Fiware Orion上下文代理订阅通知问题

问题描述:

我正在使用orion上下文代理GE图像orion-psb-image-R5.4版本1.7.0,我在其中注册了一个设备实体,然后在我的树莓派中实现了pi简单的python服务器脚本,用于监听任何传入消息并将其打印在Pi的日志中。然后我发送了订阅消息给上下文代理,让我的树莓派订阅其上下文代理中的相应实体。问题是,无论何时我更新上下文代理中实体的条件属性,它们都应该触发通知到树莓派,然后PI中的服务器脚本在Pi的日志中打印通知。但真正发生的情况是,上下文代理可能多次触发通知,然后当条件属性应用任何附加更改时突然停止发送任何通知,并且在每次尝试时,我都会检索上下文代理中的订阅状态,以及我发现最后一次失败的属性给我提供了我上次失败尝试的时间。 我认为问题可能是连接到我的Pi甚至是服务器脚本本身,但是当我从终端向树莓派发出直接请求时,即使从远程地点进行更新,它也会立即打印所有消息。所以我的结论是,问题肯定与上下文代理和订阅本身的通知过程有关。Fiware Orion上下文代理订阅通知问题

这里的订阅请求我提出:

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 

现在当开关属性与一个不同的值更新时,它可以触发通知覆盆子PI为仅在第一次但失败,那么在任何以下尝试。

这是一个简单的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() 

这是怎么从上下文经纪人的通知,其成功的时间被印在郫县的日志:

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":{}}}]} 

当上了实体的任何以下更新时,未收到通知,我检查,这是失败的,通过检索它指出了故障发生的背景下,券商对发送notificati预订状态在我尝试的确切时间。这是我找回状态检查:

[ 
    { 
     "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 
    } 
] 

现在的问题似乎是与场境经纪人和订阅/通知过程里面处理方式。现在,我想知道问题是关于我使用的上下文代理映像版本还是其他问题。我只是想知道问题出在哪里以及如何处理这些问题,非常感谢。

+0

作为实体更新的结果,Context Broker日志文件(通常在'/ var/log/contextBroker/contextBroker.log')中是否有任何日志跟踪?在这种情况下,请编辑您的问题以包含它们。谢谢! – fgalan

+0

此外,请编辑您的问题帖子,以说明每次更新尝试之间需要多少时间。鉴于您的订阅有5秒的限制,该信息是相关的。谢谢! – fgalan

+0

通知可能会触发一次或几次,但突然间上下文代理无法发送其他通知。到目前为止,我观察到的情况是,当限制时间过去之前更新条件属性时,上下文代理可能会失败,导致上下文代理完全失败,并且需要重新启动服务器以再次接受通知。由于这种态度@fgalan,情境经纪人能否失败? – ahmad

虽然我不完全确定没有所有的输入(特别是CB日志记录),但由“它运行良好,但我有时会因为某些原因停止”问题)我倾向于认为是一些网络/连接问题,与Orion Context Broker没有直接关系。