当前位置:   article > 正文

关于手机app获取onenet数据(新版)_新版onenet

新版onenet

onenet鉴权信息、数据获取

在做毕设的时候我需要做一个APP获取云平台数据,在网上找了很多资料,down了很多代码试了才知道,onenet有两种数据格式,不同格式获取方法不太一样,下面我来讲讲。

1、关于数据格式

在这里插入图片描述

1.1数据流格式

关于网上的很多代码用的是数据流的数据协议,再app中加入json转JsonRootBean时会生成Data、DataPoints、Datastreams、JsonRootBean几个JAVA类,进行数据解析使用,所以再MainActivity中会有这几个文件。

  1. Data、DataPoints、Datastreams、JsonRootBean几个JAVA类获取
    首先是进去开发者中心,在左侧找到运维监控,找到API调试,找到数据流使用,点击查询设备数据点,再填上 带*的必填项点击执行 ,复制右侧返回结果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. JSON在线解析数据
    将上面复制的返回结果粘贴到Json在线解析
    在这里插入图片描述
    就会生成下面四个JAVA类,直接加入到你的app文件中,像我下面这样加入就可,然后再MainActivity中获取解析就可以了
    在这里插入图片描述

1.2.oneJson格式

关于oneJson格式和数据流格式也差不多方法也类似在这里插入图片描述
在这里插入图片描述
2.JSON在线解析数据
基本上也是一样
在这里插入图片描述

忘记说一点很重要的了,这里msg返回的要是succ才行,不然转换的java类就是有问题的

在这里插入图片描述

关于鉴权信息

onenet studio鉴权信息仔细看文档,照搬就行,修改一些自己的信息
这是我的可以使用的java鉴权信息获取:


import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;


public class Token {

    public static String assembleToken(String version, String resourceName, String expirationTime, String signatureMethod, String accessKey)
            throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
        StringBuilder sb = new StringBuilder();
        String res = URLEncoder.encode(resourceName, "UTF-8");
        String sig = URLEncoder.encode(generatorSignature(version, resourceName, expirationTime, accessKey, signatureMethod), "UTF-8");
        sb.append("version=")
                .append(version)
                .append("&res=")
                .append(res)
                .append("&et=")
                .append(expirationTime)
                .append("&method=")
                .append(signatureMethod)
                .append("&sign=")
                .append(sig);
        return sb.toString();
    }

    public static String generatorSignature(String version, String resourceName, String expirationTime, String accessKey, String signatureMethod)
            throws NoSuchAlgorithmException, InvalidKeyException {
        String encryptText = expirationTime + "\n" + signatureMethod + "\n" + resourceName + "\n" + version;
        String signature;
        byte[] bytes = HmacEncrypt(encryptText, accessKey, signatureMethod);
        signature = Base64.getEncoder().encodeToString(bytes);
        return signature;
    }

    public static byte[] HmacEncrypt(String data, String key, String signatureMethod)
            throws NoSuchAlgorithmException, InvalidKeyException {
        //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
        SecretKeySpec signinKey = null;
        signinKey = new SecretKeySpec(Base64.getDecoder().decode(key),
                "Hmac" + signatureMethod.toUpperCase());

        //生成一个指定 Mac 算法 的 Mac 对象
        Mac mac = null;
        mac = Mac.getInstance("Hmac" + signatureMethod.toUpperCase());

        //用给定密钥初始化 Mac 对象
        mac.init(signinKey);

        //完成 Mac 操作
        return mac.doFinal(data.getBytes());
    }

    public enum SignatureMethod {
        SHA1, MD5, SHA256;
    }

    public static String token() throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
        String version = "2020-05-29";
        String resourceName = "userid/******";//将*号处换成自己的用户id
        String expirationTime = System.currentTimeMillis() / 1000 + 3600 + "";
        String signatureMethod = SignatureMethod.SHA1.name().toLowerCase();
        //这个也是换成自己的Accesskey
        String accessKey = "********************************************";
        String token = assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey);
        System.out.println("Authorization:" + token);
        return token;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

在这里我是直接创建成一个类,方便MainActivity调用,用户ID、Accesskey再用户中心查看在这里插入图片描述
我down的代码时B站上的,大家也可以参考一下app参考,这是开源的

下面是我目前修改的地方,目前实现和获取云平台数据,即get(),post还未实现,我已经注释掉了

package com.example.*******;


import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;



public class MainActivity extends Activity implements View.OnClickListener {

    private static final String Accept = "application/json, text/plain, */*";
    private static  String Authorization ;

    Button GET, POST;
    TextView data, data1, data2, data3, data4;
    String  value, value1, value2, value3;
    long time_str;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        GET = findViewById(R.id.get);
        POST = findViewById(R.id.post);

