Skip to content

TCP协议设备接入

准备工作

启动物联网平台

请参考教程5分钟快速运行

创建产品

访问产品管理菜单栏,点击创建产品按钮,根据页面提示填写参数,然后单击“确定”,完成产品的创建。

参数 参数值
产品名称电表
所属品类标准品类
选择标准品类进入选择品类页面,输入多功能电表,点击查询,选择搜索结果
节点类型直连设备
接入协议TCP
数据类型标准物模型
网络类型以太网
工厂根据实际情况填写
描述请根据实际情况填写

点击进入产品详情页面,点击"为发布"按钮,发布产品。

创建设备

访问设备管理菜单栏,点击添加设备按钮,添加方式选择单个设备,根据页面提示填写参数,然后单击“确定”,完成设备的创建。

参数 参数值
设备名称test_001
所属产品电表
关联驱动不填写
设备描述请根据实际情况填写

下载官方HTTP驱动

访问驱动镜像菜单栏,点击驱动市场,下载HTTP协议驱动。

下载成功后,会在我的驱动出现一条记录。

设备与驱动绑定

访问设备管理菜单栏,勾选刚刚创建的设备,点击批量驱动绑定按钮,弹出绑定页面,关联驱动选择TCP官方驱动开头的数据,点击确定按钮进行绑定。

绑定成功后,关联驱动一栏会出现驱动具体驱动名称。

启动驱动

访问我的驱动菜单栏,点击操作->编辑按钮。

打开Docker启动参数开关,输入-p 7653:7653 点击确定。

tcp粘包问题处理。

设备使用tcp协议传输数据时,可能造成粘包问题,对此蜂鸟物联网平台提供两种解决方案。

方法1、固定长度处理粘包

每次发送固定缓冲区大小数据。客户端和服务器约定每次发送请求的大小。例如客户端发送 1024 个字节,服务器接受 1024 个字节。

打开自定义参数开关,输入如下内容,其中bytes_len的值可以由用户自定义配置,如果未设置,则默认为1024。

json
{
    "rule_name":"fixedLength",
    "bytes_len":1024
}

方法2、使用分隔符处理粘包

基于定界符来判断是不是一个请求(结尾’\n’). 客户端发送过来的数据,每次以 \n 结束,服务器每接受到一个 \n 就以此作为一个请求。然后对其拆分后的头部部分与前一个包的剩余部分进行合并,这样就得到了一个完整的包。

打开自定义参数开关,输入如下内容。

json
{
    "rule_name":"delimiter"
}

注意

如果用户未打开自定义参数开关,则默认使用分隔符处理粘包,界定符为’\n’。

消息协议说明

参数名称大小示例说明
package length4byte75message数据包长度
header length4byte40message数据包长度
version2byte1版本号,传递时固定为1
operation2byte1操作类型,分为11种类型,详情请参见下方
sequenceID36byted7f2ece9-cd2b-4ec3-b18a-56777cf30290传递uuid
messagen byte"{}"消息内容,详情请参见下方

操作类型

鉴权(发送)

operation = 1

message格式

json
{
  "device_id": "99735615",//设备id
  "product_id": "54289730",//产品id
  "token": ""//设备接入token,具体计算方法参见下方。
}

属性上报(发送)

operation = 2

message格式

json
{
  "sys": {
    "ack": true //如果ack设置为true,服务器会会属性上报做响应
  },
  "params": {
    "Ia": { //属性标识符
      "value": 40, //属性值
      "time": 1712473482000 //毫秒时间戳,如果不带此字段,平台会取当前时间
    }
  }
}

属性上报响应(接收)

operation = 3

message格式

json
{
    "code": 200,
    "msg": "success"
}

事件上报(发送)

operation = 4

message格式

json
{
  "sys": {
    "ack": true //如果ack设置为true,服务器会会属性上报做响应
  },
  "params":{
    "eventCode":"Error",//事件标识符
    "eventTime":1712474219000,//毫秒时间戳,如果不带此字段,平台会取当前时间
    "outputParams":{
      "M_STATUS":true
    }
  }
}

事件上报响应(接收)

operation = 5

message格式

json
{
  "code": 200,
  "msg": "success"
}

属性设置(接收)

operation = 6

message格式

json
{
  "params": {
    "breaker_control": true //breaker_control为属性标识符 , true为属性值
  }
}

属性设置响应(发送)

operation = 7

message格式

json
{
  "success": true,
  "code": 200,
  "errorMessage": ""
}

属性获取(接收)

operation = 8

message格式

json
[
  "Ia",
  "Ib"
]

属性获取响应(发送)

operation = 9

message格式

json
{
  "params": [
    {
      "code": "Ia", //属性标识符
      "value": 10,  //属性值
      "time":1699412942089 //毫秒时间戳
    },
    {
      "code": "Ib", //属性标识符
      "value": 20,  //属性值
      "time":1699412942089 //毫秒时间戳
    }
  ]
}

服务调用(接收)

operation = 10

message格式

json
{
  "code": "reportlog", //服务标识符
  "inputParams": { //输入参数
    "text": "/temp" //属性值
  }
}

服务调用响应(发送)

operation = 11

message格式

json
{
  "code": "file", //服务标识符
  "outParams": { //输出参数
    "result": "/temp" //属性值
  }
}

状态码

状态码 信息 说明
200-成功
10001system error系统错误
10002rpc request errorrpc请求错误
10003too many requests并发请求数据超过设定
10004the format of result is error请求数据格式错误
20001device not found未找到该设备
30001product not found未找到该产品
40001data size is not within the defined range上报数据大小未在指定区间
40002data report type error上报数据格式错误
40003property code not found属性标识符没有找到
40004event code not found事件标识符没有找到
40005data length is greater than the defined上报数据长度未在指定区间
40006invalid Parameter无效的uri参数
40007auth PermissionDenytoken错误