OpenWRT环境下读取RS485十六进制数据并MQTT发送的脚本需求
解决方案
一、前期准备
- 安装必要工具:确保OpenWRT已安装
mosquitto-client和xxd(xxd用于正确转换十六进制)opkg update && opkg install mosquitto-client vim-full - 配置串口参数:根据你的RS485设备的实际波特率、数据位等参数,用
stty命令配置(示例为9600波特率、8位数据位、无停止位、无奇偶校验,需替换为设备实际参数)stty -F /dev/rs485 9600 cs8 -cstopb -parenb
二、核心脚本实现
创建一个简单的Shell脚本,直接读取串口数据并发送MQTT消息,避免文件读写冲突,同时保证十六进制字节顺序正确:
#!/bin/sh # 1. 配置串口参数(根据设备实际参数修改波特率等) stty -F /dev/rs485 9600 cs8 -cstopb -parenb # 2. 从RS485读取固定8字节数据,直接存入变量(无文件操作) raw_data=$(dd if=/dev/rs485 bs=1 count=8 2>/dev/null) # 3. 将原始二进制数据转为正确顺序的十六进制字符串 # -p:输出纯十六进制(无地址、空格);-c 8:按8字节连续输出 hex_data=$(echo -n "$raw_data" | xxd -p -c 8) # 4. 发送JSON格式的MQTT消息 # 替换<Broker地址>为你的MQTT服务器IP/域名,<消息主题>为实际主题 mosquitto_pub -h <Broker地址> -t <消息主题> -m "{\"data\":\"$hex_data\"}"
三、脚本使用说明
- 保存脚本:将上述内容保存为
rs485_to_mqtt.sh(比如存放在/root/目录下)vi /root/rs485_to_mqtt.sh - 添加执行权限:
chmod +x /root/rs485_to_mqtt.sh - 测试运行:直接执行脚本,它会等待设备发送8字节数据,收到后自动发送MQTT消息
/root/rs485_to_mqtt.sh
四、周期性监听优化
如果需要持续监听设备的周期性发送,可以给脚本添加循环,让它一直运行:
#!/bin/sh # 配置串口参数 stty -F /dev/rs485 9600 cs8 -cstopb -parenb # 循环监听并发送 while true; do raw_data=$(dd if=/dev/rs485 bs=1 count=8 2>/dev/null) hex_data=$(echo -n "$raw_data" | xxd -p -c 8) mosquitto_pub -h <Broker地址> -t <消息主题> -m "{\"data\":\"$hex_data\"}" # 可选:如果需要在两次监听间间隔一段时间,取消下方注释 # sleep 1 done
运行这个脚本后,它会持续等待设备发送数据,每收到8字节就发送一次MQTT消息。
关键优势
- 无文件读写:直接将串口数据存入变量,避免文件读写冲突和冗余操作
- 字节顺序正确:使用
xxd替代hexdump,保证十六进制字符串与原始字节顺序一致(如A1不会显示为1A) - 符合JSON要求:直接构造合法的JSON格式消息,适配MQTT Broker的要求
内容的提问来源于stack exchange,提问作者francis
相关产品推荐
相关产品推荐

