Android 发送MQTT消息

现在物联网很多都是使用的MQTT消息,在手机和设备之间通过MQTT协议通信,Android发送MQTT消息就会用得比较多。

步骤1:添加依赖库

你需要在你的build.gradle文件中添加MQTT客户端库。一个常用的库是Eclipse Paho,你可以这样添加依赖:

复制代码
dependencies {
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
}

步骤2:设置网络权限

在AndroidManifest.xml中增加:

XML 复制代码
<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

步骤3:前台代码(layout.xml)

在视图文件中增加按钮。

XML 复制代码
<LinearLayout
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:gravity="center_horizontal"
	android:orientation="horizontal">
	<Button
		android:id="@+id/btnTest"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_marginTop="10dp"
		android:text="测试"
		android:textAlignment="center" />
</LinearLayout>

步骤4:后台代码

java 复制代码
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

... ...

btnTest.setOnClickListener(view -> {

	new Thread(() -> {
		String context = "tcp://broker.emqx.io:1883";
		String clientId = "mqttx_20240804-android";
		String username = "username";
		String password = "password";
		String topic = "mqttx_20240804";
		try {
			MqttClient client = new MqttClient(context, clientId, new MemoryPersistence());
			MqttConnectOptions options = new MqttConnectOptions();
			options.setCleanSession(true);
			options.setUserName(username);
			options.setPassword(password.toCharArray());
			client.connect(options);

			String action =  "hello"; 
			MqttMessage message = new MqttMessage(action.getBytes());
			message.setQos(0);
			client.publish(topic, message);

			Message handlerMsg = new Message();
			handlerMsg.what = 1;
			handlerMsg.obj = action;
			handler.sendMessage(handlerMsg);

		} catch (MqttException e) {
			Message message = new Message();
			message.what = 2;
			message.obj = e.getMessage();
			handler.sendMessage(message);
		}
	}).start();

});
java 复制代码
public Handler handler = new Handler() {
	@SuppressLint("HandlerLeak")
	@Override
	public void handleMessage(Message msg) {
		String text = msg.obj.toString(); 
		switch (msg.what) {
			case 1:
				Toast.makeText(ConfigActivity.this, "发送成功", Toast.LENGTH_SHORT).show();
				break;
			case 2:
				Toast.makeText(ConfigActivity.this, "抱歉,发送异常:" + text, Toast.LENGTH_SHORT).show();
				break;
		}
	}
};
相关推荐
潘潘潘21 小时前
Android多线程机制简介
android
CYRUS_STUDIO1 天前
利用 Linux 信号机制(SIGTRAP)实现 Android 下的反调试
android·安全·逆向
CYRUS_STUDIO1 天前
Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
android·操作系统·逆向
黄林晴1 天前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我1 天前
flutter 之真手势冲突处理
android·flutter
法的空间1 天前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止1 天前
深入解析安卓 Handle 机制
android
恋猫de小郭1 天前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech1 天前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831671 天前
为何Handler的postDelayed不适合精准定时任务?
android