2023新版Onenet+AndroidStudio(GET获取数据,Onenet安全鉴权)

文章目录
  • * 概要
    
    • 整体架构流程
    • 技术名词解释
    • 两个类的声明
    • 鉴权生成(Token)
    • MainActivity代码(Java)
    • 小结

概要

最近做了个大作业,是用AndroidStudio获取Onenet上面数据的。
本文介绍两个方法,GET()和POST()。用的是java语言,kotlin语言可以直接搜kotlin,get方法,和java的没什么区别。

整体架构流程

首先要引入依赖和库,比如联网的,Okhttp的库
然后是核心的GET和POST代码,这里要注意的是鉴权
,我找了好久才在官网找到安全鉴权的方式。(这里吐槽一下Onenet的开发者文档的可查询性实在是太弱了)
最后是获取到返回数据。
![所有文件](https://img-
blog.csdnimg.cn/direct/57c8ccd33e204c089d27e7f419006159.png)

技术名词解释

1,Okhttp:OkHttp是一个开源的Java库,用于处理HTTP请求。它是Square公司开发的,设计简单而灵活,是Android开发中广泛使用的HTTP客户端。
示例代码:

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttpExample {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url("https://www.baidu.com")
                .build();

        try (Response response = client.newCall(request).execute()) {
            System.out.println(response.body().string());
        }
    }
}

2,安全鉴权:在OkHttp中,.header
方法用于设置HTTP请求头。通过这个方法,你可以添加自定义的请求头信息。以下是一个简单的示例,演示如何在OkHttp中使用.header方法:

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttpHeaderExample {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();

        // 构建请求时使用 .header 方法添加自定义的请求头
        Request request = new Request.Builder()
                .url("https://www.example.com")
                .header("Authorization", "Bearer your_access_token") // 添加 Authorization 请求头
                .build();

        try (Response response = client.newCall(request).execute()) {
            System.out.println(response.body().string());
        }
    }
}

两个类的声明

第一个是JsonRootBean.java文件(这个文件和MainActivity平行)

package com.example.myapplication;

import java.util.List;

public class JsonRootBean {//Json转换
    int code;
List<Data> data;
    String msg;
    String request_id;

}

第二个是data.java

package com.example.myapplication;
import androidx.annotation.VisibleForTesting;

import java.util.List;
public class Data {//用list存放获取的数据流
    String identifier;
    String time;
    String value;
    String data_type;
    String access_mode;
    String name;
    String description;
}

鉴权生成(Token)

Onenet的鉴权介绍网址:安全鉴权
鉴权码生成代码:API鉴权
我贴一下我的代码token.java

package com.example.myapplication;

import android.os.Build;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class Token {
    public static String TOKEN = "默认值";

    public static void setMyString(String newValue) {
        TOKEN = newValue;
    }
    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 = null;
        byte[] bytes = HmacEncrypt(encryptText, accessKey, signatureMethod);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            signature = Base64.getEncoder().encodeToString(bytes);
        }
        return signature;
    }

    public static byte[] HmacEncrypt(String data, String key, String signatureMethod)
            throws NoSuchAlgorithmException, InvalidKeyException {
        //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
        SecretKeySpec signinKey = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            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 void main(String args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
        String version = "2022-05-01";
        String resourceName = "userid/这里写你的用户id";
        String expirationTime = System.currentTimeMillis() / 1000 + 100 * 24 * 60 * 60 + "";
        String signatureMethod = SignatureMethod.SHA1.name().toLowerCase();
        String accessKey = "这里放你的AccessKey(在Onenet官网的账户信息里面)";
        String token = assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey);
        setMyString(token);
    }
}

MainActivity代码(Java)

 public class MainActivity extends AppCompatActivity {
 String token="鉴权参数";
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);//UI的基本布局
        try {
            Token.main("拿鉴权码,这里参数无所谓的");
        } catch (UnsupportedEncodingException | NoSuchAlgorithmException | InvalidKeyException e) {
            throw new RuntimeException(e);
        }
        token=Token.TOKEN;//赋值Token,把鉴权信息拿到
