使用http设备上报数据时格式匹配问题

Blade 未结 2 68
cuiyuzhou
cuiyuzhou 剑侠 2025-10-01 11:11

一、该问题的重现步骤是什么?

  1. 使用HTTP设备上报属性数据时,因上报的数据格式与平台不匹配导致无法获取到正确数据

  2. 设备上报数据格式:

{

    "device_sn":"", //设备序列号

    "submit_time":"2025-09-17 18:12:12", //上报时间

    "latitude":"", //纬度

    "longitude":"", //经度

    "rfids":[  //RFID标签

        {

            "epc":"A001", //EPC

            "rssi_min":-89,  //最小信号强度

            "rssi_max":-89,  //最大信号强度

            "count":200 //读取次数

        }

    ]

}

     3.平台产品物模型:

image.png 


二、你期待的结果是什么?实际看到的又是什么?

期待获取到正确的设备数据,实际获取到的是不对的数据

image.png

image.png

三、你正在使用的是什么产品,什么版本?在什么操作系统上?

bladex IOT ubuntu虚拟机

四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

还有一个问题就是,设备上报的数据字段必须要严格遵守平台物模型数据吗?

2条回答
  • 2025-10-09 09:47

    epc\rssi_max\rssi_min\count


    这几个字段要放到 和经纬度字段一个层级。你给它们外面包裹一层不存在的属性,是无法准确识别的。

    0 讨论(0)
  • 2025-10-09 11:01

    如果上传的json格式无法更改,那么有什么办法可以将数据成功上报呢?

    作者追问:2025-10-09 11:07

    你从java层面去考虑也能明白为什么原版是需要同一层级的,因为到后端解析的时候是一个json到对象的过程,你要获取 rssi_min 字段,那你必须知道他在哪个属性下面,如果rfids是固定的还好,如果他是随时会变的,那从java层面是无法知道 rssi_min 到底怎么获取了。

    因为获取他需要这样的逻辑:node.get("rfids").get("rssi_min") ,如果不知道 rfids ,java层面无法获取,也无法和物模型匹配。


    解决方法只能是修改 openapi 的对应接口,增加一些特殊字段的读取来处理了。提前读取 rfids 属性,判断下面有没有子属性,如果有则把他们挪到外部层级,再走下一步逻辑就行了。

    回答: 2025-10-09 11:21

    那如果设备上报的json数据中存在物模型没有的字段,会影响到数据的上传吗?

    作者追问:2025-10-09 11:25

    要看具体用的是哪个时序库,比如influxdb,你上报了不存在的字段,他也会自动创建。如果用了tdengine,规定好了超级表,上报不存在的字段会直接报错。


    回答: 2025-10-09 11:26

    因为当前json数据的rfids是以数组格式上传的,我想使用如下所示的方法构建物模型:

    image.png

    但是上传数据时还是无法正常获取,请问应该如何使用该结构体进行数据接收

    作者追问:2025-10-09 11:28

    如果是结构体,要传 json字符串。这个底层逻辑很简单,无非就是获取json然后反序列化再入库,你可以跟下断点看看具体的逻辑。

    回答: 2025-10-09 11:51

    这个数据上传是以数组中套json上传的

    image.png

    物模型也确实是以数组的数据类型,结构体的元素类型进行创建的,为什么获取不到正确数据

    image.png

    作者追问:2025-10-09 12:11

    像 struct 和 array-struct ,里面的字段会有无限层级,转译到后端入库时序库的时候只能把这两类特殊字段当成一个大的string字段来看待。所以你传递的数据对应这两个物模型的时候,需要转换成 string 字符串才能准确入库。

    否则如果要针对struct进行拆分解析,那么水平性质的时序库结构,就无法体现他的结构性,如果水平摊开,可能就会有几十上百个物模型字段,到时候统一读取再组装返回的时候无法再识别成结构体的形式,如果一定要做也会非常损耗性能。所以综合考虑下,这俩特殊物模型字段,只能以string格式的字符串来入库。

    0 讨论(0)
提交回复