一、该问题的重现步骤是什么?
使用HTTP设备上报属性数据时,因上报的数据格式与平台不匹配导致无法获取到正确数据
设备上报数据格式:
{
"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.平台产品物模型:
二、你期待的结果是什么?实际看到的又是什么?
期待获取到正确的设备数据,实际获取到的是不对的数据
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
bladex IOT ubuntu虚拟机
四、请提供详细的错误堆栈信息,这很重要。
五、若有更多详细信息,请在下面提供。
还有一个问题就是,设备上报的数据字段必须要严格遵守平台物模型数据吗?
如果上传的json格式无法更改,那么有什么办法可以将数据成功上报呢?
你从java层面去考虑也能明白为什么原版是需要同一层级的,因为到后端解析的时候是一个json到对象的过程,你要获取 rssi_min 字段,那你必须知道他在哪个属性下面,如果rfids是固定的还好,如果他是随时会变的,那从java层面是无法知道 rssi_min 到底怎么获取了。
因为获取他需要这样的逻辑:node.get("rfids").get("rssi_min") ,如果不知道 rfids ,java层面无法获取,也无法和物模型匹配。
解决方法只能是修改 openapi 的对应接口,增加一些特殊字段的读取来处理了。提前读取 rfids 属性,判断下面有没有子属性,如果有则把他们挪到外部层级,再走下一步逻辑就行了。
那如果设备上报的json数据中存在物模型没有的字段,会影响到数据的上传吗?
要看具体用的是哪个时序库,比如influxdb,你上报了不存在的字段,他也会自动创建。如果用了tdengine,规定好了超级表,上报不存在的字段会直接报错。
因为当前json数据的rfids是以数组格式上传的,我想使用如下所示的方法构建物模型:
但是上传数据时还是无法正常获取,请问应该如何使用该结构体进行数据接收
如果是结构体,要传 json字符串。这个底层逻辑很简单,无非就是获取json然后反序列化再入库,你可以跟下断点看看具体的逻辑。
这个数据上传是以数组中套json上传的
物模型也确实是以数组的数据类型,结构体的元素类型进行创建的,为什么获取不到正确数据
像 struct 和 array-struct ,里面的字段会有无限层级,转译到后端入库时序库的时候只能把这两类特殊字段当成一个大的string字段来看待。所以你传递的数据对应这两个物模型的时候,需要转换成 string 字符串才能准确入库。
否则如果要针对struct进行拆分解析,那么水平性质的时序库结构,就无法体现他的结构性,如果水平摊开,可能就会有几十上百个物模型字段,到时候统一读取再组装返回的时候无法再识别成结构体的形式,如果一定要做也会非常损耗性能。所以综合考虑下,这俩特殊物模型字段,只能以string格式的字符串来入库。
扫一扫访问 Blade技术社区 移动端