【Android+物联网】Android封装MQTT连接阿里云物联网平台

前言:

亲测可行,本文实现Android封装MQTT连接阿里云物联网平台。将MQTT协议和连接阿里云平台的操作通过Android studio写入APP中,并简单设计UI。实现手机APP远程控制单片机LED灯亮灭的功能。

关于《Android软件开发》,见如下专栏

https://blog.csdn.net/m0_61712829/category_12455686.html?spm=1001.2014.3001.5482

 关于《完整实现STM32+ESP8266+MQTT+阿里云+APP》,见如下专栏

https://blog.csdn.net/m0_61712829/category_12545281.html?spm=1001.2014.3001.5482

 本文参考的APP源码:GitCode - 开发者的代码家园

1.下载mqtt.jar包

下载链接:Index of /repositories/paho-releases/org/eclipse/paho

选取org.eclipse.paho.client.mqttv3/1.2.2/org.eclipse.paho.client.mqttv3-1.2.2.jar下载

进入链接后,过程如下:

首先,选取 org.eclipse.paho.client.mqttv3/ 
 

​选择 1.2.1/

选取 org.eclipse.paho.client.mqttv3-1.2.2.jar 进行下载

下载成功如下

然后,将下载成功的jar包拷贝到你工程的app/libs目录

2.导入mqtt.jar包

点击项目页面最右边的设置按钮,选择 Project Structure..

进入后,按如下图顺序点击选择 

在step1. 处输入路径 libs\org.eclipse.paho.client.mqttv3-1.2.2.jar

导入mqtt.jar包成功,点击ok

​ 3.程序说明

1.在 AndroidManifest.xml 添加网络权限

</application><uses-permission android:name="android.permission.INTERNET" />
</manifest>

 位置如下所示:

​ 2.在 MainActivity.java 添加包

MainActivity.java 在如下位置

注意:将代码中涉及的工程名改为你的工程名 

package com.example.test;import androidx.appcompat.app.AppCompatActivity;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;import com.example.test.AliyunIoTSignUtil;import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;import java.io.IOException;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

 3.在MainActivity.java中的public class MainActivity extends AppCompatActivity {}中初始定义一些基本信息

注意:将productKey、deviceName、deviceSecret 改为你自己的;将json数据格式中的标识符改为你自己的

 private static final String TAG =MainActivity.class.getSimpleName();private TextView msgTextView;private String productKey="a16OKk6dTya";private String deviceName="KAMI";private String deviceSecret="8790bd0545dd874d77fcac85729fc4bf";private final String payloadJson1="{\"ParkingState\":1}";private final String payloadJson2="{\"ParkingState\":0}";private MqttClient mqttClient=null;final int POST_DEVICE_PROPERTIES_SUCCESS = 1002;final int POST_DEVICE_PROPERTIES_ERROR = 1003;private String responseBody = "";private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case POST_DEVICE_PROPERTIES_SUCCESS:showToast("发送数据成功");break;case POST_DEVICE_PROPERTIES_ERROR:showToast("post数据失败");break;}}};

 4.在MainActivity.java中,写开始APP生命周期函数

  @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);msgTextView = findViewById(R.id.msgTextView);findViewById(R.id.activate_button).setOnClickListener((l) -> {new Thread(() -> initAliyunIoTClient()).start();});findViewById(R.id.post_button1).setOnClickListener((l) -> {mHandler.postDelayed(() -> postDeviceProperties1(), 1000);});findViewById(R.id.post_button2).setOnClickListener((l) -> {mHandler.postDelayed(() -> postDeviceProperties2(), 1000);});}

5.在MainActivity.java中,写连接阿里云物联网平台函数

 private void initAliyunIoTClient() {try {String clientId = "12345"+ 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();responseBody = e.getMessage();mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_ERROR);}}

6.在MainActivity.java中,写登陆MQTT函数

 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);}

