Thingsboard提供非常强大的可视化部件,除了图表、地图车联网外,还有控制部件,通过mqtt rpc可以轻松实现平台 -- 设备端 设备到平台双向数据传输及控制。
Thingboard 连接设备分为直连设备和网关连接设备两种,先说下直连设备怎么rpc双向控制。
官网有一个风力发电机、风向控制的例子,https://thingsboard.io/docs/user-guide/rule-engine-2-0/tutorials/rpc-request-tutorial/,这个比较复杂,且官方几个说明文档比较难理解,下面写个简单入门的例子。
1,首先在规则引擎建立rpc requst from device和rpc request to device两条规则链,目的是打通双向数据通道即可,暂时不用滤波器和变换脚本。
2,从仪表盘库添加一个控制开关,编辑开关,添加设备数据源,这里我关联了一个南京物联的插座,设备列表中该插座通过一个属性为switchState的标识开关状态。
3,主要设置在开关的高级设置中。注意attribute是刚才设备中的属性字段,有两个rpc方法,一个get一个set,此刻tb的配置就完成了,开始看采集控制服务终端代码。
4,因为采集控制服务和tb通信采用的mqtt直连模式,tb会为每个设备创建一个mqttserver,mqtt的账号就是设备的接入token,密码为空,采集控制服务就可以tb交互了,mqtt连接代码略过,直接看核心部分。
//这是从tb过来的请求id,一般是这个格式v1/devices/me/rpc/request/90 String requestId = topic.substring(topic.lastIndexOf("/") + 1); //mqtt body String payloadMsg = mqttmessage.toString(); HashMap<String, Object> map = JSON.parseObject(payloadMsg, HashMap.class); String method = String.valueOf(map.get("method")); String params = String.valueOf(map.get("params")); log.info("------------method------------{}", method); if (method.equals("getSwitchState")) { //假如是请求要获取设备当前状态,封装一个假数据返回 String responseContent = "{\n" + "\"switchState\":\"" + params + "\",\n" + "\"supplier\":\"njwl\"\n" + "}"; MqttMessage mqttMsg = new MqttMessage(); mqttMsg.setPayload(responseContent.getBytes("utf-8")); MqttsClientSubscriber.client .publish("v1/devices/me/rpc/response/" + requestId, mqttMsg); } if (method.equals("setSwitchState")) { //假如是要控制设备 开或者关 String responseContent = "{\n" + "\"switchState\":\"" + params + "\",\n" + "\"supplier\":\"njwl\"\n" + "}"; MqttMessage mqttMsg = new MqttMessage(); mqttMsg.setPayload(responseContent.getBytes("utf-8")); //给tb服务端写一个返回值 MqttsClientSubscriber.client .publish("v1/devices/me/rpc/response/" + requestId, mqttMsg); /** 实际控制设备开关代码忽略 **/ //设备控制完成后,给tb的设备属性写一个真实状态,部件中的状态会根据下面的值自动变化。 MqttsClientSubscriber.client .publish("v1/devices/me/attributes", mqttMsg); }
所有业务开发配置完成,我们可以通过tb服务端的按钮部件控制到插座,插座的状态发生变化,如果我们采集服务自动给tb写了设备属性,MqttsClientSubscriber.client .publish("v1/devices/me/attributes", mqttMsg);tb服务端也会自动更新设备状态。