完整工程链接
链接: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)将阿里云的三元组填入到代码中即可