基于IoT物联网平台实时控制LED灯开关实战

本文涉及的产品
物联网平台,标准版 1个月
IoT设备身份认证,上限1000台 1个月
简介: 智能灯开发实战
+关注继续查看

基于Pub/Sub模式的同步调用实战

1.同步调用场景

1.1 背景

MQTT协议是基于PUB/SUB的异步通信模式,无法实现服务端下发指令给设备端,同时需要设备端返回响应结果的场景。
IoT物联网平台基于MQTT协议制定了一套请求和响应的同步机制,无需改动MQTT协议即可实现同步通信。应用服务器通过POP API发起Rrpc调用,IoT设备端只需要在Timeout内,按照固定的格式回复Pub消息,服务端即可同步获取IoT设备端的响应结果。

具体流程如下:

1.2 Topic格式约定

请求:/sys/${productKey}/${deviceName}/rrpc/request/${messageId}
响应:/sys/${productKey}/${deviceName}/rrpc/**response**/**${messageId}**

$表示变量,每个设备不同
messageId为IoT平台生成的消息ID,
设备端回复responseTopic里的messageId要与requestTopic一致

示例:

设备端需要订阅:

/sys/${productKey}/${deviceName}/rrpc/request/+

运行中设备收到Topic:

/sys/PK100101/DN213452/rrpc/request/443859344534

收到消息后,在timeout时间内回复Topic:

/sys/PK100101/DN213452/rrpc/response/443859344534

2.同步调用RRPC示例

2.1 设备端代码

const mqtt = require('aliyun-iot-mqtt');
//设备属性
const options = require("./iot-device-config.json");
//建立连接
const client = mqtt.getAliyunIotMqttClient(options);

client.subscribe(`/sys/${options.productKey}/${options.deviceName}/rrpc/request/+`)
client.on('message', function(topic, message) {
    
    if(topic.indexOf(`/sys/${options.productKey}/${options.deviceName}/rrpc/request/`)>-1){
        handleRrpc(topic, message)
    }
})

function handleRrpc(topic, message){
    topic = topic.replace('/request/','/response/');
    console.log("topic=" + topic)
    //普通Rrpc,响应payload自定义
    const payloadJson = {code:200,msg:"handle ok"};
    client.publish(topic, JSON.stringify(payloadJson));
}

2.2 服务端POP调用Rrpc

const co = require('co');
const RPCClient = require('@alicloud/pop-core').RPCClient;

const options = require("./iot-ak-config.json");

//1.初始化client
const client = new RPCClient({
    accessKeyId: options.accessKey,
    secretAccessKey: options.accessKeySecret,
    endpoint: 'https://iot.cn-shanghai.aliyuncs.com',
    apiVersion: '2018-01-20'
});

const payload = {
  "msg": "hello Rrpc"
};

//2.构建request
const params = {
    ProductKey:"a1gMu82K4m2",
    DeviceName:"h5@nuwr5r9hf6l@1532088166923",
    RequestBase64Byte:new Buffer(JSON.stringify(payload)).toString("base64"),
    Timeout:3000
};

co(function*() {
    //3.发起API调用
    const response = yield client.request('Rrpc', params);

    console.log(JSON.stringify(response));
});

rrpc响应:

{
    "MessageId": "1037292594536681472",
    "RequestId": "D2150496-2A61-4499-8B2A-4B3EC4B2A432",
    "PayloadBase64Byte": "eyJjb2RlIjoyMDAsIm1zZyI6ImhhbmRsZSBvayJ9",
    "Success": true,
    "RrpcCode": "SUCCESS"
}

// PayloadBase64Byte 解码: {"code":200,"msg":"handle ok"}

3.物模型-服务同步调用InvokeThingService示例

注意:物模型 服务调用 接口InvokeThingService,不是Rrpc

设备订阅subTopic

注意:服务同步调用API是InvokeThingService

/sys/${productKey}/${deviceName}/rrpc/request/+

IoT云端下行的payload格式

{
 "id": 3536123,
 "version": "1.0",
 "params": {
   "入参key1": "入参value1",
   "入参key2": "入参value2"
 },
 "method": "thing.service.{tsl.service.identifier}"
}

设备响应replyTopic

/sys/${productKey}/${deviceName}/rrpc/response/request的消息Id

设备响应payload格式

{
 "id": 3536123,
 "code": 200,
 "data": {
   "出参key1": "出参value1",
   "出参key2": "出参value2"
 }
}

3.1 物模型-同步服务定义

3.2 设备端实现

const mqtt = require('aliyun-iot-mqtt');
//设备属性
const options = require("./iot-device-config.json");
//建立连接
const client = mqtt.getAliyunIotMqttClient(options);

