Socket hang up exception sent by server on Orion queryContext request - fiware

I'm trying to access FIWARE Orion Context Broker, with the following command, but I receive this error, sent by the remote context broker...
curl -d '{"entities":[{"type":"","isPattern":"true","id":".*"}]}' \
-H 'Content-type: application/json'\
-H 'X-Auth-Token: .....'\
'http://orion.lab.fiware.org:1026/ngsi10/queryContext?limit=5&details=on'
Error: socket hang up
at createHangUpError (http.js:1453:15)
at Socket.socketOnEnd [as onend] (http.js:1549:23)
at Socket.g (events.js:175:14)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:910:16
at process._tickCallback (node.js:415:13)
Can someone help me ?

This seems to be related with a recent bug discovered in Orion 0.22.0. The problem seems to happen when the query is too wide so it match with a large number of registrations to which forward messages are being sent (in the case of Orion at orion.lab.fiware.org, that query matches around 1,000 registrations).
We plan to implement a hotfix for this soon (and edit this answer after that). In the meanwhile, I'd recommend you to use "narrower" queries, e.g. fixing the type: {"entities":[{"type":"Room","isPattern":"true","id":".*"}]}.
EDIT: Orion instance has been upgraded in orion.lab.fiware.org and now it seems to work. However, I haven't been able to use exactly your curl line... instead I'm using the following that I understand is functionally equivalent:
(curl 'orion.lab.fiware.org:1026/v1/queryContext?limit=5&details=on' -s -S --header 'X-Auth-Token: ...' --header 'Content-Type: application/json' --header 'Accept: application/json' -d #- | python -mjson.tool) <<EOF
{
"entities": [
{
"type": "",
"isPattern": "true",
"id": ".*"
}
]
}
EOF

Related

Not be able to retrieve entity types from FIWARE Orion Context Broker

I want to retrieve all the entity types that has been defined in the Orion context broker. I searched the tutorials and find this. But this API give an empty message: [].
I have also tried to add other headers like fiware-service and fiware-servicepath but it made no difference.
P.S:
this is the API I used for getting all the entity types :
curl localhost:1026/v2/types -s -S -H 'Accept: application/json'
and this is another one with two aforementioned headers :
curl 178.252.170.26:1026/v2/types -s -S -H 'Accept: application/json'\
-H 'fiware-service: openiot' \
-H 'fiware-servicepath: /'
The most probable cause of getting [] as response to GET /v2/types is that you don't have any entity in that service/subservice at all.
Do GET /v2/entities to check it. If the result is [] then my hypothesis gets confirmed. You can try to create some entity (using POST /v2/entities) and try again.

User not authenticated

Im trying to download a file as described in forge documentation.
So im getting an access token with scope=data:read for the first 2 steps :
curl
-v 'https://developer.api.autodesk.com/authentication/v1/authenticate'
-X 'POST'
-H 'Content-Type: application/x-www-form-urlencoded'
-d 'client_id=xxx&client_secret=xxx&grant_type=client_credentials&scope=data:read'
It works up to the GET hubs/:hub_id/projects endpoint.
Then, the GET projects/:project_id/folders/:folder_id/contents endpoint requires data:write, so im adding it:
curl
-v 'https://developer.api.autodesk.com/authentication/v1/authenticate'
-X 'POST'
-H 'Content-Type: application/x-www-form-urlencoded'
-d 'client_id=xxx&client_secret=xxx&grant_type=client_credentials&scope=data:read%20data:write'
It returns an access token without any issue, but when i use for this endpoint, i get a "User not authenticated" error.
I honestly dont know where its coming from, i tried without the url-encoded space as well, no difference.
Thanks in advance for any pointers in the right direction.

IoT Agent registration

I'm trying to understand how data flows between the Orion Context-Broker and an IoT Agent.
For this the first thing to understand is the initial registration request. I haven't found any example describing this.
Afterwards I wanna send command throught the Context-Broker to a device (or IoT Agent in the beginning).
Can someone provide concrete examples for these use cases?
The full NGSI-v2 data flow is described in the IoT Agent documentation a couple of practical examples can be found in the Step-by-Step Tutorials
The equivalent for NGSI-LD can be found here
A full example of an NGSI-v2 actuation can be found here. The action on the broker looks something like this:
curl -iX PATCH \
'http://localhost:1026/v2/entities/urn:ngsi-ld:Door:001/attrs' \
-H 'Content-Type: application/json' \
-H 'fiware-service: openiot' \
-H 'fiware-servicepath: /' \
-d '{
"open": {
"type" : "command",
"value" : ""
}
}'

