现在物联网很多都是使用的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;
}
}
};