我正在使用猎户座上下文代理GE图像猎户座-psb-image-R5.4版本1.7.0,并在其中注册了一个设备实体,然后我在我的树莓派中实现了简单的python服务器脚本,该脚本侦听任何传入的消息并将其打印在Pi的日志上。 然后我向上下文代理发送了订阅消息,让我的树莓派订阅其在上下文代理中的相应实体。问题是,每当我在上下文代理中更新实体中的条件属性时,它们都应该触发对树莓派的通知,然后 PI 中的服务器脚本在 Pi 的日志中打印通知。但真正发生的是,上下文代理可能会多次触发通知,然后在对条件属性应用任何其他更改时突然停止发送任何通知,并且在我每次尝试时,我都会在上下文代理中检索订阅状态,我发现有一个失败由 lastfailure 属性声明,给了我上次失败尝试的时间。 我认为问题可能是与我的Pi的连接,甚至是服务器脚本本身,但是当我从终端向树莓派发出直接请求时,即使从远程位置进行更新,它也会立即打印所有消息。所以我得出结论,问题肯定出在上下文代理和订阅本身的通知过程上。
这是我提出的订阅请求:
curl -v contextbrokeraddress:1026/v2/subscriptions -s -S --header "Fiware-Service: XYZ" --header "Fiware-ServicePath: /XYZ" --header 'Content-Type: application/json'
-d @- <<EOF
{
"description": " Try",
"subject": {
"entities": [
{
"id": "Controller1",
"type": "Controller"
}
],
"condition": {
"attrs": [
"switch",
"datashow"
]
}
},
"notification": {
"http": {
"url": "http://raspberryPiaddress:8080"
},
"attrs": [
"switch",
"datashow"
]
},
"expires": "2040-01-01T14:00:00.00Z",
"throttling": 5
}
EOF
现在,当 Switch 属性更新为不同的值时,它可能仅在第一次触发对树莓派的通知,但在随后的任何尝试中都会失败。
这是一个简单的 Python 脚本,它侦听传入的通知并将其打印在其日志中:
import socket
HOST, PORT = '', 8080
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
while True:
print "listening on port 8080"
client_connection, client_address = listen_socket.accept()
print "notified"
request = client_connection.recv(1024)
print request
client_connection.close()
这就是来自上下文代理的通知在成功时期打印在 Pi 日志上的方式:
listening on port 8080
notified
POST / HTTP/1.1
User-Agent: orion/1.7.0 libcurl/7.19.7
Host: raspberryPiaddress:8080
fiware-service: XYZ
Fiware-ServicePath: /XYZ
X-Auth-Token: token
Accept: application/json
Content-length: 208
Content-type: application/json; charset=utf-8
Fiware-Correlator: f48ced60-1069-11e7-b743-fa163e7c4daf
Ngsiv2-AttrsFormat: normalized
{"subscriptionId":"58cd49191e9c000de6ea89c7","data":[{"id":"Controller1","type":"Controller","switch":{"type":"command","value":"OFF","metadata":{}},"datashow":{"type":"string","value":"OFF","metadata":{}}}]}
当在实体上的任何后续更新中未收到通知时,我通过检索订阅状态来检查它是否失败,该状态指出在我尝试的确切时间发送通知时上下文代理中发生了失败。这是我检索的状态以检查:
[
{
"description": " Try",
"expires": "2040-01-01T14:00:00.00Z",
"id": "58cd49191e9c000de6ea89c7",
"notification": {
"attrs": [
"switch",
"datashow"
],
"attrsFormat": "normalized",
"http": {
"url": "http://ahmadpi.ddns.net:8080"
},
**"lastFailure": "2017-03-24T08:22:23.00Z",**
"lastNotification": "2017-03-24T08:22:18.00Z",
"lastSuccess": "2017-03-23T22:09:33.00Z",
"timesSent": 66
},
"status": "failed",
"subject": {
"condition": {
"attrs": [
"switch",
"datashow"
]
},
"entities": [
{
"id": "Controller1",
"type": "Controller"
}
]
},
"throttling": 5
}
]
现在的问题似乎与上下文代理以及在其中处理订阅/通知过程的方式有关。现在,我想知道问题是否与我使用的上下文代理映像版本有关,或者是否与其他有关。我只想知道问题在哪里以及如何处理,非常感谢。
虽然我不完全确定,因为没有所有的输入(特别是CB日志跟踪),但">它像我说的那样运行良好,但有时会因某些原因而停止">(请参阅问题帖子中的评论线程)我倾向于认为是一些网络/连接问题,与Orion上下文代理没有直接关系。