client.subscribe(`/sys/${options.productKey}/${options.deviceName}/rrpc/request/+`)
client.on('message', function(topic, message) {
    
    if(topic.indexOf(`/sys/${options.productKey}/${options.deviceName}/rrpc/request/`)>-1){
        handleRrpc(topic, message)
    }
})
/*
* 如果存在多个同步调用服务,需要通过payload里的method区分
*/
function handleRrpc(topic, message){

    topic = topic.replace('/request/','/response/');
    console.log("topic=" + topic)
    //物模型 同步服务调用,响应payload结构:
    const payloadJson = {
        id: Date.now(),
        code:200,
        data: {
            currentMode: Math.floor((Math.random() * 20) + 10)
        }
    }

    client.publish(topic, JSON.stringify(payloadJson));
}

注意:设备端响应的payload要满足物模型定义的出参结构

3.3 服务端POP 接口InvokeThingService

const co = require('co');
const RPCClient = require('@alicloud/pop-core').RPCClient;

const options = require("./iot-ak-config.json");

//1.初始化client
const client = new RPCClient({
    accessKeyId: options.accessKey,
    secretAccessKey: options.accessKeySecret,
    endpoint: 'https://iot.cn-shanghai.aliyuncs.com',
    apiVersion: '2018-01-20'
});

const params = {
    ProductKey: "a1gMu82K4m2",
    DeviceName: "h5@nuwr5r9hf6l@1532088166923",
    Args: JSON.stringify({ "mode": "1" }),
    Identifier: "thing.service.setMode"
};

co(function*() {
    try {
        //3.发起API调用
        const response = yield client.request('InvokeThingService', params);

        console.log(JSON.stringify(response));
    } catch (err) {
        console.log(err);
    }
});

调用结果:

{
    "Data":{
        "Result": "{\"currentMode\":12}",
        "MessageId": "1536145625658"
    },
    "RequestId": "29FD78CE-D1FF-48F7-B0A7-BD52C142DD7F",
    "Success": true
}
相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
12月前
|
消息中间件 监控 物联网
阿里云iot物联网平台监控设备 在线离线状态 解决方案
阿里云iot物联网平台监控设备 在线离线状态 解决方案
1371 0
阿里云iot物联网平台监控设备 在线离线状态 解决方案
|
物联网
《阿里云IoT物联网平台技术介绍和入门实战》电子版地址
阿里云IoT物联网平台技术介绍和入门实战
98 0
《阿里云IoT物联网平台技术介绍和入门实战》电子版地址
|
JavaScript 数据可视化 物联网
iot studio中使用物联网平台提供的api
iot studio中使用物联网平台提供的api。
260 0
 iot studio中使用物联网平台提供的api
|
消息中间件 运维 监控
|
数据可视化 物联网 API
物联网平台 --- iot studio跳转页面传递数据
跳转页面时将参数附带到另一个页面。
280 0
物联网平台 --- iot studio跳转页面传递数据
|
物联网 数据格式
物联网平台 --- iot studio 如何控制 “闪烁告警”组件
通过配置数据接口,控制组件的扩散速度。
296 0
物联网平台 --- iot studio 如何控制 “闪烁告警”组件
|
存储 物联网 数据挖掘
阿里云物联网平台 - iot studio调用 “新版本数据分析” 接口展示设备数据
物联网数据分析LA(Link Analytics)是阿里云为物联网开发者提供的数据智能分析产品,针对物联网数据特点,提供海量数据的存储备份、资产管理、报表分析和数据服务等能力,帮助企业用户更容易地挖掘物联网数据中的价值
409 0
阿里云物联网平台 - iot studio调用 “新版本数据分析” 接口展示设备数据
|
SQL 存储 数据采集
阿里云物联网平台 - iot studio调用 “老版本数据分析” 接口展示设备数据
老版本数据分析:是阿里云为物联网开发者提供的设备智能分析服务,全链路覆盖了设备数据采集、管理(存储)、清洗、分析等环节,有效降低了数据分析门槛,实现了设备数据与业务数据的融合分析透视
289 0
阿里云物联网平台 - iot studio调用 “老版本数据分析” 接口展示设备数据
|
监控 JavaScript 数据可视化
国内四大 IoT 物联网平台选型综合评估报告
近年来,国内两轮电动车保超3亿辆,电动自行车充电火灾呈多发频发趋势。今年8月1日国家颁布了《高层民用建筑消防安全管理规定》,要求电动车独立区域集中停放、充电,充电装置应具备定时断电、过载保护、短路保护、漏电保护等功能 ,促进了电动车智能充电行业的爆发。
1019 0
国内四大 IoT 物联网平台选型综合评估报告
|
域名解析 数据采集 运维
解密IoT物联网平台设备如何快速上云、实现全球就近接入
近年来,物联网技术正以指数级的速度日渐成熟,并潜移默化的改变着人们的生活。根据国际数据公司IDC的预测估计,到2025年,将有416亿台联网的IoT设备或“物”,生成79.4 ZB的数据。同时IDC中国研究数据显示,2020年全球物联网支出达到6904.7亿美元,其中中国市场占比23.6%。IDC预测,到2025年全球物联网市场将达到1.1万亿美元,年均复合增长11.4%,其中中国市场占比将提升到25.9%,物联网市场规模全球第一。
解密IoT物联网平台设备如何快速上云、实现全球就近接入
相关产品
物联网平台
推荐文章
更多