APP下载

基于NB-IoT的3D打印远程更新系统

2021-11-02徐婷婷王宜怀叶柯阳

计算机工程与设计 2021年10期
关键词:远程管理模组应用程序

徐婷婷,王宜怀,张 蓉,叶柯阳

(苏州大学 计算机科学与技术学院,江苏 苏州 215006)

0 引 言

由于3D打印[1]的应用场景复杂,用户的需求不断增长,以及程序缺陷等问题的存在,需要及时对打印设备中的嵌入式应用程序更新维护,一般采取由技术人员到现场调试或回收设备后再更新的方式,但3D打印设备的体型较大,分量较重且其分布分散,导致其维护的工作量大、维护成本高,对维护人员的专业性要求也高、费时费力。为了保障3D打印机工作的稳定性以及维持较好的打印性能[2],对设备中的嵌入式应用程序采取远程更新的方式已成为当今的发展趋势。窄带物联网(narrow band internet of things,NB-IoT)是3GPP标准定义的一种基于蜂窝网络的低功耗广域网通信技术[3],具备接入数量多、成本低、覆盖范围广、穿透能力强等优势,在智能抄表、远程测控、环境监测等方面得到广泛应用。

本文以汽车电子芯片S9KEAZ128AMLX(简称KEAZ128)结合ME3616通信模组为硬件平台,设计并实现了基于NB-IoT通信技术的面曝光3D打印机远程更新系统。本系统依据构件化原则设计程序,使系统程序具有较好的封装性、可复用性、可移植性以及可维护性。

1 总体方案设计

本文基于NB-IoT通信技术设计的远程更新系统的结构如图1所示,其中基站、NB-IoT云服务器组成了信息邮局,由运营商建立并维护,起到信息传送的纽带作用;终端主要实现了3D打印功能,同时借助NB-IoT技术获取服务器中用于更新应用程序的机器码和参数,以及上传打印设备的状态信息;远程管理端使用WebSocket协议与云服务器相连,获取并显示终端3D打印设备的主要信息,也可以对终端打印设备的参数信息进行配置。终端与远程管理端组成了远程更新系统的核心部分。

图1 远程更新系统结构

2 终端设计

终端硬件选取系统时钟频率为48 MHz的汽车电子芯片KEAZ128,该芯片基于ARM Cortex-M0+内核,拥有128 KB大小的Flash区域和16 KB的RAM区域,包含模拟、定时、通信和控制等模块[4]。NB-IoT通信模组选取ME3616,它支持串口AT指令,TCP/UDP、MQTT等网络协议。将ME3616通信模组的UART模块与KEAZ128芯片UART0模块经电路转换后相连接,实现数据传输,并将eSIM卡作为固定部件接入到通信模组中,实现3D打印机中集成NB-IoT通信模组,为远程更新做好硬件准备。

软件部分主要包含了Flash扇区分配、BIOS程序设计、应用程序设计3个部分。

2.1 Flash扇区分配

为了实现远程更新的功能,需要将终端节点的程序划分成两个部分:负责更新应用程序的BIOS程序和控制设备实现3D打印功能的应用程序。在Flash空间中进行分区存储BIOS程序和应用程序是实现远程更新的第一步,在此基础上还需设计驻留驱动构件以及存储更新代码的方案。

文献[5]结合GPRS、ZigBee技术实现远程更新系统,借助SD卡暂存新机器码,其硬件成本较高、可移植性较差;为暂存新机器码文献[6]从Flash中划分了一块与应用程序大小相同的暂存区,导致应用程序的规模受到了限制。针对以上不足,对Flash分区方案进行优化。如图2所示,将Flash区域划分为BIOS程序区、应用程序区和设备配置信息区3个部分。

图2 KEAZ128的Flash划分

在驻留驱动构件函数方面,本文采用请求管理调用(supervisor call,SVC)机制取代划分专用的Flash区域的方式,将驱动构件驻留在BIOS程序区中,通过SVC机制向应用程序提供驱动接口;存储更新代码方面,不采用划分暂存区的方式,而是与应用程序复用一块Flash区域,从而扩大应用程序规模。

2.2 BIOS程序设计

引导加载程序(Bootloader)[7]是指在启动内核或应用程序之前运行的程序,其主要目的是为应用程序准备好运行的环境。本文基于Bootloader程序,设计了嵌入式版基本输入输出系统(basic input and output system,BIOS)程序。BIOS程序除了拥有引导加载程序的基本功能,还具备对应用程序进行远程更新、为应用程序提供底层驱动构件函数接口的功能。BIOS程序涉及的关键技术包括:中断向量表重定向、驱动构件驻留、程序跳转以及远程更新。

