如何使用Android应用程序向物联网传感器发送命令

时间:2019-02-01 17:12:23

标签: iot fiware fiware-orion

我在FIWARE-lab的Ubuntu 16.04实例中设置了一个fiware201:iot传感器,并且当前正在构建一个android应用程序,以便能够发送命令以访问上下文提供者提供的虚拟设备,我设置了一个类该格式的数据并将其发送到由本教程中提供的端点,但我似乎无法得到它的工作,我得到一个422错误,每当我尝试发送任何命令。

的附加细节:
我使用凌空 - >包发送后,在android系统
get请求 fiware-lab地区:克里特岛

代码如下:


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 :(得分:0)

  

422无法处理的实体

     

服务器理解请求实体的内容类型(因此, 415不支持的媒体类型状态码不合适),并且请求实体的语法正确(因此 400错误请求状态码不合适),但无法处理其中的指令。

因此,这意味着您设置了正确的内容类型,并且可以理解有效负载。

如果您查看虚拟传感器后面的code,则会看到以下内容:

// 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);
}

因此,无法识别设备的ID或命令。 array of dummy devices在启动时初始化

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

ID区分大小写,因此您应该发送lamp001而不是Lamp001。是的,它可以发送更熟悉的 404 。该语句的另一半确保如果无法识别命令,则返回 422 ,您当前正在发送On而不是on

但是,直接使用3001端口发送命令对用户来说是不是正确的方法。在教程材料中,虚拟设备模仿通过HTTP侦听的Ultralight设备-它们应该由IoT代理连接,而不是由最终用户访问。

正确的设置方法是按照IoT Agent Tutorial进行连接-最终用户可以通过Orion上下文代理间接访问设备,而最终用户不需要知道协议和每个设备使用的传输方式。

请记住,南端口以南可能发生任何事情-由IoT代理来应对来自设备的任何响应。然而一切都将被很好地定义NGSI V2的响应来北口出来。如果实体未在上下文代理中注册,它将返回熟悉的 404 。如果该实体已注册,但是命令上出现诸如 422 之类的奇怪现象,该命令将处于待处理状态,因为无法对其进行处理等等。可能是设备是使用MQTT连接的,只能唤醒以定期处理命令。

要使用已知ID更新实体的状态,您只需向上下文代理内的实体发送PATCH请求即可。编程,所述代码可以被看到here - 像

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

有效载荷是您要发送的数据。