实现安卓连接阿里云物联网平台(2)

完整工程链接

链接:https://pan.baidu.com/s/1ykcJHPBSKBXVMaMWKoVRvA?pwd=8888 
提取码:8888

(1)创建一个新工程

(2)添加mqtt包的依赖

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'

(3)联网权限配置

<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> `

(4)添加AliyunIoTSignUtil工具类 

将创建的工具类中的所有内容   除开第一行package   剩下全部内容替换成下面内容

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Arrays;
import java.util.Map;

/**
 * AliyunIoTSignUtil
 */

public class AliyunIoTSignUtil {
    public static String sign(Map<String, String> params, String deviceSecret, String signMethod) {
        //将参数Key按字典顺序排序
        String[] sortedKeys = params.keySet().toArray(new String[] {});
        Arrays.sort(sortedKeys);

        //生成规范化请求字符串
        StringBuilder canonicalizedQueryString = new StringBuilder();
        for (String key : sortedKeys) {
            if ("sign".equalsIgnoreCase(key)) {
                continue;
            }
            canonicalizedQueryString.append(key).append(params.get(key));
        }

        try {
            String key = deviceSecret;
            return encryptHMAC(signMethod,canonicalizedQueryString.toString(), key);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * HMACSHA1加密
     *
     */
    public static String encryptHMAC(String signMethod,String content, String key) throws Exception {
        SecretKey secretKey = new SecretKeySpec(key.getBytes("utf-8"), signMethod);
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        mac.init(secretKey);
        byte[] data = mac.doFinal(content.getBytes("utf-8"));
        return bytesToHexString(data);
    }

    public static final String bytesToHexString(byte[] bArray) {

        StringBuffer sb = new StringBuffer(bArray.length);
        String sTemp;
        for (int i = 0; i < bArray.length; i++) {
            sTemp = Integer.toHexString(0xFF & bArray[i]);
            if (sTemp.length() < 2) {
                sb.append(0);
            }
            sb.append(sTemp.toUpperCase());
        }
        return sb.toString();
    }

}

(5)替换MainActivity方法

此时会出现特别多报错部分,使用 ALT+ENTER引入class即可

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private String productKey = "";// 高级版产品key
    private String deviceName = "";//已经注册的设备id
    private String deviceSecret = "";//设备秘钥

    final int POST_DEVICE_PROPERTIES_SUCCESS = 1002;
    final int POST_DEVICE_PROPERTIES_ERROR = 1003;
    private MqttClient mqttClient = null;
    private Handler mHandler ;

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

        findViewById(R.id.MQTT_Connect_Button).setOnClickListener((l) -> {
            new Thread(() -> initAliyunIoTClient()).start();
        });
    }


    /**
     * 使用 productKey,deviceName,deviceSecret 三元组建立IoT MQTT连接
     */
    private void initAliyunIoTClient() {

        try {
            String clientId = "androidthings" + System.currentTimeMillis();

            Map<String, String> params = new HashMap<String, String>(16);
            params.put("productKey", productKey);
            params.put("deviceName", deviceName);
            params.put("clientId", clientId);
            String timestamp = String.valueOf(System.currentTimeMillis());
            params.put("timestamp", timestamp);

            // cn-shanghai
            String targetServer = "tcp://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883";

            String mqttclientId = clientId + "|securemode=3,signmethod=hmacsha1,timestamp=" + timestamp + "|";
            String mqttUsername = deviceName + "&" + productKey;
            String mqttPassword = AliyunIoTSignUtil.sign(params, deviceSecret, "hmacsha1");

            connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword);


        } catch (Exception e) {
            e.printStackTrace();
            mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_ERROR);
        }
    }

    public void connectMqtt(String url, String clientId, String mqttUsername, String mqttPassword) throws Exception {
        MemoryPersistence persistence = new MemoryPersistence();
        mqttClient = new MqttClient(url, clientId, persistence);
        MqttConnectOptions connOpts = new MqttConnectOptions();
        // MQTT 3.1.1
        connOpts.setMqttVersion(4);
        connOpts.setAutomaticReconnect(true);
        connOpts.setCleanSession(true);

        connOpts.setUserName(mqttUsername);
        connOpts.setPassword(mqttPassword.toCharArray());
        connOpts.setKeepAliveInterval(60);

        mqttClient.connect(connOpts);
        Log.d(TAG, "connected " + url);
    }

}

(6)添加连接阿里云按钮 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/MQTT_Connect_Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="连接阿里云IOT"/>

</LinearLayout>

(6)将阿里云的三元组填入到代码中即可

 

 (7)开始连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469076.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI将如何影响我们的生活?

1. AI 会如何影响你的生活 通用聊天场景&#xff1a;也即 ChatGPT 本身&#xff0c;或者用 gpt-3.5 的 api 实现的各类网站或小程序。他们没有明确的问题场景&#xff0c;但反而可以解决非常多的问题&#xff0c;比如搜索一些常见问题的答案、编个笑话等&#xff0c;可以当个搜…

力扣刷题(DAY09-DAY11)

Day09 0958. 二叉树的完全性检验 知识点&#xff1a;完全二叉树&#xff1a;在一棵完全二叉树中&#xff0c;除了最后一层外&#xff0c;所有层都被完全填满&#xff0c;并且最后一层中的所有节点都尽可能靠左。最后一层&#xff08;第 h 层&#xff09;中可以包含 1 到 个节点…

白酒:原料的加工方式对白酒品质的影响研究

在豪迈白酒的酿造过程中&#xff0c;原料的加工方式对白酒的品质起着至关重要的作用。云仓酒庄深知这一点&#xff0c;并进行了深入的研究和实践。本文将探讨原料的加工方式如何影响白酒的品质&#xff0c;以及酒庄如何通过改进加工方式来提升白酒的品质。 首先&#xff0c;原料…

web服务架构

1 Web服务器&#xff08;如Nginx、Apache等&#xff09;和Web应用框架&#xff08;如Flask、Django等&#xff09; Web服务器&#xff08;如Nginx、Apache等&#xff09;和Web应用框架&#xff08;如Flask、Django等&#xff09;在Web应用开发和部署中扮演着不同的角色&#xf…

Windows Server 各版本搭建远程访问 / VPN 服务器实现 VPN 连接(03~19)

一、Windows Server 2003 开机后点击添加或删除角色 点击下一步 勾选自定义&#xff0c;点击下一步 点击 远程访问/VPN 服务器&#xff0c;点击下一步 点击下一步 点击下一步 勾选自定义&#xff0c;点击下一步 选择配置类型&#xff0c;点击下一步 点击完成 点击是 点击完成…

RTSP视频监控EasyNVR安防视频云平台直播鉴权功能简述

RTSP协议视频监控系统EasyNVR安防视频云平台&#xff0c;可支持设备通过RTSP/Onvif协议接入并进行视频流的处理及分发&#xff0c;在视频监控场景中可实现视频实时监控直播、云端录像、云存储、录像检索与回看、告警、级联等&#xff0c;平台能将拉取过来的音视频流转化成适合全…

酷得智能电子方案 儿童对讲机

儿童对讲机的设计通常会考虑到孩子的使用习惯和安全&#xff0c;操作简单&#xff0c;适合不同年龄段的儿童使用。同时&#xff0c;为了防止孩子误操作&#xff0c;一些对讲机会有一键锁闭功能&#xff0c;确保除了对讲键之外的所有功能都不会被小朋友乱按。而且&#xff0c;儿…

解锁编程潜能:ChatGPT如何革新软件开发

目录 一、背景 二、功能描述 三、总结 一、背景 在这个飞速发展的数字时代&#xff0c;软件开发的效率和质量成了衡量一个开发者能力的重要标准。随着人工智能技术的不断进步&#xff0c;越来越多的开发者开始寻找能够提升工作效率的新方法。我就是其中之一&#xff0c;最近…

网络安全框架和云安全参考架构介绍

目录 一、网络安全框架 1.1 概述 1.2 IATF框架 1.2.1 框架来源 1.2.2 框架结构图 1.2.3 框架内容 1.2.3.1 人&#xff08;People&#xff09; 1.2.3.2 技术&#xff08;Technology&#xff09; 1.2.3.3 操作&#xff08;Operation&#xff09; 1.3 NIST网络安全框架 …

词令微信小程序怎么添加到我的小程序?

微信小程序怎么添加到我的小程序&#xff1f; 1、找到并打开要添加的小程序&#xff1b; 2、打开小程序后&#xff0c;点击右上角的「…」 3、点击后底部弹窗更多选项&#xff0c;请找到并点击「添加到我的小程序」&#xff1b; 4、添加成功后&#xff0c;就可以在首页下拉我的…

Java毕业设计-基于springboot开发的就业信息管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、前台功能模块2、后台功能模块2.1管理员功能2.2学生功能2.3企业功能2.4导师功能 四、毕设内容和源代码获取总结 Java毕业设计-基…

面试官:volatile如何保证可见性的,具体如何实现?

写在开头 在之前的几篇博文中&#xff0c;我们都提到了 volatile 关键字&#xff0c;这个单词中文释义为&#xff1a;不稳定的&#xff0c;易挥发的&#xff0c;在Java中代表变量修饰符&#xff0c;用来修饰会被不同线程访问和修改的变量&#xff0c;对于方法&#xff0c;代码块…

Ubuntu升级/修改内核模块详细教程

Ubuntu升级/修改内核模块详细教程 下载指定内核版本查看内核版本修改内核步骤下载deb包安装报错解决方案安装完成切换内核脚本 切换内核详解更新内核禁止自动更新 下载指定内核版本 下载路径 https://kernel.ubuntu.com/~kernel-ppa/mainline/ 查看内核版本 1.ubuntu查看当前…

X1 grok-1 开源大语言模型下载

Grok 前言 我们正在发布我们的大型语言模型 Grok-1 的基本模型权重和网络架构。Grok-1 是一个 3140 亿参数的专家混合模型&#xff0c;由 xAI 从头开始训练。 这是 2023 年 10 月结束的 Grok-1 预训练阶段的原始基础模型检查点。这意味着该模型不会针对任何特定应用&#xff…

快速高效地数据分析处理:QtiPlot for Mac中文直装版 兼容M

QtiPlot 是一个用于数据分析和可视化的跨平台科学应用程序。由于其多语言支持&#xff0c;QtiPlot 被积极用于世界各地学术机构的教学。许多研究科学家信任 QtiPlot 来分析他们的数据并发布他们的工作结果。来自各个科学领域和行业的数千名注册用户已经选择了 QtiPlot 来帮助他…

防火墙常用功能配置

防火墙&#xff1a;为了限制不同区域之间的流量通信。默认有一条拒绝所有的策略。 现在的防火墙主要作用&#xff1a;是区域隔离和访问控制。 安全防护是核心特性 路由器&#xff1a;ACL列表&#xff0c;控制流量 入侵防御&#xff1a;网络攻击 文件过滤&#xff0c;内容过滤&…

linux:线程互斥

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、线程互斥问题解释互斥量的接口 二、加锁的原理三、 死锁死锁四个必要条件避免死锁 总结 前言 本文是对于线程互斥的知识总结 一、线程互斥 问题 我们先看下面…

连锁收银系统如何降低连锁经营的税务成本

空中分账是指将总部和各门店之间的财务往来通过虚拟账户进行结算&#xff0c;而非实际资金流动。这种方式可以加强连锁企业的管控&#xff0c;同时在合规的前提下降低税务成本&#xff0c;具体有以下优势&#xff1a; 加强管控&#xff1a; 连锁门店收银统一进入连锁品牌空中账…

Springboot和Spring Cloud版本对应

Spring在不断地升级&#xff0c;各个版本存在一些不兼容的地方&#xff0c;为了避免出现问题&#xff0c;最好注意使用正确的版本。 官网的对应关系&#xff1a;https://start.spring.io/actuator/info 如下图&#xff1a; 下面附一下创建项目的工具&#xff1a; Spring官方…