OneNET主要的功能有:
- BS
- 连接请求
- 下发Delete
- 下发Discover<OneNET平台没有这个命令>
- 下发Write
- 下发BS结束命令
- 服务器基本操作
- 注册
- 更新
- 注销
- Notify
- 下发Observe
- 下发Discover
- 北向操作
- 下发Read
- 下发Write
- 下发Execute
- 特殊的处理方法
- Notify的分包上报
- Read命令的分包上报
- Write命令的分包下发URC
- FOTA操作在以上几项中已全部包含,区别只是它引用了预置对象object 5
- SOTA操作,和FOTA类似也是引用预置对象object 5。区别是在进行SOTA是会多下发一个执行5/0/26550指示此次升级是SOTA
在分析以上需求后,我自己在VS2015中实现了相关功能,其代码将在后续的博文中给出。现在先介绍如何实现这些功能。为了实现以上功能,需要:
- CON数据的重发功能,包括BS连接请求,注册,更新,注销以及可选的Notify上报。
- Notify的分包上报。Read的处理方式和Notify基本一致,采用相同的方法
- Write操作分包吐URC功能
- Observe、Discover、Execute以及BS命令的回复都是可以一次性回复的,单次组包直接上报就行了
- 保存基本Object和对应资源列表的数据
对于1采用的是使用1个重发链表ConfirmItem,在组包完成后将数据放到这个链表中,然后做好重发相关设置之后由系统自动重发,并在收到ACK消息或失败后想消息队列中投放对应的消息。
对于2采用的是使用一个上报的结构体NotifyContext和ReadContext,两个结构体是一样的。此结构中有链表保存分次传入的数据。在分次结束后将链表中的数据打包一次性上报。在OneNET平台中,上报资源数据采用的是TLV格式,如果上报的是单个资源数据则TLV可以只包含资源数据;如果上报的是数个资源的组合则必须将资源数据嵌套到Instance里面,即外面一层是Instance的TLV,里面包含数个资源的TLV。在上报时,Notify的mid是一直在变的,并且它需要一个链表ObserveItem保存订阅命令的mid和token。而上报Read数据的mid则必须对应于下发请求的mid,其下发请求数据保存在RequestItem里。
对于3采用的是在存放北向操作需手动回复的命令结构体RequestItem中增加一些数据,保存来自Write命令的payload数据和一个索引。在Write命令下发时,将索引置为0并吐第一个写资源数据,在用户回复后将索引加1并吐对应的下一个URC……直到索引到达结束处再向平台回复。
对于4采取的方法是:如果是可以直接回复的命令Observe、部分的Discover、部分的Execute以及所有的BS阶段的命令,则收到请求后直接组包回复。如果需要手动回复的命令再将其放到RequestItem里,等待用户使用AT命令回复。
对于5采用的是使用ObjectItem保存Object和Instance,使用ResourceItem保存Object和对应的Resource。
现阶段已实现的功能有:注册、更新、注销、Observe自动回复、Discover回复、Execute回复和Notify单包或分次组包上报。BS由于不知道怎么组包,所以只写了一部分。Read的分次组包上报和Notify几乎完全一致,所以没写,需要的可以复制Notify的处理代码改一些就行了。Write的分次吐URC没写。