物模型的开发方式让设备不用关心如何去订阅MQTT topic,而是调用物模型相关的接口来实现属性上报、服务监听、事件上报。
设备属性上报
API原型 | device#postProps(params, [callback]) |
---|---|
功能描述 | 上报属性 |
参数描述 |
- params 属性参数,Object 类型 - callback - res 服务端 reply 消息内容 |
示例代码:
// 上报设备属性
device.postProps({
LightSwitch: 0
}, (res) => {
console.log(res);
});
上面的示例代码用于上报一个名为LightSwitch的属性,其值为0,开发者也可参见完整参考代码。
属性设置
调用device.onProps()监听云端下发的属性设置。
API原型 | device#onProps(function(cmd)) |
---|---|
功能描述 | 监听来自云端的属性设置 |
参数描述 |
- function:收到命令时调用的回调函数 - cmd 服务端下发的命令 |
下面是收到消息的一个示例(cmd的内容):
{
method: 'thing.service.property.set',
id: '802031359',
params: { LightSwitch: 1 },
version: '1.0.0'
}
下面是对一个灯的开关属性进行设置时的示范处理代码:
// 监听云端设置属性服务消息,示例代码为一个灯
device.onProps((cmd)=>{
console.log('>>>onProps',cmd); //打印完整的属性设置消息
for(var key in cmd.params){
if(key=='LightSwitch'){ //判断是否设置的是LightSwitch属性
console.log('set property ',key);
//示例代码将云端设置的属性在本地进行保存,实际产品开发时需要修改为去将灯打开或者关闭
lightState = cmd.params.LightSwitch;
//本地设置完毕之后,将更新后的状态报告给云端。
//注意:云端下发命令后,云端属性的值并不会改变,云端需要等待来自设备端的属性上报
device.postProps({'LightSwitch': lightState});
}
}
})
监听云端下发的服务调用消息
API原型 | device#onService(seviceIdentifier, [callback]) |
---|---|
功能描述 | 监听服务设置 |
参数描述 |
- serviceIdentifier 服务ID,string类型 - callback |
res 服务端返回参数。
reply 响应服务的函数,可以使用同步可以异步方式响应。
下面是服务调用进行处理的代码示例:
//示例服务是一个加法器,云端服务调用时给出x和y,返回x和y的和
function addFunc(x,y){
let err;
if(x==undefined || y==undefined){
err = 'x or y invail value';
return {err,code:10001} //输入参数错误时的格式封装
}
//注意返回的是一个JSON对象,数据结果封装在data中
return {
data:{
z:x+y //z是服务定义中的输出参数
},
code:200
}
}
// subscribe add_async service,产品上定义了add_async的服务
device.onService('add_async', function (res,reply) {
console.log('add_async called,res:',res);
const { params:{x,y}={}} = res; //获取服务参数
const result = addFunc(x,y); //调用addFunc,在该函数中对数据进行编码
console.log('result',result);
reply(result); //返回处理结果
});
事件上报
API原型 | device#postEvent(eventIdentifier, params, [callback]) |
---|---|
功能描述 | 上报事件 |
参数描述 |
- eventIdentifier:事件ID,String 类型 - params 事件参数,Object 类型 - callback - err 错误,比如超时 - res 服务端 reply 消息内容 |
上报 id 为 eventIdentifier1 的事件示例代码:
device.postEvent('eventIdentifier1', {
//key1是事件'eventIdentifier1的参数'
key1: 'value1'
});
点击此处查看完整代码示例。