我用 Java 并使用 mosquitto-broker 编写了 PAHO 客户端 MQTT 程序。
发布商代码片段: 发布商发送 0 到 254 之间的数字。
char[] charset = new char[255];
for(int i=0;i< 255;i++)
{
charset[i] = (char)i;
System.out.println(i+" "+(int)charset[i]);
}
String str2 = String.valueOf(charset);
MqttMessage message1 = new MqttMessage();
message1.setPayload(str2.getBytes());
client.publish("temperature",message1);
订阅者代码段: 订阅者预计会收到 0 到 254 之间的号码。
byte[] ascii = message.getBytes();
for (int i = 0; i <ascii.length; i++)
{
System.out.println(i +" "+(long)(ascii[i] & 0xFF));
}
输出快照: Publisher output
订阅者输出出现问题:
The index from 128 to 159 in subscriber output is receiving the value '63' instead of the normal numbers which are being sent from publisher side.
最佳答案
为什么不使用字节数组
出版商
byte[] payload = new byte[255];
for(int i = 0; i < 255;i ++) {
payload[i] = (byte)i;
}
message.setPayload(payload);
client.publish("temperature", message);
订阅者
byte[] paylaod = message.getPayload();
for (int i = 0; i < payload.length; i++) {
System.out.println(i +" "+(int)(payload[i] & 0xFF));
}
但问题主要与 Java 如何编码 String a char
有关是 16 位 UTF-16 编码字符。字符串是“具有附加功能的字符数组”。
所以如果你打电话String#getBytes()
UTF-16 数据被转换为 UTF-8,这会导致您的情况数据丢失。字符串并非设计用于携带二进制数据
关于java - MQTT-JAVA客户端程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53338058/