【发布时间】:2018-01-03 13:58:52
【问题描述】:
我正在开发一个系统,其中我使用 Orion CB 作为主事件总线,同时使用 iotagent 节点库,以便与第三方 API 建立接口。
现在发生的情况是,我在 iotagent 上注册了一个新设备,只有惰性属性,其中一个应该是 json 字符串。
覆盖查询处理程序及其子函数,我尝试将这个 json 字符串字符串化并将其保留为 json 格式,这就是我得到的:
1) 将 json 字符串化:
当我查询 Orion 以检索实体时,它回复该实体不存在,状态码为 404。查看 iotagent 调试日志,我发现它的响应正是我所期望的(所有属性都格式化)并且它以“ statusCode":{"code": 200, "reasonPhrase": "OK"} 所以看来 iotagent 正在用状态码 200 回复 Orion(成功!)。
2) 保持 json 原样:
当我查询 Orion 以检索它以状态码 200 回复的实体时,所有属性都正常,但带有 json 的属性为空。同样,查看 iotagent 调试日志,我看到响应是我希望看到的对 Orion 的查询,它以“statusCode”:{“code”:200,“reasonPhrase”:“OK”} 结尾。
这里发生了什么?第一种情况可能是什么问题?似乎出于某种原因 Orion 不喜欢 iotagent 响应,它说该实体不存在。而在第二种情况下,我认为问题可能出在不允许的数据结构中(json 作为属性值)。
我错过了什么吗?如果有人能帮我解决这个问题,我会很高兴,如果您需要更多信息,请告诉我。
编辑:
这就是我配置设备的方式:
{
"devices": [
{
"device_id": "taxi_list",
"entity_name": "taxi_list",
"entity_type": "taxilist",
"lazy": [
{
"name": "taxiPosition",
"type": "StructuredValue"
},
{
"name": "error",
"type": "string"
},
{
"name": "status",
"type": "string"
},
{
"name": "corsaRuntime",
"type": "string"
}
]
}
]
}
我需要json的属性是“taxiPosition”,所以它的类型是“StructuredValue”。创建响应我只是在“设备”检索到的有效负载上使用 JSON.parse() 并将此值分配给如下属性:
responses.push({
name: 'taxiPositions',
type: 'StructuredValue',
value: [{...}, {...}]
});
其中的值是一个对象数组,具有简单的单级键值对,格式如下:
{ "idTaxi": "100", "idStato": "1", "lat": "90.843227100000000", "lng": "64.228254600000000", "nome": "Name", "cognome": "Surname", "licenza": "24XX", "cellulare": "+39320662332XX", "email": "xxxxxx@xxxx.eu", "targa": "XX000XX", "modelloAuto": "Focus SW", "marcaAuto": "Ford", "annoImmatricolazione": "2020", "passeggeri": "4", "dataCreazione": "2014-05-05", "rank": "4.2", "n_corse": "6", "os": "A", "dataOraInizioTurno": "05-01-2018 07:51", "dataOraFineTurno": "05-01-2018 11:50", "radio": "1", "pos": "0", "nome_radio": null, "iban": "" }
当我尝试将值作为字符串传递时,代码是相同的,但属性的类型是“字符串”,并且该值是通过在先前解析的 json 上使用 JSON.stringify() 获得的。
要从 Orion 查询实体,我只需调用 /v2/entities/taxi_list
【问题讨论】:
-
请指定您在这两种情况下使用的代码。我的猜测是您的问题在于您传递给 Orion 的 json 结构。
-
感谢您的回复,我已经添加了更多信息。我认为问题也出在结构上。如果我正确理解了 Orion 和 iotagent 如何一起工作,他们会使用 NGSIv1 格式(并且 Orion 将 NGSIv2 请求转换为 NGSIv1 以便做到这一点)。该版本是否可能不支持 json 值?但无论如何它并没有解释为什么传递一个字符串而不是 json Orion 回复一个 404 状态码。
-
或尝试使用如下列表:
"value": ["first", "second", "third"]。我的意思是,没有“价值观”的名称。并根据位置定位具体值。 -
根据您发布的链接上报告的内容,我正在使用的 json 结构应该与 NSGIv1 和 NGSIv2 完全兼容。无论如何,我尝试使用您建议的结构来简化结构,但总是遇到同样的问题。
标签: fiware fiware-orion