1.2.3.6.5.2 deviceShadow 设备模型

优质
小牛编辑
128浏览
2023-12-01

更新时间:2018-09-14 20:35:10

该模块让嵌入式设备通过 MQTT 协议,直接连接 LinkDeveloper 云平台,deviceShadow 提供设备的属性上报,事件触发,服务调用等功能,该模块自带设备模型,设备模型和 LinkDevelop 平台上创建的产品以及产品的标准模型有关。该模块支持 LiteJSE/DuktapeJSE

API 说明:

bindDevID(config) 绑定设备三元组

config介绍:

  config = {
    productKey: 'xxxxxx',
    deviceName: 'xxxxxx',
    deviceSecret: 'xxxxxx',
    domain: 'XXXXX',
    port: 1883
  }

domainport 是可选项, 默认是上海正式环境, domain:'iot-as-mqtt.cn-shanghai.aliyuncs.com', port:1883

可支持环境如下:

  1. 10.125.3.189:1883 //日常
  2. 100.67.80.75:80 //上海预发
  3. 100.67.85.156:80 //新加坡预发
  4. ${productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883 //上海正式
  5. ${productKey}.iot-as-mqtt.ap-southeast-1.aliyuncs.com:1883 //新加坡正式
  6. ${productKey}.iot-as-mqtt.us-west-1.aliyuncs.com:1883 //美西正式
  7. ${productKey}.iot-as-mqtt.ap-northeast-1.aliyuncs.com:1883 //日本正式
  8. ${productKey}.iot-as-mqtt.eu-central-1.aliyuncs.com:1883 //德国正式
  9. ${productKey}.iot-as-mqtt.us-east-1.aliyuncs.com:1883 //美东正式

start(notify_fn)

启动 deviceShadow 模块

nofity_fn 为注册的回调函数,启动 deviceShadow 完成时调用,包括成功或者失败
nofity_fn(err), err == null 表示连接正常,否则是错误信息

postProperty(name, value)

上报属性

未连云时也可以上报, 设备信息会缓存,等待上云连接成功之后会上报

postEvent(name,value)

上报事件

未连云时也可以上报, 设备信息会缓存,等待上云连接成功之后会上报

addDevSetPropertyNotify(name, ntfy_fn)

注册云端设置属性的回调处理

ntfy_fn(val), val云端设定的值

addDevCallServiceNotify(name, ntfy_fn)

注册云端远程调用服务的回调处理

ntfy_fn(msg, topic)
msg是云端下发的信息, topic服务主题

示例:

  1. 在嵌入式 JS 开发工作台上,创建测试工程并导入模块 deviceShadow。
  2. 编写测试 index.js 文件。
var deviceShadow = require(’deviceShadow‘);

console.log("=================================");
console.log("        deviceShadow test       ");
console.log("=================================");

function initDeviceShadow() {
  //设备三元组
  var config = {
    productKey: 'xxx',
    deviceName: 'xxx',
    deviceSecret: 'xxx',
    domain: 'xxxx',
    port: 1883
  };
  deviceShadow.bindDevID(config);
  deviceShadow.start(deviceShadowStartCB);
}

// 设备初始化回调函数
function deviceShadowStartCB(err) {
  if (err) {
    console.log('连接 LD 失败, err = ' + err);
    // 再次重连
    setTimeout(initDeviceShadow, 2000);
  } else {
    console.log('连接 LD 成功 ');
    registAllCloudNotify();

    console.log('上报属性');
    deviceShadow.postProperty('BatteryPercentage', 55);

    console.log('上报事件');
    deviceShadow.postEvent('Error', {
      ErrorCode: 0
    });
    deviceShadow.postEvent('Error', {
      ErrorCode: 1
    });
  }
}

// 注册所有云端设置设备端属性的处理函数
function registAllCloudNotify() {
  deviceShadow.addDevSetPropertyNotify('batteryAlarm', cloudSetProperty);
  deviceShadow.addDevCallServiceNotify('Reboot', cloudCallService);
}

// 设备端本地处理函数,将会注册到云端调用
function cloudSetProperty(val) {
  console.log('云端设置batteryAlarm=' + val);
}

function cloudCallService(msg, topic) {
  console.log('云端调用CallService, topic=' + topic);
  var val = JSON.stringify(msg);
  console.log('msg = ' + val);
}

var t1 = setInterval(function () {

  //每秒检测一次网卡是否连上网络?
  var ip = WIFI.getip();
  if (ip != null) {
    clearInterval(t1);

    //连云之前也可以post,设备信息会缓存,等待上云连接成功之后会上报

    console.log('开始链接 ' + 'LD Platform');

    process.nextTick(initDeviceShadow);
  }
}, 1000);