7.在MainActivity.java中,写发布主题Publish函数

    private void postDeviceProperties1() {try {Random random = new Random();//上报数据String payload = String.format(payloadJson1, String.valueOf(System.currentTimeMillis()), 10 + random.nextInt(20), 50 + random.nextInt(50));responseBody = payload;MqttMessage message = new MqttMessage(payload.getBytes("utf-8"));message.setQos(1);String pubTopic = "/" + productKey + "/" + deviceName + "/user/update";mqttClient.publish(pubTopic, message);Log.d(TAG, "publish topic=" + pubTopic + ",payload=" + payload);mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_SUCCESS);mHandler.postDelayed(() -> postDeviceProperties1(), 5 * 1000);} catch (Exception e) {e.printStackTrace();responseBody = e.getMessage();mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_ERROR);Log.e(TAG, "postDeviceProperties error " + e.getMessage(), e);}}private void postDeviceProperties2() {try {Random random = new Random();//上报数据String payload = String.format(payloadJson2, String.valueOf(System.currentTimeMillis()), 10 + random.nextInt(20), 50 + random.nextInt(50));responseBody = payload;MqttMessage message = new MqttMessage(payload.getBytes("utf-8"));message.setQos(1);String pubTopic = "/" + productKey + "/" + deviceName + "/user/update";mqttClient.publish(pubTopic, message);Log.d(TAG, "publish topic=" + pubTopic + ",payload=" + payload);mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_SUCCESS);mHandler.postDelayed(() -> postDeviceProperties2(), 5 * 1000);} catch (Exception e) {e.printStackTrace();responseBody = e.getMessage();mHandler.sendEmptyMessage(POST_DEVICE_PROPERTIES_ERROR);Log.e(TAG, "postDeviceProperties error " + e.getMessage(), e);}}private void showToast(String msg) {msgTextView.setText(msg + "\n" + responseBody);}}

8.解码获取password,在《物联网却不能物物相联?阿里云物联网平台得这么设置!》里面如果得到了password,不用这个class也行

在如下位置添加 AliyunIoTSignUtil.java

 AliyunIoTSignUtil.java中的代码如下

package com.example.test;import java.util.Arrays;
import java.util.Map;import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;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();}}

9. 简单UI设计

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"><TextViewandroid:id="@+id/msgTextView"android:layout_width="62dp"android:layout_height="563dp"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:padding="10dp"android:text="就你也会点灯?"android:textColor="#E91E63"android:textSize="36sp"android:textStyle="bold"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.536"app:layout_constraintStart_toStartOf="parent"tools:layout_editor_absoluteY="128dp" /><Buttonandroid:id="@+id/activate_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_alignParentEnd="true"android:layout_alignParentRight="true"android:layout_marginTop="7dp"android:layout_marginEnd="232dp"android:layout_marginRight="232dp"android:padding="10dp"android:text="激活"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"tools:layout_editor_absoluteY="274dp" /><Buttonandroid:id="@+id/post_button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_marginStart="205dp"android:layout_marginLeft="205dp"android:layout_marginTop="6dp"android:layout_marginBottom="10dp"android:padding="10dp"android:text="点灯"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.498"app:layout_constraintStart_toStartOf="parent"tools:layout_editor_absoluteY="351dp" /><Buttonandroid:id="@+id/post_button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_alignParentEnd="true"android:layout_marginTop="6dp"android:layout_marginEnd="10dp"android:text="灭灯" />

参考链接:跟我做,让Android封装MQTT连接阿里云平台!【开源】_跟我做,让安卓封装mqtt-CSDN博客

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

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

相关文章

做网页抓取时如何处理验证码

网络爬虫是自动从网站提取数据的过程&#xff0c;它已经彻底改变了企业获取信息和获取洞察的方式。然而&#xff0c;为了防止自动化机器人访问网站&#xff0c;CAPTCHA旨在阻碍网络爬虫的工作。在本文中&#xff0c;我们将探讨处理CAPTCHA的有效策略&#xff0c;并介绍Capsolve…

