安卓开发 - 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设备云
哈哈,没翻车,成功接收到消息,查看发送和接收的时间,几乎没有太大的延时,还有,当手机接收到消息时,会有小姐姐给你播报消息哦!