        data = findViewById(R.id.data);//温度显示区域
        data1 = findViewById(R.id.data1);//湿度显示区域
        data2 = findViewById(R.id.data2);//温度修改值
        data3 = findViewById(R.id.data3);//湿度修改值
        data4 = findViewById(R.id.data4);//实现显示区域

        GET.setOnClickListener(this);
        POST.setOnClickListener(this);
        requestPermissions(new String[]{"android.permission.INTERNET"}, 1);
        // Get();
        //wirte by lml
    }

    @Override
    public void onClick(View v) {

        int id = v.getId();
        if (id == R.id.get) {
            Get();
            Toast.makeText(MainActivity.this, "数据接收成功", Toast.LENGTH_SHORT).show();
        } else if (id == R.id.post) {
           // Post();
            Toast.makeText(MainActivity.this, "数据修改成功", Toast.LENGTH_SHORT).show();
        }
    }


    public void Get() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //鉴权值获取
                try {
                    Authorization = Token.token();
                    Log.d("Token", Authorization);
                } catch (NoSuchAlgorithmException | InvalidKeyException |
                         UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                    //接受温度
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder().url("https://iot-api.heclouds.com/thingmodel/query-device-property?product_id=产品id&device_name=设备名").addHeader("Authorization", Authorization).addHeader("Accept",Accept).build();
                    client.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            e.printStackTrace();
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            if(!response.isSuccessful()) {
                                throw new IOException("Unexpected code" +response);
                            }else {
                                String responseBody = response.body().string();
                                System.out.println(responseBody);//输出响应内容

                                //JSON数据提取
                                JsonRootBean app = new Gson().fromJson(responseBody, JsonRootBean.class);
                                List<Data> data_get = app.getData();
                                value = data_get.get(1).getValue();
                                time_str = data_get.get(1).getTime();
                                Date time = new Date(time_str);
                                data.post(new Runnable() {//温度显示区域
                                    @Override
                                    public void run() {
                                        data.setText(String.format("温度:%s°C", value));
                                        data4.setText(String.format("时间:%s", time));
                                    }
                                });

                            }

                        }
                    });


                try {
                    //接受湿度
                    OkHttpClient client1 = new OkHttpClient();
                    Request request1 = new Request.Builder().url("https://iot-api.heclouds.com/thingmodel/query-device-property?product_id=产品id&device_name=设备名").addHeader("Authorization", Authorization).addHeader("Accept",Accept).build();
                    Response response1 = client1.newCall(request1).execute();
                    String responseData1 = response1.body().string();
   //                 parseJSONWithGSON(responseData1);

                    JsonRootBean app = new Gson().fromJson(responseData1, JsonRootBean.class);

                    List<Data> data_get = app.getData();
                    value1 = data_get.get(0).getValue();
                    time_str = data_get.get(0).getTime();
                    Date time = new Date(time_str);
                    data1.post(new Runnable() {
                        @Override
                        public void run() {
                            data1.setText(String.format("湿度:%s%%", value1));
                        }
                    });

                } catch (IOException ex) {
                    ex.printStackTrace();
                }

            }
        }).start();

    }



    //解析json
    private void parseJSONWithGSON(String jsonData) {
        JsonRootBean app = new Gson().fromJson(jsonData, JsonRootBean.class);
        List<Data> data_get = app.getData();
        //List<Data> points = streams.get(0).getDatapoints();
        int count = data_get.size();//获取数据的数量
        for (int i = 0; i < count; i++) {
            long time = data_get.get(i).getTime();
            String value = data_get.get(i).getValue();
            Log.w("www", "time=" + time);
            Log.w("www", "value=" + value);
        }

    }

}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
关于Request.Builder().url("https://iot-api.heclouds.com/thingmodel/query-device-property?product_id=产品id&device_name=设备名").addHeader("Authorization", Authorization).addHeader("Accept",Accept).build();


  • 1
  • 2
  • 3

url是根据下面这里来的:在这里插入图片描述

好了,今天分享就到这了,可能写的有点乱,你们将就的看,希望对大家有帮助。

想起可以用百度网盘,
记得仔细看代码,和文章有点区别,因为我的app是已经做好了,加了很多东西,也修改了一些东西,我已经删掉一些没用的,但是和文章是有点不一样的,但是是可以实现云平台数据上传与接收的,下载之后记得自己在本地新建一个工程,把我的文件代码复制过去,否则会报错!!!!
还有就是需要修改成自己的设备id和产品id有标注释,仔细看看!
需要修改成自己的设备id和产品id有标注释,仔细看看!
需要修改成自己的设备id和产品id有标注释,仔细看看!
记得自己在本地新建一个工程,把我的文件代码复制过去,否则会报错!!!!
记得自己在本地新建一个工程,把我的文件代码复制过去,否则会报错!!!!
记得自己在本地新建一个工程,把我的文件代码复制过去,否则会报错!!!!
(重要的事情说三遍)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/401729
推荐阅读
相关标签