1、第2章 LoRa无线通信技术开发2.6 LoRa电子围栏系统开发与实现EducationSolutions目录ContentsInternet+项目场景安防程序逻辑分析安防类程序接口分析项目实践22:13/3项目场景畜牧牲畜对于农户来说是高价值产品,同时是保证收益的重要来源,因此为了保证牲畜在放养过程中不走失,需要为牲畜建立一个电子栅栏,当牲畜触发电子栅栏时,电子栅栏系统能够立即触发报警并通知农户及时处理牲畜走远的紧急情况,以方式造成不必要的经济损失。因此在智慧畜牧系统中使用电子栅栏对牲畜越过设定范围进行报警能够保证农户财产的安全,因此电子栅栏时智慧畜牧系统中的重要组成部分。电子围栏下图所示:
2、22:13/4任务目标智慧畜牧系统中的牲畜安全监测系统是保障农户财产的重要环节,本节以道电子栅栏系统为例学习在应用接口下的报警节点的程序开发,学习并掌握控制节点的操作逻辑和应用接口的使用。22:13/5安防类程序逻辑分析远程信息预警可以归纳为四种逻辑事件,逻辑事件归纳如下:节点安全信息定时获取并上报。当节点监测到危险信息时系统能迅速上报危险信息。当危险信息解除时系统能够恢复正常。当监测到查询信息时节点能够响应指令并反馈安全信息。22:13/6安防类程序逻辑分析安防类程序流程如图所示:22:13/7安防类程序逻辑分析1)每条数据以“”作为起始字符;2)“”内参数多个条目以“,”分隔;3)数据上行
3、格式参考:status=14)数据下行查询命令参考:status=?,程序返回:status=1此处以LoRa畜牧电子围栏系统为例定义了协议内容。约定协议如下:数据方向协议格式说明上行(节点往应用发送数据)sensorStatus=XX表示安防报警状态值下行(应用往节点发送指令)sensorStatus=?查 询 安 防 报 警 状 态 值,返 回:sensorStatus=X,X为1表示报警,Y为0表示正常22:13/8安防类程序接口分析智云传感器应用接口函数函数名称函数说明sensorInit()硬件设备初始化sensoUpdate()上传传感器实时数据和报警状态sensorCheck()
4、实时监测传感器报警状态,并实时预警上报ZXBeeUserProcess()解析接收到的下行控制命令PROCESS_THREAD(sensor,ev,data)传感器进程22:13/9安防类程序接口分析安防传感器程序逻辑流程设计如下:22:13/10安防类应用接口分析无线数据包收发函数:无线数据包解析函数:函数名称函数说明ZXBeeInfSend()节点发送无线数据包给汇集节点ZXBeeInfRecv()处理节点收到无线数据包函数名称函数说明ZXBeeBegin()增加ZXBee通信协议的帧头“”ZXBeeEnd()增加ZXBee通信协议的帧尾“”,并返回封包后的数据包指针ZXBeeAdd()Z
5、XBee通信协议的数据包中添加数据ZXBeeDecodePackage()对接收到的无线数据包进行解包22:13/11安防类应用接口分析电子围栏系统设计如下所示:22:13/12项目实践电子栅栏系统硬件框图设计如下,安全状态监测使用了外接光栅传感器,通过IO接口与芯片进行通信:22:13/13项目实践气体传感器节点LoRaGas工程实现了畜牧气体采集系统,该程序实现了以下功能:1)节点入网后,每隔20s上行上传一次气体传感器数值。2)应用层可以下行发送查询命令读取最新的气体传感器数值。LoRaGas工程采用类josn格式的通信协议(参数=值,参数=值,),具体如下:数据方向协议格式说明上行(节
6、点往应用发送数据)gratingStatus=XX表示采集的光栅状态值下行(应用往节点发送指令)gratingStatus=?查 询 光 栅 状 态 值,返 回:gratingStatus=X,X表示采集的光栅状态值。22:13/14项目实践l 传感器初始化光栅传感器初始化代码如下:void sensorInit(void)printf(sensor-sensorInit():Sensor init!rn);/初始化传感器代码grating_init();/光栅传感器初始化22:13/15项目实践void sensorUpdate(void)char pData16;char*p=pData;
7、updateGrating();ZXBeeBegin();/智云数据帧格式包头sprintf(char*)p,%u,gratingStatus);ZXBeeAdd(gratingStatus,p);p=ZXBeeEnd();/智云数据帧格式包尾if(p!=NULL)ZXBeeInfSend(p,strlen(p);/将需要上传的数据上传到智云平台printf(sensor-sensorUpdate():gratingStatus=%urn,gratingStatus);l 传感器主动上报传感器数据22:13/16项目实践l 光栅传感器实时监测及预警处理void sensorCheck(void
8、)static char lastgratingStatus=0;static uint32_t ct0=0;char pData16;char*p=pData;updateGrating();ZXBeeBegin();if(lastgratingStatus!=gratingStatus|(ct0!=0&clock_time()(ct0+3000)sprintf(p,%u,gratingStatus);ZXBeeAdd(gratingStatus,p);ct0=clock_time();if(gratingStatus=0)ct0=0;lastgratingStatus=gratingSta
9、tus;p=ZXBeeEnd();if(p!=NULL)int len=strlen(p);ZXBeeInfSend(p,len);printf(sensor-sensorCheck:Grating alarm!rn);22:13/17项目实践l 无线数据包命令解析int ZXBeeUserProcess(char*ptag,char*pval)int ret=0;char pData16;char*p=pData;printf(sensor-ZXBeeUserProcess():Receive LoRa Data!rn);if(0=strcmp(gratingStatus,ptag)/查询执
10、行器命令编码if(0=strcmp(?,pval)updateGrating();ret=sprintf(p,%u,gratingStatus);ZXBeeAdd(gratingStatus,p);return ret;22:13/18项目实践l 传感器驱动函数函数名称函数说明grating_init()光栅传感器初始化get_grating_status()获取光栅传感器状态22:13/19项目实践根据程序设定,光栅传感器节点每隔20s会上传一次光栅数值到应用层。同时通过ZCloudTools工具发送气体查询指令(gratingStatus=?),程序接收到响应后将会返回实时光栅数值到应用层。用物品穿过光栅传感器中间并遮挡光信号,可实现光栅数据的变化,光栅传感器输出为1,测试在ZCloudTools工具中每隔3s会收到电子围栏报警信息(gratingStatus=1)。22:13/20项目思考LoRa的危险报警场景有哪些?LoRa危险报警为何要定义数据协议?LoRa的危险报警使用了哪个接口函数?