GPIO widgets 主要用来对设备的GPIO状态的显示和控制。 https://thingsboard.io/docs/reference/mqtt-api/#rpc-api
显示画面大致如下:
主要设置GPIO LED的位置,默认颜色,Pin,标签,背景色等。 其中Pin(接脚)设置的值很重要,根据数据的值控制那个Pin的Led灯亮。
主要用来设置什么数据为TRUE时,控制那个Pin的Led灯亮。 下例中使用了函数,实际业务中可以使用设备对应的实体,数据源一般为时间序列或者属性。
数据键配置中,标签(label)设置的和前面的Pin对应,表示此值为true时,把对应Pin的Led灯点亮。
测试脚本如下:
var period = time % 1500; return period < 500;如果使用时间序列,需要指定使用设备发送数据中的那个Key,如数据类似:{status: 1},1表示打开的话,可以如下配置。
显示画面大致如下:
官方说明:https://thingsboard.io/docs/reference/mqtt-api/#server-side-rpc
v1/devices/me/rpc/request/+ 设备端收到订阅的消息后处理,并通过mqtt返回相应消息。 v1/devices/me/rpc/response/$request_id以下模拟设备的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})); }说明:
显示panel,7 为代码定时发送,灯亮灯灭交替变化。
控制panel,22,32,画面初始化,初始值为按钮打开。
点击控制panel的12,控制按钮变为打开,显示panle的12也同时灯亮。