Thingsboard 3.1.0 - 远程控制和GPIO状态显示

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、调用过程:

  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
}
  1. 服务器端收到请求后,会发布信息到mqtt主题。
    所以,如果设备需要接受服务器的控制,需要提前订阅此主题。

官方说明:https://thingsboard.io/docs/reference/mqtt-api/#server-side-rpc

v1/devices/me/rpc/request/+
  1. 设备端收到订阅的消息后处理,并通过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、画面效果

在这里插入图片描述
说明:

  1. 显示panel,7 为代码定时发送,灯亮灯灭交替变化。

  2. 控制panel,22,32,画面初始化,初始值为按钮打开。

  3. 点击控制panel的12,控制按钮变为打开,显示panle的12也同时灯亮。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值