安卓android向onenet物联网云平台请求数据(接入协议mqtts)

使用android向onenet物联网云平台请求数据

第一步:

在manifest加入<uses-permission android:name="android.permission.INTERNET"/>,如图所示:

第二步:

在xml文件夹中创建一个名为“network_security_config”的xml文件,如图所示:

其内容为:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

第三步:

由于本人是用okhttp进行网络请求的,所以需要在build.gradle中加入此句:

implementation 'com.squareup.okhttp3:okhttp:3.10.0'

okhttp有很多版本,最新版可通过其官网查看Overview - OkHttp (square.github.io)

第四部:

上代码!!

package com.example.???;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import java.io.IOException;
import java.util.Arrays;

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

import android.os.Build;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

//if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

public class MainActivity extends AppCompatActivity {
private TextView textView1;
    private TextView textView2;
    private TextView textView3;
    private TextView textView4;
    private Button button;

    private String[] name = new String[4];
    private String[] val = new String[4];

    private String DEVICE_ID = "设备id";
    private String PRODUCT_ID = "产品id";
    private String APIKey = "设备的key";
    private String PRODUCT_KEY = "产品的key";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button1);

        button.setOnClickListener(new View.OnClickListener() {
@Override
            public void onClick(View view) {
                s();
            }
        });
    }

public void s() {
//同步请求
//            new Thread(new Runnable() {
//                @RequiresApi(api = Build.VERSION_CODES.O)
//                @Override
//                public void run() {
//                    try {
//                        OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
//                        Request request = new Request.Builder()
//                                .url(String.format("http://api.heclouds.com/devices/%s/datapoints?",DEVICE_ID ))//请求接口。如果需要传参拼接到接口后面。
//                                .addHeader("Authorization","填入你的token,注意填入的token不要超过登陆限制的时长,否则失败")
//                                .build();//创建Request 对象
//                        Response response = null;
//                        response = client.newCall(request).execute();//得到Response 对象
//                        if (response.body() != null) {
//                            String data = response.body().string();
//                            JSONObject jsonObject = new JSONObject(data);
//                            Log.d("kwwl","response.code()=="+response.code());
//                            Log.d("kwwl","response.message()=="+response.message());
                            Log.d("kwwl","res=="+response.body().string());
//                            Log.d("kwwl","res=="+data);
//                            Log.d("kwwl","type of body"+data.getClass().getTypeName());
                            Log.d("kwwl", (String) jsonObject.get("errno"));
//                          
//                            textView = findViewById(R.id.textview1);
//                            textView.setText(data);
//                        }
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                    }
//                }
//            }).start();

        //异步请求
        new Thread(new Runnable() {
@Override
            public void run() {
                OkHttpClient client = new OkHttpClient();
                FormBody.Builder form = new FormBody.Builder();
                form.add("led_state", "1");
                Request request = new Request.Builder()
                        .url(String.format("http://api.heclouds.com/devices/%s/datapoints?", DEVICE_ID))//请求接口。如果需要传参拼接到接口后面。
                        .addHeader("Authorization", "你的token")
                        .build();//创建Request 对象
                client.newCall(request).enqueue(new Callback() {
@Override
                    public void onFailure(Call call, IOException e) {

                    }
@Override
                    public void onResponse(Call call, Response response) throws IOException {
if (response.body() != null) {
                            String result = response.body().string();
                            Log.d("kwwl", "message==" + response.message());
                            Log.d("kwwl", "code==" + response.code());
                            Log.d("kwwl", "data==" + result);
                            try {
                                JSONObject jsonObject = new JSONObject(result);
                                JSONObject data = jsonObject.getJSONObject("data");
                                JSONArray datasteams = data.getJSONArray("datastreams");
                                for (int i = 0; i < datasteams.length(); i++) {
                                    JSONObject indexObj = datasteams.getJSONObject(i);
                                    String id = indexObj.optString("id");
                                    name[i] = id;
                                    JSONArray datapoints = indexObj.getJSONArray("datapoints");
                                    JSONObject valueB = datapoints.getJSONObject(0);
                                    String value = valueB.optString("value");
                                    Log.d("kwwl", "value====" + value);
                                    val[i] = value;
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
for (int i = 0; i < name.length; i++) {
                                Log.d("kwwl", "类型:" + name[i] + "\t" + "数值:" + val[i]);
                            }

textView1 = findViewById(R.id.textview1);
                            textView2 = findViewById(R.id.textview2);
                            textView3 = findViewById(R.id.textview3);
                            textView4 = findViewById(R.id.textview4);
                            String str1 = "类型:" + name[0] + "\t" + "数值:" + val[0];
                            textView1.setText(str1);
                            String str2 = "类型:" + name[1] + "\t" + "数值:" + val[1];
                            textView2.setText(str2);
                            String str3 = "类型:" + name[2] + "\t" + "数值:" + val[2];
                            textView3.setText(str3);
                            String str4 = "类型:" + name[3] + "\t" + "数值:" + val[3];
                            textView4.setText(str4);
                        }
                    }
                });
            }
        }).start();
    }
}

