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

本文介绍了如何在Android项目中创建新工程,添加MQTT依赖,配置联网权限,使用AliyunIoTSignUtil进行签名,以及在MainActivity中实现与阿里云IoT的MQTT连接过程。
摘要由CSDN通过智能技术生成

完整工程链接

链接:https://pan.baidu.com/s/1rIL6bY2NiSGX68qlRt3K2Q
提取码:生日

(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)开始连接

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Android Studio连接阿里云物联网平台需要完成以下步骤: 第一步:安装阿里云SDK并创建云账户 要在Android Studio中连接阿里云物联网平台,需要从阿里云官网上下载并安装适用于Android的阿里云SDK。安装完成后,需要创建一个云账户,并注册一个设备。 第二步:配置Gradle文件 在项目Gradle文件中添加阿里云maven库的地址: maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } 然后在应用程序的build.gradle文件中加入相应的依赖项: dependencies { compile 'com.aliyun.alink:alink-sdk:1.4.6' } 第三步:连接阿里云服务器 通过使用AlinkSDK去连接物联网平台,可以使用以下代码进行连接。 String pk = "productKey";//产品ProductKey String dn = "deviceName";//设备DeviceName String ds = "deviceSecret";//设备DeviceSecret String regionId = "cn-shanghai";//设备所在区域 ALink al = new ALink(); al.host("tcp://" + productKey + ".iot-as-mqtt." + regionId + ".aliyuncs.com:1883"); al.pkDn(productKey, deviceName, deviceSecret);//三元组 al.debug(true);//debug模式 al.setListener(new IConnectListener() { @Override public void onError(int code, String message) { Log.e(TAG, "Alink SDK 状态变化 onError " + code + " " + message); } @Override public void onInitDone(ISubscriber subscriber) { Log.d(TAG, "Alink SDK 状态变化 onInitDone , subscriber = " + subscriber); } @Override public void onConnectStateChange(ALink.ConnectState state, int code) { Log.d(TAG, "Alink SDK 状态变化 onConnectStateChange: " + state.toString() + " " + code); } @Override public void onChannelEvent(IClient iClient) { Log.d(TAG, "Alink SDK 状态变化 onChannelEvent " + iClient); } }); 以上就是在Android Studio中连接阿里云物联网平台的方法,通过这些步骤,可以实现在应用程序中与物联网设备的通信。 ### 回答2: Android Studio是一款流行的用于开发Android应用程序的集成开发环境。阿里云物联网平台是一项面向物联网应用程序的工具,可帮助用户连接和管理物联网设备和传感器。连接Android Studio和阿里云物联网平台,可以让开发人员轻松地集成物联网设备的功能到应用程序中。 首先,用户需要创建一个阿里云物联网平台账户,并创建一个设备。然后,用户需要安装阿里云Java SDK,该SDK提供了与物联网平台通信的API。 接下来,在Android Studio中创建一个新项目,并将阿里云的Java SDK添加到项目中。使用API密钥和设备ID配置SDK,以便应用程序能够与物联网平台进行通信。 在应用程序中,用户可以使用API调用与设备进行交互。例如,如果用户希望向设备发送指令,可以使用API调用将指令发送到物联网平台,然后将指令从平台传输到设备。如果用户希望接收来自设备的数据,可以使用API调用监听物联网平台,以便在数据到达时自动接收数据并将其显示在应用程序中。 Android Studio连接阿里云物联网平台可帮助用户开发更智能和更充分利用物联网设备的应用程序。该组合提供了一种简单、安全和可靠的方法,通过API对物联网设备进行控制和监控。无论您是初学者还是经验丰富的开发人员,都可以使用这种组合进行开发。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值