AWS IoT MQTT Android 简单连接

1,252 阅读2分钟

AWS IoT MQTT Android 简单连接

什么是AWS IoT

AWS IoT 能够通过 MQTT 和 HTTP 在连接 Internet 的设备 (如传感器、执行器、嵌入式设备或智能设备) 和 AWS 云之间实现安全的双向通信。

背景

最近负责公司的海外业务的报警需求需要用到MQTT, 所以用的是亚马逊的服务。后端的同事告诉我直接用证书以及密钥进行MQTT连接。一开始按官网提供的的例子GitHub - awslabs/aws-sdk-android-samples: 去翻阅没找到适合我的方案。

最终同事建议我去参考案例 BasicConnect aws-iot-device-sdk-java-v2 · GitHub实现。下面是它的介绍

屏幕截图 2024-05-16 202519.png

翻译如下:

此示例使用使用互TLS (mTLS)的证书和密钥文件创建一个MQTT连接。设备在启动时使用证书和密钥文件连接到服务器,然后断开连接。此示例仅供通过证书和密钥文件进行连接时参考。使用证书和密钥文件对是验证连接到AWS IoT Core的最简单、最直接的方法。

简单例子

1、导入依赖

implementation 'software.amazon.awssdk.iotdevicesdk:aws-iot-device-sdk-android:1.20.6'

2、传入证书密钥文件或者字符串

如何获取密钥证书需要跟后端同事沟通了,现在假设你已经拿到证书以及密钥

private lateinit var connection: MqttClientConnection

val callback: MqttClientConnectionEvents = object : MqttClientConnectionEvents {  
    override fun onConnectionInterrupted(p0: Int) {  
        LogUtil.d(TAG, "onConnectionInterrupted: ")  
    }  
  
    override fun onConnectionResumed(p0: Boolean) {  
        LogUtil.d(TAG, "onConnectionResumed: ")  
    }  
  
    override fun onConnectionSuccess(data: OnConnectionSuccessReturn?) {  
        super.onConnectionSuccess(data)  
        LogUtil.d(TAG, "onConnectionSuccess: ")  
        subscribeAllTopic() //连接成功之后,可以订阅主题,发布主题  
    }  
  
    override fun onConnectionFailure(data: OnConnectionFailureReturn?) {  
        super.onConnectionFailure(data)  
        LogUtil.d(TAG, "onConnectionFailure: ")  
    }  
  
    override fun onConnectionClosed(data: OnConnectionClosedReturn?) {  
        super.onConnectionClosed(data)  
        LogUtil.d(TAG, "onConnectionClosed: ")  
    }  
}

fun start(callback: MqttClientConnectionEvents) {  
    try {  
        isInit = true  
        val builder = AwsIotMqttConnectionBuilder  
            .newMtlsBuilder(certificateStr, privateKeyStr)  //传入的是证书以及密钥内容
            .withConnectionEventCallbacks(callback)  
            .withClientId(LocalInfo.clientMac)  
            .withEndpoint(clientEndpoint)  
            .withPort(8883)  
            .withCleanSession(true)  
            .withKeepAliveSecs(60)  
            .withProtocolOperationTimeoutMs(60000)  
            .withWill(getLiveMessage(false))  
        val connection: MqttClientConnection = builder.build()  
        builder.close()  
        connection.connect()  
    } catch (ex: CrtRuntimeException) {  
        isInit = false  
        println("Exception encountered: $ex")  
    }  
}


//订阅主题
private fun subscribe(  
    topic: String,  
    qos: QualityOfService = QualityOfService.AT_LEAST_ONCE,  
    callback: (MqttMessage) -> Unit  
) {  
    connection.subscribe(topic, qos) { message: MqttMessage ->  
        //订阅信息处理回调,如果需要一些UI操作最好是切换到主线程
    }  
}  


//发布主题
private fun publish(  
    topic: String,  
    payload: String,  
    qos: QualityOfService = QualityOfService.AT_LEAST_ONCE  
) {  
    connection.publish(  
        MqttMessage(  
            topic, payload.toByteArray(), qos, false  
        )  
    )  
}