Ultralight 2.0 commands with parameters (polling mode)

I have found some troubles working with commands. According to the sintaxis of the protocol, a command can be executed using an updateContext operation to the Orion Context Broker, which now it is working perfect.
The doubt is, how do I give the command some parameters, as specified in the protocol?
<device name>#<command name>|<param name>=<value>|....
If I send the following REST request, it gives me a 400 Bad request, complaining about strange characters:
curl -X PUT \
'http://MYIP:1026/v2/entities/1111/attrs/blink?type=Thing' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'fiware-service: howtoservice' \
-H 'fiware-servicepath: /howto' \
-d '{
"type": "command",
"value": "blink=true|another_param=false"
}'
Where should I issue the params if it is not in the "value" key?
If I use the following request, it acts as expected:
curl -X PUT \
'http://MYIP:1026/v2/entities/1111/attrs/blink?type=Thing' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'fiware-service: howtoservice' \
-H 'fiware-servicepath: /howto' \
-d '{
"type": "command",
"value": "true"
}'
Thanks in advance
There are a couple of things regarding this question. Both of them relate to a wrong documentation, I'm affraid.
Firstly, the documentation should say the general way of sending a command from the Agent to the UL device is:
<device name>#<command name>|<value>
<value> then can be as complex as your device needs. For instance, it can be as simple as sending a single value:
dev1#turn|left
I.e. we are telling our UL device to turn left a valve.
Or it can be a composed value like this one (just an example):
dev1#turn|direction:left,lapse:3
I.e. we are telling our UL device to turn left after a time lapse of 3 seconds. In this case, we are sending the direction:left,lapse:3 string because our UL device knows how to decode that. You could be passing many other alternatives, ir depends on what your UL device is able to understand; just some examples:
dev1#turn|direction:left|lapse:3 --> value is direction:left|lapse:3
dev1#turn|direction|left|lapse|3 --> value is direction|left|lapse|3
dev1#turn|direction left lapse 3 --> value is direction left lapse 3
Having this in mind, in the documentation example we must assume the <value> sent is:
<param1 name>=<value>|<param1 name>=<value>|...
Secondly, the above documentation example for <value> cannot be used :) Among all the possible combinations, we decided to documentate one that is not accepted by Orion CB (our apologies for that). Why? Because = is a forbidden character in Orion CB.
Since values given to the commands are specified through Orion CB "update context" operations, i.e. the attribute modeling the command must be updated in order the command is forwarded to the Agent (because the Agent is the context provider for the attribute), such value must be according to Orion CB specification.
Therefore, updating Orion CB with any of the above possibilities, i.e.:
direction:left|lapse:3
direction|left|lapse|3
direction left lapse 3
is perfectly valid. It is not the case of direction=left|lapse=3 or any other string containing =.
EDIT: documentation at IOTAgent repository regarding command syntax has been fixed.

Send JSON/XML/TXT/CSV files to ElasticSearch

I have been trying to send some data in various formats to ElasticSearch running on my computer.
I am running Ubuntu 17 (the latest release) and am unable to do so.
Here are the commands I'm using on Terminal:
curl -X POST 'http://localhost:9200/json/test/2' -d #json.json
I am in the correct directory where the files are. Here is the error I'm getting:
{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}
I've searched online to no avail.
What am I doing wrong?
You can do something like this :
curl -XPUT 'localhost:9200/twitter/tweet/1?pretty' -H 'Content-Type: application/json' -d'
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
'
The reason your request wasn't passing because you didnt specify the Content-Type as JSON. Plus, you should use PUT and not POST :) I copied this request from this documentation : https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html. Cheers.
The error you're seeing is due to the version of the Elastic Search being different. Before -XPUT, add -H 'Content-Type: application/json'
Here is an example:
curl -H 'Content-Type: application/json' -XPUT 127.0.0.1:9200/