数据点协议

机智云为了方便设备协议的定义、开发,并提供通用数据接口访问设备状态和历史数据,制定了数据点协议和机遇数据点协议的通用指令

数据点协议定义了和设备通讯所承载的单个数据的类型、变换、长度,和整个数据包的封包、解包规则。

其中类型(data_type)包括以下类型:

  • 布尔型(bool):可以使用 bit 来表示
  • 枚举类型(enum):可以使用 bit 来表示
  • 数字类型(unit8,unit16,unit32,uint64):采用无符号数值进行传输,可以表示8、16、32、64位的整数和浮点数,通过 unit_spec 进行定义
    • min:, (x 最小值)
    • max:, (x 最大值)
    • ratio:, (修正系数k, default=1)
    • addition:, (增量m, default=0)
    • 显示值 y 计算公式:y = k * x + m
    • 传输值 x:uint
  • 扩展类型(binary):采用二进制数据封装其他自定义类型,固定长度
    • 从 0 开始自动累加
    • ["item 0", "item 1"],定义对应的显示信息

每种类型都可以指定为以下特性(type):

  • 读写:status_writable
  • 只读:status_readonly
  • 报警:alert
  • 故障:fault

同时定义了该数据点在响应包的偏移量和长度:

  • byte_offset:字节序偏移量
  • bit_offset:位偏移量
  • unit: 单位,byte 或者 bit
  • len: 字节或位长度

每个数据点都有对应的命名和描述信息:

  • name:对应的变量名
  • display_name:显示名称
  • desc:详细的描述

并且提供了通用基础指令

  • 写指令:指定要写的字段,和字段内容
  • 读指令:请求读取所有数据点
  • 通知:设备主动给上位机推送信息,包括所有数据点

获取产品配置

使用 Product Key 获取设备数据点配置

http://site.gizwits.com/v2/datapoint?product_key=

SDK 操作数据点指南

数据点协议参照后续样本定义

  • 写数据,使用 entity 和 attr 的 name 构建 Dictionary(iOS) 或者 JSON(Android)

JSON 结构如下:

{
    "GoBoard": {
        "set_led_color_R": 254,
        "set_led_color_G": 100,
        "set_led_color_B": 55
     }
}

如更新 LED 颜色 iOS

 [device write:@{@"GoBoard": @{@"set_led_color_R": @254, @"set_led_color_G": @100, @"set_led_color_B": @55}}];

或者 Android

JSONObject entity = new JSONObject();
JSONObject attrs = new JSONObject();

attrs.put("set_led_color_R", 254);
attrs.put("set_led_color_G", 100);
attrs.put("set_led_color_B", 55);

entity.put("GoBoard", attrs);

device.write(entity.toString());

收到硬件数据回调, iOS

  - (BOOL)XPGWifiDevice:(XPGWifiDevice *)device didReceiveData:(NSDictionary *)data result:(int)result
 {
     //处理P0数据刷新
     NSDictionary *_data = [data valueForKey:@"data"];
     if (_data) {
         NSDictionary *values = [_data valueForKey:@"GoBoard"];
         NSNumber *brightness = [values valueForKey:@"set_led_brightness"];
         NSLog(@"接收到的LED亮度:%@", brightness);
     }

     //处理报警数据刷新
     NSArray *_alters = [data valueForKey:@"alters"];

     //处理错误数据刷新
     NSArray *_faults = [data valueForKey:@"faults"];

     //处理二进制数据刷新
     NSArray *_binary = [data valueForKey:@"binary"];
 }

或者 Android

 public void didReceiveData(XPGWifiDevice device, ConcurrentHashMap<String, Object> dataMap, int result) {
      if (dataMap.get("data") != null) {
           Log.i("info", (String)dataMap.get("data"));
           // 返回主线程处理P0数据刷新
      }

      if (dataMap.get("alters") != null) {
           Log.i("info", (String)dataMap.get("alters"));
           // 返回主线程处理报警数据刷新
      }

      if (dataMap.get("faults") != null) {
           Log.i("info", (String)dataMap.get("faults"));
           // 返回主线程处理错误数据刷新
      }

      if (dataMap.get("binary") != null) {
           Log.i("info", "Binary data:" + bytesToHex((byte[])dataMap.get("binary")));
           // 返回主线程处理二进制数据刷新
      }
 };

主线程中处理P0数据举例:

     JSONObject result = new JSONObject(data);
     JSONObject values = result.getJSONObject("GoBoard");

     int brightness = values.getInt("set_led_brightness");
     Log.i("info", "brightness: " + brightness);
                return true;

数据点样本

