OneNET平台通信开发(一)

OneNET主要的功能有:

  1. BS
    • 连接请求
    • 下发Delete
    • 下发Discover<OneNET平台没有这个命令>
    • 下发Write
    • 下发BS结束命令
  2. 服务器基本操作
    • 注册
    • 更新
    • 注销
    • Notify
    • 下发Observe
    • 下发Discover
  3. 北向操作
    • 下发Read
    • 下发Write
    • 下发Execute
  4. 特殊的处理方法
    • Notify的分包上报
    • Read命令的分包上报
    • Write命令的分包下发URC
  5. FOTA操作在以上几项中已全部包含,区别只是它引用了预置对象object 5
  6. SOTA操作,和FOTA类似也是引用预置对象object 5。区别是在进行SOTA是会多下发一个执行5/0/26550指示此次升级是SOTA

在分析以上需求后,我自己在VS2015中实现了相关功能,其代码将在后续的博文中给出。现在先介绍如何实现这些功能。为了实现以上功能,需要:

  1. CON数据的重发功能,包括BS连接请求,注册,更新,注销以及可选的Notify上报。
  2. Notify的分包上报。Read的处理方式和Notify基本一致,采用相同的方法
  3. Write操作分包吐URC功能
  4. Observe、Discover、Execute以及BS命令的回复都是可以一次性回复的,单次组包直接上报就行了
  5. 保存基本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没写。

猜你喜欢

转载自www.cnblogs.com/mengxiangdu/p/11144876.html