onenet平台中,如果设备接入的是mqtts协议,那么想要对其发起数据请求,貌似只能通过Authorization的方式进行数据请求,但官方文档说除了此方式外还可以通过apk-key的方式也行,但是本人试了不行,而且后面客服反馈说如果是mqtts协议,就只能Authorization的方式请求,官方文档给出的东西还是有坑的,小伙伴们记得闭坑,不知道啥时候才能改过来。

除此之外,以上还提到了token,我们可以通过使用官方给出的代码生成自己的token,连接如下:

java_开发者文档_OneNET (10086.cn)

python_开发者文档_OneNET (10086.cn)

一个是java的代码另一个则是python的,大家自行选择。(注意:官方还推出了token计算工具,在此嘱咐大家别用这个工具,因为使用这个工具生成的token是请求不到数据的,所以大家还是用代码吧,代码也挺香的)

<LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="请求数据"
        android:id="@+id/button1"
        />

    <TextView
        android:id="@+id/textview1"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:text="textview"
        android:textSize="22sp"
        />

    <TextView
        android:id="@+id/textview2"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:text="textview"
        android:textSize="22sp"
        />

    <TextView
        android:id="@+id/textview3"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:text="textview"
        android:textSize="22sp"
        />

    <TextView
        android:id="@+id/textview4"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:text="textview"
        android:textSize="22sp"
        />

</LinearLayout>

效果:

点一下button按钮后稍等一段时间

注:以上代码只有一个MainActivity和activity_main.xml文件,结构很简单,主要是想实现一个通过android开发工具实现对onenet物联网云平台设备数据的请求。

  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
Android中使用OkHttp3进行POST和GET请求来发送数据OneNet物联网云平台可以按照以下步骤进行。 首先,要使用OkHttp3,需要将其添加为项目的依赖项。可以在项目的build.gradle文件中添加以下代码来导入OkHttp3库: ```groovy implementation 'com.squareup.okhttp3:okhttp:3.12.1' ``` 接下来,要发送POST请求,可以使用OkHttp3的Request和RequestBody类来构建请求,并使用OkHttpClient来执行请求。 ```java OkHttpClient client = new OkHttpClient(); // 构建请求体 FormBody requestBody = new FormBody.Builder() .add("key1", "value1") .add("key2", "value2") .build(); // 构建请求 Request request = new Request.Builder() .url("https://api.heclouds.com/devices/{deviceId}/datapoints") .addHeader("api-key", "YOUR_API_KEY") .post(requestBody) .build(); // 执行请求 try { Response response = client.newCall(request).execute(); if (response.isSuccessful()) { // 请求成功 String responseData = response.body().string(); // 处理返回的数据 } else { // 请求失败 // 处理错误信息 } } catch (IOException e) { e.printStackTrace(); } ``` 上面的代码示例中,我们创建了一个FormBody作为请求体,并填充了要发送的数据请求的URL需要替换为OneNet物联网云平台实际的URL,同时需要在请求头中添加API密钥。 对于GET请求,可以使用OkHttp3的Url类来构建请求,同样使用OkHttpClient来执行请求。 ```java OkHttpClient client = new OkHttpClient(); // 构建请求 HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.heclouds.com/devices/{deviceId}/datapoints").newBuilder(); urlBuilder.addQueryParameter("key1", "value1"); urlBuilder.addQueryParameter("key2", "value2"); // 执行请求 try { Request request = new Request.Builder() .url(urlBuilder.build()) .addHeader("api-key", "YOUR_API_KEY") .get() .build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { // 请求成功 String responseData = response.body().string(); // 处理返回的数据 } else { // 请求失败 // 处理错误信息 } } catch (IOException e) { e.printStackTrace(); } ``` 同样地,GET请求的URL需要替换为OneNet物联网云平台实际的URL,同时在请求头中添加API密钥。GET请求需要使用Url类来构建URL,并通过addQueryParameter()方法添加查询参数。 以上就是使用OkHttp3在Android中发送POST和GET请求OneNet物联网云平台的简要步骤。根据实际的接口定义和需求,可能需要调整请求的参数和处理返回数据的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值