APP通过http获取OneNet数据与命令下发应用层

Posted a鱼儿哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了APP通过http获取OneNet数据与命令下发应用层相关的知识,希望对你有一定的参考价值。

文章目录


前言

在之前我们已经完成了感知层和网络层的设计,现在我们来完成应用层的设计,这样大概的物联网框架就有了。这边采用APP实现,由于没有花很多时间学习app的设计,所以ui和程序都设计的比较简陋。需要完成设计的小伙伴可以参考前几篇博客。

ESP32驱动震动传感器、MAX4466(感知层)

ESP32通过MQTT协议把数据上传到OntNet平台(网络层)


一、项目思路及结构

1.结构(如下图):

其中http保存的是get请求和post请求的文件夹,json保存的是请求返回json数据解析的文件。

2.思路:
首先我们需要设计一个能够接收信息和发送信息到云平台的应用,使用get请求获取云平台的额数据显示到文本框上,通过按钮发送post请求到云平台,其中get请求获取的是一个json格式的数据如下:


	"errno": 0,
	"data": 
		"count": 3,
		"datastreams": [
			
				"datapoints": [
					
						"at": "2022-09-29 01:22:34.128",
						"value": 326
					,
					
						"at": "2022-09-29 01:22:32.997",
						"value": 325
					,
					
						"at": "2022-09-29 01:22:31.967",
						"value": 324
					
				],
				"id": "data"
			
		]
	,
	"error": "succ"

所以还要对数据进行解析,由于涉及的细节比较多这里只介绍主要的函数,当然完整工程会在文末分享出来。

二、主要函数

1.Get请求方法

代码如下:

 public  String GetDateMethod(String url)
        String time=new String();
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .addHeader("Authorization","version=2018-10-31&res=products%2F417488&et=1700000000&method=md5&sign=2c5X8shBYQAVp%2B7BtJ0iTg%3D%3D")//这里需要生成新的key  我搞了一晚上才发现
                .build();
        String responseData="";
        Response response=null;
        try 
            response=client.newCall(request).execute();
            responseData=response.body().string();
         catch (IOException e) 
            e.printStackTrace();
        
        Log.w("ww","responsedata:"+responseData);


        return responseData;
    

新的密钥生成格式如下:

具体可以查看网络层的文章 其中res的参数是不一样的,key需要在云平台的产品概况找到,如下图:

2.Post请求

代码如下:

 public String PostDataMethod(String commd)
        OkHttpClient client=new OkHttpClient();
        String url=String.format("http://api.heclouds.com/v1/synccmds?device_id=997936235&timeout=30"); //api接口只需要把device_id=后面的改成你自己的设备id就可以
        
        String body=String.format(commd);
        Log.e("url",url);
        Log.e("body",body);
        RequestBody bodyJson=RequestBody.create(MediaType.parse("application/json;charset=utf-8"),body);
        Request request = new Request.Builder()
                .url(url).headers(new Headers.Builder().add("Authorization",
                                "version=2018-10-31&res=products%2F417488&et=1700000000&method=md5&sign=2c5X8shBYQAVp%2B7BtJ0iTg%3D%3D")  //这里和get请求的一样
                        .build()).post(bodyJson).build();
        Call call=client.newCall(request);
        call.enqueue(new Callback() 
            @Override
            public void onFailure(Call call, IOException e) 
                Log.e("e","post请求失败");
            

            @Override
            public void onResponse(Call call, Response response) throws IOException 

            
        );
        Response response=null;
        String responseData="";
        try
            response=client.newCall(request).execute();
            String jsonResStr=response.body().string();
            Log.e("onenet回应数据",jsonResStr);
            JSONObject jsonObject=new JSONObject(jsonResStr);
            responseData=jsonObject.getString("error");
            Log.e("val",responseData);
        catch (Exception e)
            e.printStackTrace();
        
        return responseData;
    

3.Main函数

代码如下:

