LoRa デバイス A を介してデータを送信しているときに小さな問題に直面しています。文字列または文字列として定義された 16 進数の文字列を送信しています (これらの 1 つだけを送信しますが、これまでのところ同じ結果です)。
String packet = "025555AD4148E1BE4100A06E421954C5BB";
//char data[] = "025555AD4148E1BE4100A06E421954C5BB";
それでもバックエンドで受け取るとbase64で文字列はこんな感じ。
msg.payload = MDJhYmFhNmE0MTUyYjhjNDQxMDBjNDgwNDIwMDAwMDcwOQ==
これは、別のデバイス (LoRa B) に受信された base64 文字列と実際には異なります。送信されたペイロードが同じであったとしても、この 2 番目のデバイス (LoRa B デバイス) はこれを受信します。msg.payload = AquqakFSuMRBAMSAQgAABwk=
同じ関数でnodejsでLoRAとLoRa B base64をデコードした場合
var b = new Buffer(msg.payload,'base64')
16 進文字列ではない次の文字列を取得します
30326162616136613431353262386334343130306334383034323030303030373039
<= LoRa A
02ABAA6A4152B8C44100C4804200000709
<= LoRa B
ここで起こっていると思うのは、元の 16 進数文字列が文字に分割され、Lora 経由で送信されているということです。したがって、得られるのは 16 進数の ASCII 表現です。
次の質問は、元の 16 進数文字列を取得するにはどうすればよいかということです。
前もって感謝します
よろしく!
編集:
私の経験に基づいた推測が示唆していたように、問題は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
の関数を調べると、 16 進文字に変換されていることがわかります。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]))));}