安卓开发 - MQTT通信

安卓开发 - MQTT通信

默认你有安卓开发基础

在此之前,说一下巴法云平台的相关配置 网址:https://bemfa.com/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.添加依赖

在项目的 build.gradle 文件中添加 MQTT 客户端库的依赖,常用的 MQTT 客户端库是 Eclipse Paho。

dependencies {
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
    //我这里用以下方式,根据情况选择
    implementation("org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5")
    implementation("org.eclipse.paho:org.eclipse.paho.android.service:1.1.1")
}

然后点击右上角"Sync Now",如下图:
在这里插入图片描述
在这里插入图片描述
然后看见正在下载依赖包,然后在下载的同时,不要浪费时间,编写其他代码

2.加入权限

在 AndroidManifest.xml 中添加网络访问权限,因为 MQTT 通信需要网络连接。

	<!-- 网络访问权限 -->
    <uses-permission android:name="android.permission.INTERNET" />

到这里,如果网速快的话,依赖包已经下载完成了

3.进入主题,配置MQTT

编写MQTT初始化函数mqtt_init(),注意,在此之前需要在onCreate方法之前添加以下代码:
	private static final String TAG = "MainActivity";
	private static final String serverURL = "tcp://bemfa.com:9501"; //我这里用的是巴法云平台
    private static final String clientID = "这是巴法云平台的私钥,前面有介绍,复制过来即可";
    private TextToSpeech textToSpeech;
    private MqttClient mqttClient;
    private MqttConnectOptions options;
    private ScheduledExecutorService scheduledExecutorService;
private void mqtt_init(){
        Log.d(TAG, "mqtt_init: 开始初始化 MQTT .");
        try {
            mqttClient = new MqttClient(serverURL, clientID, new MemoryPersistence());
            options = new MqttConnectOptions();
            mqttClient.setCallback(new MqttCallback() {
                @Override
                public void connectionLost(Throwable cause) {
                    //连接丢失
                }
                @Override
                public void messageArrived(String topic, MqttMessage message) throws Exception {
                    //收到消息
                    speakOut("来消息啦!");
                    speakOut("收到的消息:" + message.toString());
                    Log.d(TAG, "messageArrived: 收到的消息:[" + message.toString() + "]");
                    //可以自己对收到的数据进行解析
                }
                @Override
                public void deliveryComplete(IMqttDeliveryToken token) {
                    //发送完成
                }
            });
            Log.d(TAG, "mqtt_init: MQTT 初始化完成");
        } catch (MqttException e) {
            throw new RuntimeException(e);
        }
    }
编写MQTT连接函数mqtt_connect()
private void mqtt_connect(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                if(!mqttClient.isConnected()){
                    try {
                        mqttClient.connect(options);
                        Log.d(TAG, "run: MQTT 连接状态:[" + mqttClient.isConnected() + "]");
                        mqttClient.subscribe("LED02002",0);		//这里需要与巴法云平台创建的topic相对应,不然会报错
                        speakOut("MQTT连接成功");
                    } catch (MqttException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }).start();
    }
编写MQTT重连函数mqtt_reconnect()
private void mqtt_reconnet(){
        //每10秒运行一次此函数,检查MQTT是否连接
        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                if(!mqttClient.isConnected()){
                    mqtt_connect();
                }
            }
        },0,10*1000, TimeUnit.MILLISECONDS);
    }
接下来就是调用函数进行连接了,在onCreate方法中添加以下代码
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
		//这里引入了上期的原生TTS
        textToSpeech = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if (status == TextToSpeech.SUCCESS) {
                    // TTS初始化成功
                    Log.d(TAG, "onInit: TTS初始化成功");
                    int result = textToSpeech.setLanguage(Locale.US);
                    if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                        // 语言不支持的处理
                    }
                } else {
                    // TTS初始化失败
                    Log.d(TAG, "onInit: TTS初始化失败");
                }
            }
        });
        textToSpeech.setLanguage(Locale.CHINESE);   // 设置语言
        textToSpeech.setSpeechRate(0.6f);           // 设置语速
        textToSpeech.setPitch(1.2f);                // 设置音调


        mqtt_init();
        mqtt_reconnet();
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
        if (textToSpeech!= null) {
            textToSpeech.stop();
            textToSpeech.shutdown();
        }
    }

4.测试

好了,现在来测试一下,打开浏览器,进入巴法云平台 > 控制台 > MQTT设备云
在这里插入图片描述

在这里插入图片描述
哈哈,没翻车,成功接收到消息,查看发送和接收的时间,几乎没有太大的延时,还有,当手机接收到消息时,会有小姐姐给你播报消息哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值