2015-05-20 54 views
1

我有我自己的Orion Context Broker实例,我正在使用IDAS和我自己的fiware服务。我创建了一个实体,我可以更新/查询信息没有任何问题。当我订阅实体通知我,当值发生了变化,我得到以下有效载荷:Orion Context Broker订阅后没有通知

* Status Code: 200 

{ 
    "subscribeResponse" : { 
    "subscriptionId" : "555c979c98add18cc3e1839b", 
    "duration" : "P1M", 
    "throttling" : "PT5S" 
    } 
} 

并具有REST API监听的主机和端口,我在订阅请求指示,我得到通知的订阅:

[20/May/2015 10:22:59] "POST/HTTP/1.1" 200 

问题是,当我尝试更新contextbroker上的值,我不会得到通知该更改的值。

我试着用accumulator-script.py和我得到相同的“错误”。

我利用我在一个瓶子框架创建一个python脚本:

import bottle 

DEFAULT = {'url': '/'} 

@bottle.post(DEFAULT['url']) 
def post_default(): 
    print str(bottle.request.json) 

if __name__ == '__main__': 
    bottle.run(host='188.1??.??.??', port=????, debug=True, reloader=True) 

(我已经隐伏的主机和端口由于安全问题)

编辑:

要订阅contextBroker我正在使用Figway中的脚本SetSubscription.py:

python2.7 SetSubscription.py [entity][attribute][server url] 

要我用我自己的脚本更新实体:

import json 
import urllib 
import urllib2 

BASE_URL = 'http://188.?.?.?:????' 
UPDATE_URL = BASE_URL+'/ngsi10/updateContext' 

HEADERS = { 
    'Content-Type': 'application/json', 
    'Accept': 'application/json', 
    'Fiware-Service': 'fiwaretestapi' 
} 



UPDATE_EXAMPLE = { 
    "contextElements": [ 
     { 
      "type": "", 
      "isPattern": "false", 
      "id": "bustest3", 
      "attributes": [ 
      { 
       "name": "temperature", 
       "type": "int", 
       "value": "19" 
      } 
      ] 
     } 
    ], 
    "updateAction": "APPEND" 
} 


def post(url, data): 
    """""" 
    req = urllib2.Request(url, data, HEADERS) 
    f = urllib2.urlopen(req) 
    result = json.loads(f.read()) 
    f.close() 
    return result 

if __name__ == "__main__": 
    print post(UPDATE_URL, json.dumps(UPDATE_EXAMPLE)) 

它的输出:

[{u'contextElement': {u'attributes': [{u'type': u'int', u'name': u'temperature', u'value': u''}], u'type': u'thing', u'id': u'bustest3', u'isPattern': u'false'}, u'statusCode': {u'code': u'200', u'reasonPhrase': u'OK'}}]} 
{u'contextResponses': [{u'contextElement': {u'attributes': [{u'type': u'string', u'name': u'att_name', u'value': u'value', u'metadatas': [{u'type': u'ISO8601', u'name': u'TimeInstant', u'value': u'2015-05-20T14:36:45.752248Z'}]}, {u'type': u'int', u'name': u'temperature', u'value': u'19', u'metadatas': [{u'type': u'ISO8601', u'name': u'TimeInstant', u'value': u'2015-05-20T14:36:45.751958Z'}]}, {u'type': u'ISO8601', u'name': u'TimeInstant', u'value': u'2015-05-20T14:36:45.751958Z'}], u'type': u'thing', u'id': u'bustest3', u'isPattern': u'false'}, u'statusCode': {u'code': u'200', u'reasonPhrase': u'OK'}}]} 

我undersand有一直在ContextBroker的更新,但因为我的问题已经被回事一个星期前。所以我使用0.20。

编辑:

这是我提出用SetSubscription.py确切的请求:

python2.7 SetSubscription.py bustest3 temperature http://188.???.??.???:8082 

这是有效载荷我得到一次我让订阅:

* Asking to http://188.???.??.???:1026/v1/subscribeContext 
* Headers: {'Fiware-Service': 'fiwaretestapi', 'content-type': 'application/json', 'accept': 'application/json', 'X-Auth-Token': 'NULL'} 
* Sending PAYLOAD: 
{ 
    "reference": "http://188.???.??.???:8082", 
    "throttling": "PT5S", 
    "entities": [ 
     { 
      "type": "", 
      "id": "bustest3", 
      "isPattern": "false" 
     } 
    ], 
    "attributes": [ 
     "temperature" 
    ], 
    "duration": "P1M", 
    "notifyConditions": [ 
     { 
      "condValues": [ 
       "temperature" 
      ], 
      "type": "ONCHANGE" 
     } 
    ] 
} 

... 

* Status Code: 200 

{ 
    "subscribeResponse" : { 
    "subscriptionId" : "555ef47298add18cc3e1839d", 
    "duration" : "P1M", 
    "throttling" : "PT5S" 
    } 
} 

而在另一部分我正在听港口,当我订阅我得到:

"POST/HTTP/1.1" 200 0 
{u'originator': u'localhost', u'subscriptionId': u'???????????????????????', u'contextResponses': [{u'contextElement': {u'attributes': [{u'type': u'int', u'name': u'temperature', u'value': u'100', u'metadatas': [{u'type': u'ISO8601', u'name': u'TimeInstant', u'value': u'2015-05-20T14:36:45.751958Z'}]}], u'type': u'thing', u'id': u'bustest3', u'isPattern': u'false'}, u'statusCode': {u'code': u'200', u'reasonPhrase': u'OK'}}]} 
188.???.??.??? - - [22/May/2015 05:20:50] "POST/HTTP/1.1" 200 0 
+0

的支持,您可以编辑你的答案,所以你正在使用创建预订,并做更新(包括HTTP报头),请确切的请求?另外,您使用哪种Context Broker版本?谢谢! – fgalan

+0

回答编辑:) –

+0

这将是很高兴知道哪个确切的请求是SetSubscription.py放入电线...您可以添加到您的问题,你从该命令得到的输出,包括“询问”,“头“和”发送PAYLOAD“字段?谢谢! – fgalan

回答

1

我想通了,我正在伪造添加“Fiware-ServicePath”:'/'标题到update_context脚本并且它没有通过。它现在正在工作,REST API正在获取更改后的值。

感谢:-)

+0

很高兴认识你,终于解决了这个问题!这有点奇怪,就好像Fiware-ServcePath不包含在内,CB使用“/”implicitley ...然而,问题解决了,所以它没问题:) – fgalan

0

比较Fiware,服务你所使用的updateContext:

HEADERS = { 
    ... 
    'Fiware-Service: 'my_service' 
} 

,并用它来创建订阅的一个:

Headers: {'Fiware-Service': 'fiwaretestapi', ...} 

都是不同的。这可能是导致问题的原因。

+0

不,我用这个名字'my_service'只是一个例子来向你展示我是如何运行的,并没有显示fiwaretestapi ..头是正确的。 –

+0

为了调试这个问题,我需要不同命令的*精确*输出(当然,破解公共IP,密码等东西)。你能否回顾一下你的提问,以确保它是这样的?谢谢! – fgalan

+0

我更新了我的答案,以包含我使用的所有命令的输出。 –