这一篇接着上一篇继续根据阿里云提供的物模型开发文档往下讲。
监听云端下发的服务调用消息
1、首先需要在物联网平台设置一个功能为服务的自定义功能
服务的调用方式分为两种:同步和异步
同步指的是服务为同步调用时,云端会等待设备回复5秒;若设备没有回复,则调用超时。
异步指的是服务为异步调用时,云端执行调用后直接返回结果,不会等待设备的回复消息。
2、接下来是对云端服务的调用,我们使用的是python SDK来开发云端,使用的是调用设备服务的API:InvokeThingService,然后再github中找到相关代码并进行改写。
#!/usr/bin/env python
#coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkiot.request.v20180120.InvokeThingServiceRequest import InvokeThingServiceRequest
client = AcsClient('************', '************', 'cn-shanghai')
request = InvokeThingServiceRequest()
request.set_accept_format('json')
request.set_Args({'num_a':1,'num_b':2}) // 设置服务的输入参数
request.set_Identifier("add_async") // 设置调用服务的标识符
# request.set_IotId("IotId")
request.set_DeviceName("testdevice2")
request.set_ProductKey("a1qfDPbUCyE")
response = client.do_action_with_exception(request)
# python2: print(response)
print(response)
3、最后是对设备端的开发,使用的是Nodejs SDK
const iot = require('alibabacloud-iot-device-sdk');
// init device and connect linkplatform 初始化设备,并与物联网平台进行连接
const device = iot.device({
"ProductKey": "************",
"DeviceName": "************2",
"DeviceSecret": "************"
});
//示例服务是一个加法器,云端服务调用时给出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的服务
// res是服务端返回的参数,reply响应服务的函数可以使用同步或异步的方式
// onservice监听服务端下发服务调用的消息
device.onService('add_async', function (res,reply) {
console.log('add_async called,res:',res);
const { params:{num_a,num_b}={}} = res; //获取服务参数,获取res对象中params中的num_a,num_b的值,num_a,num_b必须与平台设置的服务参数的标识符一致
console.log(num_a,num_b);
const result = addFunc(num_a,num_b); //调用addFunc,在该函数中对数据进行编码
console.log('result',result);
reply(result); //返回处理结果
});
res:
当设置为同步调用模式是服务调用总是不成功,但是设置为异步就能够成功,还不知道原因,希望有大神可以解答。
事件上报
1、首先在物联网平台定义事件物模型
2、在设备端进行设备接入,并编写上报事件postevent代码
const iot = require('alibabacloud-iot-device-sdk');
const device = iot.device({
"ProductKey": "************",
"DeviceName": "************",
"DeviceSecret": "************"
});
device.on('connect', () => {
console.log('>>>>>connect');
device.postEvent("Alarmevent", {
alarmtype: 2,
}, (res) => {
console.log(`postEvent:`,res);
})
});