NodeJS SDK物模型开发

这一篇接着上一篇继续根据阿里云提供的物模型开发文档往下讲。

监听云端下发的服务调用消息

1、首先需要在物联网平台设置一个功能为服务的自定义功能
NodeJS SDK物模型开发_第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、首先在物联网平台定义事件物模型
NodeJS SDK物模型开发_第2张图片
NodeJS SDK物模型开发_第3张图片

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);
  })
});

NodeJS SDK物模型开发_第4张图片
NodeJS SDK物模型开发_第5张图片

你可能感兴趣的:(NodeJS SDK物模型开发)