查看: 1848|回复: 0

[项目] 如何用安卓连接MQTT Broker服务器?

[复制链接]
  • TA的每日心情

    2018-11-20 13:41
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2019-3-8 14:58:40 | 显示全部楼层 |阅读模式
    分享到:

    准备工作

    添加依赖
    MQTT 客户端我们使用官方实现,Eclipse Paho Android Service


    Maven
    1. <project ...>
    2. <repositories>
    3.     <repository>
    4.         <id>Eclipse Paho Repo</id>
    5.         <url>https://repo.eclipse.org/content/repositories/paho-releases/</url>
    6.     </repository>
    7. </repositories>
    8. ...
    9. <dependencies>
    10.     <dependency>
    11.         <groupId>org.eclipse.paho</groupId>
    12.         <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    13.         <version>1.2.0</version>
    14.     </dependency>
    15.     <dependency>
    16.         <groupId>org.eclipse.paho</groupId>
    17.         <artifactId>org.eclipse.paho.android.service</artifactId>
    18.         <version>1.1.1</version>
    19.     </dependency>
    20. </dependencies>
    21. </project>
    复制代码


    Gradle
    1. dependencies {
    2.     implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'
    3.     implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
    4. }
    复制代码


    配置 AndroidManifest.xml
    修改 AndroidManifest.xml,添加网络权限以及添加后台 service
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android">

    3.     <!-- Permissions the Application Requires -->
    4.     <uses-permission android:name="android.permission.WAKE_LOCK" />
    5.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    6.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    7.     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    8.     <uses-permission android:name="android.permission.INTERNET" />

    9.     <application
    10.         android:icon="@mipmap/ic_launcher"
    11.         android:label="@string/app_name"
    12.         android:supportsRtl="true"
    13.         android:theme="@style/AppTheme">
    14.         <activity android:name=".MainActivity">
    15.             <intent-filter>
    16.                 <action android:name="android.intent.action.MAIN" />

    17.                 <category android:name="android.intent.category.LAUNCHER" />
    18.             </intent-filter>
    19.         </activity>
    20.         <!-- Mqtt Service -->
    21.         <service android:name="org.eclipse.paho.android.service.MqttService">
    22.         </service>
    23.     </application>

    24. </manifest>
    复制代码

    开始使用初始化
    1. private void initClient() {
    2.         String serverURI = "tcp://127.0.0.1:1883";
    3.         String clientId = "your client id";
    4.         mClient = new MqttAndroidClient(getApplicationContext(), serverURI, clientId);

    5.         mClient.setCallback(new MqttCallbackExtended() {

    6.             @Override
    7.             public void connectComplete(boolean reconnect, String serverURI) {

    8.             }

    9.             @Override
    10.             public void connectionLost(Throwable cause) {

    11.             }

    12.             @Override
    13.             public void messageArrived(String topic, MqttMessage message) {

    14.             }

    15.             @Override
    16.             public void deliveryComplete(IMqttDeliveryToken token) {

    17.             }
    18.         });
    19.     }
    复制代码


    回调方法说明
    1. public void connectComplete(boolean reconnect, String serverURI)
    复制代码
    连接成功
    1. public void connectionLost(Throwable cause)
    复制代码
    与服务断开连接
    1. public void messageArrived(String topic, MqttMessage message)
    复制代码
    接收到消息,可在该回调方法中进行消息的处理
    1. public void deliveryComplete(IMqttDeliveryToken token)
    复制代码
    发布消息成功


    配置
    配置连接
    1. MqttConnectOptions options = new MqttConnectOptions();
    2. options.setCleanSession(true);
    3. options.setUserName("username");
    4. options.setPassword("password".toCharArray());
    5. options.setAutomaticReconnect(true);
    复制代码
    可以设置用户名,密码,是否重连,设置遗愿等,更多配置可以查看 MqttConnectOptions 类
    配置客户端离线或者断开连接的选项
    1. DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions();
    2. disconnectedBufferOptions.setBufferEnabled(true);
    3. disconnectedBufferOptions.setBufferSize(5000);
    4. disconnectedBufferOptions.setDeleteOldestMessages(true);
    5. disconnectedBufferOptions.setPersistBuffer(true);
    6. mClient.setBufferOpts(disconnectedBufferOptions);
    复制代码
    配置是否缓存消息,缓存大小,缓存满的时候是否删除旧消息,是否持久化消息

    连接
    1. private void connect(MqttConnectOptions options) throws MqttException {
    2.         mClient.connect(options, new IMqttActionListener() {
    3.             @Override
    4.             public void onSuccess(IMqttToken asyncActionToken) {

    5.             }

    6.             @Override
    7.             public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

    8.             }
    9.         });
    10.     }
    复制代码

    订阅
    1. private void subscribe() throws MqttException {
    2.         mClient.subscribe("topic", 1, null, new IMqttActionListener() {
    3.             @Override
    4.             public void onSuccess(IMqttToken asyncActionToken) {

    5.             }

    6.             @Override
    7.             public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

    8.             }
    9.         });
    10.     }
    复制代码


    发布消息
    1. private void publish() throws MqttException {
    2.         mClient.publish("topic", "payload".getBytes(), 1, false, null, new IMqttActionListener() {
    3.             @Override
    4.             public void onSuccess(IMqttToken asyncActionToken) {

    5.             }

    6.             @Override
    7.             public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

    8.             }
    9.         });
    10.     }
    复制代码


    取消订阅
    1. private void unsubscribe() throws MqttException {
    2.         mClient.unsubscribe("topic", null, new IMqttActionListener() {
    3.             @Override
    4.             public void onSuccess(IMqttToken asyncActionToken) {

    5.             }

    6.             @Override
    7.             public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

    8.             }
    9.         });
    10.     }
    复制代码


    断开连接
    1. private void disconnect() throws MqttException {
    2.         mClient.disconnect(null, new IMqttActionListener() {
    3.             @Override
    4.             public void onSuccess(IMqttToken asyncActionToken) {

    5.             }

    6.             @Override
    7.             public void onFailure(IMqttToken asyncActionToken, Throwable exception) {

    8.             }
    9.         });
    10.     }
    复制代码


    配置 SSL 连接
    emqtt 为例子,复制 emqttd/etc/certs/cacert.pem 到自定义目录之下Android 仅支持 BKS 的证书,需要使用 keytool 转换为 BKS 格式。下载 bcprov-jdk16-146.jar(下载地址),放到 jdk/Contents/Home/jre/lib/ext 目录下。进入自定义目录,执行以下命令:
    1. keytool -importcert -keystore key.bks -file cacert.pem  -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
    复制代码
    按照提示输入密码,然后就在该目录下生成了 key.bks 证书


    • 将证书复制到 Android 项目的 res/raw 目录下面,通过以下代码进行使用:
    1. SSLSocketFactory sslSocketFactory=
    2. mClient.getSSLSocketFactory(getResources().openRawResource(R.raw.key), "your password");
    3. MqttConnectOptions options = new MqttConnectOptions();
    4. options.setSocketFactory(sslSocketFactory);
    5. // more options
    复制代码
    • serverURI 记得修改为 ssl:// 和对应的 8883 端口
    结语
    • 以上为简单代码实例,更多用法,可参考 MqttAndroidClient.java
    • 因为 Android 平台的特殊性,需要通过 service 保持连接,该库是 Paho Java Client  在 Android 平台的接口实现,用法很相似。
    • 可以在消息回调中考虑使用 EventBus 或者 RxBus 进行消息分发。






    作者:EMQ
    来源:简书






    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 14:20 , Processed in 0.095481 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.