实现安卓连接阿里云物联网平台(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 = "";// 高级版产品keyprivate String deviceName = "";//已经注册的设备idprivate String deviceSecret = "";//设备秘钥final int POST_DEVICE_PROPERTIES_SUCCESS = 1002;final int POST_DEVICE_PROPERTIES_ERROR = 1003;private MqttClient mqttClient = null;private Handler mHandler ;@Overrideprotected 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-shanghaiString 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.1connOpts.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"><Buttonandroid:id="@+id/MQTT_Connect_Button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="连接阿里云IOT"/></LinearLayout>

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

 

 (7)开始连接

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MINT: Detecting Fraudulent Behaviors from Time-series Relational Data论文阅读笔记

2. 问题定义 时间序列关系数据&#xff08;Time Series Relation Data&#xff09; 这个数据是存放在关系型数据库中&#xff0c;每一条记录都是泰永时间搓的行为。 更具体地&#xff0c;每条记录表示为 x ( v , t , x 1 , x 2 , … , x m − 2 ) x (v,t,x_1,x_2,\dots,x…

【Unity】UI九宫格

什么是九宫格&#xff1f; 顾名思义&#xff0c;九宫格就是指UI切成9个格子&#xff0c;9个格子可以任意拉伸。 1、3、7、9不拉伸。 2、8水平拉伸。 4、6垂直拉伸。 5既可以水平也可以垂直拉伸。 怎么切九宫格&#xff1f; 选中图片&#xff0c;改成Sprite模式&#xff0c;点…

Spark面试整理-Spark的主要组件是什么?

Apache Spark由几个关键组件组成,这些组件共同构成了它强大的数据处理和分析能力。以下是Spark的主要组件: Spark Core:Spark Core是整个Spark平台的基础,提供了基本的I/O功能、任务调度、内存管理、错误恢复等功能。它引入了弹性分布式数据集(RDD),这是Spark的一个基本…

Linux 常用命令汇总(七):进程管理 系统权限 用户授权

一、进程管理命令 1.1 service 1.1.1 介绍 service 是一个在大多数 Linux 发行版中用于管理系统服务的命令 1.1.2 使用方法 sudo service 服务名 [start|stop|restart|status|...] 1.1.3 常见使用案例 1.1.3.1 启动服务 sudo service apache2 start 这将启动名为 apac…

CCF编程能力等级认证GESP—C++5级—20240316

CCF编程能力等级认证GESP—C5级—20240316 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)成绩排序B-smooth 数 参考答案单选题判断题编程题1编程题2 单选…

[flask] flask的基本介绍、flask快速搭建项目并运行

笔记 Flask Flask 本身相当于一个内核&#xff0c;其他几乎所有的功能都要用到扩展&#xff08;邮件扩展Flask-Mail&#xff0c;用户认证Flask-Login&#xff0c;数据库Flask-SQLAlchemy&#xff09;&#xff0c;都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、…

婴儿奶瓶哪个品牌最好?五大热门品牌深度测评推荐

最近很多新手爸妈都在后台私信咨询如何选购婴儿奶瓶&#xff0c;以及要怎么选才能够避雷避坑。为了解答大家的问题&#xff0c;我特地为大家对现在的各种主流款奶瓶进行全面测评。 对于婴儿奶瓶&#xff0c;可能有些新手爸妈觉得随便买买就好&#xff0c;但实际上挑选婴儿奶瓶…

day12-SpringBootWeb 登录认证

