2015-05-20 77 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

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