我在通过 LoRa 设备 A 发送数据时遇到了一个小问题。我正在发送一个十六进制字符串,该字符串定义为字符串或字符字符串(我只发送其中一个,但到目前为止结果相同)
String packet = "025555AD4148E1BE4100A06E421954C5BB";
//char data[] = "025555AD4148E1BE4100A06E421954C5BB";
然而,当我在后端收到它时,字符串在 base64 中看起来像这样。
msg.payload = MDJhYmFhNmE0MTUyYjhjNDQxMDBjNDgwNDIwMDAwMDcwOQ==
这实际上与接收到不同设备(LoRa B)的 base64 字符串不同,即使发送的有效负载相同,第二个设备(LoRa B 设备)也会接收到这个msg.payload = AquqakFSuMRBAMSAQgAABwk=
如果我在 nodejs 中使用相同的功能解码 LoRA 和 LoRa B base64
var b = new Buffer(msg.payload,'base64')
我得到以下一堆不是我的十六进制字符串的字符
30326162616136613431353262386334343130306334383034323030303030373039
<= 洛拉 A
02ABAA6A4152B8C44100C4804200000709
<= 洛拉 B
所以我认为这里发生的是原始的十六进制字符串被拆分为字符并通过 Lora 发送。因此,我得到的是十六进制的 ascii 表示,对吗?
下一个问题是,我怎样才能得到我原来的十六进制字符串?
提前致谢
问候!
编辑:
正如我有根据的猜测所暗示的那样,问题似乎在于有效载荷在发送之前的处理方式,而不是在 base64 编码/解码中
payload = 'MDJhYmFhNmE0MTUyYjhjNDQxMDBjNDgwNDIwMDAwMDcwOQ==';
b = new Buffer(payload,'base64')
console.log("Buffer b raw ");
console.log(b);
console.log("Buffer b stringfied ");
console.log(b.toString());
退货
Buffer b raw
<Buffer 30 32 61 62 61 61 36 61 34 31 35 32 62 38 63 34 34 31 30 30 63 34 38 30 34 32 30 30 30 30 30 37 30 39>
Buffer b stringfied
02abaa6a4152b8c44100c4804200000709
查看用于在设备中传输macTransmit
的代码中的功能,可以看出它们正在将其转换为十六进制字符packet
for (int i = 0; i < size; ++i) {
this->loraStream->print(static_cast<char>(NIBBLE_TO_HEX_CHAR(HIGH_NIBBLE(payload[i]))));
this->loraStream->print(static_cast<char>(NIBBLE_TO_HEX_CHAR(LOW_NIBBLE(payload[i]))));}