繁体   English   中英

Lora 数据包数据编码为十六进制字符串,但解码为 ASCII 显示无意义

[英]Lora packet data is encoded as hex string but decoding to ASCII is showing nonsense

我正在使用 2 个 LHT65N 传感器、一个 Wisgate Edge Lite 2 网关,将有效载荷转发到 Mosquitto 代理,并显示我正在使用 mqtt.js 的数据。

我从传感器接收数据包,我得到的数据是一个十六进制字符串,但是当我将它解码为明文时,我没有得到任何有用的数据。

所以这是我得到的 object:

{
"applicationID": "1",
"applicationName": "ptxd_temp_humid",
"devEUI": "a84041a777864399",
"deviceName": "sensor_uphill",
"timestamp": 1674051438,
"fCnt": 179,
"fPort": 2,
"data": "CBCF09200203017FFF7FFF",
"data_encode": "hexstring",
"adr": true,
"rxInfo": [
    {
        "gatewayID": "ac1f09fffe08bf79",
        "loRaSNR": 0,
        "rssi": -59,
        "location": {
            "latitude": 0,
            "longitude": 0,
            "altitude": 0
        }
    }
],
"txInfo": {
    "frequency": 868800000,
    "dr": 7
}

您可以看到数据包数据被编码为十六进制字符串。

我正在使用这种方法:

decoder(bytes: any) {
  var batt_v = ((bytes[0]<<8 | bytes[1]) & 0x3FFF)/1000;
  var temp_int = ((bytes[2]<<24>>16 | bytes[3])/100).toFixed(2);
  var temp_ext = ((bytes[7]<<24>>16 | bytes[8])/100).toFixed(2);
  var hum_int = ((bytes[4]<<8 | bytes[5])/10).toFixed(1);
  var ext_sen = 
     {
       "0":"No external sensor",
       "1":"Temperature Sensor",
     }[bytes[6]&0x7F];

  return {
    Ext_sensor: ext_sen,
    BatV: batt_v,
    TempC_SHT: temp_int,
    Hum_SHT: hum_int,
    TempC_DS: temp_ext,
  };

为达到这个:

{
   "BatV": 1,
   "TempC_SHT": "27.56",
   "Hum_SHT": "50.6",
   "TempC_DS": "25.23"
 }

但我得到:

{
  "BatV": 0,
  "TempC_SHT": "0.00",
  "Hum_SHT": "0.9",
  "TempC_DS": "0.00"
}

我感觉是网关的问题。 网关的系统日志已经在接收编码数据。 我尝试了十六进制转换器和 LHT65N 的有效载荷格式化程序,但都没有给我正确的数据。 我还三次检查了 API 密钥,但它是正确的。

是否需要进行任何配置才能接收正确的数据?

解决方案

我将错误的类型传递给方法。 我很困惑,因为我将自己的数据与其他人进行了比较,而我的数据似乎太短了,所以我很困惑。 我现在正在将我的 hexstring 解码为 UInt8Array,它按预期工作。

    client.on('message', (topic, message: Buffer, packet: 
              mqtt.IPublishPacket) => {
    
      let payload = JSON.parse(message.toString())
      console.log(Buffer.from(payload.data, 'hex'))
      this.data = this.Decoder(Buffer.from(payload.data, 'hex'));
      console.log(this.data)
  
    })

收到的十六进制字符串"data": "CBCF09200203017FFF7FFF"使用您显示的代码正确解码。 针对十六进制字符串运行它,我得到:

{
  Ext_sensor: 'Temperature Sensor',
  BatV: 3.023,
  TempC_SHT: '23.36',
  Hum_SHT: '51.5',
  TempC_DS: '327.67'
}

所以这似乎有效。 如果它通过网关一直到达 MQTT 代理,那么问题就不在网关上了。 它与代理或解码器本身有关,但话又说回来,正如我所说,解码器的代码似乎可以正常工作。 看起来你得到了错误的数据,在它被发送到解码器和它返回给你的时间之间的某个地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM