TA的每日心情 | 怒 2018-11-20 13:41 |
---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I
|
准备工作
添加依赖
Maven
- <project ...>
- <repositories>
- <repository>
- <id>Eclipse Paho Repo</id>
- <url>https://repo.eclipse.org/content/repositories/paho-releases/</url>
- </repository>
- </repositories>
- ...
- <dependencies>
- <dependency>
- <groupId>org.eclipse.paho</groupId>
- <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
- <version>1.2.0</version>
- </dependency>
- <dependency>
- <groupId>org.eclipse.paho</groupId>
- <artifactId>org.eclipse.paho.android.service</artifactId>
- <version>1.1.1</version>
- </dependency>
- </dependencies>
- </project>
复制代码
Gradle
- dependencies {
- implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'
- implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
- }
复制代码
配置 AndroidManifest.xml修改 AndroidManifest.xml,添加网络权限以及添加后台 service - <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Permissions the Application Requires -->
- <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_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.INTERNET" />
- <application
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity android:name=".MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <!-- Mqtt Service -->
- <service android:name="org.eclipse.paho.android.service.MqttService">
- </service>
- </application>
- </manifest>
复制代码
开始使用初始化- private void initClient() {
- String serverURI = "tcp://127.0.0.1:1883";
- String clientId = "your client id";
- mClient = new MqttAndroidClient(getApplicationContext(), serverURI, clientId);
- mClient.setCallback(new MqttCallbackExtended() {
- @Override
- public void connectComplete(boolean reconnect, String serverURI) {
- }
- @Override
- public void connectionLost(Throwable cause) {
- }
- @Override
- public void messageArrived(String topic, MqttMessage message) {
- }
- @Override
- public void deliveryComplete(IMqttDeliveryToken token) {
- }
- });
- }
复制代码
回调方法说明
- public void connectComplete(boolean reconnect, String serverURI)
复制代码 连接成功
- public void connectionLost(Throwable cause)
复制代码 与服务断开连接
- public void messageArrived(String topic, MqttMessage message)
复制代码 接收到消息,可在该回调方法中进行消息的处理
- public void deliveryComplete(IMqttDeliveryToken token)
复制代码 发布消息成功
配置配置连接 - MqttConnectOptions options = new MqttConnectOptions();
- options.setCleanSession(true);
- options.setUserName("username");
- options.setPassword("password".toCharArray());
- options.setAutomaticReconnect(true);
复制代码可以设置用户名,密码,是否重连,设置遗愿等,更多配置可以查看 MqttConnectOptions 类 配置客户端离线或者断开连接的选项 - DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions();
- disconnectedBufferOptions.setBufferEnabled(true);
- disconnectedBufferOptions.setBufferSize(5000);
- disconnectedBufferOptions.setDeleteOldestMessages(true);
- disconnectedBufferOptions.setPersistBuffer(true);
- mClient.setBufferOpts(disconnectedBufferOptions);
复制代码配置是否缓存消息,缓存大小,缓存满的时候是否删除旧消息,是否持久化消息
连接- private void connect(MqttConnectOptions options) throws MqttException {
- mClient.connect(options, new IMqttActionListener() {
- @Override
- public void onSuccess(IMqttToken asyncActionToken) {
- }
- @Override
- public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
- }
- });
- }
复制代码
订阅
- private void subscribe() throws MqttException {
- mClient.subscribe("topic", 1, null, new IMqttActionListener() {
- @Override
- public void onSuccess(IMqttToken asyncActionToken) {
- }
- @Override
- public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
- }
- });
- }
复制代码
发布消息
- private void publish() throws MqttException {
- mClient.publish("topic", "payload".getBytes(), 1, false, null, new IMqttActionListener() {
- @Override
- public void onSuccess(IMqttToken asyncActionToken) {
- }
- @Override
- public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
- }
- });
- }
复制代码
取消订阅
- private void unsubscribe() throws MqttException {
- mClient.unsubscribe("topic", null, new IMqttActionListener() {
- @Override
- public void onSuccess(IMqttToken asyncActionToken) {
- }
- @Override
- public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
- }
- });
- }
复制代码
断开连接
- private void disconnect() throws MqttException {
- mClient.disconnect(null, new IMqttActionListener() {
- @Override
- public void onSuccess(IMqttToken asyncActionToken) {
- }
- @Override
- public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
- }
- });
- }
复制代码
配置 SSL 连接
以 emqtt 为例子,复制 emqttd/etc/certs/cacert.pem 到自定义目录之下Android 仅支持 BKS 的证书,需要使用 keytool 转换为 BKS 格式。下载 bcprov-jdk16-146.jar(下载地址),放到 jdk/Contents/Home/jre/lib/ext 目录下。进入自定义目录,执行以下命令:
- keytool -importcert -keystore key.bks -file cacert.pem -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
复制代码 按照提示输入密码,然后就在该目录下生成了 key.bks 证书
- 将证书复制到 Android 项目的 res/raw 目录下面,通过以下代码进行使用:
- SSLSocketFactory sslSocketFactory=
- mClient.getSSLSocketFactory(getResources().openRawResource(R.raw.key), "your password");
- MqttConnectOptions options = new MqttConnectOptions();
- options.setSocketFactory(sslSocketFactory);
- // more options
复制代码- serverURI 记得修改为 ssl:// 和对应的 8883 端口
结语
作者:EMQ
来源:简书
|
|