1.2.3.4.14 miio( 调试)

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

更新时间:2018-09-14 13:52:13

    TinyEngine 为接入小米设备,在TinyEngine的 Native 层,实现了小米设备 miio 通信协议,并向上提供了 JS 调用接口,这些接口都封装在 miio 这个对象中。本地 miio 库实现数据传输通道(包括会话建立、加密发送数据、解密接收数据等)和事件转发,具体的设备模型(属性、接口、事件)在JS应用层可见。

本扩展对象仅仅为开发者提供如何对接小米miio设备的方法。

miio 对象接口说明

  • 创建设备

    • miio.createDevice(host, token)
      • host - 设备的ip地址
      • token - 设备对应的token
      • return - 设备标识
  • 注册设备事件监听器

    • miio.deviceOnEvent(device, cb)
      • device - miio.createDevice创建的设备
      • cb - function (event) {} 类型的回调函数
      • return - 无
  • 控制设备

    • miio.deviceControl(device, method, args, sid)

      • device - miio.createDevice创建的设备
      • method - 设备控制接口,如:set_power
      • args - 设备控制接口参数,如:["on"],["off"]等
      • sid - 子设备标识,控制device下的子设备时才会用到,其他情况不用填写
      • return - 设备返回子符串

      注:该接口为同步接口,最长等待时间为2秒

  • IP自发现

    • miio.discover(timeout, cb)
      • timeout - 单位为秒
      • cb - function(host, deviceId) {} 类型的回调函数

示例

如何获取小米设备的 token,如何获取小米设备不同品类的属性和设备模型,请参见 设备联动示例

console.log("=================================");
console.log("         demo-miio-scene         ");
console.log("=================================");

// miio 为 Natvie Modules,按照小米设备接入协议实现的扩展对象

var lightDevice;

// 控制开灯
function lightOn() {
  console.log("lightOn");
  if (lightDevice) {
    miio.deviceControl(lightDevice, "set_power", '["on"]');
  }
}

// 控制开关
function lightOff() {
  console.log("lightOff");
  if (lightDevice) {
    miio.deviceControl(lightDevice, "set_power", '["off"]');
  }
}

function setupLight(host) {
  // 创建小米灯设备,如何获取小米设备的token,
  //其具体方法和步骤请见:设备联动示例
  lightDevice = miio.createDevice(
    host,
    "Please input your device's token !"
  );

  // 初次启动时,第一次关闭小米灯
  lightOff();
}

function setupGateway(host) {
  // 创建小米 Zigbee 网关设备:如何获取小米设备的token,
  //其具体方法和步骤请见:设备联动示例
  var gatewayDevice = miio.createDevice(
    host,
    "0a7b7e5af0fc0b1b4877b0907834f9a7"
  );

  var motionSensorId = null;
  var timeout = null;
  // 注册监听事件,回调函数
  miio.deviceOnEvent(gatewayDevice, function(event) {
    console.log("gateway receive event");

    var obj = JSON.parse(event);
    var open = false;

    if (obj.data) {
      open = JSON.parse(obj.data).status === "motion";
    }
    //如果人体感应器检测到人,则开灯,如果一分钟没有感应到人存在,则关灯
    if (obj.cmd === "report" && obj.sid === motionSensorId && open) {
      lightOn();
      if (timeout) {
        clearTimeout(timeout);
        timeout = null;
      }
      //每分钟接收一次
      timeout = setTimeout(function() {
        lightOff();
      }, 60 * 1000);
    }
  });

  // 获取小米网关的设备列表
  var device_list = miio.deviceControl(
    gatewayDevice,
    "get_device_prop",
    '["lumi.0","device_list"]'
  );
  console.log("device list: " + device_list);

  // 从小米网关下挂的设备列表中,找到人体感应设备,网关下的其他设备可以按照类似的方法
  var deviceList = JSON.parse(device_list);
  for (var i = 0; i < deviceList.result.length; i++) {
    if (deviceList.result[i + 1] === 2) {
      motionSensorId = deviceList.result[i].substring(5);
      console.log("motion sensor id: " + motionSensorId);
      break;
    }
  }
}

miio.discover(20, function(host, deviceId) {
  console.log('discovered device, host: ' + host + ', deviceId: ' + deviceId);
  if (deviceId === 61632282) {
    setupLight(host);
  } else if (deviceId === 78463041) {
    setupGateway(host);
  }
});