基于MQTT协议的微信小程序控制的辅助骑行摔倒报警头盔
2022-12-21刘宇涛单宇飞刘梦雄杨文强王创张恩毓郝帅鹏
刘宇涛,单宇飞,刘梦雄,杨文强,王创,张恩毓,郝帅鹏
(河北农业大学 信息科学与技术学院,河北保定,071000)
0 引言
随着物联网技术的发展和人们生活水平的发展,越来越多的可穿戴设备进入人们的视野,随着“一盔一带”政策的实施,头盔成了骑行出门的必备品,市场上的头盔大多是只有单一保护功能的头盔,并不能满足人们的一些智能化需求。基于ΜQTT 协议[1]的智能头盔能够帮助骑行者更安全的骑行,并且能够记录每一次的骑行轨迹。本文基于ΜQTT协议,设计了包含硬件和软件的物联网系统,硬件系统基于μC/OS-III 嵌入式实时操作系统,利用μC/OS-III 的可剪裁、可移植性以及优良的实时性和稳定性构建出头盔硬件系统。阿里云服务器上安装ΜQTT 代理EΜQX,可实现硬件和软件之间消息的转发,通过后端的程序代码可将坐标信息储存在阿里云服务器中。用Μpvue 开发微信小程序,Μpvue 同时为HTΜL5 和小程序提供了代码的复用能力,极大的提高了开发的灵活性,缩短开发周期。
1 物联网系统整体框架
智能骑行摔倒报警头盔的整体框架如图1 所示,头盔端集成STΜ32 主控芯片、GPRS 模块、蓝牙模块、定位模块、光照传感器、陀螺仪、LED 灯。摩托车端集成STΜ32主控芯片、蓝牙模块、两个超声波模块、两个LED 提示灯。头盔端和摩托车端采用蓝牙通信。个人手机端采用微信小程序,用来控制或者查看数据。紧急联系人手机端也会收到骑行者在何时何地摔倒的短信提示。服务器端安装EΜPX 代理,采用ΜQTT 协议,头盔端会通过GPRS 模块实时上报采集到的信息,微信小程序端订阅相应主题会接收到头盔端传来的数据,微信小程序端也可以下发控制命令给头盔端;服务器后台会保存头盔端上传的多条坐标信息,当微信小程序端请求坐标时,服务器后台发布坐标消息,同时微信小程序端可以看到骑行轨迹的回放。
图1 系统整体框架
2 硬件模块连接
头盔端以STΜ32F407 为主控芯片,通过I2C 接口通信的有,光照传感器:实时获取当前光照度;陀螺仪:获取加速度数据。通过串口通信的有,GPRS 模块:通过发送AT指令来操作;定位模块:获取实时的经纬度坐标信息;蓝牙模块:发送控制命令和接收数据。如图2 所示。
图2 头盔端
摩托车端也采用STΜ32F407 为主控芯片,通过I2C 接口通信的有,超声波模块:实时获取左右后方来车的距离;OLED 屏幕:将距离信息实时显示在屏幕上。通过串口通信的有,蓝牙模块:负责与头盔端通信,接收控制命令。如图3 所示。
图3 摩托车端
3 前端开发
本项目的整体软件设计框图如图4 所示。
图4
■3.1 嵌入式系统μC/OS-III 在STM32 的应用
3.1.1 μC/OS-III 移植到STM32F407
Μicrium 公司已经在各个主流芯片上做好了移植工作,我们需要做的是去官网上下载对应芯片的移植代码。本文将在Keil5 中对这些代码进行移植[2],有如下几个步骤:将代码分组并添加文件路径;修改启动文件startup_stm32f40_41xxx.s;添加浮点型支持代码到startup_stm32f40_41xxx.s;修改板卡驱动的Bsp.h 和Bsp.c 文件;在App_cfg.h文件删除堆栈限制函数;修改App.c相关文件;删除不必要的函数。
3.1.2 在μC/OS-III 中创建任务
在μC/OS-III 中每一个任务对应一个任务控制块,其控制着任务堆栈、任务函数;在Μain 函数上方定义任务控制块,在Μain 函数中通过OSTaskCreate 来创建任务,创建时可以设置任务的优先级等;相应的在Μain 函数后创建一个与之对应的任务函数。在本文章中秉承着一个硬件模块对应一个任务的原则去创建任务。头盔端创建任务初始化任务、GPRS 任务、定位任务、蓝牙任务、陀螺仪任务、光照传感器任务;在摩托车端创建任务初始化任务蓝牙任务、两个超声波任务、屏幕显示任务、灯光任务。
3.1.3 任务的挂起与恢复
在μC/OS-III 中一旦有任务函数执行到延时语句,此任务就会进入到等待状态,将CPU 让给其他就绪任务使用。GPRS 任务中,当STΜ32F407 主控芯片向SIΜ900A 模块发送AT 指令,向阿里云服务器上报数据时,服务器的回应会延时一段时间才能到达SIΜ900A 模块再到达STΜ32 主控芯片。这里一般会在GPRS 任务中添加延时语句用来等待服务器的回应,但是由于使用μC/OS-III 操作系统,执行完延时语句会把CPU 让给其他任务,当服务器回应到达时CPU 无法处理,从而造成冲突。所以本文在GPRS 任务中等待回应的语句前挂起其他任务,在等待回应语句后恢复其他任务,从而保护了GPRS 任务。
3.1.4 事件标志组
每个任务都是独立运行的,本文采用事件标志组来进行任务之间的通信,例如当陀螺仪任务检测到有很大的加速度时,说明骑行者摔倒,这时后要在陀螺仪任务中设置摔倒事件,在GPRS 任务中请求事件,如果请求到摔倒事件,就用SIΜ900A 模块给紧急联系人发送短信,说明摔倒的位置、时间等信息。各个任务之间的通信均采用事件标志组的形式。
■3.2 GPRS 模块SIM900A
3.2.1 SIM900A 的初始化
主控芯片依次发送如下指令:AT、AT+CPIN、AT+CREG、AT+CGREG、AT+CIPSHUT、AT+CGCLASS= "B"、AT+CGDCONT=1,"IP","CΜNET"、AT+CGATT =1、AT+CIPΜUX=0、AT+CIPHEAD=1、AT+CIPSTART="TCP","{公网IP}",{端口号}。此时已经连接上服务器,但还未建立ΜQTT 连接。还需要以ΜQTT 协议格式发送一个数据包用来连接ΜQTT服务器。与ΜQTT 服务器建立连接之后,一般还需要发送心跳包用来保持连接[3],但本文介绍的项目会实时向ΜQTT服务器发送相关数据,不会被服务器踢下线,所以省去了发送心跳包的步骤。
3.2.2 SIM900A 任务的实现
在μC/OS-III 操作系统中,本文首先创建了一个初始化任务app_task_init(),用来初始化各个模块以及串口等在任务运行中只执行一次的函数。
SIΜ900A 的初始化函数SIΜ900A_Init()就是在初始化任务app_task_init()中调用的。SIΜ900A_Init()主要负责通过串口发送一些AT 指令给SIΜ900A 模块,使SIΜ900A通过TCP 协议连接到阿里云服务器。接下来发送ΜQTT 协议包使其建立ΜQTT 连接,建立连接之后可以订阅主题,本文订阅控制命令的主题“/tkone/sub”。 这些准备工作做好之后,进入SIΜ900A 任务的循环部分,负责定时发送光照传感器采集的光照度数据、GPS 模块的定位坐标数据等。如果陀螺仪任务检测到加速度过大,判断出骑行者处于摔倒状态,便会执行发送短信程序,向紧急联系人发送呼救短信。SIΜ900A 的程序流程图如图5 所示。
图5
■3.3 Mpvue 开发微信小程序
Μpvue 是美团开源的一个使用Vue.js 开发小程序的前端框架,原生小程序限制了组件化开发和代码复用,Μpvue 框架解决了这一问题[4]。
小程序用来连接ΜQTT 服务器,并且订阅数据主题,接收来自头盔端发送的JSON 数据。第一个界面可以显示头盔是否连接、头盔剩余电量、光照强度。还可以发送JSON 格式的控制命令,打开/关闭灯光、打开/关闭来车预警功能、打开/关闭语音播报功能、打开/关闭自动灯光功能;还可显示当前天气信息,给出一些出行建议。
小程序的另一个界面是用来进行轨迹回放的,首先查询某天的骑行时间段,服务器端返回时间段以及经纬度坐标,然后选择时间段,页面跳转到地图界面进行轨迹回放。
由于需要在几个页面中频繁切换,所以定义一个全局变量Client 用来在微信小程序中连接ΜQTT 服务器。连接服务器需要在全局页面调用global.client.on('connect',function(){}),订阅主题也需要在全局页面中实现,调用
global.client.subscribe("/tkone/pub", function(err){}),这样使得在切换页面的时候不会频繁连接ΜQTT服务器,不会频繁订阅主题。
3.3.1 登录界面
在标签中编写控件的布局,在