基于物联网通信协议的车辆信息系统开发
2022-03-22李鹏程张文胜郝孜奇
李鹏程,张文胜+,郭 栋,郝孜奇
(1.石家庄铁道大学 交通运输学院,河北 石家庄 050043;2.中铁十四局集团公司遂道工程有限公司, 山东 济南 250000;3.山东省交通规划设计院集团有限公司 科技研发中心,山东 济南 250101)
0 引 言
MQTT、WebScoket运行在传输控制协议/网际协议之上[1],用于物联网[2](Internet of things,IoT)设备的消息传递。前者通过发布/订阅模式实现[3,4],凭借耗电慢、吞吐量小等优点[5],常用于智能家居[6]等领域。但是受限于传输能力和消息质量等级,有数据重复、传输节点通道不稳定等问题。后者传输时仅需一次握手,便可实现双向数据推送[7],常用于服务器数据交互领域[8],比如疫情轨迹追踪等。在用于物联网领域时,由于数据格式的不同,需对其进行封装处理。
针对两种协议的特点,国内外学者进行了研究。马鑫龙等针对数据传输,提出了基于MQTT协议的传输方法[9]。吕闫等设计了WebSocket实时数据推送方法[10]。Mileva Aleksandra等研究了MQTT所选数据隐藏技术[11]。Linh Manh Pham等开发了基于MQTT协议的消息件工具[12]。Mauro A.A等提出了物联网传输中中间件的重要性[13]。
以上对两种通信协议的研究工作都是单边展开,未实质解决两类协议在传输数据时的问题。因此本文将对基于MQTT over WebSocket数据传输进行研究。通过设身份标识去重算法生成ID数据,保证数据传输的唯一性,解决多节点传输通道数据重复问题。然后对生成的ID数据进行数据格式封装匹配,使服务器可以主动向应用端推送封装消息,避免单节点传输通道与服务器连接不稳定的问题。最终结合实例,开发一套车辆信息管理系统,用于验证方法的可行性和传输性能。
1 基于MQTT over WebSocket的数据传输
1.1 身份标识去重算法
受限于MQTT协议的消息交付质量等级,IoT设备使用MQTT协议进行消息传输时容易出现数据重复、冗杂等问题。因此需要对消息进行去重处理,身份标识去重算法流程如图1所示。根据自身的设备号,在消息数据里设置一个身份标识符(Client_ID),辅以获取的数据信息,如经纬度数据、温度数据等。如果Client_ID不唯一,则进行重新生成,如果唯一,订阅端保存已经收到的Client_ID。每当接收到新消息,通过Client_ID判断消息的独立性,如果与储存信息相同,则舍弃;如果没有不同则更新Client_ID并存生成ID数据信息,如此可以保证数据传输的独立性。算法核心代码如下:
sprintf(postDate, “{“IsFix”:“%s”, “Lat”:%lf, “Lon”:%lf}”
isFixedStr, latitude, longitude);//这里获取设备数据信息
INFO_GetIMEI(imei);//这里获取IMEI
sprintf(tClient, “{“Imei”:“%s”, “PostDatet”:%lf}”//融合信息
if (NULL == pJsonRoot){Trace(1, "tClient data pJsonRoot == NULL"); goto __tClient_Delete; }/执行判断
tClient *pJsonRoot = tClient_Parse(data)
MQTT_tClient* client = MQTT_tClientNew();
if (tClient_IsString(pCMD) && (tClient->valuestring != NULL))
_tClient_Delete:tClient_Delete(pJsonRoot);}
图1 身份标识去重算法流程
1.2 数据格式匹配算法
使用去重算法后进行MQTT传输,保证了数据的准确性,但是因为MQTT协议特点,应用终端只能单方面接受IoT设备消息,由于网络环境波动和内存缓冲区储存的压力,容易造成传输节点通道不稳定,从而对数据传输速度产生影响。而使用WebSocket协议可以允许服务器端主动向客户端推送消息,可以通过握手建立的稳定通道连接持久传输数据信息,来避免IoT设备通过节点通道直接向应用终端传输消息,减少对数据传输速度的影响。但经过去重算法后的MQTT传输的消息格式不符合WebSocket的格式要求,因此需要通过对端口信息、ID信息的数据格式进行匹配,对消息进行封装,最终生成满足WebSocket协议,包含ID数据以及设备数据的需求信息数据。数据格式匹配算法流程如图2所示,算法核心代码如下:
图2 数据格式匹配算法流程
cJSON *pJsonRoot = cJSON_Parse(data);{//判断是否为Json格式的数据
if (NULL == pJsonRoot){Trace(1, "MQTT data pJsonRoot == NULL"); goto __cJSON_Delete; }/执行判断
cJSON *pCMD = cJSON_GetObjectItemCaseSensitive(pJsonRoot, "cmd");
if (cJSON_IsString(pCMD) && (pCMD->valuestring != NULL))
_cJSON_Delete:cJSON_Delete(pJsonRoot);}
1.3 MQTT over WebSocket数据传输模型
基于MQTT over WebSocket进行数据传输,本质上是为了综合两种通信协议的优点,弥补各自的不足,MQTT over Websocket传输数据的总体模型实现过程如图3所示。首先以IoT设备作为MQTT客户端,在获取设备数据消息的同时,通过身份标识去重算法生成ID消息数据,可以确保节点传输通道中的消息唯一性。此外,PC作为WebSocket服务器,对ID消息数据进行格式匹配与封装,有助于保证消息传输节点通道的稳定性。最终在中间件消息服务器实现需求信息数据的订阅与发布,使得消息数据能够由服务器主动向应用终端推送,完成高效率、低流量、高稳定性的数据传输。
图3 MQTT over WebSocket数据传输模型
2 系统开发及应用
随着我国高等教育快速发展,高校多校区建设成为常态,往返校区间的校车成为师生通勤的重要选择。随着校车投放的增多,工作人员如何通过信息化手段管理校车,师生如何实时了解校车运行状态成为了亟待解决的问题。为了解决这些问题,同时验证MQTT over WebSocket进行数据传输的可行性,开发了车辆信息管理系统。
2.1 系统开发
2.1.1 系统架构
根据MQTT over WebScoket数据传输模型,车辆信息管理系统开发采用三层软件架构体系,分别为硬件层、服务器层和软件层,图4为系统平台架构。
图4 系统平台架构
其中硬件层位于整个系统最底层,主要完成硬件模块的物理熔接、烧录开发、MQTT配置。并且在此层级使用身份标识去重算法完成信息数据获取;服务器层是连接硬件层和软件层的枢纽,需进行环境搭建、服务器开发以及MQTT服务器配置等工作。并且在此层级使用数据格式匹配算法完成信息数据封装;软件端是程序功能实现的平台,主要通过编写JS脚本以及相应组件的挂载,实现车辆定位、车辆预约、信息管理、动态天气、实时路况等功能。
2.1.2 系统设计
图5 系统设计流程
车辆定位系统采用C/S架构,选取微信开发者平台作为系统开发平台,选取EMQ X Broker作为中间消息件服务器,选取腾讯云服务器作为后台服务器,开发支持北斗导航的安信可A9g开发板作为IoT设备。系统基于MQTT over WebSocket进行消息数据传输,最终在微信平台上发布程序,设计流程如图5所示。
2.1.3 系统关键技术
系统以MQTT over WebSocket为核心方法进行数据传输,分别针对IoT设备、服务器进行开发,以满足使用身份标识去重算法和数据格式匹配算法的需要。
(1)IoT设备开发
系统需要对IoT设备如A9g模块、萤石云摄像头等进行开发。以A9g模块为例,在对硬件设备完成焊接等处理后,执行代码烧录,将工程项目代码烧录到开发板当中,实现模块自身定位、获取经纬度数据信息等功能,以便融合身份标识信息。其中,通过循环逻辑来判断是否成功开启开发板的定位功能。
if(isGpsOn){//判断定位状态
uint8_tisFixed=gpsInfo->gsa[0].fix_type >gpsInfo->gsa[1].fix_type ?gpsInfo->gsa[0].fix_type:gpsInfo->gsa[1].fix_type;
char* isFixedStr; if(isFixed == 2)isFixedStr = "2D fix";else if(isFixed == 3){if(gpsInfo->gga.fix_quality == 1)
isFixedStr = "3D fix";
else if(gpsInfo->gga.fix_quality == 2)isFixedStr = "3D/DGPS fix";}
else{
isFixedStr = "no fix";
snprintf(buffer,sizeof(buffer),"GPS fix mode:%d, BDS fix mode:%d, fix quality:%d, satellites tracked:%d, gps sates total:%d, is fixed:%s,coordinate:WGS84,Latitude:%f,Longitude:%f,unit:degree,altitude:%f",gpsInfo->gsa[0].fix_type,gpsInfo->gsa[1].fix_type,gpsInfo->gga.fix_quality,gpsInfo->gga.satellites_tracked,gpsInfo->gsv[0].total_sats,isFixedStr,latitude,longitude,gpsInfo->gga.altitude);}
通过可视化管理工具,当回弹打印出“is fixed”时,便代表获取到了开发板自身的经纬度数据信息(即需要输入到身份标识去重算法中的设备数据信息),表明模块通过北斗导航成功实现了定位。
(2)服务器开发
EMQ X Broker是一款高并发低时延、支持分布式集群架构的开源物联网MQTT服务器,支持多种物联网协议,如完整支持MQTT第五代协议规范,适合用于构建从边缘到云端的各种5G、物联网、车联网平台与应用。
因为系统最终发布在微信程序,而微信程序的架构是用基本前端代码实现,与MQTT服务器无法进行直接消息传输,需要对服务器进行开发以满足代理,从而获取输入到数据格式匹配算法中的端口号信息,开发逻辑如图6所示。
图6 服务器开发逻辑
(3)订阅与发布
完成IoT设备和服务器的开发后,利用MQTT over WebSocket数据传输模型实现所封装数据信息的订阅与发布,比如经纬度数据信息以及转化格式的视频数据信息,最终在微信程序端完成对数据信息的调用,实现对车辆信息的管理。数据信息订阅与发布如图7所示。
图7 数据信息订阅与发布
2.2 系统应用
基于MQTT over WebSocket的车辆信息管理系统主要包含车辆位置信息管理、开行方案信息管理、车辆座位信息管理、图像信息管理等功能模块,并且已经在石家庄铁道大学校车上进行了实际应用。模块封装设备如图8所示,校车如图9所示。
图8 模块封装设备
图9 校车整体
2.2.1 车辆位置信息管理
对于车辆位置信息的管理,是系统的核心功能。以2号车为例,点击“2号车”按钮,如果车辆运行正常,会出现“定位成功”的字样,并且车辆图标会显示在页面中央;如果车辆上IoT设备正在定位或者车辆未启动,会出现“车辆未运行或定位中”字样。
2.2.2 开行方案信息管理
在实际应用中,老师分散居住在城市各地,所以车辆存在多条运营线路,由于站点众多,导致部分师生无法了解车辆的准确停靠地点、开行时间。同时,管理人员需要针对路况信息和日程安排进行开行方案调整,因此系统设置开行方案信息管理模块解决此问题。
2.2.3 车辆座位信息管理
如何让师生知道具体车辆的座位信息,具体车站的车辆信息,如何让管理者能够知道校车空间内部信息等等也是在校车运行中存在的问题,为了解决这些问题,系统设计了车辆选座功能,在页面右上角有选座按钮,点击按钮,可以进行分车辆分车站的选座预约,方便校车管理以及师生乘车。
2.2.4 视频信息管理模块
为了防止车辆意外,保证运行过程中校车管理人员对车厢的信息获取以及进行更好的安全管理,每辆车放置了一个摄像头,同时通过萤石云平台与微信程序进行了网络关联,管理人员可以通过点击按钮进行视频信息的获取和储存。
2.2.5 其它信息管理模块
其它信息管理模块主要包含道路、天气等其它信息。为了让师生更好地了解出行情况,系统设有天气、道路拥堵、空气质量等信息展示功能。
各个系统功能模块应用截图如图10所示。
图10 系统各功能模块
3 数据传输测试及系统应用测试
3.1 数据传输测试
为了验证MQTT over WebSocket进行数据传输的传输性能,在系统程序使用过程中,将3个IoT设备分别放到3辆车辆当中,并以0.5 s、1 s作为发布时间间隔,运行30 min进行测试,统计消息传输数量和流量消耗,测试结果见表1。
表1 数据传输测试结果
数据传输测试表结果显示,IoT设备使用该方法进行数据传输时,相同时间间隔下,多节点传输准确率非常高,验证了以多节点通道进行数据传输时,没有产生消息重复冗杂的情况,同时由于服务器主动向客户端推送消息,即使以非常短的时间间隔进行消息循环,使得车辆时刻处于定位中,但消耗的流量极低,没有给内存缓冲区造成储存压力,同时传输也非常精准,验证了节点传输通道的稳定性。
3.2 系统应用测试
为了解系统在车辆上的应用效果,从而进一步实现对系统和传输方法的改进,通过招募石家庄铁道大学25名乘坐车辆的师生,包括10名老师、10名学生以及5名车辆车队管理人员,对乘坐车辆时使用系统的满意度进行调查,并以问卷形式对使用结果进行记录,测试结果见表2。
表2 系统应用测试结果
4 结束语
本文提出了一种基于MQTT over WebSoccket的数据传输方法,通过身份标识去重算法,设置Client_ID,生成了独立的身份数据信息,保证了传输的准确性;通过数据格式匹配算法,将身份信息数据封装成需求信息数据,并完成格式转化,满足了使用WebSocket协议的传输要求,使得服务器可以主动向应用终端推送封装的消息,避免单节点传输通道与服务器连接不稳定的问题。并且以经纬度等车辆信息数据为例,选取微信开发者平台作为系统开发平台,腾讯云服务器作为后台支撑,基于支持北斗导航的A9g开发板作为IoT设备,通过对其开发,使用身份标识去重算法和数据格式匹配算法,构建了MQTT over WebSocket数据传输模型,完成了基于MQTT over WebSocket的数据传输,开发了车辆信息管理系统,最终在微信平台上发布程序。
数据测试表明,该方法成功地实现了联合两种通信协议进行低耗高效的数据传输。应用测试结果表明,师生通过使用该方法开发的系统乘坐车辆,降低了时间成本,减少了沟通成本,系统应用效果较佳,达到了预期的设计效果。两种测试结果验证了本文提出的基于MQTT over WebSocket进行数据传输的方法有效、可靠。
未来计划从物联网通信协议的数据传输信息以及设备种类出发,对语音数据、图像数据开展研究,对数据格式匹配算法进行优化,使其具备更好的普适性,以实现更广泛、高效的应用。