2.2.1 中断向量表重定向

中断向量表是一段用来连续存储中断服务程序(ISR)起始地址的区域,一般存放在Flash区域中。由于BIOS程序和应用程序都在运行、维护各自的中断向量表,当运行3D打印的应用程序时,BIOS程序将无法响应中断,导致很难实现远程更新的功能。因此BIOS程序和应用程序需要共享一张中断向量表,即将两个程序的中断服务程序的地址记录在一张中断向量表中。由于Flash以扇区为单位进行擦除操作,不易对向量表中的部分表项进行修改,而修改RAM区域中的数据却无此操作要求。因此在本文中先将BIOS的中断向量表拷贝到RAM区,将之作为两个程序的共享表,之后对中断向量表进行重定向的操作。在ARM Cortex-M0+处理器中可以将RAM区中共享的中断向量表的首地址赋值给向量表偏移寄存器(vector table offset regi-ster,VTOR),从而实现对中断向量表的共享和重定向。

2.2.2 驱动构件驻留

BIOS程序驻留应用程序常用的驱动构件可以简化应用程序的开发,在远程更新应用程序时,基础驱动构件程序也无须更新,进而减少通信的传输量。本文在BIOS程序中驻留驱动构件并借助SVC机制向3D打印应用程序开放驱动构件接口。SVC机制是使任务能够触发特定OS异常的软件中断机制,通过该指令可以触发SVC中断,并执行对应的中断服务程序[8]。SVC指令包含一个8位立即数,其中0号表示系统指令,本文中使用的是1号指令即“svc 1”,用于返回驻留在BIOS程序中的驱动构件函数的接口。

2.2.3 程序跳转

上电后首先运行的是BIOS程序,为应用程序准备好运行环境,之后再跳转到指定的3D打印应用程序。通过获取应用程序的Reset_Handler复位向量(即应用程序的中断向量表的第二项)的地址,并赋值给程序计数器(program counter,PC),即可实现由BIOS程序跳转至应用程序的功能,该功能使用汇编语言实现,具体代码如下:

void user_reset(volatile uint_32 addr){

__asm(" push{r0, r1, lr};");

//(1)给栈指针SP寄存器赋值

__asm(" mov r1,r0;"); //r0中为C语言默认的第一个参数

__asm(" ldr r1,[r1];"); //取出USER程序SP的值

__asm(" mov sp,r1;"); //赋给CPU内部SP寄存器

//(2)转至USER的Reset_Handler执行

__asm(" ldr r0,[r0,#4];"); //r0←User的Reset_Handler地址

__asm(" blx r0;"); //跳转至USER程序Reset_Handler函数

//(3)结尾

__asm(" pop {r0, r1, pc};");

}

2.2.4 远程更新

在远程通信方面,选用KEA128芯片的串口模块(UART0)使用AT指令与ME3616模组进行交互,模组再与服务器进行通信获得数据。其中将芯片与通信模组交互有关的一系列函数封装成uecom构件,该构件主要包含控制通信模块供电状态、初始化接口、获取通信模组的IMSI号、与基站建立连接、与服务器建立TCP连接、通过TCP通道发送数据、从串口中断获取服务器发来的数据等函数,终端与服务器的通信步骤如图3(a)所示。

图3 远程更新判断

终端节点发起远程更新的请求,服务器提供相应服务,因此需要在终端程序中判断是否需要远程更新的操作,该判断应该由BIOS程序执行,具体流程如图3(b)所示,其中可以依据Flash扇区的前4个字节判定是否存在应用程序,它存放的是堆栈指针(stack pointer,SP),若存在应用程序,该指针应该指向栈顶(KEAZ128为0x20003000),若不存在应用程序时,该指针的值一般为0xffffffff。在进行程序更新时,为避免出现更新不完整的情况,将最后写入Flash区的前4个字节。

终端节点提供了2种存储新代码的方式:①当Flash区域空间足够同时容纳新、旧代码时,在应用程序后的空闲的扇区暂存新代码;②当Flash区域空间不足时,擦除之前应用程序的代码后,存储新代码。

2.3 应用程序设计