public class MainActivity extends AppCompatActivity 
    HttpNetwork httpNetwork = new HttpNetwork();
    String openRes;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button bt1=findViewById(R.id.button);
        Button bt2=findViewById(R.id.button2);
        Button bt3=findViewById(R.id.button3);
        TextView tw1=findViewById(R.id.textView);

		//get请求需要用的url
        String url="http://api.heclouds.com/devices/997936235/datapoints?datastream_id=data&limit=3";
        bt1.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                new Thread(() -> 
                    Looper.prepare();
                    openRes=httpNetwork.PostDataMethod("1");
                    Toast.makeText(getApplicationContext(),openRes.toString(),Toast.LENGTH_LONG).show();
                    Looper.loop();
                ).start();
            
        );

        bt2.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                new Thread(() -> 
                    Looper.prepare();
                    openRes=httpNetwork.PostDataMethod("0");
                    Toast.makeText(getApplicationContext(),openRes.toString(),Toast.LENGTH_LONG).show();
                    Looper.loop();
                ).start();
            
        );
        bt3.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 

                    new Thread(() -> 
                        Looper.prepare();
                        String data = httpNetwork.GetDateMethod(url);
                        int date= getvalue(data).intValue();
                        Log.i("data", String.valueOf(date));
                        tw1.post(new Runnable() 
                            @Override
                            public void run() 
                                tw1.setText(String.valueOf(date));
                            
                        );

                    ).start();


            
        );
    

	//json数据解析的函数
    public Integer getvalue(String responseData)
        JsonDate data = new Gson().fromJson(responseData, JsonDate.class);
        List<DatastreamItem> streams = data.getData().getDatastreams();
        List<DatapointItem> points = streams.get(0).getDatapoints();
        Integer resultData = new Integer(1);
        resultData = points.get(0).getValue();
        return resultData;
    

4.运行效果

如图:

这里返回了云平台的最新数据!

完整工程链接:https://pan.baidu.com/s/1LZZS_9tlLnPaN-YwgMAHmw?pwd=8888
提取码:8888


总结

上面的程序仅供参考,写的也比较简陋,文笔也不是很好,所以好多东西都表达的不到位,由于涉及的东西比较多,所以就直接把工程分享出来了。到此为止,一个简单的物联网项目设计就完成了,也是在复习之前学习的知识,同时,也欢迎小伙伴们和我一起进行学习交流呀!!!要学习的东西还很多,大家一起加油进步呀!如果觉得是不错分享动动发财的小手点一个赞呀!

最后多看官方给出的文档,如下:
https://open.iot.10086.cn/doc/v5/develop/
https://developer.android.com/

基于STM32的ESP8266 WIFI与ONENET通信连接,云平台以及手机APP数据显示

首先,如果未了解STM32如何通过WIFI将数据读取传输到云平台可跳转连接进行之前步骤的操作。
基于STM32的ESP8266 WIFI与ONENET通信连接(1),实现温湿度数据互传,LED控制
第一步,在实现STM32将传感器数据采集之后,并且完成WIFI配网步骤,可以正常通过ESP8266WIFI模块正常将数据发送到云平台之后进行以下阅读,
上述内容可以跳转到以下链接进行查看具体操作。
将数据进行可视化处理步骤;
1.登陆oneNET进入控制台

如果按(1)中完成注册配置之后再次进入可以看到以下情况“多协议接入”

点击进入后选择你创建的产品,

然后选择
2.进入编辑应用





当重复多次,将温度、湿度仪表做好,曲线完成之后,需要进行命令行的一个设计

拖动一个命令行,只要按照命令格式 ,可以此处将命令写好,进行发送,WIFI将数据传送给STM32之后进行阈值的修改,从而调整上下限。

同理阈值控制区域也是如此将数据流进行匹配;

完成电脑端设计之后,相同的步骤再将APP端进行设计,;
设计效果与电脑端效果相同;

如果具体细节不了解如何操作,可以简单看一下右上角的“帮助文档”,有具体说明如何操作控件以及匹配数据流。
最终保存退出之后我们可以全屏查看数据,在通信配置良好,设备在线情况下,数据会发生变化。
手机端APP下载链接如下:
链接:https://pan.baidu.com/s/1pqmy6BzQfGd4uRnEL5Oz8w
提取码:8888

手机安装注册(手机端需要登录就可以,一定要和ONENET的账号匹配)
登录后可以查看到你的设备信息;



读者可以进行调整。
笔者能力有限,如遇错误或者功能不能实现,希望私信我,第一时间会进行修改;如遇侵权情况,同样进行整改。
近期笔者在学习阿里云数据传输,后期会更新STM32f103C8T6单片机使用WIFI模块将数据与阿里云平台实现交互。

以上是关于APP通过http获取OneNet数据与命令下发应用层的主要内容,如果未能解决你的问题,请参考以下文章

玩转 ESP32 + Arduino (十二) 通过MQTT协议上传数据至OneNet云平台

物联网(二)---原理分析[STM32+OneNET+ESP8266]

esp32 mqtt协议上报 dht11温湿度数据到onenet 指令下发控制开关灯

基于STM32的ESP8266 WIFI与ONENET通信连接,云平台以及手机APP数据显示

如何使用4G模块通过MQTT协议传输温湿度数据到onenet

016-Android获取onenet平台上的数据