MQTT简介
MQTT 是一种基于发布订阅模型的即时通讯协议,主要应用于物联网设备中
配置
- 添加依赖
在project的gradle中添加远程maven仓库
repositories {
maven {
url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
}
}
- 在app的gradle中添加两个mqtt库
dependencies {
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}
- 添加必要的权限
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
封装
MQTT主要需要MQ服务器地址、用户名、密码、发布主题和响应主题,以及客户端唯一标识
需要注意的是服务器地址如果是IP地址的话,格式是tcp://192.168.168.101:1883,由tcp协议+ip地址+端口号
组成。若为域名的方式则只需要tcp协议+域名,端口号可忽略,默认端口是1883。
使用方法:
1.注册Service。
为了防止内存泄漏,我们使用Application的Context
2.MyMqttService.startService(BaseApplication.getContext()); //开启服务
public class MyMqttService extends Service {
public final static String TAG = MyMqttService.class.getSimpleName();
public static MqttAndroidClient mqttAndroidClient;
private static MqttConnectOptions mMqttConnectOptions;
public static String HOST = Config.getMqHost();//服务器地址(协议+地址+端口号)
public String USERNAME = Config.getMqUserName();//用户名
public String PASSWORD = Config.getMqPassWord();//密码
public static String PUBLISH_TOPIC = Config.getMqResponseTopic();//发布主题
public static String RESPONSE_TOPIC = Config.getMqResponseTopic();//响应主题
public String CLIENTID = DeviceUtils.getIMEI();//设备唯一标识
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
init();
return START_NOT_STICKY;//非粘性的 service强制杀死后,不会尝试重新启动service
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
/**
* 开启服务
*/
public static void startService(Context mContext) {
mContext.startService(new Intent(mContext, MyMqttService.class));
}
/**
* 发布 (模拟其他客户端发布消息)
*
* @param message 消息
*/
public static void publish(String message) {