一、简述
麒麟座开发板代码例程由onenet-基础例程、onenet-进阶例程、onenet-rtos例程组成,由浅入深地演示如何接入onenet,从最基本的上传数据点,命令接收处理,到网络维持,平台连接维持,到最后的网络错误处理,一步一步演示如何处理这些事情。
下面先以onenet-基础例程为例,讲解如何接入onenet。
二、onenet-基础例程模块分析
1. 代码框架说明
初始化开发板外围硬件;如led、蜂鸣器、按键等。
初始化网络模组;开发板板载gsm模组-m6312,可插拔的wifi-esp8266-01模组。
登录onenet。
执行相关上下行数据处理。
2. 代码功能简述
演示如何接入onenet,如何处理onenet推送的数据。
不具备网络维持能力,掉网后无法处理。
3. 初始化开发板外围硬件-hardware_init()函数
根据不同功能所需要用到的外围硬件不同,可根据自己使用的例程查看相应的硬件驱动代码,这里以 为例说明
麒麟座使用的stm32f103ret6单片机,mini板使用stm32f103c8t6单片机,都是f1系列,编程方式完全一致。
先配置单片机的中断分组,采用2:2配置;
然后初始化systick用来做阻塞延时;
然后初始化串口1和串口2,串口1用来调试打印,串口2和网络模组通信;
然后就是初始化led,蜂鸣器,按键,主要就是gpio的配置;
最后打印一下,提示硬件初始化完成。
4. 初始化网络模组-esp8266_init()函数
wifi模组的初始化比较简单:
先初始化相关控制的gpio。
然后先发送at,测试通信是否ok。
然后就是设置wifi工作模式、登录路由、连接ip。
如果是gsm模组,前两步相同,初始化控制gpio、发送at测试通信。然后是注册、激活网络、连接ip。
5. 登录onenet -onenet_devlink()函数
主要流程就是获取登录数据,然后发送出去,等待返回。
获取登录数据:
edp_packetconnect1(devid, apikey,256, &edppacket)
根据devid和apikey通过sdk生成登录数据,保存在edppacket里边。
发送:
esp8266_senddata(edppacket._data,edppacket._len);
指明要发送的数据和长度即可,调用此函数就会发送到onenet接入机。
等待结果
esp8266_getipd(250):从硬件层判断时间是否收到
edp_unpacketrecv(dataptr) ==connresp:
edp_unpacketconnectrsp(dataptr):
从软件层解析是否接入成功。
6. 执行相关上下行数据处理
上行数据
执行onenet_senddata()函数,会调用相关上传功能。
166行,是封装一个json,把要上传的内容写在里边
170行,根据devid、json格式和json封装协议包
175行,将协议包上传。
简单看看166行的内容
其中led_status.xxx,就是我们要上传的数据,按照json格式写好即可,如果新增数据点,复制高亮三行的任意一行加以扩展,然后把箭头的buf缓存开大一点即可。
下行数据
先判断驱动层是否收到数据,有则调用onenet_re**taptr)函数解析相关功能。
判断是否是下发命令,是则回复这个命令,然后做相关命令的处理
三、onenet-rtos例程模块分析
1. 代码框架说明
初始化开发板外围硬件;如led、蜂鸣器、按键等。
初始化网络模组;开发板板载gsm模组-m6312,可插拔的wifi-esp8266-01模组。
登录onenet。
执行相关上下行数据处理。
网络维持,网络监测、错误处理。
2. 代码功能简述
完整的开发板功能体验,所有传感器数据均上传,并包含一些监测类变量;完备的网络维持、监测、错误处理机制。
后文以与onenet通讯、网络监测、错误处理为重点进行分析。
3. 初始化开发板外围硬件-hardware_init()函数--main.c
基本流程和基础例程类似,初始化板载硬件,单片机片内外设等。
这里多了一个功能,将登陆的devid和apikey保存在eeprom里边,可以通过串口1按照资料中的格式进行更改而无需重新下载代码。
4. 初始化网络模组- net_device_init ()函数--net_task.c
这个函数不连接具体的ip,仅仅只是让网络模组具备网络接入能力即可。
5. 登录onenet- -net_task.c
onenet_getlinkip:获取该协议当前资源最优的接入ip和port。
onenet_connectip:连接ip和port。
onenet_devlink:根据devid和apikey 或者 proid和auth_info登录onenet设备。
6. 执行相关上下行数据处理--net_task.c
上行数据
在net_task.c-- net_**_task任务里,红框处,是定时上传的内容,这个任务以50ms周期执行一次,当累计300次-约15s时,可自行更改,触发一次上传数据的标志,箭头所指处。
然后在net_task.c--data_p_task任务里判断到标志置位,执行onenet_senddata(…)函数根据当前的data_stream值去打包一个待上传的数据包,但此时并不上传,而是放入一个单向链表里,原因稍后分析,如果上传成功,则返回值会改变onenet_info.send_data的值,如果错误,则会间隔一段时间后继续回来打包数据。
最终将数据发送出去的的是net_task.c--data_s_task任务判断表头是否为空,且网络连接正常,然后获取表里数据和对应长度,吧数据发往onenet。
简单说一下,为什么上传一包数据,分了三个步骤(触发、打包、发送),因为这样可以在其他地方方便地上传数据,只需要改变一个变量值即可,而不用调用复杂的打包、发送函数,对函数堆栈要求降低很多;然后发送作为一个单独的任务是为了网络模组稳定性,wifi和gsm发送数据的时间间隔不同,wifi可以快一点,当短时间内有很多包大小不同的数据包待上传时,发送必须要稳定,所以onenet_senddata(…)只是打包放入链表,发送函数以一个稳定的时间间隔来一包包的发出去。
下行数据
在net_task.c-- recv_task任务里边,只有一个函数onenet_cmdhandle
先是调用net_device_read()函数判断驱动层是否收到数据。
然后调用net_device_getipd(dataptr)判断是否具有ipd头,这里说明一下,在绝大多数网络模组里,在指令模式下,如果收到一帧网络数据,则会以ipd标识(不同网络模组这个头可能不一样),如果带有ipd头,则说明收到onenet推来的数据,进入onenet_revpro(ipdptr)函数进行处理。
处理函数里边先通过edp_unpacketrecv(cmd)判断推送数据的类型,以edp为例,有连接响应、命令下发、数据转发、心跳回复等,然后各自处理即可。
最后具体说说命令下发的处理机制。
先调用edp_unpacketcmd(…)函数解析出uuid、uudi长度、命令、命令长度。
然后是调用edp_packetcmdresp(…)函数打包命令回复的内容。
然后是调用callback_execute(...)函数处理命令,在cmd_callback.c里边可以找到处理的过程
调用callback_find_callback(…)找到红框处xxx的内容,这是是命令体,后边yyy是命令值,后边会用到
然后根据命令体对应的回调函数,执行响应的动作,比如redled,
调用callback_find_value(…)函数找到命令参数yyy
调用callback_str2dec(…)函数转为数值形式,方便执行开关处理。
大家在添加自己的命令和处理内容的时候添加两个地方
命令体和命令回调对应表
然后编写命令回调函数即可。
继续回到下行数据处理上来,处理完命令之后,就是释放相关内存,然后调用net_device_adddatasendlist(…)函数吧命令回复的内容加入链表,最后置位一下onenet_info.send_data上传一次数据,以更新onenet设备上的数据。
7. 网络维持—net_task.c
在net_**_task任务里边,和数据上传一样的流程,定时发送心跳,然后等待心跳返回正确的结果,以此判断网络是否通畅
同样的,在data_p_task任务里边调用onenet_senddata_heart()函数打包心跳数据并清除心跳标志,在data_s_task任务里真正发送出去,在onenet_revpro()函数里边解析心跳数据,收到则置位心跳标志,然后在onenet_check_heart()来检测心跳标志。
如果在规定时间内检测不到心跳标志,则会检测当前模组状态,根据状态分配错误等级,然后会进入相关错误处理。
8. 网络监测、错误处理
7中说到,心跳标志检测不到,会进入错误处理,先看看错误等级处理都干了什么:
fault.c--net_fault_process
将相关标志位清零,在任务里边检查到标志位变化,会执行对应功能,错误等级为1,只是负责重新连接一下ip。
错误等级2就是走初始化流程,去重新初始化一下网络模组了。
错误等级3是复位网络模组。
错误等级4是给网络模组断电后,等待一会,再打开。
那么错误等级如何确定,下面一一截图说明
net_fault_level_1的场景:
net_task.c--os_timercallback
在网络定时检测回调里,发送数据未得到回应次数超过规定次数时。
onenet.c--onenet_cmdhandle
当收到网络模组返回的连接关闭提示时。
onenet.c-- onenet_check_heart
心跳标志接收超时,且网络模组具备网络能力时。
net_fault_level_3的场景:
错误2和3通畅搭配使用,在重新初始化之前,先复位一下。
net_task.c--os_timercallback
当网络断开超过规定时间时。
onenet.c-- onenet_check_heart
心跳标志接收超时,且网络模组不具备网络能力时。
fault.c
在错误等级1下,在规定次数内还未连接成功时。
可以看到,在例程里边有很多地方都在保障网络的通畅性,一旦发生网络错误,则会根据响应状态制定错误处理,争取用最高效的方式重新接入onenet。
MPU抽象层设计与使用方法
英特尔酷睿I7 VS AMD R7鹿死谁手?酷睿I7让用户看到实力!
异构计算时代,RISC-V架构发展应该更大胆一些
工业用红外测温仪用什么传感器测温度更好
“慧眼”识人,传统工业机器人也能人机协作!
剖析中移物联网麒麟座开发板代码模块
人工智能在能源领域的主要用途
同步辐射CT技术揭示正负极串扰失效机理:不均匀的离子通量
超过400家新能源车企消失了
中兴通讯遭美重启制裁已成过去式,将痛定思痛,继续发扬拼搏创新的精神
2018年内存行业将推动半导体收入达4510亿美元 较比去年增长7.5%
Infineon推出超低电容及四线 ESD5V3U4U-HD
Intel展示新一代酷睿 基于10nm工艺打造2019年末推出
MAX15090/MAX15090B热插拔方案在阻性负载低压应用中的应用
6A RGB LED Driver Reference De
布局电力行业,巡检机器人的优势何在?
基于新一代SoC SH7264的图形仪表板开发平台
海上组合惯导的介绍(关于惯导在海上的应用)
以KaggleDays数据集为例,编码方法介绍
德国机器视觉市场销售额 连续8年创下新高