复杂协议

更新时间:2023-02-21 03:29:58下载pdf

本文提供了数据类型为部分采用字符型、透传型的产品功能(DP,Data Point)的解析说明,让您了解该类复杂 DP 协议解析规则。

适用范围

复杂协议适用于部分电工、照明、门锁类产品,且适用于部分字符型(String)和透传型(Raw)类型的标准功能。

您在了解这类复杂协议功能的组成规律后,能在跨品类选功能点、面板开发、智能小程序开发、云开发、大数据解析时查看,以及复用对应的取值。建议您按照标准协议规则进行设备端开发,以未来兼容更多的开发方式。

产品功能中,涂鸦支持布尔型、数值型、枚举型、故障型、字符型、透传型这六种数据类型。

  • 布尔型、数值型和枚举型是基础类型,大部分功能可通过这三种数据类型定义。
  • 字符型和透传型用于较复杂功能,只有当其他类型无法满足需求时,才推荐使用。

查看步骤

  1. 登录 涂鸦 IoT 开发平台

  2. 产品列表 中,找到一款开发中的照明、电工、或者门锁等产品,单击操作列的 继续开发

  3. 进入 功能定义 页面,在 标准功能 下,找到一个字符型或者透传型功能,如果出现了 协议解析说明 链接,单击该链接。

    复杂协议

  4. 复杂协议解析 页面,查看协议预览。

    复杂协议

协议预览

下图的协议解析规则中,F 代表字节,一个 F 表示一个字节,数字代表具体字段:

复杂协议
  • 每个字段用一个 F 展示,用于表示一个字节长度。

  • 每个字段下面展示对应的数字,每个数字代表具体协议字段。同时每个数字会有长度范围,对应字段长度。

  • 协议会存在循环情况,循环分为三种类型循环:无固定次数循环、固定次数循环、依赖循环,基于 1 个以上字段组成循环,并结合其他普通字段实现完整的复杂协议内容。

    • 无固定次数循环:根据接收到的总字段长度,动态计算循环次数,其存在位置为固定,但是长度为不固定的。
    • 固定次数循环:指定次数循环,其存在位置及长度均为固定。
    • 依赖字段循环:基于某一个字段的数值作为其循环次数,其存在位置及长度均为固定。
  • 循环解析规则:由于循环存在循环套循环的情况,解析循环时,应先解析内循环。待内循环解析完成,再解析上一级循环。

  • 字节长度定义:由于 Raw 格式为 16 进制组成,String 格式为字符形式,故协议解析时,默认以 Raw 格式字节长度定义,String 格式解析时,按照协议字段定义长度 × 2 进行逐位裁剪。

字段说明

复杂协议
  • 序号:协议字段序号,关系到协议字段的顺序。

  • 字段名称:协议字段的名称解释。

  • 长度:协议字段长度。

  • 数据类型:协议字段类型。目前,包括布尔、数值、枚举、String、周数据、比特位类型。不同类型对应属性值不一致。

  • 字段属性:具体字段属性值。

  • 说明:字段的补充解释说明。

    类型 参数名 说明 示例
    布尔型 bool 非真即假的二值型变量 开关功能的开或者关
    数值型 value 可线性调节类型的数据 温度调节,温度范围 20~40 °C
    枚举型 enum 自定义的有限集合值 工作档位:低档、中档、高档
    周数据 week 以二进制形式透传的数据 周一到周日的生效日期
    字符型 string 以字符形式传输的数据 -
    比特位 bit 以二进制形式透传的数据 bit0~bit7 的生效情况

解析示例

以下为一个复杂协议的 JSON 对象预览。JSON 对象的 key 为字段、组的标识符。字段的值为 JSON 对象、组的值为数组。多语言标识符需要通过 Dubbo 接口解析具体中英文。

{
    "bs2":[
        {
            "bs22":{
                "langKey":"30d7e1f1",
                "type":"string",
                "value":[
                    17
                ]
            }
        },
        {
            "bs22":{
                "langKey":"30d7e1f1",
                "type":"string",
                "value":[
                    34
                ]
            }
        }
    ],
    "bs1":{
        "langKey":"5165502",
        "type":"enum",
        "value":{
            "value":[
                2
            ]
        }
    },
    "bs4":[
        {
            "bs44":{
                "langKey":"731d3b7e",
                "type":"string",
                "value":[
                    85
                ]
            }
        },
        {
            "bs44":{
                "langKey":"731d3b7e",
                "type":"string",
                "value":[
                    17
                ]
            }
        },
        {
            "bs44":{
                "langKey":"731d3b7e",
                "type":"string",
                "value":[
                    17
                ]
            }
        },
        {
            "bs44":{
                "langKey":"731d3b7e",
                "type":"string",
                "value":[
                    17
                ]
            }
        }
    ],
    "bs3":[
        {
            "bs33":{
                "langKey":"d372e06a",
                "type":"string",
                "value":[
                    51
                ]
            }
        },
        {
            "bs33":{
                "langKey":"d372e06a",
                "type":"string",
                "value":[
                    68
                ]
            }
        }
    ]
}