`        requestPermissions(new String[]{"android.permission.INTERNET"}, 1);
        Get();}

如图上面是主函数代码,获取网络请求后直接GET就好了。

public void Get(){
         new Thread(new Runnable() {
                    @Override
                    public void run() {
               		while (true) {
                    try {
                        OkHttpClient client = new OkHttpClient();
                        //http(s)://iot-api.heclouds.com/thingmodel/query-device-property?product_id=w50WLDzGBb&device_name=light
                        //http://iot-api.heclouds.com/thingmodel/query-thing-model?product_id=w50WLDzGBb
                        Request request = new Request.Builder().url("http://iot-api.heclouds.com/thingmodel/query-device-property?product_id=这里输入你的产品id&device_name=你的设备名称")
                                .header("Authorization",token)
                                .build();
                        Response response = client.newCall(request).execute();
                        String responseData = response.body().string();
                          JsonRootBean app = new Gson().fromJson(responseData, JsonRootBean.class);

                       value=app.data.get(0).value.toString();//获得亮度
                        brightnessDisplay.post(new Runnable() {
                            @Override
                            public void run() {
                                brightnessDisplay.setText(String.format("BrightnessRightNow:%s", value));
                            }
                        });
                    } catch (IOException e) {
                        e.printStackTrace();}
                   try {
                       Thread.sleep(1000);
                   } catch (InterruptedException e) {
                       throw new RuntimeException(e);
                   }//延时一秒获取一次亮度
               }
            }
        }).start();

在.header后面这个token,就是我们要的鉴权码。
上面代码中的jsonRootbean是我自己的一个类,我GET获取的数据是一段json格式的数组

{"code":0,
"data":[{"identifier":"bright","time":1700127636130,"value":"0.600000","data_type":"float","access_mode":"读写","name":"bright"},
{"identifier":"setbright","data_type":"int32","access_mode":"读写","name":"setbright"},
{"identifier":"state","time":1698234341316,"value":"2","data_type":"enum","access_mode":"读写","name":"state","description":"工作模式"},
{"identifier":"time","data_type":"date","access_mode":"读写","name":"time"}],
"msg":"succ",
"request_id":"f97096fb25a94f2884a043c510821485"}

ONENET官网关于GET方法的返回数组
可以看到有4个大参数,code,data,msg,request_id
data是一个数组,在数组的每一个项里面又包含4个小参数(如下图),![identifier,data_type,access_mode,name](https://img-
blog.csdnimg.cn/direct/e7cf4bf104bc4048b28e33e236bab119.png)
所以我们核心的是获取到data里面的这个value值,因此GET获取到数据后,采用了下面这个方式提取到value

 Response response = client.newCall(request).execute();
                        String responseData = response.body().string();
                          JsonRootBean app = new Gson().fromJson(responseData, JsonRootBean.class);

                       value=app.data.get(0).value.toString();//获得亮度

小结

搞定鉴权就简单了很多很多。有问题私信问

学习网络安全技术的方法无非三种:

第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。

第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉自己没有进步,容易劝退。

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

第三种就是去找培训。

image.png

接下来,我会教你零基础入门快速入门上手网络安全。

网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。但是对于完全零基础的人来说又或者急于转行的人来说,学习编程或者计算机基础对他们来说都有一定的难度,并且花费时间太长。

第一阶段:基础准备 4周~6周

这个阶段是所有准备进入安全行业必学的部分,俗话说:基础不劳,地动山摇
image.png

第二阶段:web渗透

学习基础 时间:1周 ~ 2周:

① 了解基本概念:(SQL注入、XSS、上传、CSRF、一句话木马、等)为之后的WEB渗透测试打下基础。
② 查看一些论坛的一些Web渗透,学一学案例的思路,每一个站点都不一样,所以思路是主要的。
③ 学会提问的艺术,如果遇到不懂得要善于提问。
image.png

配置渗透环境 时间:3周 ~ 4周:

① 了解渗透测试常用的工具,例如(AWVS、SQLMAP、NMAP、BURP、中国菜刀等)。
② 下载这些工具无后门版本并且安装到计算机上。
③ 了解这些工具的使用场景,懂得基本的使用,推荐在Google上查找。

渗透实战操作 时间:约6周:

① 在网上搜索渗透实战案例,深入了解SQL注入、文件上传、解析漏洞等在实战中的使用。
② 自己搭建漏洞环境测试,推荐DWVA,SQLi-labs,Upload-labs,bWAPP。
③ 懂得渗透测试的阶段,每一个阶段需要做那些动作:例如PTES渗透测试执行标准。
④ 深入研究手工SQL注入,寻找绕过waf的方法,制作自己的脚本。
⑤ 研究文件上传的原理,如何进行截断、双重后缀欺骗(IIS、PHP)、解析漏洞利用(IIS、Nignix、Apache)等,参照:上传攻击框架。
⑥ 了解XSS形成原理和种类,在DWVA中进行实践,使用一个含有XSS漏洞的cms,安装安全狗等进行测试。
⑦ 了解一句话木马,并尝试编写过狗一句话。
⑧ 研究在Windows和Linux下的提升权限,Google关键词:提权
image.png
以上就是入门阶段

第三阶段:进阶

已经入门并且找到工作之后又该怎么进阶?详情看下图
image.png

给新手小白的入门建议:
新手入门学习最好还是从视频入手进行学习,视频的浅显易懂相比起晦涩的文字而言更容易吸收,这里我给大家准备了一套网络安全从入门到精通的视频学习资料包免费领取哦!

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值