Subscriptions don't seem to work using dockerized fiware-orion

大城市里の小女人 提交于 2020-01-04 05:39:11

问题


I'm using Fiware-Orion ContextBroker 0.28, the dockerized version in my localhost on ubuntu 15.10 64 bits.

$ curl localhost:1026/version
{
  "orion" : {
  "version" : "0.28.0-next",
  "uptime" : "0 d, 0 h, 0 m, 6 s",
  "git_hash" : "067e13618c247daa4af61f82d7831f3015d9eb5d",
  "compile_time" : "Mon Mar 14 13:04:02 UTC 2016",
  "compiled_by" : "root",
  "compiled_in" : "838a42ae8431"
}
}

The docker configuration I'm using is:

$ cat docker-compose.yml 
mongo:
  image: mongo:2.6
  command: --smallfiles --nojournal
orion:
  image: fiware/orion
  links:
    - mongo
  ports:
    - "1026:1026"
  command: -dbhost mongo

The warning I get from orion/docker when I do the subscriptions is:

orion_1 | WARNING@12:19:14  AlarmManager.cpp[303]: Raising alarm NotificationError localhost:1028/accumulate: (curl_easy_perform failed: Couldn't connect to server)

I'm following the API V1 walkthorugh to test subscriptions to changes. I start with a mint new dockerized (sudo docker-compose up and all that fuzz) fiware-orion 0.28 with mongodb. Then I start the accumulator

$ ./accumulator-server.py 1028 /accumulate localhost on
verbose mode is on
 * Running on http://localhost:1028/ (Press CTRL+C to quit)

Then I register Room1

$ (curl localhost:1026/v1/updateContext -s -S --header 'Content-Type: application/json' \
>     --header 'Accept: application/json' -d @- | python -mjson.tool) <<EOF
> {
>     "contextElements": [
>         {
>             "type": "Room",
>             "isPattern": "false",
>             "id": "Room1",
>             "attributes": [
>                 {
>                     "name": "temperature",
>                     "type": "float",
>                     "value": "23"
>                 },
>                 {
>                     "name": "pressure",
>                     "type": "integer",
>                     "value": "720"
>                 }
>             ]
>         }
>     ],
>     "updateAction": "APPEND"
> } 
> EOF
{
    "contextResponses": [
        {
            "contextElement": {
                "attributes": [
                    {
                        "name": "temperature",
                        "type": "float",
                        "value": ""
                    },
                    {
                        "name": "pressure",
                        "type": "integer",
                        "value": ""
                    }
                ],
                "id": "Room1",
                "isPattern": "false",
                "type": "Room"
            },
            "statusCode": {
                "code": "200",
                "reasonPhrase": "OK"
            }
        }
    ]
}

Then I test query context just to check:

$ (curl localhost:1026/v1/queryContext -s -S --header 'Content-Type: application/json' \
>     --header 'Accept: application/json' -d @- | python -mjson.tool) <<EOF
> {
>     "entities": [
>         {
>             "type": "Room",
>             "isPattern": "false",
>             "id": "Room1"
>         }
>     ]
> } 
> EOF
{
    "contextResponses": [
        {
            "contextElement": {
                "attributes": [
                    {
                        "name": "pressure",
                        "type": "integer",
                        "value": "720"
                    },
                    {
                        "name": "temperature",
                        "type": "float",
                        "value": "23"
                    }
                ],
                "id": "Room1",
                "isPattern": "false",
                "type": "Room"
            },
            "statusCode": {
                "code": "200",
                "reasonPhrase": "OK"
            }
        }
    ]
}

Then I do the subscription

$ (curl localhost:1026/v1/subscribeContext -s -S --header 'Content-Type: application/json' \
>     --header 'Accept: application/json' -d @- | python -mjson.tool) <<EOF
> {
>     "entities": [
>         {
>             "type": "Room",
>             "isPattern": "false",
>             "id": "Room1"
>         }
>     ],
>     "attributes": [
>         "pressure"
>     ],
>     "reference": "http://localhost:1028/accumulate",
>     "duration": "P1M",
>     "notifyConditions": [
>         {
>             "type": "ONCHANGE",
>             "condValues": [
>                 "pressure"
>             ]
>         }
>     ],
>     "throttling": "PT5S"
> }
> EOF
{
    "subscribeResponse": {
        "duration": "P1M",
        "subscriptionId": "570f8ac247fcf8a62722353c",
        "throttling": "PT5S"
    }
}

At this point the manual says that the accumulator might receive a first update but it's not required, so I don't receive nothing but maybe that's OK. Or maybe not, because after sending the subscription query, orion's docker says:

orion_1 | WARNING@12:19:14  AlarmManager.cpp[303]: Raising alarm NotificationError localhost:1028/accumulate: (curl_easy_perform failed: Couldn't connect to server)

Finally I update the entity and I should receive the update on the accumulator, but I don't:

$ (curl localhost:1026/v1/updateContext -s -S --header 'Content-Type: application/json' \
>      --header 'Accept: application/json' -d @- | python -mjson.tool) <<EOF
> {
>     "contextElements": [
>         {
>             "type": "Room",
>             "isPattern": "false",
>             "id": "Room1",
>             "attributes": [
>                 {
>                     "name": "temperature",
>                     "type": "float",
>                     "value": "56.5"
>                 },
>                 {
>                     "name": "pressure",
>                     "type": "integer",
>                     "value": "553"
>                 }
>             ]
>         }
>     ],
>     "updateAction": "UPDATE"
> } 
> EOF
{
    "contextResponses": [
        {
            "contextElement": {
                "attributes": [
                    {
                        "name": "temperature",
                        "type": "float",
                        "value": ""
                    },
                    {
                        "name": "pressure",
                        "type": "integer",
                        "value": ""
                    }
                ],
                "id": "Room1",
                "isPattern": "false",
                "type": "Room"
            },
            "statusCode": {
                "code": "200",
                "reasonPhrase": "OK"
            }
        }
    ]
}

I should also say that it's quite difficult to get fiware-orion to compile on Ubuntu, and that's the reason why I'm using docker.


回答1:


It looks like the answer is on ifconfig.

$ ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:09:7b:6e:b7  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:9ff:fe7b:6eb7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1036 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1506 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0

This means that for the docker orion machine, the host is on 172.17.0.1.

The accumulator should be started with:

$  ./accumulator-server.py 1028 /accumulate 172.17.0.1 on

The subscribing command should be something like (using "reference": "http://172.17.0.1:1028/accumulate"):

(curl localhost:1026/v1/subscribeContext -s -S --header 'Content-Type: application/json' \
    --header 'Accept: application/json' -d @- | python -mjson.tool) <<EOF
{
    "entities": [
        {
            "type": "Room",
            "isPattern": "false",
            "id": "Room1"
        }
    ],
    "attributes": [
        "temperature",
        "pressure"
    ],
    "reference": "http://172.17.0.1:1028/accumulate",
    "duration": "P1M",
    "notifyConditions": [
        {
            "type": "ONCHANGE",
            "condValues": [
                 "temperature",
                 "pressure"
            ]
        }
    ],
    "throttling": "PT1S"
}
EOF

At least this solution works for me




回答2:


You may have to change the URL of your target subscription (the "reference" attribute). If you are running Orion inside a Docker, the localhost to Orion is the Docker itself, and not your machine. So, the notifications are being raised to Docker localhost port 1028. As probably there may not exist any application listening on Docker port 1028, you get the curl error.

Try to set the accumulate server in another machine, or make a tunnel to your machine's localhost (for instance using ngrok), and set the subscription reference to that address.



来源:https://stackoverflow.com/questions/36624433/subscriptions-dont-seem-to-work-using-dockerized-fiware-orion

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!