GPIO widgets 主要用来对设备的GPIO状态的显示和控制。
https://thingsboard.io/docs/reference/mqtt-api/#rpc-api
一、GPIO状态显示
显示画面大致如下:
1、【高级】:
主要设置GPIO LED的位置,默认颜色,Pin,标签,背景色等。
其中Pin(接脚)设置的值很重要,根据数据的值控制那个Pin的Led灯亮。
2、【数据】:
主要用来设置什么数据为TRUE时,控制那个Pin的Led灯亮。
下例中使用了函数,实际业务中可以使用设备对应的实体,数据源一般为时间序列或者属性。
数据键配置中,标签(label)设置的和前面的Pin对应,表示此值为true时,把对应Pin的Led灯点亮。
测试脚本如下:
var period = time % 1500;
return period < 500;
如果使用时间序列,需要指定使用设备发送数据中的那个Key,如数据类似:{status: 1},1表示打开的话,可以如下配置。
二、GPIO远程控制
显示画面大致如下:
1、调用过程:
- 当点击控制按钮时,会调用rpc远程接口,类似如下:
官方说明:https://thingsboard.io/docs/user-guide/rpc/#server-side-rpc-api
http://127.0.0.1:8080/api/plugins/rpc/twoway/f8f18d90-11a8-11eb-be20-dba5ef0eb0f7
// 数据如下:
{
"method": "setGpioStatus",
"params": {
"pin": 2,
"enabled": true
},
"timeout": 500
}
- 服务器端收到请求后,会发布信息到mqtt主题。
所以,如果设备需要接受服务器的控制,需要提前订阅此主题。
官方说明:https://thingsboard.io/docs/reference/mqtt-api/#server-side-rpc
v1/devices/me/rpc/request/+
- 设备端收到订阅的消息后处理,并通过mqtt返回相应消息。
v1/devices/me/rpc/response/$request_id
3、客户端代码
以下模拟设备的mqtt代码。
//Requires node.js and mqtt library installed.
var mqtt = require('mqtt');
const thingsboardHost = process.argv[2];
const accessToken = process.argv[3];
console.log('Connecting to: %s using access token: %s', thingsboardHost, accessToken);
var client = mqtt.connect('mqtt://'+ thingsboardHost, { username: accessToken });
var datas = [];
// 成功连接到Thingsboard server时触发
client.on('connect', function () {
console.log('Client connected!');
// 订阅GPIO控制
client.subscribe('v1/devices/me/rpc/request/+');
// 启动定时器
setInterval(publishTelemetry, 1000);
});
// 收到到Thingsboard server消息时触发
client.on('message', function (topic, message) {
console.log('request.topic: ' + topic);
console.log('request.body: ' + message.toString());
// 取得请求ID和消息数据
var requestId = topic.slice('v1/devices/me/rpc/request/'.length);
var messageData = JSON.parse(message.toString());
if (messageData.method === 'getGpioStatus') {
// 如果取得GPIO状态,返回22,32为灯亮
var data = {"22":true, "32":true};
client.publish('v1/devices/me/rpc/response/' + requestId, JSON.stringify(data));
} else if (messageData.method === 'setGpioStatus') {
// 如果设置GPIO状态,返回设置的灯状态,及控制杆状态。
var params = messageData.params;
var data ={};
data[params.pin] = params.enabled;
client.publish('v1/devices/me/attributes', JSON.stringify(data));
client.publish('v1/devices/me/rpc/response/' + requestId, JSON.stringify(data));
} else {
client.publish('v1/devices/me/rpc/response/' + requestId, message);
}
});
// 定时发送状态显示panel的Pin为7的LED属性
function publishTelemetry() {
// 发送客户端属性,用于点亮和关闭Pin7的Led
var period = Date.now() % 1500;
client.publish('v1/devices/me/attributes', JSON.stringify({"7": period < 500}));
}
3、画面效果
说明:
-
显示panel,7 为代码定时发送,灯亮灯灭交替变化。
-
控制panel,22,32,画面初始化,初始值为按钮打开。
-
点击控制panel的12,控制按钮变为打开,显示panle的12也同时灯亮。