设备节点功能模块设计
在本文节点功能设计中,拥有用于检测温度的温度传感器、监测湿度的湿度传感器以及 调节空调温度的IR红外发射器,另留有部分外接扩展串口,因此可能会在实际使用中扩展更多的设备模块与功能。
可见,如何高效地管理设备及其挂载资源,是一个值得研究的重要方向。
本章对设备节点功能以及通信协议接口进行了设计,实现了设备端与客户端平台间的通信以及设备端的功能模块,同时设计了本文重点讨论的设备端远程升级模块。
需求分析
在软件架构的整体设计中,本文的终端节点所需要完成的功能主要有两个,首先是环境监测,需要对环境数据进行实时采集,并根据数据进行环境温湿度调整,以达到节能的目的。
其次是设备管理平台通信,通信中除了设备的上报接口、接收平台指令接口之外,还应有设备注销和注销接口来构成完善的设备管理功能。
此外,本文还设计了远程升级模块,其中包含了对差分文件的还原算法以支持差分升级。
除此之外需要考虑的是嵌入式设备通常在计算能力、存储能力以及通信能力方面受到限制。
因此,节点的功能设计需要综合考虑以上因素,设计出功能结构清晰,低耦合度同时兼顾实时性的软件系统结构。
综上所述,本文终端的设计需满足设备功能低功耗多任务、软件设计低耦合高实时性的要求。
通信需求及协议栈设计
由于NB网络的低带宽以及终端小型设备的低计算能力,因特网中使用广泛的HTTP协议并不适用,因为其具有冗长的报文格式以及复杂的通信规则。
因此,在本项目的网络环境下,需要对网络通信协议进行选型。
物联网中常用的应用层通信协议有:MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)协议与CoAP(Constrained Application Protocol,受限应用协议)。
- MQTT协议是一种基于TCP协议的双向控制可靠协议,但功耗较高。
- CoAP协议是一种基于UDP协议的适用于资源受限的设备,由于不需要维持长连接而功耗降低,因此比较适用于电池供电的应用场景。
本论文驱动在环境信息数据采集功能设计中使用基于CoAP协议的LwM2M协议。
LwM2M协议在是OMA面向NB-IoT发布的轻量级端到端协议,该协议栈基于UDP,提供轻量化报文结构的方案,对窄带物联网中的通信方式提供了参考标准。
LwM2M协议是应用层协议,具体协议栈:
LwM2M协议定义了LwM2M Server、LwM2M Client和Bootstrap Server三个逻辑实体以及Bootstrap、Device Discovery and Registration、Device Management and Service Enablement和Information Reporting四个逻辑接口,逻辑实体和逻辑接口关系如图所示。
Bootstrap Server 通过Bootstrap接口对LwM2MClient进行配置。
LwM2M Client通过Device Discovery and Registration接口在服务器进行注册并通知服务器所具备的能力,并会调用Information Reporting接口向服务器上报资源信息。
LwM2M Server可以通过Device Mangement and Service Enablement 接口向Client发送指令信息。
由于本文使用NB-IoT技术作为底层通信技术,该技术具有带宽较窄的特点,因此本文参考了LwM2M协议标准,设计了基于FreeRTOS的机房环境监测终端,实现了协议的部分接口以完成终端功能。
该终端可根据环境实时情况调整机房空调参数,同时将数据实时上报给云平台,平台侧可通过平台的Web UI人为下发指令,实时获取终端数据以及命令终端执行某些特定功能。
终端驱动利用LwM2M协议的设备管理功能进行设备的管理操作,以实现设备的数据上云以及远程管理等功能,降低了设备功耗。
利用FreeRTOS实现功能模块的分割以达到功能间的低耦合,同时保持设备状态实时性。
本文设备管理驱动总体架构参考TCP/IP五层协议进行设计,从下至上依次是:
- 设备层。本文采用的硬件平台包括ARM-Cortex M3架构的STM32F103系列芯片,外接AM2302传感器以及IR红外发射器。
- 物理层以及数据链路层。3GPP对NB-IoT的物理层和数据链路层有相应的规定及标准。
- 网络层。使用IP协议。
- 传输层:在设备通信时均采用UDP以及保证通信安全的DTLS协议,而在进行资源下载时,使用TCP以及保证通信安全的TLS协议。
- 应用层。首先,在设备通信时采用基于CoAP并可将设备抽象成对象-资源模型的LwM2M协议,使设备在通信过程中保证实时性以及更高的成功率。同时在软件设计时,使用FreeRTOS保证软件结构清晰、代码耦合度低。其次,应用层还包含了固定的处理逻辑,具体为差分包还原算法以及代码覆盖逻辑。此外,本文的项目需求中还有动态控制空调的要求,因此应用层还应该包括空调控制逻辑,这个部分需要依托特定的红外编码规范,会在下文中阐述。
软件功能需求
从软件设计层面,本文的设备功能上主要分为环境数据采集功能、远程升级功能、只能环境控制功能以及云端通信功能,这样的模块设计需要配合具体的协议与操作系统进行编写,软件架构图如图所示。
硬件选型主要选择由STM32处理器、温湿度传感器AM2302、IR发射器等各个环境参数传感器和NB-IoT通信模块组成;远程升级功能主要需要具体的算法以及支持无线数据交换的通信模组。
FreeRTOS封装了五种内存分配方式
(1) headp_1
heap_1内存分配方案逻辑最简单,该方案只能申请内存,而这块内存不能被释放。
对于大多数嵌入式系统,特别是对安全要求高的嵌入式系统,这种内存管理策略很有用,因为对系统软件来说,逻辑越简单越容易兼顾安全。我们可以将第一种内存管理看做追加式的顺序分配,调用pvPortMALLOC()时就从空闲内存中分配一段空间给新的变量。这个内存管理策略使用两个局部静态变量来跟踪内存分配,变量定义为:
其中,变量xNextFreeByte记录已经分配的内存大小,用来定位下一个空闲的内存堆位置。
内存堆在软件上的表达实际是大数组,通过偏移量和已分配内存就可以定位到最近的未分配空间。
为了加快运行速度,变量pucAlignedHeap指向对齐后的内存堆起始位置。
为了提高性能,FreeRTOS会进行对齐操作,不同的硬件架构对齐操作也不同。
(2)heap_2
第二种内存管理策略较第一种复杂,除了实现了嵌入式设备内的内存分配,同时允许释放内存空间。它使用最佳匹配算法,但不允许空闲块合并,因此会造成内存碎片。
这个内存管理策略适用于重复的分配和删除具有相同堆栈空间的任务、队列、信号量、互斥量等等,并且不考虑内存碎片的应用程序,不适用于分配和释放随机字节堆栈空间的应用程序。
与第一种内存管理策略一样,内存堆仍然是一个大数组,定义为:
static uint8_t uncHeap[configTOTAL_HEAP_SIZE];
局部静态变量pucAlignedHeap指向对齐后的内存堆起始位置。
(3)heap_3
heap_3.c的设计初衷是为了确保线程安全,保证不会被多个线程同时分配或回收内存,只是简单的包装一下标准函数malloc()和free()以确保线程安全,在大多数情况下,这些包装器是需要编译器提供,它们依赖于编译器自己的malloc()和free()实现。
(4)heap_4
在上文中提及的heap_@内存分配策略中,分配算法使用的是最佳匹配算法,会将空闲块形成空闲空间大小排序的链表,当需要为代码分配内存空间时,会从头遍历链表找到最小的满足条件的空闲块,但这样会形成很多空间很小的空间碎片,这些空间碎片可能很难满足任何的空间分配需求,因此内存利用率较低。
而heap_4内存分配策略会将相邻的空闲块合并,形成更大的空闲块。
本文中的程序设计因为需要对内存进行反复动态分配和释放,所以选择使用heap_4的内存分配方式。
(5)heap_5
heap_5内存分配策略使用的是首次适应算法,优先使用低地址空间,而为了提高内存空间的利用率,会在相邻空闲块上使用合并算法将小的内存碎片合并成大的空闲块。