1、第4章 LTE无线通信技术开发4.3 LTE协议栈解析与应用开发EducationSolutions目录ContentsInternet+协议栈工作流程协议栈执行原理协议栈关键接口函数22:13/3开发场景智慧交通是一个综合性的城市服务项目,项目中蕴含着多种使用场景,如交通关键节点的数据信息采集,采集后的数据需要通过LTE网络发送到远程控制中心;如城市交通路障管理,当城市路障节点接收到控制指令时可以执行相应的控制操作;这些复杂的功能操作都需要一个强大的软件系统。22:13/4任务目标通过基于LTE无线网的城市空气质量采集和调节项目实例了解LTE的网络协议栈的工作原理和协议栈的关键接口,学习和掌
2、握企业协议栈接口的使用,掌握应用接口的使用,通过使用应用接口能够实现快速的LTE无线传感网络开发。22:13/5contiki操作系统Contiki 是一个开源的、高度可移植的多任务操作系统,适用于联网嵌入式系统和无线传感器网络。Contiki 适用于存储器资源十分受限的嵌入式单片机系统,典型的配置下 Contiki 只占用约 2Kbytes 的 RAM 以及 40Kbytes 的 Flash 存储器。Contiki 操作系统是基于事件驱动(Event-driven)内核的操作系统。Contiki 系统内部集成了两种类型的无线传感器网络协议栈:uIP 和 Rime。22:13/6事件驱动Con
3、tiki 两个主要机制:事件驱动和 protothread 机制,前者是为了降低功耗,后者是为了节省内存。在 Contiki 系统中,事件被分为以下三种类型:进程可以设置一个定时器,在给定的时间完成之后生成一个事件,进程一直阻塞直到定时器终止,才继续执行。定时器事件(timer events)外围设备连接到具有中断功能的微处理器 IO 引脚,触发中断时可能生成事件。外部事件(external events)任何进程都可以为自身或其它进程指定事件。内部事件(internal events)22:13/7protothread 机制传统的操作系统使用栈保存进程上下文,每个进程需要一个栈,这对于内存
4、极度受限的传感器设备将难以忍受。protothread 机制恰解决了这个问题,通过保存进程被阻塞处的行数(进程结构体的一个变量,unsiged short 类型,只需两个字节),从而实现进程切换,当该进程下一次被调度时,通过 switch(_LINE_)跳转到刚才保存的点,恢复执行。整个 Contiki 只用一个栈,当进程切换时清空,大大节省内存。22:13/8Contiki的系统运行分析Contiki内核是基于事件驱动的,系统运行可以视为不断处理事件的过程。Contiki运行通过事件触发完成,一个事件绑定相应的进程。22:13/9contiki用户进程与程序Contiki的用户进程建立较为简
5、单。用户进程的建立有三个步骤,分别是定义用户进程,在进程列表中添加进程信息,编写进程实体。PROCESS(hello,hello);定义用户进程 struct process*const autostart_processes=&hello,NULL;autostart_start(autostart_processes);进程列表中添加进程信息 PROCESS_THREAD(hello,ev,data).编写进程实体22:13/10进程实体编写进程实体/hello进程主体PROCESS_THREAD(hello,ev,data)PROCESS_BEGIN();/进程启动while(1)/进程
6、循环体printf(HelloWorld!rn);/进程打印信息etimer_set(&hello_timer,CLOCK_SECOND);/进程定时进入执行设置process_status=2;PROCESS_YIELD();/进程跳转PROCESS_END();/进程结束22:13/11Contiki的多种定时器Contiki包含一个时钟模型和5个定时器模型(timer,stimer,ctimer,etimer,and rtimer)5种timer简述如下:timer、stimer 提供了最简单的时钟操作,即检查时钟周期是否已经结束。程序从timer中读出状态,判断时钟是否过期。tmier
7、s 是使用的系统时钟的ticks,而stimers是使用的秒。Ctimer 回调定时器,驱动某一个回调函数。etimer 事件定时器,驱动某一个事件。Rtimer 实时时钟。22:13/12LTE无线函数接口分析EC20协议栈文件结构22:13/13EC20协议栈工程目录结构协议栈的工程目录比较简单,总的目录下只有三个文件分组,分别是app、core、zonesion。app是系统的contiki的脚本文件。Core是contiki-3.0微操作系统的系统文件。zonesion是和NB-IOT相关的驱动文件以及相关的协议文件。22:13/14EC20的项目开发目录LTE appLTE无线应用层
8、api at-uart.c调试串口初始化 at.c提供给串口调试的AT交互协议 zhiyun.c智云平台LTE通信接口 zxbee-sys-command.c处理下行的用户命令 zxbee.c无线数据包封包、解包 devLTE射频驱动及部分硬件驱动 lte-ec20.cEC20模块的AT指令操作文件 lte-inf.cEC20模块的接口操作文件 lte-tcp.cEC20的TCP连接配置文件 sensorNB-IoT节点传感器驱动 autoapps.cContiki操作系统进程列表 sensor.c传感器进程、驱动及应用 contiki-conf.hLTE网络参数配置 contiki-conf
9、.cContiki操作系统入口22:13/15EC20无线关键函数解析了方便操作,企业将EC20模块的操作通过AT指令进行了封装,通过contiki协议栈实现了EC20模块的高效利用。EC20的AT指令封装代码放置在协议栈工程目录的zonesion/LTE/dev目录下.编号文件名说明1lte-ec20.cEC20模块的AT指令操作文件2lte-inf.cEC20模块的接口操作文件3lte-tcp.cEC20的TCP连接配置文件4config.cSTM32F103系列内部Flash读写操作 5debug.c调试信息处理文件6key.c按键处理7leds-arch.cLED数据收发提示文件8re
10、lay.c继电器驱动代码22:13/16EC20无线关键函数解析协议栈中真正涉及到EC20模块的操作的文件时Lte-ec20.c、Lte-inf.c和Lte-tcp.c文件,根据从底层到上层的程序设计流程,文件的操作顺序为Lte-inf.c(初始化EC20模块的串口接口操作)、Lte-ec20.c(AT指令操作及执行文件)、Lte-tcp.c(TCP连接与数据收发操作)。22:13/17传感器应用接口分析智云传感器框架智云框架是在应用接口和无线协议接口上搭建起来的,通过合理调用这些接口,使项目的开发形成一套系统的开发逻辑。函数名称函数说明sensorInit()传感器硬件初始化sensorUp
11、date()传感器数据定时上报sensorControl()传感器/执行器控制函数sensorCheck()传感器预警监测及处理函数ZXBeeInfRecv()解析接收到的传感器控制命令函数PROCESS_THREAD(sensor,ev,data)传感器进程(处理传感器上报、传感器预警监测)22:13/18智云传感器程序解析智云框架下LTE无线节点示例程序基于Contiki系统框架开发,详细程序流程图如下:22:13/19智云框架硬件API节点传感器初始化函数与数据更新函数:void sensor_init(void)/执行传感器设备初始化操作代码段 void sensorUpdate(vo
12、id)char pData16;/获取系统传感器数据/更新更新数值并上报if(pData!=NULL)ZXBeeInfSend(pData,strlen(pData);/上传数据到智云平台22:13/20开发实践硬件功能设计从上图中可以得知,大气压力传感器使用内部随机数发生器产生虚拟数据,而继电器使用I/O进行控制。继电器原理图如下:22:13/21开发实践软件逻辑设计22:13/22开发实践设计通信协议为了实现LTE节点的数据能够实现远程与本地的识别,需要设计一套约定的通讯协议,约定的通信协议可以被远程设备和本地节点识别。根据项目特性设计通信协议如下:数据方向协议格式说明上行(节点往应用发送
13、数据)airPressure=XX表示采集的大气压力值下行(应用往节点发送指令)cmd=XX为0表示关闭,1表示开启。22:13/23开发实践LTE无线框架关键函数理解节点工程LTEApiTest内源码文件,理解无线协议进程及无线数据收发函数的处理。1)LTE无线协议进程zhiyun.c-PROCESS_THREAD(u_zhiyun,ev,data)。2)LTE无线数据收发api接口:void zhiyun_send(char*pkg)package_data_send(pkg);22:13/24开发实践LTE无线框架关键函数int package_data_send(char*zxbee)
14、if(tcp_con-status!=TCP_STATUS_CONNECTED)return-1;char*pbuf=gsm_tcp_buf();if(pbuf=NULL)Debug(package_data():error tcp buffer busy.rn);return-1;int len=sprintf(pbuf,method:sensor,data:%s,zxbee);gsm_tcp_send(tcp_con,len);/*修改心跳包时间*/etimer_set(&timer,CLOCK_SECOND*60);return len;22:13/25开发实践任务验证通xlabTools数据记录窗口可以查看到LTE模块发出的模拟大气压力数据”airPressure=101.0”22:13/26开发实践任务验证通过智云工具数据记录窗口可以查看到LTE模块发出的模拟大气压力数据22:13/27项目思考LTE协议栈的执行思路是怎样的?LTE协议栈是如何将AT指令融入其中的?LTE协议栈的数据收发是如何完成的?