陈 垅,叶庆明,李亚静
(河南科技大学信息工程学院,河南 洛阳 471023)
随着科技的发展与生活水平的日益提高,交通工具成为了人们日常生活的必需品。疫情政策的逐渐放开也使人们对于出行的需求随即提升。充电桩作为非机动车出行必不可少的一个公共设施,也逐渐被人们接受与使用。但在我们日常生活中,对充电桩的管理较为混乱,用户对充电桩产生需求时往往因找不到或没有空闲充电桩而无法满足自身的需求,这也对我们日常出行产生了一定的限制。而许多充电桩采取的是线下的即充即用,无法通过手机等设备对充电桩的位置、是否空闲等状态进行远程控制,使用效果并不理想。我国交通业虽然近年发展飞速,但是充电桩市场的管理及充电桩远程定位控制这块的投入较为稀少。而那些主流公司设计的App功能较为冗余,操作繁琐不够便捷,不利于日常生活的快捷操纵。为解决这一问题,简化App冗余功能,实现用户对充电桩的即点即用、即需即有的需求。基于此特设计与开发一款完成远程查找租用充电桩以及使用的APP。此项目采用STM32[1]完成功能的实现,并没有商业化的模块功能,例如收费和云服务器存储。
一般市面上的充电桩APP 分为Web端和Android端。 Web端是商家搭建的服务器,用来记录信息。 Android端则是用户自主安装的App,让用户自行进行操作。因为一些在线功能如用户信息存储,充电金额缴纳等功能不是程序设计的核心,故本项目对Android端进行详解,暂不分析设计Web端。该项目的需求主要由以下六大部分组成:
1) 注册:新用户可以点击首页的注册按钮,输入自己的账号及密码,因无Web端,故账号密码存入本地数据库。
2) 登录:用户输入自己的账号与密码,进入地图页面。
3) 地图:在地图页面,用户将会定位自己的位置。
4) 定位手机与充电桩:点击搜索按钮,即可搜索地图上充电桩的位置。
5) 远程控制:用户点击地图上的充电桩按钮,即可选择充电与断电,达到远程控制的效果。
6) 充电记录:充电结束后,后台记录充电时长。
硬件核心采用STM32,灵感来源于《基于STM32单片机的智能窗户设计》[2]和《ARM嵌入式开发实例——基于STM32的系统设计》[3]。
GPS模块采用 U-BLOX NEO-6M 模组,见图1,引脚见图2,体积小巧,性能优异。搭配20.5 dB 高增益LNA芯片,搜星能力强。
图1 U-BLOX NEO-6M模组图
图2 引脚图
此项目用于硬件编程的软件为Keil(C51),烧录软件使用FLYMCU,串口软件使用XCOM,如果使用其他串口助手可能控制DTR/RTS导致MCU复位/程序不运行。串口软件波特率必须是115200,设备通电后就可以通过串口查看经纬度、速度、海拔等信息。在硬件烧录,焊接好后通过软件引入的百度地图API进行调用,使用Java语言进行调控。
目前市面上的无线通信技术中除了我们日常使用的蓝牙技术之外,还可以使用WiFi进行设备的连接。相比于蓝牙模块,Wifi模块的可自定义程度要更强,用户可操作性也更强。在我们的项目中,将使用无线通信的技术,实现APP端远程操控硬件端。
在硬件端,我们使用ESP8266模块,见图3。
图3 ESP8266模块图
ESP8266具有一个WiFi透传模块。何为透传?透传全称透明传输,模糊了输入和输出的差别。在数据不变的前提下,不同协议之间的转换可由模块完成。模块对于使用者是“透明的”,由此模块仅对外提供使用的接口。该模块具有两种工作模式:STA模式(Station)和AP模式(Access Point)。个别的WiFi模块具有STA+AP模式,此模式可以从STA 和AP自由切换。
在我们的项目中,主要使用的是STA模式。STA模式,通俗讲是将硬件对应TCP传输协议中的客户端。我们可以将手机视为服务端,使用AT指令开发,连接手机和充电桩硬件,达到发送信息的效果。
AT指令开发是利用了ESP8266本身是可编程芯片这一特点,我们可以使用出厂时封装的WiFi协议栈,通过单片机串口实现WiFi模块的通信。用A9和A10接口输出连接ESP8266模块实现无线通信以便于后面功能的使用。
软件方面此项目通过Android Studio进行开发。首先解决地图的调用问题,此项目调用了百度地图API,在百度地图开放平台申请使用。
在App端要对地图sdk进行初始化(配置AndroidManifest.xml文件),填写相关的信息,初始完成后,即可调用相关功能。首先,创建一个地图容器进行使用,在App登录后显示地图主界面,调用locationService.start();其次通过LocationClient发起定位,在点击左上角搜索按钮后,即可显示充电桩位置。
对于充电桩,我们可以在无线通信的情况下,对其进行充电和停电两种操作(详见2.5如何模拟通电与断电),断电后,后台将自动记录充电时间。
对于登录界面,我们将使用Button和EditText控件,因该项目暂未涉及Web端,我们将用户数据存入sqlite本地,以此实现简单的登录注册功能。
对于软硬件的交互,我们使用MQTT协议(Message Queuing Telemetry Transport,消息队列遥测传输协议)。
MQTT协议构建于TCP/IP协议之上,具有低开销,低宽带占用的特点,对于小型设备的应用较为友好。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。
MQTT 服务端通常是一台服务器(broker),用来完成MQTT 信息传输,是信息传输的核心,像中转站一样将 MQTT 客户端发送来的信息传递给另一个MQTT 客户端;MQTT 服务端不但可以分拣传输信息,还可以管理调用 MQTT 客户端,保证客户端与客户端之间的通讯顺畅,信息得以正确传输与接收。
MQTT 客户端可以向服务端发布信息,也可以从服务端收取信息。我们把客户端发送信息的行为称为 “发布”信息;而客户端要想从服务端收取信息,则称为订阅信息。
发布/订阅模式重定义了客户端,令客户端可以划分为2种角色:发布者(Publisher)和订阅者(Subscriber),这大大扩充了客户端的功能。发布者可以发布若干的消息,此类信息类型一般称为主题,在整体通信中,只有订阅了这个主题的订阅者才能收到属于这个主题的消息。
对于发布者,其不需获取订阅者的信息(例如不知道订阅者的IP和端口),也不需与对方建立直接的联系。MQTT服务端将会扮演这个中间人角色。
对于订阅者,其只需要获取MQTT 服务器的IP和端口即可,并和它直接建立连接通信,MQTT服务端将会作为信息的中转站,正确地分发信息。
项目中,我们将App发布的主题信息送往MQTT服务端,MQTT服务端分拣信息后,将信息传递给ESP8266模块,ESP8266模块再将信息传递给STM32主板进行统筹计算,然后将充电断电信息传达给其他模块(见图4)。
在我们接收到APP端的信息后,经过STM32主控的处理,通过A7接口输出信号,接到信号后, S8050三极管高电平导通,实现充电桩的通电与断电。在此项目中,为明显显示实验结果,在硬件上添加LED灯和继电器,两者是通过S8050三极管控制通断,来具现实验现象(见图5)。
图5 三极管原理图
本文设计并实现了充电桩的远程通信和控制。在App端用户可以通过账号密码登录,在地图界面查找自己,然后通过搜寻功能查到充电桩的位置,对充电桩进行无线通信控制,控制其通电与断电,并在断电后保存使用的时长记录。该项目秉承简单易用的特点,基本满足了日常出行对充电桩的需求,减少不必要的时间浪费。同时此项目是一个功能的实现,并没有商业化的模块功能,例如收费和云服务器存储。