查看: 297|回复: 1

[中移One NET] kyLinMini学习笔记:4. NET代码学习之one net

[复制链接]

5

主题

1

好友

138

积分

童生

Rank: 2

  • TA的每日心情
    开心
    2017-8-23 08:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2017-8-29 22:20:34 |显示全部楼层
    EDP
    从协议层的角度来看,由于ESP8266是硬件协议栈,所以net_device的代码已经实现到了传输层,再往上的应用层便是由协议定义了。SDK代码里有EDP、HTTP和MQTT三种协议的实现,与OneNET平台连接时也需要选择所使用的是哪种协议,我们先来看EDP协议。EDP协议的参考文档需要看“资料、软件下载\资料\协议文档\EDP\设备终端接入协议2-EDP.docx”里的描述,很详细;协议中各种类型包的封装由EdpKit.c实现,首先是EDP报文的描述符EDP_PACKET_STRUCTURE,即EDP packet
    edp_packet.jpg



    EdpKit.c                        ---- EDP协议代码,后面的红字表明对应参考文档的第几节
    EDP_NewBuffer                                ---- 申请一个EDP packet
    EDP_DeleteBuffer                                ---- 释放一个EDP packet
    EDP_PacketConnect1                        ---- 构造1类连接的EDP packet,5.16.1
    ---- byte[0]:连接类型
    ---- byte[1]:剩余消息长度
    ---- byte[2~3]:协议名长度
    ---- byte[4~6]:协议名
    ---- byte[7]:协议版本
    ---- byte[8]:连接标志
    ---- byte[9~10]:连接保持时间
    ---- byte[11~12]:devid_len
    ---- byte[13~12+devid_len]:devid
    ---- byte[13+devid_len~14+devid_len]:apikey_len
    ---- byte[15+devid_len~15+devid_len+apikey_len]:apikey
    EDP_PacketConnect2                        ---- 构造2类连接的EDP packet,5.16.1
    ---- byte[0]:连接类型
    ---- byte[1]:剩余消息长度
    ---- byte[2~3]:协议名长度
    ---- byte[4~6]:协议名
    ---- byte[7]:协议版本
    ---- byte[8]:连接标志
    ---- byte[9~10]:连接保持时间
    ---- byte[11~12]:0
    ---- byte[13~14]:proid_len
    ---- byte[15~14+proid_len]:proid
    ---- byte[15+proid_len~16+proid_len]:authkey_len
    ---- byte[17+proid_len~17+proid_len+authkey_len]:authkey
    EDP_PacketSaveData                        ---- 存储(&转发)格式的数据包封装,5.56.3
    EDP_PacketPushData                        ---- 转发(透传)格式的数据包封装,5.36.2
    EDP_PacketCmdResp                        ---- 命令响应格式的数据包封装,5.86.6
    EDP_PacketPing                                ---- 心跳请求格式的数据包封装,5.96.7
    EDP_UnPacketRecv                        ---- 返回EDP packet类型,即数据包的第1个字节,4.1
    EDP_UnPacketConnectRsp                ---- 返回连接响应的返回码,即数据包的第4个字节,5.26.1
    ---- 0        连接成功
    ---- 1        验证失败:协议错误
    ---- 2        验证失败:设备ID鉴权失败
    ---- 3        验证失败:服务器失败
    ---- 4        验证失败:用户ID鉴权失败
    ---- 5        验证失败:未授权
    ---- 6        验证失败:授权码无效
    ---- 7        验证失败:激活码未分配
    ---- 8        验证失败:该设备已被激活
    ---- 9        验证失败:重复发送连接请求包
    EDP_UnPacketPushData                        ---- 解析转发(透传)格式的数据包封装,5.36.2
    EDP_UnPacketCmd                                ---- 解析命令请求格式的数据包封装,5.86.6
    WriteRemainlen                                ---- 写包头中剩余消息长度的部分,4.2
    ReadRemainlen                                ---- 读包头中剩余消息长度的部分,4.2
    在上层需要解析EDP包的时候直接调用EdpKit.c中的数据包封装和解析接口就可以了。需要注意的是EDP很多接口中都调用了EDP_NewBuffer,但是由于报文还要被继续处理和发送,所以接口在返回前不能释放,需要在上层代码中显式地调用EDP_DeleteBuffer来释放内存,否则就会造成内存泄漏。加粗的接口中有调用EDP_NewBuffer

    OneNET
    再往上就是OneNET层了,由onenet.c实现所有与OneNET平台通信的接口,首先还是数据结构
    onenet_info.jpg

    ONETNET_INFO oneNetInfo = {"xxxxxxxx", "ajdjfkajdkfjkejfajkdfjajdfqajdklfjl=",
                                                            "183.230.40.39", "876",
                                                            0, 0, 0, 1, 0};

    onenet.c                ---- OneNET平台应用
    OneNet_DevLink                                ---- 与OneNET平台创建连接
    OneNet_PushData                                ---- 设备与设备之间发送数据
    OneNet_SendData                                ---- 向OneNET平台发送数据,JSON格式或bin格式
    JSON格式的数据是调用NET_DEVICE_AddDataSendList放到发送链表中,由任务发送
    bin格式的数据当作图片传输,而且是调用NET_DEVICE_SendData直接发送
    OneNet_SendData_Heart                ---- 向OneNET平台发送心跳请求
    调用NET_DEVICE_AddDataSendList放到发送链表中,由任务发送
    OneNet_Check_Heart                        ---- 检测OneNET平台的心跳响应
    OneNet_RevPro                ---- 检查平台返回的数据,处理PUSHDATA,CMDREQ,SAVEACK报文

    JSON
    SAVEDATA消息支持的数据格式类型有
    save_data_type.jpg

    对应了代码中定义的5种JSON的类型用来构造上传到平台的消息格式,OneNET平台使用的是FORMAT_TYPE3kTypeSimpleJsonWithoutTime
    format_type.jpg


    关于JSON的相关内容可以参考以下链接,大概作用就是定义一种“用键值来描述对象信息”的消息格式,相当于定义了AP和平台服务器之间沟通的“语言语法”
    http://www.json.org/
    cJSON对数据流的描述符如下
    data_stream.jpg


    dStream.c                ---- cJson格式数据流通用封装
    DSTREAM_toString                                ---- DSTREAM中的数值转换为字符串
    DSTREAM_GetDataStream_Body        ---- 根据streamArray生成cJson格式的消息
    DSTREAM_GetDataStream_Body_Measure        ---- 测量streamArray可以生成的cJson消息的长度

    OneNET的代码看得差不多了,接下来就该分析一下系统中各个任务的作用和整个系统的运作流程了


    回复

    使用道具 举报

    1

    主题

    1

    好友

    203

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    无聊
    5 天前
  • 签到天数: 19 天

    连续签到: 4 天

    [LV.4]偶尔看看III

    发表于 2017-9-19 23:15:49 |显示全部楼层
    讲的十分详细学习学习了
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /5 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-10-23 12:04 , Processed in 0.226536 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部