2
votes

I want to persist some historical data from my server. So the documentation says that you must first send a subscription to Orion and then Orion will send the notification to Cygnus.

I made the subscription like this:

Entity payload = Entity.json("{\r\n" + 
                "   \"entities\": [{\r\n" + 
                "       \"type\": \"Usuario\",\r\n" + 
                "       \"isPattern\": \"true\",\r\n" + 
                "       \"id\": \"Usuario*\"\r\n" + 
                "   }],\r\n" + 
                "   \"attributes\": [],\r\n" + 
                "   \"reference\": \"http://192.168.10.3:5050/notify\",\r\n" + 
                "   \"duration\": \"P4Y\",\r\n" + 
                "   \"notifyConditions\": [{\r\n" + 
                "       \"type\": \"ONCHANGE\",\r\n" + 
                "       \"condValues\": [\r\n" + 
                "           \"speed\"\r\n" + 
                "       ]\r\n" + 
                "   }],\r\n" + 
                "   \"throttling\": \"PT0.001S\"\r\n" + 
                "}");
        Response response = client.target("http://192.168.10.3:1026/v1/subscribeContext")
                .request(MediaType.APPLICATION_JSON_TYPE)
                .post(payload);

And the creation of entities:

Entity payload = Entity.json("{  \"type\": \"Usuario\",  \"id\": \"Usuario22\",  \"temperature\": {    \"value\": \"80.0\"  },  \"location\": {    \"value\": \""+latitud+", "+altitud+"\", \"type\": \"geo:point\",    \"metadata\": {      \"crs\": {        \"value\": \"WGS84\"      }    }  }}");
Response response = client.target("http://192.168.10.3:1026/v2/entities")
                .request(MediaType.APPLICATION_JSON_TYPE)
                .post(payload);

Then, Cygnus log tell me:

HTTPBadRequestException: 'fiware-servicepath' header value does not match the number of notified context responses [...]

Do any of you know why this is happening? The creation of the headers should be done by Orion or, failing that, by using the configuration of the Cygnus...

Thank you in advance.

UPDATE:

I have changed the http client of the server to make it easier to incorporate headers.

My subscription:

CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("http://192.168.10.3:1026/v1/subscribeContext");

        String json = "{\r\n" + 
                "   \"entities\": [{\r\n" + 
                "       \"type\": \"cargador\",\r\n" + 
                "       \"isPattern\": \"true\",\r\n" + 
                "       \"id\": \"cargador*\"\r\n" + 
                "   }],\r\n" + 
                "   \"attributes\": [\"speed\"],\r\n" + 
                "   \"reference\": \"http://192.168.10.3:5050/notify\",\r\n" + 
                "   \"duration\": \"P4Y\",\r\n" + 
                "   \"notifyConditions\": [{\r\n" + 
                "       \"type\": \"ONCHANGE\",\r\n" + 
                "       \"condValues\": [\r\n" + 
                "           \"speed\"\r\n" + 
                "       ]\r\n" + 
                "   }],\r\n" + 
                "   \"throttling\": \"PT0.001S\"\r\n" + 
                "}";
        StringEntity entity;
        try {
            entity = new StringEntity(json);
            httpPost.setEntity(entity);
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");
            httpPost.setHeader("fiware-servicepath", "/");
            CloseableHttpResponse response;
                response = client.execute(httpPost);
            System.out.println(response.getStatusLine());
            client.close();

        } catch (UnsupportedEncodingException e1) {

My update context:

CloseableHttpClient client = HttpClients.custom().setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build()).build();
        HttpPost httpPost = new HttpPost("http://192.168.10.3:1026/v1/updateContext");

        String json = "{\r\n" + 
                " \"contextElements\": \r\n" + 
                "\r\n" + 
                "                   \r\n" + 
                "\r\n" + 
                "                       [\r\n" + 
                "   {\r\n" + 
                "     \"type\": \"cargador\",\r\n" + 
                "     \"isPattern\": \"false\",\r\n" + 
                "     \"id\": \"cargador48\",\r\n" + 
                "     \"attributes\": [\r\n" + 
                "        {\r\n" + 
                "          \"name\": \"speed\",\r\n" + 
                "          \"type\": \"float\",\r\n" + 
                "          \"value\": \"798\"\r\n" + 
                "        }\r\n" +  
                "      ]\r\n" + 
                "    }\r\n" + 
                "  ],\r\n" + 
                "  \"updateAction\": \"APPEND\"\r\n" + 
                "  }";

        StringEntity entity;
        try {
            entity = new StringEntity(json);
            httpPost.setEntity(entity);
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");
            httpPost.setHeader("fiware-servicepath", "/");
            CloseableHttpResponse response;
                response = client.execute(httpPost);
            System.out.println(response.getStatusLine());
            client.close();

And the trace I generate is like this:

Trace1

Trace2

Trace3

Thank you again.

1
Are you specifying the headers? Besides the general headers, for POST requests, take a look at this link to know how to use fiware-servicepath header: fiware-orion.readthedocs.io/en/master/user/service_path/… . If you are using headers, please update your question with them.Dalton Cézane
@DaltonCézane I have just updated with the information you give me. Now I've put a trace of the mistake, in case I'm missing something. Thank you.Cristina V
According to your last lof trace Cygnus has a communication problem with the HDFS endpoint, are you running the service using containers?, can you check the host and port of HDFS?.anmunoz
Hello @anmunoz , indeed, the problem was in the connections between Cygnus and Hadoop. Hadoop responded with the hostname, and Cygnus was unable to send the data to him. Modifying the /etc/hosts of the Cygnus container worked. Thank you all so much for your help.Cristina V

1 Answers

0
votes

The error message you are receiving would seem to indicate that you are attempting to send a subscription to Cygnus using the newer NGSI v2 format however the current Cygnus release only accepts notifications in the older NGSI v1 format- the attrsFormat=legacy attribute is therefore required when setting up the subscription

See this question for more details about how to fix it.