嵌入式系统软件自动生成方法研究
2018-01-09陈骏勰
陈骏勰
摘要:相比于PC软件系统的设计,嵌入式系统的设计具有更多难点。由于嵌入式系统的CPU性能较差,嵌入式系统软件设计对于很多初学者而言较为困难。研究了嵌入式系统软件自动生成的方法,它是一款具有云服务的嵌入式系统开发套件的一部分,可以根据开发者需求,智能生成嵌入式软件,所生成的软件代码只需进行少量改动,即能实现具有云服务功能的嵌入式终端设计。经过测试,生成的程序运行稳定、通信安全性高、操作方便,可以为嵌入式系统学习者和开发人员提供一条新的系统开发路径。
关键词:云技术;物联网;阿里云;嵌入式技术;ESP8266
DOIDOI:10.11907/rjdk.172612
中图分类号:TP301
文献标识码:A 文章编号:1672-7800(2017)012-0036-04
Abstract:Compared to the design of PC software system, the design of embedded system is more difficult. The current common market development kit mainly reduce hardware development difficulty. Due to poor CPU performance of the embedded system, embedded system software design is still one of the hardest difficult for many beginners to get started.Thic topic research the method of embedded system software automatically generated. It is a part of a cloud service development kit. The intelligent generation code only needs a little change, and can be achieved with embedded terminal design of cloud services. After testing, the generated program runs stably, the communication security is high, and the operation is convenient. It can provide a new system development path for the embedded system learners and developers.
Key Words:cloud technology; Internet of Things; Ali cloud; embedded; ESP8266
0 引言
嵌入式系統[1]应用非常广泛,它是一种专用的计算机系统,相比于PC系统,其是软件和硬件的综合体,除需要设计软件代码外,硬件的相关设计也是嵌入式系统设计的难点之一。传统的嵌入式系统开发套件更多地考虑了硬件设计的便利性,而对于嵌入式系统软件设计的智能化和自动化研究较少,从而影响了嵌入式系统的开发和普及。随着嵌入式系统的一大分支——智能家居[2]的发展,嵌入式系统的问题逐渐凸显出来,如各种智能家居系统普遍存在不同厂家间设备难以兼容、云服务器设计难度大、难以保证信息安全性等问题。因此,各类为智能家居系统提供服务的云平台服务系统应运而生。阿里云物联网开发套件即是其中的产品之一,它是阿里云专门为物联网领域开发人员推出的,其目的是帮助开发者搭建安全且性能强大的数据通道,方便终端(如传感器、执行器、嵌入式设备或智能家电等)和云端的双向通信。在安全上,物联网套件提供多重防护,保障设备云端安全;在性能上,物联网套件能够支撑亿级设备长连接,百万消息并发。物联网套件还提供了一站式托管服务,从数据采集到计算,再到存储,用户无需购买服务器部署分布式架构,只需通过规则引擎在Web上配置规则,即可实现“采集+计算+存储”等全栈服务。另一方面,随着无线通信技术的进步,国内外出现了大量带有无线近距离通信功能的MCU芯片,其中ESP8266即是一款性价比较高的低功耗WiFi芯片[3-4]。它可以作为WiFi终端,也可以作为路由器使用,其同时具有较多外设,开发灵活,应用前景广阔。
笔者结合ESP8266与阿里云物联网套件,设计了一款具有云服务功能的开发套件,它与其它同类产品最大的区别在于具有智能化的嵌入式系统软件自动生成功能。相比于人工编写代码的方式,自动生成的代码具有通信安全性高、配置方便、稳定性高、兼容性强等优势,从而降低了嵌入式系统开发难度,提高了开发者的开发效率。
开发套件由一个云平台、终端软件生成工具和相关硬件平台构成,默认硬件采用STM32F103C8T6(以下简称STM32)为核心,开发套件的开发流程如图1所示。使用者完成项目设计后,通过IE浏览器访问云平台,对自己的项目进行配置,再通过嵌入式软件生成算法生成相应工程代码,适当修改后,烧录入硬件平台中,即可完成一个具有云服务功能的嵌入式系统设计。本文在简要介绍整个系统结构的前提下,主要介绍开发套件的核心,即嵌入式系统软件自动生成算法的原理与流程。
1 开发套件整体结构
如图2所示,开发套件由两部分构成,一部分依托于阿里云的主控服务器(以下简称云端),另一部分是STM32和ESP8266组成的嵌入式系统开发模块(以下简称终端)。云端由数据服务器和授权服务器构成。数据服务器是整个云端的核心,为终端提供了与云服务有关的支持,如数据交互;授权服务器主要实现两方面功能:一是给予开发人员项目设置功能,如配置项目数据点,绑定对应的手机APP;二是给予终端设备授权验证功能,实现设备秘钥的分发,简化设备初次上网难度。终端由ESP8266和STM32组成,ESP8266实现与云端通信,STM32是终端的核心,嵌入式系统软件生成工具的主要目标就是智能化地生成终端软件代码。
云端布置在阿里云上,通过阿里云物联网套件与终端通信,每个开发者在云端、网页完成注册后,可以建立属于自己的项目。开发套件的项目结构如图3所示,一个开发者可以新建若干项目,每一个项目下可以有多个终端设备。开发者使用账号密码管理自己创建的项目,每个项目会分配一个项目ID和项目秘钥,这两个参数需要写入该项目的终端设备中。云端通过终端设备上报的项目ID和项目秘钥对应相应的项目,同时每个终端会包含终端独有设备ID和设备秘钥,阿里云物联网套件会通过该ID和秘钥验证终端身份,并且区分每个设备,以保证通信的可靠性。
2 云端与终端通信协议
云端与终端的数据交互方式非常重要,它提供了两者数据交互的信道,对其进行合理设计具有诸多重要意义:一方面数据交互是两者间通信的重点,合理的通信方式可以在减少自动生成方法设计难度的同时,提高整体的通信安全性;另一方面是在终端初次联网时,能够智能地配置终端相关参数,使开发者在使用本系统学习与调试时不用频繁配置云端,解决了终端批量化生产后的参数配置问题。
2.1 云端与终端通信方式
由于终端与云端的通信需要借助于阿里云物联网套件,因此终端使用MQTT[6-7](Message Queuing Telemetry Transport,消息队列遥测传输)协议与云端进行通信。MQTT可以应用在低带宽、不可靠的通信信道中,同时阿里云开发套件在MQTT协议之上额外使用TSL加密技术[8],以保证通信的保密性。因此,本系统的终端使用该协议与云端进行通信,终端将MQTT协议封装于ESP8266中,不需要开发者关心使用细节。
2.2 终端联网参数配置方式
终端设备连接云端时,云端需要验证终端的设备ID和秘钥,用于分辨终端设备。为方便学习者烧写程序后能自动刷新设备,设备ID和秘钥记录在STM32中,可以选择在烧写程序时固化,也可以在初次联网时动态获取。
当终端需要智能获取联网参数时,它会与云端的授权服务器通信,以获取必要的参数。其流程是终端使用包含项目ID的数据包,通过HTTP协议向授权服务器申请新的设备ID和秘钥,并加上相应的MD5签名[9],该签名与项目秘钥及当前时间有关。如果授权服务器验证通过,则会通过加密方式发送新的设备ID和设备秘钥。
2.3 数据交互协议设计
系统的云端与终端两部分间需要进行数据交互,为了简化设计,所有数据均采用数据点的方式进行通信,也即是将要通信的数据做成一个个节点,当终端和云端通信时,协议实现了这些节点数据的同步。对于云端和终端中同步的变量,两者均保存一个副本,如一个灯的开关状态,当一方需要修改该参数时,则通知另一方同时进行修改,或者对于某一方可执行的额外解析程序,如终端的异常报警,云端接收后不需要保存即可直接对用户进行警告。
数据点从10H开始编号,最大编号为FFFFH,当云端和终端通信时,这些数据点只使用编号进行标识,以减少网络带宽的消耗。这些数据点可以是整型、布尔型、浮点型、信息型或复合类型中的某一种类型,数字类型均采用固定字节的整型传输方式。对于浮点型的传输,会先乘以预先设置好的放大系数,取整后再通过整型进行传输。信息类型可以用来传输包括字符串在内的任何长度的任何数据,用户可以灵活地进行扩展。
信息类型的协议如表1所示,其规则与MQTT编码类似,先发送MsgLen,再发送MsgData,当信息长度小于128字节时,MsgLen占用1个字节,否则MsgLen占用2个字节,为第一个字节信息长度除以128的余数部分加上80H。第二个字节为整数部分,当接收方解析时,根据相同规则进行解析。
在本系统中,一帧数据包只能传递一个数据点。因此,如果项目需要一次性传输多个数据点,则必须使用复合类型,复合类型可以将多个数据点打包(包括另一个复合类型的数据点)。复合类型在申明时,可以申明所包含数据点的ID和对应顺序,发送时按照申明时的顺序进行发送。比如要发送包含2个数据的复合类型数据点,本身ID为15H,其中第一个数据的ID为10H,类型为整型,第二个数据的ID为22H,类型为布尔型,则发送的数据包(十六进制表示)可能为15 00 78 56 34 12 01,这代表了整型数据为12345678H,布尔型数据为真。
3 终端代码生成与运行原理
代码生成工具生成的软件代码由固定部分与动态生成部分构成,其中固定部分的代码与项目无关,也是生成项目的核心程序,动态生成的程序代码与项目相关,由必要的动作函数和描述项目的数组组成,其中固定部分是生成代码的核心,动态部分作为固定部分的补充。
3.1 智能终端程序结构
终端由ESP8266和STM32构成,其中ESP8266的代码考虑到烧写问题,直接固化,不需要代码生成工具生成,对于任何项目均不改变,主要完成与云端交互的功能。代码生成工具主要生成STM32的运行代码。STM32程序由内核层、API层、驱动层和数据点层构成。内核层是自动化生成代码的核心,与具体项目无关;数据点层用于存储每个数据点的情况,代码的生成是代码生产器的核心工作;API层作为与内核其它部分的接口,在自动化生成工具生成的同時,需要开发者进行定义;驱动层实现了硬件资源的封装与调用,如调用串口与ESP8266通信,与具体硬件相关,通常不需要用户定义与修改。
内核层的核心流程由消息和任务队列组成,内核程序流程如图4所示,任务队列由消息驱动,程序的其它部分都可以往消息队列里添加消息。终端通过内核层的任务机制,实现了伪并行功能,提高了终端并发的稳定性。
数据点层和API层是具体项目的核心,其中数据点层用来保存数据点的整体情况,除固定的API函数外,需要由代码生成工具生成一个与项目相关的结构体数据,用来保存每个数据点的情况;API层是一个C文件,里面保存了所有数据点对应的读写函数,开发者可能需要对这一部分进行二次定义;驱动层实现了内核与硬件的交互,提供了诸如获取系统状态、发送调试数据等常用功能,可方便开发者调用系统资源,这里不作赘述。
3.2 智能终端数据收发流程
云端和终端数据交互是每个项目的核心功能之一,它驱动了云端和终端的相关事务流程,是自动生成方法的核心之一,以下介绍数据的收发流程。
当终端接收到一帧完整的数据包时,会依托内核层建立一个任务用以解析该帧数据,任务的执行流程如图5所示,可以简述为:①解析数据包,通过数据点层API获得云端发送数据的数据类型;②判断数据点类型是否为复合类型,是则进入③,否则进入④;③通过数据点层API获取该数据点集合,对于集合当中的每个数据点,执行②;④根据数据类型的编码规则分离出数据,建立一个新任务,在新任务中执行对应数据点的写API,将数据接入对应数据点。
在此流程当中,网络数据的解析与响应分为两个任务执行,可避免解析程序运行时间过长,以提升产品用户体验。
当需要将终端数据发送给云端时,其流程与接收类似,开发者使用公共的发送API进行发送,其输入参数为数据点ID与需要发送的数据,它会根据数据点层将待发送的数据打包为数据帧,发送到云端。
3.3 程序自动生成方法
由于代码生成工具生成的项目代码中,大部分都与具体项目无关,对于这些代码直接复制即可,少部分需要动态生成的代码具有较统一的格式。它们的生成方法很简单,流程如图6所示。首先生成工具会读取具体项目的配置文件,获得正常开发的项目参数,之后根据预先设计好的模板写入各个参数,生成可编译的代码,写入硬盘的相应位置,供用户继续开发使用。
4 结语
综上述,本文研究的嵌入式软件智能生成方法具有以下优点:①项目数据点设计灵活,项目设计灵活性高;②可扩展性较强,如二次开发者可以将本系统仅作为数据收发使用;③自动化程度高,可以智能地生成大部分代码,减轻开发者工作难度。经过合作学校的试用,获得了较好的反响,该开发套件将在学生学习以及开发具有云功能的产品中扮演重要角色。
参考文献:
[1] 汤琳.基于智能电网的物联网技术及其应用研究[J].绵阳师范学院学报,2016,35(5):79-83.
[2] 童晓渝,房秉毅,张云勇,等.物联网智能家居发展分析[J].移动通信,2010,34(9):16-20.
[3] 范兴隆.ESP8266在智能家居监控系统中的应用[J].单片机与嵌入式系统应用,2016,16(9):52-56.
[4] 曹振民,陳年生,马强,等.基于ESP8266的无线控制电路设计[J].工业控制计算机,2017,30(1):68-69.
[5] 李宁,卞祥.基于机智云的智能宿舍系统设计[J].物联网技术,2016(2):59-60,64.
[6] 刘峰,陈朴,贾军营,等.WebSocket与MQTT在Web即时通信系统中的应用[J].计算机系统应用,2016,25(5):28-33.
[7] IBM,Eurotech . MQTT V3.1 Protocol Specification [EB/OL]. https://www.ibm.com/developerworks/library/ws-mqtt/.
[8] 杨亚平,李伟琴.基于SSL的数据安全传输系统的设计与实现[J].北京航空航天大学学报,2001,27(4):469-473.
[9] 张裔智,赵毅,汤小斌,等.MD5算法研究[J].计算机科学,2008,35(7):295-297.
(责任编辑:黄 健)