一、登录功能 Slf4j RestController public class LoginController {Autowiredprivate EmpService empService;PostMapping("/login")public Result login(RequestBody Emp emp){log.info("员工登录: {}", emp);Emp e empService.login(emp);//登录失败, …

css使用伪类选择器来选择特定模式的元素

在CSS中&#xff0c;伪类选择器用于选择处于特定状态或符合特定条件的元素。以下是一些常用的伪类选择器&#xff0c;它们可以用来选择特定模式的元素&#xff1a; :hover&#xff1a;选择鼠标指针浮动在上面的元素。 a:hover { color: red; }:active&#xff1a;选择并激…

高企认定中科技成果转化是什么呢?

其实&#xff0c;这是一个流程&#xff0c;可以用下面的分段进程来表示&#xff1a;企业开展科研立项—科研立项得到科研结果—科研结果用于产品的生产—新产品品质提高带动了销售的增加。 上面的流程&#xff0c;其实是高企审核的核心&#xff0c;不仅仅关系到了量化打分。更…

负阻尼振荡器仿真模拟

负阻振荡器&#xff08;Negative resistance oscillator&#xff09;是利用负阻器件抵消回路中的正阻损耗&#xff0c;产生自激振荡的振荡器。由于负阻器件与回路仅有两端连接&#xff0c;故负阻振荡器又称为“二端振荡器”。 阻尼是指阻碍物体的相对运动、并把运动能量转化为…

NVIDIA 推出地球-2云平台,使用AI超级计算机的模拟技术,预测整个地球的气候变化

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

汇编LOG怎么看

一 汇编中常见的数据类型 C 字符 H 半字 F 全字 D 双字 X 十六进制数 B 二进制数 P 压缩十进制数 Z 非压缩十进制数AREA DS CL4 AREA2 DS 4CL1CL4是一个很常见的定义 类似的还有PL5,XL6 第一个定义保留4 个字节的区域&#xff0c;并将该区域的首地址赋予AREA&#xf…

深入理解 Linux 函数参数

在Linux Shell编程中&#xff0c;函数是一种非常有用的功能&#xff0c;它可以将重复的代码封装起来&#xff0c;提高代码的可重用性和可维护性。在本文中&#xff0c;我们将探讨Linux Shell函数及其参数的相关知识。 函数基础 在Linux Shell中&#xff0c;我们可以使用 func…

new mars3d.layer.GeoJsonLayer({的pupup配置参考

new mars3d.layer.GeoJsonLayer({的pupup配置可选项以及相关效果参考&#xff1a; 说明&#xff1a;popup按属性字段配置&#xff0c;可以是字符串模板或数组 1.popup仅配置{type}{name}等属性的的时候&#xff0c;指显示json文件内数据的type与name&#xff0c;效果如下 相关…

MyBatis核心配置文件:解锁数据之美的密码

MyBatis&#xff0c;这位编程的诗人&#xff0c;通过其独特的核心配置文件&#xff0c;为我们描绘出一幅数据之美的画卷。本篇博客将带你深入探讨MyBatis核心配置文件的奥秘&#xff0c;让你能够更好地理解和运用这个优雅的数据持久化框架。 最近想搞私域&#xff0c;欢迎各位…

【MySQL】8. 基本查询(update/delete/聚合/分组)

表的删改 3. Update 语法&#xff1a; UPDATE table_name SET column expr [, column expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]对查询到的结果进行列值更新 案例&#xff1a; 3.1 将孙悟空同学的数学成绩变更为 80 分 -- 更新值为具体值 -- 查看原数据 SELECT…

开发指南-1:编码技巧与规范开始

目录 实例 1.使用对象代替if及switch 2.使用Array.from快速生成数组 3.使用router.beforeEach来处理跳转前逻辑 4.使用v-if来优化页面加载 5.路由跳转尽量使用name而不是path 6.使用key来优化v-for循环 7.使用computed代替watch 8.统一管理缓存变量 9.使用setTimeout…

【深度学习】训练Stable Diffusion环境

仓库&#xff1a; https://github.com/bmaltais/kohya_ss.git 基础镜像&#xff1a; from kevinchina/deeplearning:sdxllighting_trt_nginx_002api docker run --net host --gpus device0 -e APIWORKS1 -it t1:t1 bash构建环境&#xff1a; sudo -i git clone https://git…

springboot291校园疫情防控系统

校园疫情防控系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统校园疫情防控信息管理难度…