应用程序存储在BIOS程序之后的扇区,主要用于实现3D打印功能,并每隔一段时间就将终端设备的主要信息通过NB-IoT上传至远程管理端。当应用程序需要更新时,可通过BIOS程序向应用程序的Flash区写入新机器码实现。面曝光3D打印机的工作流程如图4所示,先将模型切分得到切片位图,再使用投影设备将切片位图投射到装有液态光敏树脂的液槽中,利用紫外线照射使树脂固化成膜并附着在成型台面上,最后逐层累积固化膜从而打印出模型实体[9]。

图4 3D打印流程

应用程序使用KEAZ128芯片的UART、PWM、UART、KBI、GPIO等外设资源,实现对设备信息的感知以及对执行机构的控制,通过UART串口接收上位机发送的指令以及发送反馈信息至上位机,调整PWM的频率可以有效控制电机运动的速度,使用KBI捕捉限位开关的状态,当电机运行至限位开关处则立即停止电机,利用GPIO控制紫外线灯的亮暗从而有效控制曝光的时长,进而机器可以根据打印流程完成3D打印任务。

3 远程管理端设计

3D打印的远程管理软件是指用户能对终端设备中的嵌入式应用程序进行远程更新操作的交互软件,包含解析机器码文件(.hex文件)以及设计更新方案。

3.1 .hex文件解析

.hex(Intel HEX)是一种可以直接烧录到单片机中的机器码文件,使用GCC编译器可以将C程序、汇编程序编译成.hex文件。该文件中的每一行对应一条机器码记录[10],共有6种类型的记录,每条记录由6个字段组成,字段的具体含义见表1。

表1 .hex文件记录的格式及语义分析

写入机器码时,可以通过扩展段地址、扩展线性地址类型的记录辅助计算出数据段在Flash中的地址,BIOS程序再将数据记录中的数据段写入指定位置。以记录为单位解析.hex文件,提取记录类型为“00”的数据记录的数据长度、数据内容,以及通过偏移量与当前的扩展地址(由“02”和“04”记录类型改变)相加获得该条数据的存储位置,最后将得到数据长度、记录类型、存储地址、数据内容以及校验和组成一个结构体存入链表中,.hex文件提取的具体流程如图5所示。

图5 .hex文件解析流程

3.2 更新方案

远程管理端解析机器码文件后,借助NB-IoT技术将机器码和控制命令发送给终端设备。为保证数据的完整性和可靠性,本文设计了通信帧格式以及5种命令帧:开始帧、复制帧、机器码数据帧、检查帧、更新命令帧。

通信帧格式见表2,包含7个字段:帧头、长度、帧序、命令、数据、校验、帧尾,其中校验码使用的是16位CRC校验,生成多项式为G(X)=X16+X15+X2+1。

表2 通信帧格式

开始帧:命令字段为“0x00”,该帧主要包含了通信的总帧数、新机器码占用的Flash扇区数、程序版本信息,用于通知终端节点为更新操作做好准备工作。

复制帧:命令字段为“0x01”,包括复制的次数、复制字符串的长度、复制操作在Flash区域的源地址以及目标地址。根据复制帧携带的信息从旧程序拷贝机器码,采用增量式更新方式,减少需要传输的代码量,仅当远程管理端保存了旧程序且终端节点剩余的扇区足够存储新程序时才能采用该方式。

机器码数据帧:命令字段为“0x02”,该帧用于传输机器码段数,每段机器码的存储地址、长度、机器码数据,终端节点收到该命令帧后将机器码存放到指定的位置。

检查帧:命令字段为“0x03”,用于检查在更新过程中,终端节点是否丢帧以及所丢帧的帧号,远程控制端将对丢帧情况进行补发,从而提高远程更新的成功率。

更新命令帧:命令字段为“0x04”,通知终端节点更新机器码并反馈更新结果。

3.3 通信流程

系统中终端设备、服务器端以及远程管理端的通信流程如图6所示。终端打印设备将信息传递给服务器,服务器再将数据传输给远程管理端的程序,该过程为数据上行;远程管理端通过服务器将配置信息传输给终端打印设备为数据下行的过程,整个过程将服务器端维护的上行表与下行表作为中转站。终端设备通过通信模组与服务器成功建立TCP连接后,便可向服务器端发送设备的状态信息以及请求远程更新。远程管理程序与服务器使用WebSocket协议成功建立连接后可获取设备状态,以及修改终端配置参数,修改的信息将会保存在下行表中,将在终端设备与服务器再一次成功连接后发送给终端设备,并对终端信息进行更新。