GO——cobra

定义 Cobra 是 Go 的 CLI 框架 CLI&#xff0c;command-line interface&#xff0c;命令行界面 使用 注意 第一个cmd的USE即使命名了也没有意义&#xff0c;一般保持和项目名一致。 示例 package mainimport ("fmt""github.com/spf13/cobra" )func …

5分钟了解股票交易!上海股票开户交易佣金最低是多少?怎么开户费用最低?

股票交易是指通过证券市场买卖股票的活动。以下是股票交易的基本步骤&#xff1a; 开立证券账户&#xff1a;首先需要选择一家证券公司&#xff0c;向其提交相关材料开立证券账户&#xff0c;并完成账户开立手续。 研究和选择股票&#xff1a;在决定购买股票之前&#xff0c;建…

Css样式制作图形倒影

该CSS样式是WebKit&#xff08;主要应用于Safari和其他基于WebKit的浏览器&#xff09;的特定前缀属性&#xff0c;用于实现元素内容的反射效果。具体解释如下&#xff1a; -webkit-box-reflect: 定义了一个盒反射效果&#xff0c;仅在支持WebKit的浏览器中生效。 below 15px&a…

【复现】Spider-Flow RCE漏洞(CVE-2024-0195)_16

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Spider Flow 是一个高度灵活可配置的爬虫平台&#xff0c;用户无需编写代码&#xff0c;以流程图的方式&#xff0c;即可实现爬虫…

静态代理IP是如何助力跨境电商运营的?我的跨境电商发展史

跨境电商这几年的火爆程度已经不需要我多说什么了&#xff0c;我自己与跨境电商结缘还是无意之间在某乎上看了那种所谓的“0基础小白如何在家做跨境电商&#xff0c;副业月入XX&#xff0c;附选品指南&#xff01;”。 我不知道你们刷到过这种类似的帖子没有&#xff0c;当时…

PHP留言板实现

完整教程PHP留言板 登陆界面 一个初学者的留言板&#xff08;登录和注册&#xff09;_php留言板登录注册-CSDN博客 留言板功能介绍 百度网盘 请输入提取码 进入百度网盘后&#xff0c;输入提取码&#xff1a;knxt&#xff0c;即可下载项目素材和游客访问页面的模板文件。 &…

在线陪玩软件开发系统(APP小程序H5、平台、搭建)游戏陪玩系统APP开发 源码搭建,源码交付,支持二开!

一、游戏陪玩系统APP的核心功能 1. 匹配系统&#xff1a;通过智能匹配算法&#xff0c;将寻找陪玩的玩家与愿意提供陪玩服务的玩家进行匹配&#xff0c;确保双方的需求能够得到满足。 2. 实时通讯&#xff1a;提供实时语音和文字聊天功能&#xff0c;让玩家和陪玩者可以在游戏…

他们说 GPT Store 像应用商店,我却看到了微信小程序的影子

List item 昨天&#xff0c;GPT Store 终于上线。 早在 2023 年 11 月的开发者大会上&#xff0c;Sam Altman 就已经对外介绍了 GPT Store&#xff0c;随后而来的内部「宫斗」显然拖慢了 GPT 商店「剪彩挂牌」的进度。但这段时间以来&#xff0c;GPTs 的热度并未消退&#xf…

轻量级图床Imagewheel本地部署并结合内网穿透实现远程访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

【数字人】9、DiffTalk | 使用扩散模型基于 audio-driven+对应人物视频 合成说话头(CVPR2023)

论文&#xff1a;DiffTalk: Crafting Diffusion Models for Generalized Audio-Driven Portraits Animation 代码&#xff1a;https://sstzal.github.io/DiffTalk/ 出处&#xff1a;CVPR2023 特点&#xff1a;需要音频对应人物的视频来合成新的说话头视频&#xff0c;嘴部抖…

字体包大小缩小的软件

Fontmin - 字体子集化方案https://ecomfe.github.io/fontmin/#app