diff --git a/SzyxImSdk/build.gradle b/SzyxImSdk/build.gradle index f944707..e63830b 100644 --- a/SzyxImSdk/build.gradle +++ b/SzyxImSdk/build.gradle @@ -15,6 +15,7 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" + multiDexEnabled true buildConfigField("String", "versionName", "\"${versionName}\"") } @@ -54,5 +55,11 @@ dependencies { implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1' + //添加mqtt 2个包 + implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' + implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' + + //gson + implementation 'com.google.code.gson:gson:2.9.0' } \ No newline at end of file diff --git a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/common/json/GsonImplHelp.java b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/common/json/GsonImplHelp.java new file mode 100644 index 0000000..d190134 --- /dev/null +++ b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/common/json/GsonImplHelp.java @@ -0,0 +1,54 @@ +package cn.org.bjca.trust.android.lib.im.common.json; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Created by xuqm on 2016/6/3. + */ +public class GsonImplHelp extends Json { + private final Gson gson = new Gson(); + + @Override + public String toJson(Object src) { + return gson.toJson(src); + + } + + @Override + public T toObject(String json, Class claxx) { + return gson.fromJson(json, claxx); + + } + + @Override + public T toObject(byte[] bytes, Class claxx) { + return gson.fromJson(new String(bytes), claxx); + + } + + public List toList(String json, Class clazz) { + JsonArray jsonArray = JsonParser.parseString(json).getAsJsonArray(); + + List list = new ArrayList<>(); + for (JsonElement jsonElement : jsonArray) { + list.add(gson.fromJson(jsonElement, clazz)); //cls + } + + return list; + + + } + + public static List stringToArray(String s, Class cls) { + T[] array = new Gson().fromJson(s, cls); + return Arrays.asList(array); + } + +} diff --git a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/common/json/Json.java b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/common/json/Json.java new file mode 100644 index 0000000..ab85be1 --- /dev/null +++ b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/common/json/Json.java @@ -0,0 +1,29 @@ +package cn.org.bjca.trust.android.lib.im.common.json; + +import java.util.List; + +/** + * Created by xuqm on 2016/6/3. + */ +public abstract class Json { + private static Json json; + + Json() { + } + + public static Json get() { + if (json == null) { + json = new GsonImplHelp(); + } + return json; + } + + public abstract String toJson(Object src); + + public abstract T toObject(String json, Class claxx); + + public abstract T toObject(byte[] bytes, Class claxx); + + public abstract List toList(String json, Class claxx); + +} diff --git a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/IMHelper.java b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/IMHelper.java new file mode 100644 index 0000000..5316826 --- /dev/null +++ b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/IMHelper.java @@ -0,0 +1,16 @@ +package cn.org.bjca.trust.android.lib.im.im; + +import cn.org.bjca.trust.android.lib.im.im.kit.IMInterface; +import cn.org.bjca.trust.android.lib.im.im.manager.ImManager; + +public class IMHelper { + + private static final class IMHelperHolder { + static final IMInterface instance = new ImManager(); + } + + public static IMInterface getInstance() { + return IMHelper.IMHelperHolder.instance; + + } +} diff --git a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/kit/IMInterface.java b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/kit/IMInterface.java new file mode 100644 index 0000000..8c8e8e5 --- /dev/null +++ b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/kit/IMInterface.java @@ -0,0 +1,16 @@ +package cn.org.bjca.trust.android.lib.im.im.kit; + +import cn.org.bjca.trust.android.lib.im.im.opt.ImConnectOptions; +import cn.org.bjca.trust.android.lib.im.kit.IMSDKListener; +import cn.org.bjca.trust.android.lib.im.kit.MsgListener; + +public interface IMInterface { + void addMsgListener(MsgListener listener); + void removeMsgListener(MsgListener listener); + void setStatusListener(IMSDKListener listener); + void removeStatusListener(IMSDKListener listener); + void login(ImConnectOptions imConnectOptions); + void logout(); + boolean isConnect(); + boolean isConnecting(); +} diff --git a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/manager/ImManager.java b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/manager/ImManager.java new file mode 100644 index 0000000..d80cdfc --- /dev/null +++ b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/manager/ImManager.java @@ -0,0 +1,135 @@ +package cn.org.bjca.trust.android.lib.im.im.manager; + +import android.util.Log; + +import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; +import org.eclipse.paho.client.mqttv3.MqttCallbackExtended; +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; + +import cn.org.bjca.trust.android.lib.im.cfg.Constant; +import cn.org.bjca.trust.android.lib.im.im.kit.IMInterface; +import cn.org.bjca.trust.android.lib.im.im.opt.ImConnectOptions; +import cn.org.bjca.trust.android.lib.im.kit.IMSDKListener; +import cn.org.bjca.trust.android.lib.im.kit.MsgListener; + +public class ImManager implements IMInterface { + private final String TAG = "ImManager"; + + private MqttClient mqttClient; + private MqttConnectOptions connectOptions; + + private int status = -1; // -1未连接|0连接成功|1连接中 + + private IMSDKListener statusListener; + + + @Override + public void addMsgListener(MsgListener listener) { + + } + + @Override + public void removeMsgListener(MsgListener listener) { + + } + + @Override + public void setStatusListener(IMSDKListener listener) { + this.statusListener = listener; + } + + @Override + public void removeStatusListener(IMSDKListener listener) { + this.statusListener = null; + } + + @Override + public void login(ImConnectOptions imConnectOptions) { + if (this.isConnect()) this.logout(); + + if (null == connectOptions) connectOptions = new MqttConnectOptions(); + connectOptions.setCleanSession(false); + connectOptions.setUserName(imConnectOptions.getClientId()); + connectOptions.setPassword(imConnectOptions.getToken().toCharArray()); + connectOptions.setConnectionTimeout(30); + connectOptions.setKeepAliveInterval(20); + connectOptions.setAutomaticReconnect(true); + + try { + mqttClient = new MqttClient("tcp://" + imConnectOptions.getHost() + ":" + imConnectOptions.getPort(), + Constant.getSdkAppID() + imConnectOptions.getClientId() + System.currentTimeMillis(), new MemoryPersistence()); + mqttClient.setCallback(new MqttCallbackExtended() { + @Override + public void connectComplete(boolean reconnect, String serverURI) { + Log.e("======>connectComplete", reconnect + "::" + serverURI); + try { + mqttClient.subscribe(Constant.getSdkAppID() + "/message" + Constant.getUserId(), 2); + mqttClient.subscribe(Constant.getSdkAppID() + "/pang" + Constant.getUserId(), 2); + mqttClient.subscribe(Constant.getSdkAppID() + "/login" + Constant.getUserId(), 2); + mqttClient.subscribe(Constant.getSdkAppID() + "/data" + Constant.getUserId(), 2); + } catch (MqttException e) { + Log.e(TAG, "=====>connectComplete", e); + } + } + + @Override + public void connectionLost(Throwable cause) { + Log.e("======>connectionLost", "", cause); + status = -1; + if (null != statusListener) statusListener.onConnectionLost(); + } + + @Override + public void messageArrived(String topic, MqttMessage message) throws Exception { + Log.e("======>messageArrived", topic + "::" + message.getPayload().toString()); + } + + @Override + public void deliveryComplete(IMqttDeliveryToken token) { + Log.e("======>deliveryComplete", "token.getMessage().toString()"); + } + + }); + } catch (MqttException e) { + Log.e(TAG, "login: ", e); + } + + connect(); + } + + private void connect() { + this.status = 1; + new Thread(() -> { + try { + if (!mqttClient.isConnected()) { + mqttClient.connect(connectOptions); + } + + } catch (MqttException e) { + Log.e(TAG, "connect: ", e); + if (statusListener != null) statusListener.onConnectFailed(3001, e.getMessage()); + } + } + ).start(); + + } + + @Override + public void logout() { + + } + + @Override + public boolean isConnect() { + return this.mqttClient != null && this.mqttClient.isConnected(); + } + + @Override + public boolean isConnecting() { + return this.status == 1; + } +} diff --git a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/opt/ImConnectOptions.java b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/opt/ImConnectOptions.java new file mode 100644 index 0000000..b057318 --- /dev/null +++ b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/im/opt/ImConnectOptions.java @@ -0,0 +1,47 @@ +package cn.org.bjca.trust.android.lib.im.im.opt; + +public class ImConnectOptions { + private String host; + private String port; + private String clientId; + private String token; + + public ImConnectOptions(String host, String port, String clientId, String token) { + this.host = host; + this.port = port; + this.clientId = clientId; + this.token = token; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } +} diff --git a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/IMSDKListener.java b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/IMSDKListener.java index 9f71f20..599e876 100644 --- a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/IMSDKListener.java +++ b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/IMSDKListener.java @@ -6,28 +6,30 @@ public interface IMSDKListener { /** * 连接中 */ - void onConnecting (); + void onConnecting(); /** * 连接成功 */ - void onConnectSuccess (); + void onConnectSuccess(); + void onConnectionLost(); /** - *连接失败 - * @param code 错误码 + * 连接失败 + * + * @param code 错误码 * @param error 错误信息 */ - void onConnectFailed (int code, String error); + void onConnectFailed(int code, String error); /** - *用户被踢出 + * 用户被踢出 */ - void onKickedOffline (); + void onKickedOffline(); /** - *用户信息变更 + * 用户信息变更 */ - void onSelfInfoUpdated (IMUserFullInfo info); + void onSelfInfoUpdated(IMUserFullInfo info); } diff --git a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/SdkInterface.java b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/SdkInterface.java index 0e4607f..b50177d 100644 --- a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/SdkInterface.java +++ b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/kit/SdkInterface.java @@ -4,7 +4,7 @@ import android.content.Context; public interface SdkInterface { - void addIMSDKListener(IMSDKListener listener); + void setIMSDKListener(IMSDKListener listener); void removeIMSDKListener(IMSDKListener listener); diff --git a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/manager/SZYXImManager.java b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/manager/SZYXImManager.java index 9409542..8e7a481 100644 --- a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/manager/SZYXImManager.java +++ b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/manager/SZYXImManager.java @@ -1,18 +1,20 @@ package cn.org.bjca.trust.android.lib.im.manager; import android.content.Context; -import android.util.Log; import cn.org.bjca.trust.android.lib.im.BuildConfig; import cn.org.bjca.trust.android.lib.im.SZYXDbHelper; import cn.org.bjca.trust.android.lib.im.cfg.Constant; import cn.org.bjca.trust.android.lib.im.common.DeviceHelper; import cn.org.bjca.trust.android.lib.im.http.HttpManage; +import cn.org.bjca.trust.android.lib.im.im.IMHelper; +import cn.org.bjca.trust.android.lib.im.im.opt.ImConnectOptions; import cn.org.bjca.trust.android.lib.im.kit.IMSDKCallback; import cn.org.bjca.trust.android.lib.im.kit.IMSDKListener; import cn.org.bjca.trust.android.lib.im.kit.MsgListener; import cn.org.bjca.trust.android.lib.im.kit.SdkInterface; import cn.org.bjca.trust.android.lib.im.repository.Service; +import cn.org.bjca.trust.android.lib.im.repository.bean.LoginBean; import cn.org.bjca.trust.android.lib.im.repository.data.LoginData; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; @@ -23,12 +25,14 @@ public class SZYXImManager implements SdkInterface { private IMSDKListener imsdkListener; @Override - public void addIMSDKListener(IMSDKListener listener) { + public void setIMSDKListener(IMSDKListener listener) { this.imsdkListener = listener; + IMHelper.getInstance().setStatusListener(listener); } @Override public void removeIMSDKListener(IMSDKListener listener) { + IMHelper.getInstance().removeStatusListener(listener); this.imsdkListener = null; } @@ -50,25 +54,31 @@ public class SZYXImManager implements SdkInterface { if (httpResult.getCode() == 200) { if (null != callback) callback.success(); if (null != imsdkListener) imsdkListener.onConnecting(); + LoginBean bean = httpResult.getData(); + imLogin(bean.getHost(), bean.getPort(), bean.getClientId(), bean.getToken()); } else if (null != callback) callback.failed(1001, httpResult.getMsg()); }, throwable -> { if (null != callback) callback.failed(1001, throwable.getMessage()); }); } + private void imLogin(String host, String port, String clientId, String token) { + IMHelper.getInstance().login(new ImConnectOptions(host, port, clientId, token)); + } + @Override public void logout(IMSDKCallback callback) { - + IMHelper.getInstance().logout(); } @Override public void addMsgListener(MsgListener listener) { - + IMHelper.getInstance().addMsgListener(listener); } @Override public void removeMsgListener(MsgListener listener) { - + IMHelper.getInstance().removeMsgListener(listener); } @Override diff --git a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/repository/bean/LoginBean.java b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/repository/bean/LoginBean.java index 3861bd5..fd6f581 100644 --- a/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/repository/bean/LoginBean.java +++ b/SzyxImSdk/src/main/java/cn/org/bjca/trust/android/lib/im/repository/bean/LoginBean.java @@ -4,5 +4,37 @@ public class LoginBean { private String host; private String port; private String clientId; - private String sign; + private String token; + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } } diff --git a/app/src/main/java/cn/org/bjca/trust/android/imdemo/MyApplication.java b/app/src/main/java/cn/org/bjca/trust/android/imdemo/MyApplication.java index 7dbb819..57eabcd 100644 --- a/app/src/main/java/cn/org/bjca/trust/android/imdemo/MyApplication.java +++ b/app/src/main/java/cn/org/bjca/trust/android/imdemo/MyApplication.java @@ -11,7 +11,7 @@ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); - SZYXImSdk.getInstance().addIMSDKListener(new IMSDKListener() { + SZYXImSdk.getInstance().setIMSDKListener(new IMSDKListener() { @Override public void onConnecting() { @@ -22,6 +22,11 @@ public class MyApplication extends Application { } + @Override + public void onConnectionLost() { + + } + @Override public void onConnectFailed(int code, String error) { @@ -37,7 +42,7 @@ public class MyApplication extends Application { } }); - SZYXImSdk.getInstance().init(this, "202305161853245", new IMSDKCallback() { + SZYXImSdk.getInstance().init(this, "202305181830247", new IMSDKCallback() { @Override public void success() {