以下为 GoKit 的数据点协议样本

 {
     "protocolType": "standard",
     "packetVersion": "0x00000004",
     "product_key": "a001192634a511e4ac3200163ee2253c",
     "name": "机智云开发套件",
     "entities": [
         {
             "id": 0,
             "name": "GoBoard",
             "display_name": "机智云开发套件",
             "attrs": [
                 {
                     "id": "1",
                     "name": "set_led_brightness",
                     "display_name": "设定LED亮度",
                     "desc": "......",
                     "type": "status_writable",
                     "data_type": "uint8",
                     "position": {
                         "byte_offset": 0,
                         "bit_offset": 0,
                         "unit": "byte",
                         "len": 1
                     },
                     "uint_spec": {
                         "min": 0,
                         "max": 254,
                         "step": 1,
                         "ratio": 1,
                         "addition": 0
                     }
                 },
                 {
                     "id": "2",
                     "name": "set_led_color_R",
                     "display_name": "设定LED颜色R值",
                     "desc": "......",
                     "type": "status_writable",
                     "data_type": "uint8",
                     "position": {
                         "byte_offset": 1,
                         "bit_offset": 0,
                         "unit": "byte",
                         "len": 1
                     },
                     "uint_spec": {
                         "min": 0,
                         "max": 254,
                         "step": 1,
                         "ratio": 1,
                         "addition": 0
                     }
                 },
                 {
                     "id": "3",
                     "name": "set_led_color_G",
                     "display_name": "设定LED颜色G值",
                     "desc": "......",
                     "type": "status_writable",
                     "data_type": "uint8",
                     "position": {
                         "byte_offset": 2,
                         "bit_offset": 0,
                         "unit": "byte",
                         "len": 1
                     },
                     "uint_spec": {
                         "min": 0,
                         "max": 254,
                         "step": 1,
                         "ratio": 1,
                         "addition": 0
                     }
                 },
                 {
                     "id": "4",
                     "name": "set_led_color_B",
                     "display_name": "设定LED颜色B值",
                     "desc": "......",
                     "type": "status_writable",
                     "data_type": "uint8",
                     "position": {
                         "byte_offset": 3,
                         "bit_offset": 0,
                         "unit": "byte",
                         "len": 1
                     },
                     "uint_spec": {
                         "min": 0,
                         "max": 254,
                         "step": 1,
                         "ratio": 1,
                         "addition": 0
                     }
                 },
                 {
                     "id": "5",
                     "name": "set_motor_speed",
                     "display_name": "设定电机转速",
                     "desc": "......",
                     "type": "status_writable",
                     "data_type": "uint16",
                     "position": {
                         "byte_offset": 4,
                         "bit_offset": 0,
                         "unit": "byte",
                         "len": 2
                     },
                     "uint_spec": {
                         "min": 0,
                         "max": 65000,
                         "step": 1,
                         "ratio": 1,
                         "addition": -32500
                     }
                 },
                 {
                     "id": "6",
                     "name": "env_temperature",
                     "display_name": "环境温度",
                     "desc": "......",
                     "type": "status_readonly",
                     "data_type": "uint8",
                     "position": {
                         "byte_offset": 6,
                         "bit_offset": 0,
                         "unit": "byte",
                         "len": 1
                     },
                     "uint_spec": {
                         "min": 0,
                         "max": 250,
                         "step": 1,
                         "ratio": 1,
                         "addition": -125
                     }
                 },
                 {
                     "id": "7",
                     "name": "env_humidity",
                     "display_name": "环境湿度",
                     "desc": "......",
                     "type": "status_readonly",
                     "data_type": "uint8",
                     "position": {
                         "byte_offset": 7,
                         "bit_offset": 0,
                         "unit": "byte",
                         "len": 1
                     },
                     "uint_spec": {
                         "min": 0,
                         "max": 100,
                         "step": 1,
                         "ratio": 1,
                         "addition": 0
                     }
                 },
                 {
                     "id": "8",
                     "name": "ir_detection",
                     "display_name": "红外探测",
                     "desc": "是否探测到红外信号",
                     "type": "status_readonly",
                     "data_type": "bool",
                     "position": {
                         "byte_offset": 8,
                         "bit_offset": 0,
                         "unit": "bit",
                         "len": 1
                     }
                 },
                 {
                     "id": "9",
                     "name": "fault_led",
                     "display_name": "led灯故障",
                     "desc": "......",
                     "type": "fault",
                     "data_type": "bool",
                     "position": {
                         "byte_offset": 9,
                         "bit_offset": 0,
                         "unit": "bit",
                         "len": 1
                     }
                 },
                 {
                     "id": "10",
                     "name": "fault_temperature",
                     "display_name": "温度传感器故障",
                     "desc": "......",
                     "type": "fault",
                     "data_type": "bool",
                     "position": {
                         "byte_offset": 9,
                         "bit_offset": 1,
                         "unit": "bit",
                         "len": 1
                     }
                 },
                 {
                     "id": "11",
                     "name": "fault_humidity",
                     "display_name": "湿度传感器故障",
                     "desc": "......",
                     "type": "fault",
                     "data_type": "bool",
                     "position": {
                         "byte_offset": 9,
                         "bit_offset": 2,
                         "unit": "bit",
                         "len": 1
                     }
                 },
                 {
                     "id": "12",
                     "name": "fault_motor",
                     "display_name": "电机故障",
                     "desc": "......",
                     "type": "fault",
                     "data_type": "bool",
                     "position": {
                         "byte_offset": 9,
                         "bit_offset": 3,
                         "unit": "bit",
                         "len": 1
                     }
                 },
                 {
                     "id": "13",
                     "name": "fault_ir_detection",
                     "display_name": "红外探测故障",
                     "desc": "......",
                     "type": "fault",
                     "data_type": "bool",
                     "position": {
                         "byte_offset": 9,
                         "bit_offset": 4,
                         "unit": "bit",
                         "len": 1
                     }
                 }
             ]
         }
     ],
 }