iot/docs/websocket.md
2023-12-08 12:03:54 +08:00

6.0 KiB
Raw Blame History

websocket通讯格式逻辑说明

消息体有四种格式

1. 主机发送的请求 (0x01)
2. 服务端对主机请求的响应 (0x02)
3. 服务端对主机的消息推送 (0x03)
4. 主机对服务器推送消息的响应 (0x04)

消息体的格式说明

<<消息体类型/1byte, PacketId/4byte, Packet/任意长度>> 

特殊说明

  • 服务器端处理异常时直接关闭websocket连接

消息类型说明

register消息

请求

<<0x01, PacketId:4, Method:1, Body:任意长度>>

PacketId: 4字节整数, 值必须大于0; Method: 0x00 Body: {uuid: string, salt: string, username: string, token: string}, json序列化后的二级制数据明文

响应

<<0x02, PacketId:4, Reply>> Reply: {code: 1, message: "ok"}

create_session消息

请求

<<0x01, PacketId:4, 0x01, PubKey:任意长度(公钥信息)>>

PacketId: 4字节整数, 值必须大于0;

响应

<<0x02, PacketId:4, Reply>> Reply: {a: bool, aes: "服务器生成的aes的值"}

data数据上传(无响应)

<<0x01, PacketId:4, 0x02, Body:任意长度>>

PacketId: 4字节整数, 值为0; Body:

{
    "service_name": "从该设备端的哪个服务采集的数据",
    // 如果为空,就表明是微服务产生的数据,如果有值,表示是设备产生的数据
    "device_id": $uuid 非设备产生的device_id为空
    "at": int, 精确到毫秒
    // 该微服务采集的数据是一个包含map的列表类型map的内容可以由微服务自己指定
    // 目前一般的格式是"metric-name": $value样式的数据
    "fields": [
        {
            "key": "test"
            "value": 124,
            "unit": "U",
            "type": "AI遥测值DI遥信值SOE事件",
            "timestamp": int
        }
    ],
    // 微服务自身可以生成tag用于微服务指定自己的一些性质目前使用得不多以后可以扩展
    // 是一个map[string]string类型的数据
    "tags": {
        "tag1": "value1",
        "tag2", "value2"
    }
    // todo 在insert数据到influxdb的时候需要增加service_name + host_uuid
}

ping数据上传(无响应)

<<0x01, PacketId:4, 0x03, Body:任意长度>>

PacketId: 4字节整数, 值为0; Body:

{
   // 硬件信息目前有剩余内存剩余磁盘和cpu负载
   // 剩余内存单位为mb

   "memory": {
      "total": 1024, // 内存数mb
      "used": "$int" // 剩余内存数
   },
   "disk": {
      "total": 1024, //  硬盘容量GB
      "used": "$int" // 剩余硬盘内容GB
   },

   "cpu_load":  $float, // 浮点数
   "cpu_temperature": $float // 稳定信息
   "cpu_core": $int,

   "boot_time": 2000, // 启动时间
   "efka_version": "1.0.0", // 客户端版本
   "kernel_arch": "arm64", // 客户端硬件架构
   "province": "", // 所在省
   "city": "", // 所在市
   "adcode": 100, // 所在城市的编号
   "ips": [
      "ip地址1",
      "ip地址2"
   ],
   // 接口信息
   "interfaces": [
      {
         "status": 0|1, "接口状态0离线1在线"
         "name": "接口名称",
         "desc": "接口描述",
      }
   ]
}

inform数据上传(无响应)

<<0x01, PacketId:4, 0x04, Body:任意长度>>

PacketId: 4字节整数, 值为0; Body:

{
  "at": $int64,
  // 微服务信息
  "services": [{
    "scene_id": $int "场景的编号",
    "name": "微服务名称",
    "version": "微服务版本",
    "version_copy": "微服务副本",
    // 微服务是否在线0表示离线1表示在线
    "status": 0|1
  }]
}

feedback_step数据上传(无响应)

<<0x01, PacketId:4, 0x05, Body:任意长度>>

PacketId: 4字节整数, 值为0; Body:

    {
  "task_id": "任务的task id",
  // sc为step code具体地
  //  0代表该任务开始了服务端创建该任务之后是这个代码
  //  1代表任务被分发了服务端向nats(mqtt)发送消息之后,是这个代码
  //  2代表任务被设备端接收到了
  //  3代表该任务已经被发送给微服务进行处理了
  //  4代表该任务已经被微服务收到了微服务正在处理
  //  5代表任务已经完成微服务已经处理完成。
  "code": $int
}

feedback_result数据上传(无响应)

<<0x01, PacketId:4, 0x06, Body:任意长度>>

PacketId: 4字节整数, 值为0; Body:

{
  "task_id": "任务id",
  // unix nano类型
  "time": $int,
  // 返回的结果码0代表成功其他代表出错
  "code": $int,
  "reason": "任务执行的结果",
  "error": "错误消息当c为非0时这个字段会表示出错消息",
  // 返回任务类型1表示任务是微服务下发0代表是命令下发
  "type": 0 | 1,
} 

主机上传终端设备的相关事件

<<0x01, PacketId:4, 0x07, Body:任意长度>>

PacketId: 4字节整数, 值为0; Body: 事件内容AES加密


设备的离在线状态

{
   "event_type": 1,
   "params": {
      "device_uuid": "",
      "status": 0 // 1在线 0离线
   }
}

主机上传AI事件

<<0x01, PacketId:4, 0x08, Body:任意长度>>

PacketId: 4字节整数, 值为0; Body: 事件内容AES加密


设备的离在线状态

{
   "event_type": 1, // 事件类型
   "params": {
      "device_uuid": "",
      "description": "垃圾溢满", 
      "datetime": "2023-06-10 12:00:00",
      "event_code": "事件编码,采集项下发的事件编码: 5位事件编码",  //1. 异物占道(异物识别) 20405 2.垃圾溢满 20453
      "attachments": [
          {
            "name": "垃圾溢满",
            "filename": "2023-12-10-xyz.hdc"
          },
          {
            "name": "垃圾溢满",
            "filename": "2023-12-10-xyz.hdc"
          }
      ]
   }
}