Windows下如何用Mosquitto_pub发布二进制字节MQTT负载?
问题描述
在Windows环境下使用MQTT Mosquitto,现有情况:
- 可通过Java代码订阅Mosquitto Broker并监听MQTT消息,代码中使用
message.getPayload()获取消息负载(字节数组,代码运行正常)。 - 遇到的问题:通过命令提示符发布消息时,Java代码接收到的负载与发布内容完全不符。
具体细节:希望发布单个二进制字节(例如11001111,是1个字节而非8个字符)。尝试两种方式均失败:
- 将文本“11001111”存入data2.txt后,执行命令
mosquitto_pub -h localhost -t sample_data -f "C:\Users\....\data2.txt",Java收到的字节数组为49 49 48 48 49 49 49 49(对应ASCII的'1'和'0')。 - 使用
mosquitto_pub -h localhost -t sample_data -m "11001111"命令发布,得到相同结果。
咨询两个问题:
(1) 如何通过命令提示符执行mosquitto_pub命令发布上述单个二进制字节?
(2) 若要发布多个二进制字节(例如11001111、11111111、11111111,共3个字节而非24个字符),该如何操作?
解决方案
(1) 发布单个二进制字节
Windows命令提示符无法直接通过-m参数输入二进制字节,可借助二进制文件配合-f参数实现:
- 生成包含目标二进制字节的文件:
以二进制11001111(对应十六进制0xCF)为例,用PowerShell执行以下命令生成二进制文件:[byte[]]$byte = 0xCF; [System.IO.File]::WriteAllBytes("C:\temp\single_byte.bin", $byte) - 发布该二进制文件:
在命令提示符中执行:
此时Java代码收到的字节数组将是mosquitto_pub -h localhost -t sample_data -f "C:\temp\single_byte.bin"207(十进制,对应目标二进制字节)。
(2) 发布多个二进制字节
同样通过生成多字节二进制文件实现,或直接通过管道传递数据:
方式一:二进制文件发布
- 生成包含多字节的二进制文件:
以11001111(0xCF)、11111111(0xFF)、11111111(0xFF)三个字节为例,用PowerShell生成:[byte[]]$bytes = 0xCF, 0xFF, 0xFF; [System.IO.File]::WriteAllBytes("C:\temp\multi_bytes.bin", $bytes) - 发布文件:
Java代码将收到字节数组mosquitto_pub -h localhost -t sample_data -f "C:\temp\multi_bytes.bin"207 255 255,对应三个目标二进制字节。
方式二:管道直接传递(PowerShell环境)
无需生成文件,直接通过标准输入传递二进制数据:
[byte[]]$bytes = 0xCF, 0xFF, 0xFF; $bytes | mosquitto_pub -h localhost -t sample_data -s
其中-s参数表示从标准输入读取消息内容。
内容的提问来源于stack exchange,提问作者user1
相关产品推荐
相关产品推荐