简单字段类型(字符型、数值型)

{
    "langKey":"d372e06a",
    "type":"string",
    "value":[
        51
    ]
}
  • langKey:字段多语言标识符。
  • type:字段类型,取值 string、number。
  • value:int 数组。

周字段类型

{
    "langKey":"d372e06a",
    "type":"week",
    "value":[
        1,0,0,0,0,0,0
    ]
}
  • langkey:字段多语言标识符。
  • type:字段类型取值 week
  • value:int 数组,固定 7 位,从 0 到 6 位,数据坐标依次为周一至周末的取值。以上述案例举例表示周一启动。

多语言值字段类型(枚举型、布尔型)

{
    "langKey":"5165502",
    "type":"enum",
    "value":{
        "langKey":"d372e06a",
        "value":[
            2
        ]
    }
}
  • langKey:字段多语言标识符。
  • type:字段类型取值 enum、boolean。
  • value:JSON 对象。
  • langKey:值多语言标识符。若 value 未匹配到预定义的值,则会缺失。
  • value:int 数组。

比特字段类型

{
    "langKey":"2ecbe5e2",
    "type":"bit",
    "value":{
        "bit7":{
            "langKey":"8ebb4416",
            "index":7,
            "type":"boolean",
            "value":{
                "langKey":"2d3975fd",
                "value":[
                    0
                ]
            }
        },
        "bit5":{
            "langKey":"d0cc3145",
            "index":5,
            "type":"boolean",
            "value":{
                "langKey":"2d3975fd",
                "value":[
                    0
                ]
            }
        },
        "bit6":{
            "langKey":"fc9a8919",
            "index":6,
            "type":"boolean",
            "value":{
                "langKey":"2d3975fd",
                "value":[
                    0
                ]
            }
        },
        "bit3":{
            "langKey":"c978dd00",
            "index":3,
            "type":"boolean",
            "value":{
                "langKey":"7f18c924",
                "value":[
                    1
                ]
            }
        },
        "bit4":{
            "langKey":"15d5ee1e",
            "index":4,
            "type":"boolean",
            "value":{
                "langKey":"7f18c924",
                "value":[
                    1
                ]
            }
        },
        "bit1":{
            "langKey":"50b1a328",
            "index":1,
            "type":"boolean",
            "value":{
                "langKey":"7f18c924",
                "value":[
                    1
                ]
            }
        },
        "bit2":{
            "langKey":"18d3937b",
            "index":2,
            "type":"boolean",
            "value":{
                "langKey":"2d3975fd",
                "value":[
                    0
                ]
            }
        },
        "bit0":{
            "langKey":"801acde4",
            "index":0,
            "type":"boolean",
            "value":{
                "langKey":"2d3975fd",
                "value":[
                    0
                ]
            }
        }
    }
}
  • langKey:字段多语言标识符。

  • type:字段类型取值 bit。

  • value: 字段值,JSON 类型。比特字段属于“复合类型字段”,包含 8 个子字段。JSON 的 key 为子字段的标识符。

    子字段:

    • langKey: 子字段多语言标识符。
    • index:顺序号。
    • type: 子字段类型,取值为 boolean。
    • value:子字段取值(多语言类型)。
    • langKey:子字段取值多语言标识符。
    • value:子字段取值,int 数组。取值范围 0 或者 1

组字段类型

[
    {
        "a":{
            "langKey":"266edefb",
            "type":"string",
            "value":[
                12
            ]
        },
        "d":{
            "langKey":"01f1e022",
            "type":"string",
            "value":[
                18
            ]
        }
    },
    {
        "a":{
            "langKey":"266edefb",
            "type":"string",
            "value":[
                12
            ]
        },
        "d":{
            "langKey":"01f1e022",
            "type":"string",
            "value":[
                18
            ]
        }
    }
]
  • JSON 数组,相同的字段定义重复多次。
  • 不循环的组,是长度为 1 的数组。