前言
ThingsBoard GateWay 是在ThingsBoard下的一款高度集成遗留系统和第三方系统上联接设备的开源解决方案。
具有以下几个特点:
- MQTT扩展 - 于控制、配置和收集使用现有协议连接到外部MQTT代理的IoT设备数据。
- OPC-UA扩展 - 收集连接到OPC-UA服务端的IoT设备数据。
- Sigfox扩展 - 收集连接到Sigfox后端的IoT设备数据。
- 数据持久 - 网络和硬件异常时保证数据正常传输。
- 自动重新连接到UlyncThings集群。
- 将传入的数据和消息映射到统一格式。
本篇将介绍在树莓派上安装ThingsBoard GateWay使用Modbus协议遥测数据。准备工作
- 启动ThingsBoard服务
- 在树莓派上安装ThingsBoard GateWay
- 启动ThingsBoard GateWay服务
- 树莓派串口配置
- 树莓派RS485扩展板一块,将扩展板插入树莓派,并与自己的传感设备连接好
- 将树莓派ttyAMA0串口权限开放
系统配置
配置网关扩展
[{ "id": "modbus-water", "type": "MODBUS", "configuration": { "servers": [{ "transport": { "type": "rtu", "portName": "ttyAMA0", "encoding": "rtu", "timeout": 5000, "baudRate": 9600, "dataBits": 8, "stopBits": 1, "parity": "none" }, "devices": [{ "unitId": 1, "deviceName": "水压-设备1", "attributesPollPeriod": 1000, "timeseriesPollPeriod": 1000, "attributes": [], "timeseries": [{ "tag": "pressure", "type": "long", "pollPeriod": 1000, "functionCode": 3, "address": 4, "registerCount": 1, "bit": 0, "byteOrder": "BIG" }] }] }] } }]
## 配置网关服务文件tb-gateway.yml
```$xslt
server:
# Server bind address
address: "0.0.0.0"
# Server bind port
port: "9090"
# Check new version updates parameters
updates:
# Enable/disable updates checking.
enabled: "${UPDATES_ENABLED:true}"
gateways:
tenants:
-
label: "Tenant"
reporting:
interval: 60000
persistence:
type: file
path: storage
bufferSize: 1000
connection:
host: #ThingsBoard服务地址#
port: 1883
retryInterval: 3000
maxInFlight: 1000
security:
accessToken: #网关设备的令牌#
remoteConfiguration: true
extensions:
-
id: "http"
type: "HTTP"
extensionConfiguration: http-config.json
重启GateWay服务
#问题
整个安装配置过程中出现了一个问题花了好久,在配置并重启GateWay服务后,发现网关设备始终没有同步,查看日志后发现
2019-11-19 18:36:13,160 [pool-1-thread-1] ERROR o.t.g.extensions.modbus.ModbusClient - MBS[ttyAMA0] connection failed!
java.io.IOException: Port [ttyAMA0] cannot be opened or does not exist - Valid ports are: [ttyAMA0]
at com.ghgande.j2mod.modbus.net.SerialConnection.open(SerialConnection.java:127)
at com.ghgande.j2mod.modbus.facade.ModbusSerialMaster.connect(ModbusSerialMaster.java:96)
at org.thingsboard.gateway.extensions.modbus.ModbusClient.connect(ModbusClient.java:121)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.thingsboard.gateway.extensions.modbus.DefaultModbusService.init(DefaultModbusService.java:64)
at org.thingsboard.gateway.service.TenantServiceRegistry.updateExtensionConfiguration(TenantServiceRegistry.java:83)
at org.thingsboard.gateway.service.DefaultTenantManagerService.lambda$init$0(DefaultTenantManagerService.java:64)
at org.thingsboard.gateway.service.gateway.MqttGatewayService.updateConfiguration(MqttGatewayService.java:515)
at org.thingsboard.gateway.service.gateway.MqttGatewayService.onGatewayAttributesGet(MqttGatewayService.java:496)
at org.thingsboard.gateway.service.gateway.MqttGatewayService.lambda$onMessage$17(MqttGatewayService.java:426)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
2019-11-19 18:36:13,165 [pool-1-thread-1] ERROR o.t.g.e.modbus.DefaultModbusService - [Tenant] Modbus service initialization failed
日志显示ttyAMA0口不能打开或不存在。dose not exist肯定是不可能的,那就是串口打不开。
最后在这里找到了解决办法。将ttyAMA0口的权限设置为任何人可以读,写。
在/etc/udev/rules.d
中添加100-ttyAMA0.rules,内容为:
KERNEL=="ttyAMA0", MODE="666"