You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
3.0 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Android Mqtt Client
基于[mosquitto](https://github.com/eclipse/mosquitto)的android mqtt客户端
* 使用[mosquitto/lib](https://github.com/eclipse/mosquitto/tree/master/lib)的代码用c++封装接口
* 对外提供java接口简单易用
* 支持OpenSSL加密
* 实现订阅、解除订阅、发布消息等功能
## 接口
MqttClient.java
```java
/**
* 获取单例
*/
public static MqttClient getInstance()
```
```java
/**
* 启动mqtt服务
*/
public void start(@NonNull String host, int port, @NonNull String uuid, boolean clearSession)
public void start(@NonNull String host, int port, @NonNull String uuid, boolean clearSession, @NonNull String caFilePath, @NonNull String username, @NonNull String password)
```
```java
/**
* 重连服务
*/
public void reconnect()
```
```java
/**
* 订阅主题
*/
public void subscribe(String topic)
public void subscribe(String topic, int qos)
public void subscribe(List<String> topicList)
public void subscribe(List<String> topicList, List<Integer> qosList)
```
```java
/**
* 解除订阅
*/
public void unsubscribe(String topic)
public void unsubscribe(List<String> topicList)
```
```java
/**
* 发布消息
*/
public void publish(String topic, String message)
public void publish(String topic, String message, int qos)
```
```java
/**
* mqtt事件回调接口
*/
public interface MqttCallback {
@WorkerThread
void onMessage(@NonNull String topic, @NonNull String message);
@WorkerThread
void onLog(String str);
}
```
```java
/**
* 设置mqtt事件回调
*/
public void setOnMqttCallback(@Nullable MqttCallback callback)
```
## 使用
```
- 导入Module: Android Studio -> File -> New -> Import Module -> 选中“library”文件夹
- 修改app/build.gradle文件添加ndk abiFilters设置
android {
...
defaultConfig {
...
ndk {
abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a'
}
}
}
- 添加依赖
dependencies {
implementation project(':library')
}
```
## 编译问题
因为默认支持OpenSSL依赖静态库只添加了三个abi版本所以项目编译默认只支持```'armeabi-v7a', 'x86', 'arm64-v8a'```如需支持其他cpu abi请自行编译OpenSSL静态库
* 把```libssl.a libcrypto.a```文件添加到```/library/src/main/jni/lib```目录下并用文件夹区分abi类型
* 修改```library/build.gradle```添加对应的abi类型
* 修改```app/build.gradle```添加对应的abi类型
## 禁用OpenSSL
修改```/library/src/main/jni/Android.mk```文件,注释掉下面的代码
```
...
# ssl lib
#include $(CLEAR_VARS)
#LOCAL_MODULE := ssl
#LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libssl.a
#include $(PREBUILT_STATIC_LIBRARY)
# crypto lib
#include $(CLEAR_VARS)
#LOCAL_MODULE := ssl_crypto
#LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libcrypto.a
#include $(PREBUILT_STATIC_LIBRARY)
...
#LOCAL_CFLAGS += -DWITH_TLS_PSK
#LOCAL_CFLAGS += -DWITH_TLS
...
# link lib
#LOCAL_STATIC_LIBRARIES := ssl ssl_crypto
...
```
## 例子
app module只实现了简单的调用相关日志输出到了logcat