Как отправлять команды на iot-сенсоры с помощью приложения для Android - PullRequest
0 голосов
/ 01 февраля 2019

Я устанавливаю fiware201: iot-sensor внутри экземпляра Ubuntu 16.04 в FIWARE-lab, и в настоящее время я создаю приложение для Android, чтобы иметь возможность отправлять команды для доступа к фиктивным устройствам, предоставленным провайдером контекста, я устанавливаю класскоторый форматирует данные и отправляет их в конечную точку, предоставленную в учебном пособии, но, кажется, я не могу заставить ее работать, я получаю ошибку 422. Каждый раз, когда я пытаюсь отправить какую-либо команду.

дополнительные сведения:
я использую залп -> пакет для отправки поста, получения запросов в android
fiware-lab region: crete

вот код:


import android.content.Context;
import android.util.Log;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;


public class ApiController {
    private String urlString
    public String serverResponse;
    private RequestQueue queue ;

    public ApiController(Context context) {
        //set context variables if required

        serverResponse = "";
        queue = Volley.newRequestQueue(context);


    }

    public void setDevice(String device) {
        this.device = device;
        urlString = "http://myFloatingIp:3001/iot/" +"Lamp001"; // URL to call

}


    public void send() {
        String uri = String.format(Locale.US, urlString);

        // Request a string response from the provided URL.
        StringRequest stringRequest = new StringRequest(Request.Method.POST,uri,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                               serverResponse = response;
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
              serverResponse = "Error";
            }
        }
                      ) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String,String> params=new HashMap<String,String>();
                params.put("data","urn:ngsi-ld:Lamp:001"@On");
                return params;

            }

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String,String> headers=new HashMap<String,String>();
                headers.put("Content-Type","text/plain");
                return headers;
            }

        };

// Add the request to the RequestQueue.
        queue.add(stringRequest);
    }


}

1 Ответ

0 голосов
/ 01 февраля 2019

422 Unprocessable Entity

Сервер понимает тип содержимого объекта запроса (следовательно, статус статуса 415 Неподдерживаемый тип носителя не подходит),и синтаксис объекта запроса является правильным (таким образом, код состояния 400 Bad Request не подходит), но не смог обработать содержащиеся в нем инструкции.

Таким образом, это означает, что у вас естьустановите правильный тип контента, и полезная нагрузка будет понятна.

Если вы посмотрите на код позади фиктивных датчиков, вы увидите следующее:

// Check for a valid device and command
  if (
    _.indexOf(myCache.keys(), deviceId) === -1 ||
    _.indexOf(['on', 'off'], command) === -1
  ) {
    return res.status(422).send(result + NOT_OK);
}

Поэтомулибо идентификатор устройства, либо команда не распознана. массив фиктивных устройств инициализируется при запуске

myCache.set('lamp001', LAMP_OFF);
myCache.set('lamp002', LAMP_OFF);
myCache.set('lamp003', LAMP_OFF);
myCache.set('lamp004', LAMP_OFF);

Идентификаторы чувствительны к регистру, поэтому вы должны отправлять lamp001, а не Lamp001.Да, это может отправить более знакомый 404 .Другая половина оператора гарантирует, что 422 будет возвращено, если команда не распознана, вы в настоящее время отправляете On, а не on

Однако, используя порт 3001 напрямую для отправки команд не - правильный способ доступа пользователей к устройствам.В учебном материале фиктивные устройства имитируют устройство Ultralight, прослушивающее HTTP - они должны быть подключены агентом IoT, а не конечным пользователем.

Правильный способ настройки - подключениеследуя инструкциям IoT Agent - таким образом, конечные пользователи могут получать косвенный доступ к устройствам через посредник контекста Orion, и конечному пользователю не нужно знать протокол и транспорт, используемый каждым устройством.

Помните, что на юге южного порта может происходить что угодно - агент IoT должен справиться с любым ответом устройства.Однако все будет хорошо определено ответами NGSI v2, выходящими из северного порта.Если объект не зарегистрирован в посреднике контекста, он вернет знакомый 404 .Если объект зарегистрирован, но в команде происходит что-то странное, например 422 , команда останется в состоянии ожидания, так как ее невозможно обработать и т. Д.Возможно, устройство подключено с использованием MQTT и периодически активируется для обработки команд.

Чтобы обновить состояние объекта с помощью известного идентификатора, вы просто отправляете запрос PATCH объекту в посреднике контекста.Программно, код может быть виден здесь - что-то вроде

PATCH http://localhost:1026/v2/entities/'urn:ngsi-ld:lamp001/attrs

С полезной нагрузкой, являющейся данными, которые вы хотите отправить.

...