图6 通信流程

4 实验结果与评估

本实验终端程序在结合了ME3616通信模组的KEAZ128芯片上进行,并使用Visual Studio 2013平台进行远程控制端程序的开发,更新的界面如图7所示。在应用程序中新增传感器信息采集等任务,得到大小不同的机器码文件,并以此进行远程更新实验,其中方案A是将存储完BIOS程序之后的95 KB的Flash区等分为两块,分别用作应用程序区和新机器码暂存区,上位机发送全部的机器码给终端,终端设备将接收到机器码存储在新机器码暂存区;方案B为本文方案,应用程序与新代码暂存区复用一块Flash区,可用大小为95 KB,当Flash区能够同时容纳新旧机器码时,优先采用比较增量更新的方式以减少代码传输量,Flash区的大小不足以存储新旧机器码时,新的机器码将直接覆盖终端设备中的旧机器码。

图7 远程管理端更新界面

首先分别采用方案A与方案B对3个不同大小的机器码文件进行40次远程更新实验,对比两种方案的更新耗时以及成功率,结果见表3,可以看出当Flash区域能够同时容纳新旧机器码时,方案B所需传输的数据量较少,更新耗时不到方案A的一半。当机器码有效字节数为52.3 KB时,超出了方案A可容纳的最大尺寸导致更新失败,而方案B能够完成更新操作,且更新成功率可以达到95%。

表3 方案A与方案B实验结果对比

其次采用方案B分别对3个不同大小的.hex文件进行循环100次的远程更新操作测试,计算更新过程中的丢帧率以及平均耗时。从表4可知本文方案的丢帧率低于5%,且辅之以检查帧,可以对丢掉的帧进行重传,从而可以保证更新的成功率。平均每帧的下发、处理、接收时间在2.5 s左右,更新的效率较高。

表4 采用方案B更新测试

由实验结果可知,在终端节点能够暂存机器码且在远程管理端也保存了旧版本的机器码的条件下,采用比较增量

更新的方案,相较于传输全部的机器码方案,能够有效减小网络开销、大大缩短了更新时间;当应用程序规模较大时,若采取等分存储完BIOS程序后的Flash区域的方案,由于暂存区无法容纳新代码导致无法更新,而采用应用程序与更新代码共用一块Flash区域的方法能够有效扩大程序规模,实验结果表明,本文设计的远程更新方案的成功率较高,更新所需时间较短。

成功更新机器码后,进行3D打印实验,本文利用自主研制的数字光处理(DLP)3D打印机进行实验,该设备最大可打印120 mm×64 mm×300 mm的模型,其单层打印精度可达0.05 mm。选取尺寸为26.60 mm*25.54 mm*29.53 mm的“小飞龙”模型进行打印,每层的打印厚度为0.05 mm,打印结果如图8所示,打印出的模型表面光洁度较好、细节完整,结果表明本系统的控制精度较高,终端节点的应用程序能够完整、稳定地完成模型的打印工作。

图8 3D打印成品

5 结束语

本文设计了具备远程更新功能的BIOS程序以及3D打印应用程序,并在终端节点的Flash区域对这两个程序进行合理划分,从而有效减轻了开发应用程序的工作量、降低了开发难度。在远程更新方面,提供了两种更新方案:当远程管理端存有旧版本机器码文件且终端节点有足够空间暂存新版本机器码时,采用比较增量更新的方案,大大减轻了网络传输的负担,否则采用整体替换的方式,使用新的代码替换掉旧的代码,使得应用程序的规模扩大一倍。实验结果表明更新后的3D打印机能够很好地完成打印功能。

本文设计的远程更新系统采用构件化的思想,具备很好的可维护性,可适用于基于NB-IoT技术的多种远程通信方式以及有远程维护需求的众多应用场景,对维护自动化设备中的嵌入式程序具有很大的参考价值。

猜你喜欢

远程管理模组应用程序
GSM-R网络SIM卡远程管理技术方案研究
删除Win10中自带的应用程序
光学薄膜技术及在背光模组中的应用研究
谷歌禁止加密货币应用程序
高速公路表贴透镜模组设计浅谈
浅谈石墨烯材料在LED路灯模组中的应用及该模组的设计
被忽视的远程管理模块
Radmin在服务器远程管理中的应用
西门子全新远程管理平台使远程访问安全简便
一种大面积OLED模组均匀调光技术研究