@@ -46,14 +46,15 @@ android { | |||||
} | } | ||||
} | } | ||||
compileOptions { | compileOptions { | ||||
sourceCompatibility JavaVersion.VERSION_1_8 | |||||
targetCompatibility JavaVersion.VERSION_1_8 | |||||
sourceCompatibility JavaVersion.VERSION_11 | |||||
targetCompatibility JavaVersion.VERSION_11 | |||||
} | } | ||||
kotlinOptions { | kotlinOptions { | ||||
jvmTarget = '1.8' | |||||
jvmTarget = '11' | |||||
} | } | ||||
} | } | ||||
dependencies { | dependencies { | ||||
implementation fileTree(dir: 'libs',includes: ['*.jar','*.aar']) | |||||
implementation 'androidx.core:core-ktx:1.7.0' | implementation 'androidx.core:core-ktx:1.7.0' | ||||
implementation 'androidx.appcompat:appcompat:1.4.1' | implementation 'androidx.appcompat:appcompat:1.4.1' | ||||
@@ -9,8 +9,11 @@ class MainActivity : AppCompatActivity() { | |||||
override fun onCreate(savedInstanceState: Bundle?) { | override fun onCreate(savedInstanceState: Bundle?) { | ||||
super.onCreate(savedInstanceState) | super.onCreate(savedInstanceState) | ||||
setContentView(R.layout.activity_main) | setContentView(R.layout.activity_main) | ||||
findViewById<TextView>(R.id.tv).setOnClickListener { | |||||
PushSdk.instance.register(this, "xuqm") | |||||
findViewById<TextView>(R.id.register).setOnClickListener { | |||||
PushSdk.instance.register(this, "xuqinmin") | |||||
} | |||||
findViewById<TextView>(R.id.send).setOnClickListener { | |||||
PushSdk.instance.sendTextMessage("xuqinmin", "你好啊") | |||||
} | } | ||||
} | } | ||||
@@ -7,13 +7,25 @@ | |||||
tools:context=".MainActivity"> | tools:context=".MainActivity"> | ||||
<TextView | <TextView | ||||
android:id="@+id/tv" | |||||
android:id="@+id/register" | |||||
android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:text="Hello World!" | |||||
android:text="注册im服务" | |||||
app:layout_constraintBottom_toBottomOf="parent" | app:layout_constraintBottom_toBottomOf="parent" | ||||
app:layout_constraintEnd_toEndOf="parent" | app:layout_constraintEnd_toEndOf="parent" | ||||
app:layout_constraintStart_toStartOf="parent" | app:layout_constraintStart_toStartOf="parent" | ||||
app:layout_constraintTop_toTopOf="parent" /> | |||||
app:layout_constraintTop_toTopOf="parent" | |||||
app:layout_constraintVertical_bias="0.08" /> | |||||
<TextView | |||||
android:id="@+id/send" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="发送消息" | |||||
app:layout_constraintBottom_toBottomOf="parent" | |||||
app:layout_constraintEnd_toEndOf="parent" | |||||
app:layout_constraintStart_toStartOf="parent" | |||||
app:layout_constraintTop_toTopOf="parent" | |||||
app:layout_constraintVertical_bias="0.188" /> | |||||
</androidx.constraintlayout.widget.ConstraintLayout> | </androidx.constraintlayout.widget.ConstraintLayout> |
@@ -42,26 +42,22 @@ android { | |||||
} | } | ||||
} | } | ||||
compileOptions { | compileOptions { | ||||
sourceCompatibility JavaVersion.VERSION_1_8 | |||||
targetCompatibility JavaVersion.VERSION_1_8 | |||||
sourceCompatibility JavaVersion.VERSION_11 | |||||
targetCompatibility JavaVersion.VERSION_11 | |||||
} | } | ||||
kotlinOptions { | kotlinOptions { | ||||
jvmTarget = '1.8' | |||||
jvmTarget = '11' | |||||
} | } | ||||
} | |||||
repositories{ | |||||
flatDir { | |||||
dirs 'libs' | |||||
} | |||||
} | |||||
repositories { | |||||
flatDir { | |||||
dirs 'libs' | |||||
publishing { | |||||
multipleVariants { | |||||
withSourcesJar() | |||||
withJavadocJar() | |||||
allVariants() | |||||
} | |||||
} | } | ||||
} | } | ||||
dependencies { | dependencies { | ||||
implementation fileTree(dir: 'libs',includes: ['*.jar','*.aar']) | |||||
compileOnly fileTree(dir: 'libs',includes: ['*.jar','*.aar']) | |||||
implementation 'androidx.core:core-ktx:1.7.0' | implementation 'androidx.core:core-ktx:1.7.0' | ||||
implementation 'androidx.appcompat:appcompat:1.4.1' | implementation 'androidx.appcompat:appcompat:1.4.1' | ||||
implementation 'com.google.android.material:material:1.5.0' | implementation 'com.google.android.material:material:1.5.0' | ||||
@@ -74,6 +70,13 @@ dependencies { | |||||
kapt("androidx.room:room-compiler:2.5.0") | kapt("androidx.room:room-compiler:2.5.0") | ||||
// implementation("androidx.room:room-ktx:2.5.0") | // implementation("androidx.room:room-ktx:2.5.0") | ||||
//添加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' | |||||
// 小米推送 | // 小米推送 | ||||
// implementation (name: 'MiPush_SDK_Client_5_3_0-C_3rd', ext: 'aar') | // implementation (name: 'MiPush_SDK_Client_5_3_0-C_3rd', ext: 'aar') | ||||
@@ -81,6 +84,8 @@ dependencies { | |||||
implementation 'com.huawei.hms:push:6.9.0.300' | implementation 'com.huawei.hms:push:6.9.0.300' | ||||
} | } | ||||
// 这个是把源码打入aar包中的任务 | // 这个是把源码打入aar包中的任务 | ||||
task sourceJar(type: Jar) { | task sourceJar(type: Jar) { | ||||
@@ -101,7 +106,7 @@ afterEvaluate { | |||||
// 这里除了有debug 还有release | // 这里除了有debug 还有release | ||||
from components.release | from components.release | ||||
// 运行任务,把源码打进去 | // 运行任务,把源码打进去 | ||||
artifact sourceJar | |||||
// artifact sourceJar | |||||
} | } | ||||
} | } | ||||
// 添加仓库地址 | // 添加仓库地址 | ||||
@@ -1,5 +1,8 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
<!-- 网络相关权限 --> | |||||
<uses-permission android:name="android.permission.INTERNET" /> | |||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | |||||
<application> | <application> | ||||
<provider | <provider | ||||
@@ -1,5 +1,7 @@ | |||||
package cn.org.bjca.trust.push.common | package cn.org.bjca.trust.push.common | ||||
import java.util.* | |||||
object CommonHelper { | object CommonHelper { | ||||
@JvmStatic | @JvmStatic | ||||
fun anyToString(value: Any?): String { | fun anyToString(value: Any?): String { | ||||
@@ -15,4 +17,6 @@ object CommonHelper { | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@JvmStatic | |||||
fun generateMessageId(): String = UUID.randomUUID().toString() | |||||
} | } |
@@ -0,0 +1,22 @@ | |||||
package cn.org.bjca.trust.push.common | |||||
import cn.org.bjca.trust.push.db.DbHelper | |||||
object DeviceHelper { | |||||
@JvmStatic | |||||
fun getDeviceId(): String { | |||||
val device = DbHelper.getDataBase().deviceDao().getAll() | |||||
if (device.isEmpty()) { | |||||
throw Throwable("获取设备信息失败") | |||||
} | |||||
return device[0].device | |||||
} | |||||
@JvmStatic | |||||
fun getManufacturer(): String { | |||||
val device = DbHelper.getDataBase().deviceDao().getAll() | |||||
if (device.isEmpty()) { | |||||
throw Throwable("获取设备信息失败") | |||||
} | |||||
return device[0].manufacturer | |||||
} | |||||
} |
@@ -0,0 +1,54 @@ | |||||
package cn.org.bjca.trust.push.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> T toObject(String json, Class<T> claxx) { | |||||
return gson.fromJson(json, claxx); | |||||
} | |||||
@Override | |||||
public <T> T toObject(byte[] bytes, Class<T> claxx) { | |||||
return gson.fromJson(new String(bytes), claxx); | |||||
} | |||||
public <T> List<T> toList(String json, Class<T> clazz) { | |||||
JsonArray jsonArray = JsonParser.parseString(json).getAsJsonArray(); | |||||
List<T> list = new ArrayList<>(); | |||||
for (JsonElement jsonElement : jsonArray) { | |||||
list.add(gson.fromJson(jsonElement, clazz)); //cls | |||||
} | |||||
return list; | |||||
} | |||||
public static <T> List<T> stringToArray(String s, Class<T[]> cls) { | |||||
T[] array = new Gson().fromJson(s, cls); | |||||
return Arrays.asList(array); | |||||
} | |||||
} |
@@ -0,0 +1,29 @@ | |||||
package cn.org.bjca.trust.push.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> T toObject(String json, Class<T> claxx); | |||||
public abstract <T> T toObject(byte[] bytes, Class<T> claxx); | |||||
public abstract <T> List<T> toList(String json, Class<T> claxx); | |||||
} |
@@ -0,0 +1,15 @@ | |||||
package cn.org.bjca.trust.push.enums | |||||
enum class ConnAckReturnCode(value: Int) { | |||||
CONNECTED(1), | |||||
VERSION_ERROR(2), | |||||
SESSION_KEY_ERROR(3), | |||||
OS_ERROR(4), | |||||
OS_VER_ERROR(5), | |||||
CLIENT_ID_ERROR(6), | |||||
DEVICE_ID_ERROR(7), | |||||
NOT_AUTHENTICATED(8), | |||||
CLIENT_NOT_ALLOCATION_TO_THIS_SERVER(9), | |||||
UNKNOWN(-1), | |||||
CAN_NOT_CONNECT_TO_SERVER(-2); | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package cn.org.bjca.trust.push.enums | |||||
enum class DeviceType(val value: Int) { | |||||
PHONE(1), PAD(2), PC(3), UNKNOWN(-1); | |||||
companion object { | |||||
fun getDeviceType(value: Int): DeviceType { | |||||
for (item in values()) { | |||||
if (item.value == value) { | |||||
return item | |||||
} | |||||
} | |||||
return UNKNOWN | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,6 @@ | |||||
package cn.org.bjca.trust.push.enums | |||||
enum class MsgType(val value:Int) { | |||||
UNKNOWN(-1), | |||||
Text(1) | |||||
} |
@@ -0,0 +1,17 @@ | |||||
package cn.org.bjca.trust.push.enums | |||||
enum class OsType(val value: Int) { | |||||
IOS(1), ANDROID(2), WEB(3), WINDOWS(4), MAC(5), UNKNOWN(-1); | |||||
companion object { | |||||
fun getOsType(value: Int): OsType { | |||||
for (item in values()) { | |||||
if (item.value == value) { | |||||
return item | |||||
} | |||||
} | |||||
return UNKNOWN | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,12 @@ | |||||
package cn.org.bjca.trust.push.enums | |||||
enum class PacketType(value: Int) { | |||||
CONNECT(10), | |||||
// CONNACK(11), | |||||
SEND(20), | |||||
// SENDACK(21), | |||||
// PINGREQ(30), | |||||
// PINGRESP(31), | |||||
DISCONNECT(40), | |||||
UNKNOWN(-1); | |||||
} |
@@ -0,0 +1,7 @@ | |||||
package cn.org.bjca.trust.push.enums | |||||
enum class QRCodeType { | |||||
WINDOWS, | |||||
WEB, | |||||
MAC; | |||||
} |
@@ -0,0 +1,13 @@ | |||||
package cn.org.bjca.trust.push.kit | |||||
import cn.org.bjca.trust.push.message.client.ImConnectOptions | |||||
import cn.org.bjca.trust.push.message.msg.SendMessage | |||||
interface ImClientInterface { | |||||
fun connect(mImConnectOptions: ImConnectOptions) | |||||
fun reConnect() | |||||
fun disConnect() | |||||
fun isConnect(): Boolean | |||||
fun isConnecting(): Boolean | |||||
fun sendMessage(msg: SendMessage) | |||||
} |
@@ -1,6 +1,7 @@ | |||||
package cn.org.bjca.trust.push.kit | package cn.org.bjca.trust.push.kit | ||||
import android.content.Context | import android.content.Context | ||||
import cn.org.bjca.trust.push.message.msg.Message | |||||
interface SdkInterface { | interface SdkInterface { | ||||
/** | /** | ||||
@@ -8,4 +9,10 @@ interface SdkInterface { | |||||
*/ | */ | ||||
fun register(context: Context, userId: String) | fun register(context: Context, userId: String) | ||||
fun unregister(context: Context, userId: String) | fun unregister(context: Context, userId: String) | ||||
/** | |||||
* 消息相关 | |||||
*/ | |||||
fun sendMessage(message: Message) | |||||
fun sendTextMessage(toUserId:String, msg: String) | |||||
} | } |
@@ -1,15 +1,77 @@ | |||||
package cn.org.bjca.trust.push.manager | package cn.org.bjca.trust.push.manager | ||||
import android.content.Context | import android.content.Context | ||||
import cn.org.bjca.trust.push.BuildConfig | |||||
import cn.org.bjca.trust.push.common.CommonHelper | |||||
import cn.org.bjca.trust.push.common.DeviceHelper | |||||
import cn.org.bjca.trust.push.common.LogHelper | |||||
import cn.org.bjca.trust.push.enums.OsType | |||||
import cn.org.bjca.trust.push.kit.SdkInterface | import cn.org.bjca.trust.push.kit.SdkInterface | ||||
import cn.org.bjca.trust.push.message.ImCallback | |||||
import cn.org.bjca.trust.push.message.ImManager | |||||
import cn.org.bjca.trust.push.message.bean.TextMessage | |||||
import cn.org.bjca.trust.push.message.msg.Message | |||||
import cn.org.bjca.trust.push.message.msg.SendMessage | |||||
import cn.org.bjca.trust.push.message.client.ImConnectOptions | |||||
import kotlin.random.Random | |||||
class PushSdkManager : SdkInterface { | class PushSdkManager : SdkInterface { | ||||
lateinit var imConnectOptions: ImConnectOptions | |||||
override fun register(context: Context, userId: String) { | override fun register(context: Context, userId: String) { | ||||
//先关闭已有连接 | |||||
if (ImManager.instance.isConnect() || ImManager.instance.isConnecting()) { | |||||
ImManager.instance.disConnect() | |||||
} | |||||
if (::imConnectOptions.isInitialized) { | |||||
imConnectOptions.clientId = userId | |||||
imConnectOptions.host = "192.168.115.173" | |||||
imConnectOptions.port = 1883 | |||||
imConnectOptions.deviceId = DeviceHelper.getDeviceId() | |||||
imConnectOptions.token = "token" | |||||
imConnectOptions.osType = OsType.ANDROID | |||||
imConnectOptions.sdkVersion = BuildConfig.versionName | |||||
} else { | |||||
imConnectOptions = ImConnectOptions( | |||||
"192.168.115.173", | |||||
1883, | |||||
userId, | |||||
DeviceHelper.getDeviceId(), | |||||
"token", | |||||
OsType.ANDROID, | |||||
BuildConfig.versionName | |||||
) | |||||
} | |||||
imConnectOptions.callback = ImCallback() | |||||
ImManager.instance.connect(imConnectOptions) | |||||
} | } | ||||
override fun unregister(context: Context, userId: String) { | override fun unregister(context: Context, userId: String) { | ||||
TODO("Not yet implemented") | TODO("Not yet implemented") | ||||
} | } | ||||
override fun sendTextMessage(toUserId:String, msg: String) { | |||||
sendMessage(TextMessage().apply { | |||||
toClientId = toUserId | |||||
text = msg | |||||
}) | |||||
} | |||||
override fun sendMessage(message: Message) { | |||||
LogHelper.d("------app端调用发送消息-----") | |||||
val sendMessage = SendMessage() | |||||
sendMessage.messageId = message.messageId?: CommonHelper.generateMessageId() | |||||
sendMessage.timestamp = System.currentTimeMillis() | |||||
sendMessage.fromClientId = imConnectOptions.clientId | |||||
sendMessage.toClientId = message.toClientId | |||||
sendMessage.target = imConnectOptions.clientId | |||||
sendMessage.messageType = message.msgType.value | |||||
sendMessage.message = message.createContentJsonStr() | |||||
ImManager.instance.sendMessage(sendMessage) | |||||
} | |||||
} | } |
@@ -0,0 +1,41 @@ | |||||
package cn.org.bjca.trust.push.message | |||||
import cn.org.bjca.trust.push.common.LogHelper | |||||
import cn.org.bjca.trust.push.enums.ConnAckReturnCode | |||||
import cn.org.bjca.trust.push.enums.OsType | |||||
import cn.org.bjca.trust.push.message.msg.SendMessage | |||||
import cn.org.bjca.trust.push.message.callback.CallbackListener | |||||
class ImCallback : CallbackListener { | |||||
override fun sendComplete(var1: List<SendMessage>) { | |||||
TODO("Not yet implemented") | |||||
} | |||||
override fun sendError(msg: SendMessage) { | |||||
TODO("Not yet implemented") | |||||
} | |||||
override fun messageArrived(var1: List<SendMessage>) { | |||||
TODO("Not yet implemented") | |||||
} | |||||
override fun connected() { | |||||
LogHelper.d("------im连接成功------") | |||||
} | |||||
override fun connectionKicked(var1: OsType) { | |||||
TODO("Not yet implemented") | |||||
} | |||||
override fun connectError(var1: ConnAckReturnCode) { | |||||
TODO("Not yet implemented") | |||||
} | |||||
override fun connectionLost() { | |||||
TODO("Not yet implemented") | |||||
} | |||||
override fun exceptionCause(var1: Throwable) { | |||||
TODO("Not yet implemented") | |||||
} | |||||
} |
@@ -0,0 +1,15 @@ | |||||
package cn.org.bjca.trust.push.message | |||||
import cn.org.bjca.trust.push.kit.ImClientInterface | |||||
import cn.org.bjca.trust.push.message.client.ImClient | |||||
object ImManager { | |||||
private lateinit var imClientInterface: ImClientInterface | |||||
val instance: ImClientInterface | |||||
get() { | |||||
if (!::imClientInterface.isInitialized) { | |||||
imClientInterface = ImClient() | |||||
} | |||||
return imClientInterface | |||||
} | |||||
} |
@@ -0,0 +1,42 @@ | |||||
package cn.org.bjca.trust.push.message.bean | |||||
import cn.org.bjca.trust.push.common.LogHelper | |||||
import cn.org.bjca.trust.push.enums.MsgType | |||||
import cn.org.bjca.trust.push.message.msg.Message | |||||
import cn.org.bjca.trust.push.message.msg.SendMessage | |||||
import org.json.JSONException | |||||
import org.json.JSONObject | |||||
class TextMessage : Message() { | |||||
var text: String? = null | |||||
init { | |||||
this.msgType = MsgType.Text | |||||
} | |||||
override fun parse(type: MsgType, sendMessage: SendMessage) { | |||||
super.parse(type, sendMessage) | |||||
// if (!(jsonStr instanceof String)) | |||||
// return; | |||||
try { | |||||
val json = sendMessage.message?.let { JSONObject(it) } | |||||
if (json != null) { | |||||
this.text = json.getString("text") | |||||
} | |||||
} catch (e: Exception) { | |||||
LogHelper.e("消息组装失败", e) | |||||
} | |||||
} | |||||
override fun createContentJsonStr(): String { | |||||
val json = JSONObject() | |||||
try { | |||||
json.put("text", this.text) | |||||
} catch (e: JSONException) { | |||||
LogHelper.e("消息组装失败", e) | |||||
} | |||||
return json.toString() | |||||
} | |||||
} |
@@ -0,0 +1,31 @@ | |||||
package cn.org.bjca.trust.push.message.callback | |||||
import cn.org.bjca.trust.push.enums.ConnAckReturnCode | |||||
import cn.org.bjca.trust.push.enums.OsType | |||||
import cn.org.bjca.trust.push.message.msg.SendMessage | |||||
interface CallbackListener { | |||||
// 发送消息完成 | |||||
fun sendComplete(msg: List<SendMessage>) | |||||
// 发送消息失败 | |||||
fun sendError(msg: SendMessage) | |||||
// 消息到达 | |||||
fun messageArrived(msg: List<SendMessage>) | |||||
// 连接成功 | |||||
fun connected() | |||||
// 踢出消息 | |||||
fun connectionKicked(var1: OsType) | |||||
// im连接失败 | |||||
fun connectError(var1: ConnAckReturnCode) | |||||
// im连接丢失 | |||||
fun connectionLost() | |||||
// 其它异常 | |||||
fun exceptionCause(var1: Throwable) | |||||
} |
@@ -0,0 +1,35 @@ | |||||
package cn.org.bjca.trust.push.message.callback | |||||
import cn.org.bjca.trust.push.common.LogHelper | |||||
import cn.org.bjca.trust.push.common.json.GsonImplHelp | |||||
import cn.org.bjca.trust.push.message.ImManager | |||||
import com.xiaomi.push.service.bj.G | |||||
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken | |||||
import org.eclipse.paho.client.mqttv3.MqttCallback | |||||
import org.eclipse.paho.client.mqttv3.MqttMessage | |||||
import java.nio.charset.Charset | |||||
class MqttCallback(val callback: CallbackListener?) : MqttCallback { | |||||
override fun connectionLost(cause: Throwable?) { | |||||
callback?.connectionLost() | |||||
LogHelper.e("----------IM断开-------------") | |||||
LogHelper.e("----------IM开始重连-------------") | |||||
ImManager.instance.reConnect() | |||||
} | |||||
override fun messageArrived(topic: String, message: MqttMessage) { | |||||
LogHelper.e( | |||||
"----------IM收到消息-------------${topic}::${ | |||||
String( | |||||
message.payload, | |||||
Charset.forName("GB2312") | |||||
) | |||||
}" | |||||
) | |||||
} | |||||
override fun deliveryComplete(token: IMqttDeliveryToken?) { | |||||
LogHelper.d("----------IM发送完成-------------${GsonImplHelp.get().toJson(token)}") | |||||
// callback?.sendComplete() | |||||
} | |||||
} |
@@ -0,0 +1,5 @@ | |||||
package cn.org.bjca.trust.push.message.callback | |||||
interface PingService { | |||||
fun ping() | |||||
} |
@@ -0,0 +1,83 @@ | |||||
package cn.org.bjca.trust.push.message.client | |||||
import cn.org.bjca.trust.push.common.LogHelper | |||||
import cn.org.bjca.trust.push.common.json.GsonImplHelp | |||||
import cn.org.bjca.trust.push.enums.ConnAckReturnCode | |||||
import cn.org.bjca.trust.push.kit.ImClientInterface | |||||
import cn.org.bjca.trust.push.message.callback.MqttCallback | |||||
import cn.org.bjca.trust.push.message.msg.SendMessage | |||||
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 | |||||
class ImClient : ImClientInterface { | |||||
private lateinit var connectOptions: ImConnectOptions | |||||
private lateinit var mqttClient: MqttClient | |||||
private lateinit var options: MqttConnectOptions | |||||
override fun connect(mImConnectOptions: ImConnectOptions) { | |||||
connectOptions = mImConnectOptions | |||||
init() | |||||
mConnect() | |||||
} | |||||
private fun mConnect() { | |||||
if (isConnect()) return | |||||
try { | |||||
mqttClient.connect(options) | |||||
mqttClient.subscribe(connectOptions.clientId, 2) | |||||
connectOptions.callback?.connected() | |||||
} catch (e: java.lang.Exception) { | |||||
connectOptions.callback?.connectError(ConnAckReturnCode.CONNECTED) | |||||
} | |||||
} | |||||
private fun init() { | |||||
if (!::mqttClient.isInitialized) { | |||||
mqttClient = MqttClient( | |||||
"tcp://${connectOptions.host}:${connectOptions.port}", | |||||
connectOptions.clientId, | |||||
MemoryPersistence() | |||||
) | |||||
options = MqttConnectOptions() | |||||
options.isCleanSession = true | |||||
options.userName = connectOptions.clientId | |||||
options.password = "xuqinmin1022".toCharArray() | |||||
options.connectionTimeout = connectOptions.connectTimeOutSecond | |||||
options.keepAliveInterval = connectOptions.pingInterval | |||||
mqttClient.setCallback(MqttCallback(connectOptions.callback)) | |||||
} | |||||
} | |||||
override fun reConnect() { | |||||
init() | |||||
mConnect() | |||||
} | |||||
override fun disConnect() { | |||||
init() | |||||
mqttClient.disconnect() | |||||
} | |||||
override fun isConnect(): Boolean { | |||||
return if (::mqttClient.isInitialized) { | |||||
mqttClient.isConnected | |||||
} else { | |||||
false | |||||
} | |||||
} | |||||
override fun isConnecting(): Boolean { | |||||
return false | |||||
} | |||||
override fun sendMessage(msg: SendMessage) { | |||||
try { | |||||
mqttClient.publish("server", MqttMessage(GsonImplHelp.get().toJson(msg).toByteArray())) | |||||
} catch (e: MqttException) { | |||||
LogHelper.e("发送消息失败", e) | |||||
connectOptions.callback?.sendError(msg) | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,25 @@ | |||||
package cn.org.bjca.trust.push.message.client | |||||
import cn.org.bjca.trust.push.enums.DeviceType | |||||
import cn.org.bjca.trust.push.enums.OsType | |||||
import cn.org.bjca.trust.push.enums.QRCodeType | |||||
import cn.org.bjca.trust.push.message.callback.CallbackListener | |||||
import cn.org.bjca.trust.push.message.callback.PingService | |||||
class ImConnectOptions( | |||||
var host: String, | |||||
var port: Int, | |||||
var clientId: String, | |||||
var deviceId: String, | |||||
var token: String, | |||||
var osType: OsType, | |||||
var sdkVersion: String | |||||
) { | |||||
var pingInterval = 20 | |||||
var timeOut = 60 | |||||
var connectTimeOutSecond = 30 | |||||
var callback: CallbackListener? = null | |||||
var qrCodeType: QRCodeType? = null | |||||
var pingService: PingService? = null | |||||
} |
@@ -0,0 +1,33 @@ | |||||
package cn.org.bjca.trust.push.message.msg | |||||
import cn.org.bjca.trust.push.enums.PacketType | |||||
open class BaseMessage protected constructor(packetType: PacketType) { | |||||
private val packetType: PacketType | |||||
init { | |||||
this.packetType = packetType | |||||
} | |||||
fun getPacketType(): PacketType { | |||||
return packetType | |||||
} | |||||
open fun getClassz(): Class<*> { | |||||
return getClassz(packetType) | |||||
} | |||||
open fun getClassz(packetType: PacketType): Class<*> { | |||||
return when (packetType) { | |||||
PacketType.CONNECT -> ConnectMessage::class.java | |||||
// PacketType.CONNACK -> ConnAckMessage::class.java | |||||
PacketType.SEND -> SendMessage::class.java | |||||
// PacketType.SENDACK -> SendAckMessage::class.java | |||||
// PacketType.PINGREQ -> PingReqMessage::class.java | |||||
// PacketType.PINGRESP -> PingRespMessage::class.java | |||||
PacketType.DISCONNECT -> DisconnectMessage::class.java | |||||
else -> throw IllegalStateException("协议类型不正确!") | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,19 @@ | |||||
package cn.org.bjca.trust.push.message.msg | |||||
import cn.org.bjca.trust.push.enums.DeviceType | |||||
import cn.org.bjca.trust.push.enums.OsType | |||||
import cn.org.bjca.trust.push.enums.PacketType | |||||
import cn.org.bjca.trust.push.enums.QRCodeType | |||||
import cn.org.bjca.trust.push.message.msg.BaseMessage | |||||
class ConnectMessage : BaseMessage(PacketType.CONNECT) { | |||||
var sessionKey: String? = null | |||||
var osType: OsType? = null | |||||
var osVer: String? = null | |||||
var deviceType: DeviceType? = null | |||||
var token: String? = null | |||||
var clientId: String? = null | |||||
var deviceId: String? = null | |||||
var qrCodeType: QRCodeType? = null | |||||
} |
@@ -0,0 +1,8 @@ | |||||
package cn.org.bjca.trust.push.message.msg | |||||
import cn.org.bjca.trust.push.enums.PacketType | |||||
import cn.org.bjca.trust.push.message.msg.BaseMessage | |||||
class DisconnectMessage : BaseMessage(PacketType.DISCONNECT) { | |||||
var requestCode: Int? = -1 | |||||
} |
@@ -0,0 +1,27 @@ | |||||
package cn.org.bjca.trust.push.message.msg | |||||
import cn.org.bjca.trust.push.enums.MsgType | |||||
import org.json.JSONException | |||||
abstract class Message { | |||||
var messageId: String? = null | |||||
var timestamp: Long = 0 | |||||
var fromClientId: String? = null | |||||
var toClientId: String? = null | |||||
var target: String? = null | |||||
var msgType: MsgType = MsgType.UNKNOWN | |||||
var message: String? = null | |||||
var tenantNo: String? = null | |||||
@Throws(JSONException::class) | |||||
open fun parse(type: MsgType, sendMessage: SendMessage) { | |||||
this.msgType = type | |||||
this.messageId = sendMessage.messageId | |||||
this.timestamp = sendMessage.timestamp | |||||
this.fromClientId = sendMessage.fromClientId | |||||
this.toClientId = sendMessage.toClientId | |||||
this.target = sendMessage.target | |||||
this.tenantNo = sendMessage.tenantNo | |||||
} | |||||
abstract fun createContentJsonStr(): String | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package cn.org.bjca.trust.push.message.msg | |||||
import cn.org.bjca.trust.push.enums.PacketType | |||||
import cn.org.bjca.trust.push.message.msg.BaseMessage | |||||
class SendMessage : BaseMessage(PacketType.SEND) { | |||||
var messageId: String? = null | |||||
var timestamp: Long = 0 | |||||
var fromClientId: String? = null | |||||
var toClientId: String? = null | |||||
var target: String? = null | |||||
var messageType = 0 | |||||
var message: String? = null | |||||
var tenantNo: String? = null | |||||
} |
@@ -10,6 +10,9 @@ pluginManagement { | |||||
url 'http://nexus.51trust.net/repository/maven-public/' | url 'http://nexus.51trust.net/repository/maven-public/' | ||||
allowInsecureProtocol true | allowInsecureProtocol true | ||||
} | } | ||||
maven { | |||||
url "https://repo.eclipse.org/content/repositories/paho-releases/" | |||||
} | |||||
} | } | ||||
} | } | ||||
dependencyResolutionManagement { | dependencyResolutionManagement { | ||||