【问题标题】:MQTT- JAVA client programMQTT- JAVA 客户端程序
【发布时间】:2023-04-03 02:34:01
【问题描述】:

我已经用 Java 和 mosquitto-broker 编写了 PAHO 客户端 MQTT 程序。

Publisher sn-p 代码: Publisher 发送从 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);

订阅者 sn-p 代码: 订阅者预计会收到 0 到 254 之间的数字。

byte[] ascii = message.getBytes(); 
for (int i = 0; i <ascii.length; i++) 
{                         
       System.out.println(i +" "+(long)(ascii[i] & 0xFF));                                           
}

输出快照: Publisher output

subscriber ouput

订阅者输出问题:

订阅者输出中从 128 到 159 的索引正在接收值“63”而不是 从发布方发送的普通号码。

【问题讨论】:

    标签: java mqtt paho


    【解决方案1】:

    为什么不使用字节数组

    出版商

    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 如何编码字符串有关,char 是 16 位 UTF-16 编码字符。字符串是“具有附加功能的字符数组”。

    因此,如果您调用 String#getBytes(),UTF-16 数据将转换为 UTF-8,这会导致您的案例数据松动。字符串不是用来承载二进制数据的

    【讨论】:

    • 谢谢,我已经尝试过你的方法,而且效果很好!但是你能解释一下为什么会出现 63 的值吗?为什么它只来自 128 到 159?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多