浏览代码

1、mqtt优化
2、定位逻辑调整

carlos 3 月之前
父节点
当前提交
aaa39e35ea

二进制
XPCommonService.apk


+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -166,6 +166,7 @@
                 <action android:name="com.xplora.action.DELETE_CONTENT" />
                 <action android:name="com.xplora.action.POSITION" />
                 <action android:name="com.xplora.action.LIVE_TRACKING" />
+                <action android:name="com.xplora.action.MQTT" />
             </intent-filter>
         </receiver>
         <receiver

+ 7 - 0
app/src/main/java/com/xplora/commonservice/model/Const.kt

@@ -54,6 +54,7 @@ object Config {
     const val STEP_REPORT_TIME_THRESHOLD = 1 * 60 * 60 * 1000
     const val FORECAST_WEATHER_UPDATE_THRESHOLD = 6 * 60 * 60 * 1000
     const val CURRENT_WEATHER_UPDATE_THRESHOLD = 60 * 60 * 1000
+    const val POSITION_MIN_GPS_COUNT = 1
 
     const val CHARGING_WARNING_TIME:Long = 5 * 60 * 60 * 1000
 
@@ -79,7 +80,9 @@ object CkMessage {
 object HttpApi {
     const val INIT = "$PROTOCOL_VERSION/init"
 
+    const val PUSH_CALLBACK = "$PROTOCOL_VERSION/fcm/watch/arrival"
     const val PUSH_RESULT = "$PROTOCOL_VERSION/fcm/result"
+    const val SESSION_NEW = "$PROTOCOL_VERSION/fcm/session/new"
 
     object Location {
         private const val PREFIX = "$PROTOCOL_VERSION/location"
@@ -135,6 +138,8 @@ object HttpApi {
         const val SIM = "$PREFIX/updateSIM"
 
         const val WIFI = "$PREFIX/wifi/get"
+
+        const val TEMP_CONTROL = "$PREFIX/temperature/threshold/get"
     }
 
     object Etc {
@@ -274,6 +279,7 @@ object HttpApi {
         const val NOTIFY_WIFI_UPDATE = 1360
         const val NOTIFY_CONTENT_DOWNLOAD = 1500
         const val NOTIFY_XCOIN_COST = 1510
+        const val NOTIFY_TEMPERATURE = 1550
     }
 }
 
@@ -351,6 +357,7 @@ object LocalActions {
     const val ACTION_CALL_LOG = "com.xplora.call_log"
     const val ACTION_SOS = "com.xplora.call.sos"
     const val ACTION_DELETE_CONTENT = "com.xplora.action.DELETE_CONTENT"
+    const val ACTION_MQTT = "com.xplora.action.MQTT"
 
     const val NOTIFICATION_CHAT = "com.xplora.notification.Chat"
     const val NOTIFICATION_MISSED_CALL = "com.xplora.notification.Missed_call"

+ 16 - 2
app/src/main/java/com/xplora/commonservice/modules/WatchStateChangeImpl.kt

@@ -92,7 +92,8 @@ object WatchStateChangeImpl : WatchStateChangeObserver, NetworkStateChangeObserv
                 clearReconnectTimer()
                 startReconnectTimer()
 
-                refreshMsgListBySelf()
+                // TODO: 改用纯推送方案,此方案暂时跳过
+                // refreshMsgListBySelf()
             } else {
                 forceCheck(false)
                 doOnBootCompleted()
@@ -435,7 +436,20 @@ object WatchStateChangeImpl : WatchStateChangeObserver, NetworkStateChangeObserv
         var lastReportStepTime: Long = 0L,
         var batteryTemp: Int = -1,
         var tempStatus: Int = HighTempStatus.OFF.ordinal,
-        var shutingdown: Boolean = false
+        var shutingdown: Boolean = false,
+
+        var highTempDisable: Int = Settings.Global.getInt(
+            globalContext.contentResolver,
+            "highTempDisable", 500
+        ),
+        var highTempShutdown: Int = Settings.Global.getInt(
+            globalContext.contentResolver,
+            "highTempShutdown", 500
+        ),
+        var releaseTempControl: Int = Settings.Global.getInt(
+            globalContext.contentResolver,
+            "releaseTempControl", 400
+        ),
 //        var lastForecastWeatherUpdate: Long = 0
     )
 }

+ 19 - 0
app/src/main/java/com/xplora/commonservice/modules/callbacks/LocalReceiver.kt

@@ -14,6 +14,7 @@ import com.xplora.commonservice.model.LocalActions.ACTION_ADD_FRIEND
 import com.xplora.commonservice.model.LocalActions.ACTION_ALARM
 import com.xplora.commonservice.model.LocalActions.ACTION_DELETE_CONTENT
 import com.xplora.commonservice.model.LocalActions.ACTION_LIVE_TRACKING
+import com.xplora.commonservice.model.LocalActions.ACTION_MQTT
 import com.xplora.commonservice.model.LocalActions.ACTION_OTA
 import com.xplora.commonservice.model.LocalActions.ACTION_OTA_CHECK
 import com.xplora.commonservice.model.LocalActions.ACTION_POSITION
@@ -45,6 +46,7 @@ import com.xplora.commonservice.modules.XPAlarmManager.setSilentStartTimes
 import com.xplora.commonservice.modules.database.DatabaseManager
 import com.xplora.commonservice.modules.database.DatabaseManager.resetStep
 import com.xplora.commonservice.modules.http.FlowableFactory.getFlowable
+import com.xplora.commonservice.modules.http.RetrofitFactory.retrofit
 import com.xplora.commonservice.modules.http.XPHttpServiceExecutor
 import com.xplora.commonservice.modules.service.position.Position
 import com.xplora.commonservice.modules.service.position.Position.Companion.MODE_ONCE
@@ -53,6 +55,7 @@ import com.xplora.commonservice.utils.Logger
 import com.xplora.commonservice.utils.WatchPowerHelper.doReboot
 import com.xplora.commonservice.utils.WatchPowerHelper.doReset
 import com.xplora.commonservice.utils.WatchPowerHelper.doShutdown
+import io.reactivex.schedulers.Schedulers
 import kotlinx.coroutines.DelicateCoroutinesApi
 import kotlinx.coroutines.GlobalScope
 import kotlinx.coroutines.launch
@@ -227,6 +230,22 @@ class LocalReceiver : BroadcastReceiver() {
                     }
                 }
             }
+            ACTION_MQTT -> {
+                val isSessionPresent = intent.getBooleanExtra("isSessionPresent", true)
+                if(!isSessionPresent) {
+                    GlobalScope.launch {
+                        retrofit().awsSessionNew()
+                            .flowable
+                            .subscribeOn(Schedulers.io())
+                            .subscribe({}, { error ->
+                                Logger.w(
+                                    "${XPHttpServiceExecutor.TAG}-awsSessionNew",
+                                    "error -> ${error.message}"
+                                )
+                            })
+                    }
+                }
+            }
         }
     }
 

+ 19 - 14
app/src/main/java/com/xplora/commonservice/modules/callbacks/SystemInfoReceiver.kt

@@ -31,7 +31,6 @@ import com.xplora.commonservice.modules.http.FlowableFactory.getFlowable
 import com.xplora.commonservice.modules.http.XPHttpServiceExecutor
 import com.xplora.commonservice.ui.activity.EmptyActivity
 import com.xplora.commonservice.utils.Logger
-import com.xplora.commonservice.utils.ShellUtils
 import com.xplora.commonservice.utils.WatchPowerHelper.doShutdown
 import kotlinx.coroutines.DelicateCoroutinesApi
 import kotlinx.coroutines.GlobalScope
@@ -54,16 +53,19 @@ class SystemInfoReceiver : BroadcastReceiver() {
                 var needReport = false
                 val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)
                 var levelFin = level//if (level >= 90) 100 else (level * 100) / 90
-/*                val enable: Boolean
-                if (levelFin >= 100) {
-                    enable = false
-                    ShellUtils.writeValue(CHARGER_ENABLED_PATH, DISABLED_CHARGER)
-                } else {
-                    enable = true
-                    ShellUtils.writeValue(CHARGER_ENABLED_PATH, ENABLED_CHARGER)
-                }*/
+                /*                val enable: Boolean
+                                if (levelFin >= 100) {
+                                    enable = false
+                                    ShellUtils.writeValue(CHARGER_ENABLED_PATH, DISABLED_CHARGER)
+                                } else {
+                                    enable = true
+                                    ShellUtils.writeValue(CHARGER_ENABLED_PATH, ENABLED_CHARGER)
+                                }*/
                 watchBaseInfo.batteryTemp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0)
-                val chargeStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1) == BatteryManager.BATTERY_STATUS_CHARGING
+                val chargeStatus = intent.getIntExtra(
+                    BatteryManager.EXTRA_STATUS,
+                    -1
+                ) == BatteryManager.BATTERY_STATUS_CHARGING
 
                 val chargeDisableStatus = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1).let {
                     it == BatteryManager.BATTERY_PLUGGED_AC || it == BatteryManager.BATTERY_PLUGGED_USB
@@ -74,7 +76,7 @@ class SystemInfoReceiver : BroadcastReceiver() {
                     Settings.Global.getInt(globalContext.contentResolver, "disable_status", 0)
 
                 // 高温禁用
-                if (watchBaseInfo.batteryTemp >= 500) {
+                if (watchBaseInfo.batteryTemp >= watchBaseInfo.highTempDisable) {
                     watchBaseInfo.tempStatus = HighTempStatus.DISABLE.ordinal
                     reportBattery(levelFin, chargeStatus, watchBaseInfo.tempStatus)
                     changeForbiddenState(
@@ -82,12 +84,12 @@ class SystemInfoReceiver : BroadcastReceiver() {
                     )
                 }
                 // 高温关机
-                if (watchBaseInfo.batteryTemp >= 500) {
+                if (watchBaseInfo.batteryTemp >= watchBaseInfo.highTempShutdown) {
                     watchBaseInfo.tempStatus = HighTempStatus.SHUTDOWN.ordinal
                     needReport = true
                 }
                 // 解除高温禁用
-                if (watchBaseInfo.batteryTemp <= 400 && disableStatus == 3) {
+                if (watchBaseInfo.batteryTemp <= watchBaseInfo.releaseTempControl && disableStatus == 3) {
                     watchBaseInfo.tempStatus = HighTempStatus.OFF.ordinal
                     needReport = true
                     changeForbiddenState(
@@ -124,7 +126,10 @@ class SystemInfoReceiver : BroadcastReceiver() {
                     }
                 }
                 // 上报充电状态变化
-                Logger.d(TAG, "chargeStatus $chargeStatus -- chargeDisableStatus $chargeDisableStatus")
+                Logger.d(
+                    TAG,
+                    "chargeStatus $chargeStatus -- chargeDisableStatus $chargeDisableStatus"
+                )
                 if (chargeDisableStatus != watchBaseInfo.isCharging) {
                     watchBaseInfo.isCharging = chargeDisableStatus
                     needReport = true

+ 6 - 0
app/src/main/java/com/xplora/commonservice/modules/http/FlowableFactory.kt

@@ -40,6 +40,11 @@ object FlowableFactory {
     ): Flowable<out BaseResponse<*>>? {
         val retrofit = RetrofitFactory.retrofit()
         return when (type) {
+            HttpApi.PUSH_CALLBACK -> {
+                retrofit.pushCallback(
+                    pushId!!
+                ).flowable
+            }
             HttpApi.PUSH_RESULT -> {
                 retrofit.pushResult(
                     pushId!!,
@@ -130,6 +135,7 @@ object FlowableFactory {
             HttpApi.Content.RESULT -> retrofit.reportContentDownloadResult(requestBody as ReportContentDownloadStatusReq).flowable
             HttpApi.Watch.SIM -> retrofit.uploadIccid(requestBody as UploadIccidReq).flowable
             HttpApi.Watch.WIFI -> retrofit.getWifi().flowable
+            HttpApi.Watch.TEMP_CONTROL -> retrofit.getTempCtrl().flowable
             else -> null
         }
     }

+ 56 - 4
app/src/main/java/com/xplora/commonservice/modules/http/XPHttpService.kt

@@ -1,8 +1,36 @@
 package com.xplora.commonservice.modules.http
 
 import com.xplora.commonservice.model.HttpApi
-import com.xplora.commonservice.model.http.*
-import com.xplora.commonservice.model.http.chat.*
+import com.xplora.commonservice.model.http.BaseResponse
+import com.xplora.commonservice.model.http.CallLogReq
+import com.xplora.commonservice.model.http.FcmResultReq
+import com.xplora.commonservice.model.http.GetAlarmListRepo
+import com.xplora.commonservice.model.http.GetApnDataRepo
+import com.xplora.commonservice.model.http.GetContactListRepo
+import com.xplora.commonservice.model.http.GetEmojiListRepo
+import com.xplora.commonservice.model.http.GetSilentListRepo
+import com.xplora.commonservice.model.http.GetWifiRepo
+import com.xplora.commonservice.model.http.InitRepo
+import com.xplora.commonservice.model.http.InitReq
+import com.xplora.commonservice.model.http.NormalResponse
+import com.xplora.commonservice.model.http.PercentReq
+import com.xplora.commonservice.model.http.SetWatchModelInfoReq
+import com.xplora.commonservice.model.http.UploadIccidReq
+import com.xplora.commonservice.model.http.chat.DeleteMsgReq
+import com.xplora.commonservice.model.http.chat.GetMsgStateRepo
+import com.xplora.commonservice.model.http.chat.GetMsgStateReq
+import com.xplora.commonservice.model.http.chat.MsgListRepo
+import com.xplora.commonservice.model.http.chat.MsgListReq
+import com.xplora.commonservice.model.http.chat.MsgRepo
+import com.xplora.commonservice.model.http.chat.MsgReq
+import com.xplora.commonservice.model.http.chat.SendEmojiReq
+import com.xplora.commonservice.model.http.chat.SendMsgRepo
+import com.xplora.commonservice.model.http.chat.SendPhotoReq
+import com.xplora.commonservice.model.http.chat.SendSmsReq
+import com.xplora.commonservice.model.http.chat.SendTextReq
+import com.xplora.commonservice.model.http.chat.SendVideoReq
+import com.xplora.commonservice.model.http.chat.SendVoiceReq
+import com.xplora.commonservice.model.http.chat.SetMsgReadReq
 import com.xplora.commonservice.model.http.content.GetContentRepo
 import com.xplora.commonservice.model.http.content.GetContentReq
 import com.xplora.commonservice.model.http.content.ReportContentDownloadStatusReq
@@ -12,7 +40,12 @@ import com.xplora.commonservice.model.http.etc.SOSReq
 import com.xplora.commonservice.model.http.file.UploadRepo
 import com.xplora.commonservice.model.http.friend.FriendAddReq
 import com.xplora.commonservice.model.http.friend.FriendCodeReq
-import com.xplora.commonservice.model.http.location.*
+import com.xplora.commonservice.model.http.location.CellLocationReq
+import com.xplora.commonservice.model.http.location.CombainPositionReq
+import com.xplora.commonservice.model.http.location.GpsLocationReq
+import com.xplora.commonservice.model.http.location.LocationTrackingStatusReq
+import com.xplora.commonservice.model.http.location.MultiPositionRepo
+import com.xplora.commonservice.model.http.location.MultiPositionReq
 import com.xplora.commonservice.model.http.log.SaveLogRepo
 import com.xplora.commonservice.model.http.log.SaveLogReq
 import com.xplora.commonservice.model.http.power.GetSavingModeRepo
@@ -29,7 +62,15 @@ import com.xplora.commonservice.modules.http.converter.CustomFlowable
 import okhttp3.MultipartBody
 import okhttp3.ResponseBody
 import retrofit2.Call
-import retrofit2.http.*
+import retrofit2.http.Body
+import retrofit2.http.GET
+import retrofit2.http.Header
+import retrofit2.http.Multipart
+import retrofit2.http.POST
+import retrofit2.http.Part
+import retrofit2.http.Query
+import retrofit2.http.Streaming
+import retrofit2.http.Url
 
 interface XPHttpService {
 
@@ -39,12 +80,20 @@ interface XPHttpService {
         @Body body: InitReq
     ): Call<InitRepo>
 
+    @POST(HttpApi.PUSH_CALLBACK)
+    fun pushCallback(
+        @Header("H-Push-ID") pushId: String
+    ): CustomFlowable<BaseResponse<NormalResponse>>
+
     @POST(HttpApi.PUSH_RESULT)
     fun pushResult(
         @Header("H-Push-ID") pushId: String,
         @Body body: FcmResultReq
     ): CustomFlowable<BaseResponse<NormalResponse>>
 
+    @POST(HttpApi.SESSION_NEW)
+    fun awsSessionNew(): CustomFlowable<BaseResponse<NormalResponse>>
+
     @POST
     fun xpCb(@Url url: String, @Query("tid") tid: String): CustomFlowable<String>
 
@@ -241,4 +290,7 @@ interface XPHttpService {
 
     @POST(HttpApi.Watch.WIFI)
     fun getWifi(): CustomFlowable<GetWifiRepo>
+
+    @POST(HttpApi.Watch.TEMP_CONTROL)
+    fun getTempCtrl(): CustomFlowable<BaseResponse<NormalResponse>>
 }

+ 34 - 1
app/src/main/java/com/xplora/commonservice/modules/mqtt/AwsIotManager.kt

@@ -8,11 +8,15 @@ import com.amazonaws.services.iot.client.AWSIotTimeoutException
 import com.xplora.commonservice.BaseApplication.Companion.globalContext
 import com.xplora.commonservice.BaseApplication.Companion.iotConfig
 import com.xplora.commonservice.BaseApplication.Companion.isTest
+import com.xplora.commonservice.modules.http.RetrofitFactory.retrofit
+import com.xplora.commonservice.modules.http.XPHttpServiceExecutor
 import com.xplora.commonservice.utils.Logger
+import io.reactivex.schedulers.Schedulers
 import kotlinx.coroutines.CoroutineName
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.DelicateCoroutinesApi
 import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
 import kotlinx.coroutines.cancel
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
@@ -23,9 +27,15 @@ object AwsIotManager {
 
     private val client: MyAWSIotMqttClient by lazy { init() }
     var isDisconnected = false
+    var lastDisconnectTime = 0L
 
     fun onCloseCallback() {
         isDisconnected = true
+        lastDisconnectTime = System.currentTimeMillis()
+    }
+
+    fun onFailureCallback() {
+        lastDisconnectTime = System.currentTimeMillis()
     }
 
     private fun init(): MyAWSIotMqttClient {
@@ -69,6 +79,10 @@ object AwsIotManager {
     fun connect() {
         CoroutineScope(Dispatchers.IO + CoroutineName("MQTT_connect")).launch {
             try {
+                var needNewSession = false
+                if (System.currentTimeMillis() - lastDisconnectTime > 24 * 60 * 60 * 1000) {
+                    needNewSession = true
+                }
                 Logger.d(TAG, "connect : ${Thread.currentThread()}")
                 disconnect()
                 while (!isDisconnected) {
@@ -84,7 +98,12 @@ object AwsIotManager {
                     connectionTimeout = 30 * 1000
                     isCleanSession = false
                 }.apply {
-                    connect(10 * 1000, true)
+                    connect(10 * 1000, true).also {
+                        lastDisconnectTime = System.currentTimeMillis()
+                        if (needNewSession) {
+                            callNewSession()
+                        }
+                    }
                     val topic = XpTopic(iotConfig.topic!!, AWSIotQos.QOS0)
                     subscribe(topic, 10 * 1000, false)
                     // willMessage = AWSIotMessage("/from/${IMEI}/last-will", AWSIotQos.QOS0, "")
@@ -115,6 +134,20 @@ object AwsIotManager {
                 isDisconnected = true
             }
         }
+    }
 
+    @OptIn(DelicateCoroutinesApi::class)
+    private fun callNewSession() {
+        GlobalScope.launch {
+            retrofit().awsSessionNew()
+                .flowable
+                .subscribeOn(Schedulers.io())
+                .subscribe({}, { error ->
+                    Logger.w(
+                        "${XPHttpServiceExecutor.TAG}-awsSessionNew",
+                        "error -> ${error.message}"
+                    )
+                })
+        }
     }
 }

+ 2 - 0
app/src/main/java/com/xplora/commonservice/modules/mqtt/MyAWSIotMqttClient.kt

@@ -6,6 +6,7 @@ import android.os.PowerManager
 import com.amazonaws.services.iot.client.AWSIotMqttClient
 import com.xplora.commonservice.modules.WatchStateChangeImpl
 import com.xplora.commonservice.modules.mqtt.AwsIotManager.onCloseCallback
+import com.xplora.commonservice.modules.mqtt.AwsIotManager.onFailureCallback
 import com.xplora.commonservice.utils.Logger
 import java.security.KeyStore
 import java.util.concurrent.Future
@@ -39,6 +40,7 @@ class MyAWSIotMqttClient(
     override fun onConnectionFailure() {
         super.onConnectionFailure()
         Logger.d(TAG, "onConnectionFailure: ${WatchStateChangeImpl.watchBaseInfo.networkType}")
+        onFailureCallback()
         /*        if(WatchStateChangeImpl.watchBaseInfo.networkType != NetworkType.NETWORK_NO &&
                     WatchStateChangeImpl.watchBaseInfo.networkType != NetworkType.NETWORK_UNKNOWN){
                     keepAliveInterval = BaseApplication.iotInfo.keepAlive!! - 30 * 1000

+ 22 - 8
app/src/main/java/com/xplora/commonservice/modules/mqtt/XpTopic.kt

@@ -27,6 +27,7 @@ import com.xplora.commonservice.model.HttpApi.MqttCode.NOTIFY_SENT_MSG_STATUS
 import com.xplora.commonservice.model.HttpApi.MqttCode.NOTIFY_SERVER_INFO_UPDATE
 import com.xplora.commonservice.model.HttpApi.MqttCode.NOTIFY_SILENT_MODE_UPDATED
 import com.xplora.commonservice.model.HttpApi.MqttCode.NOTIFY_STATUS_UPDATED
+import com.xplora.commonservice.model.HttpApi.MqttCode.NOTIFY_TEMPERATURE
 import com.xplora.commonservice.model.HttpApi.MqttCode.NOTIFY_TURN_OFF
 import com.xplora.commonservice.model.HttpApi.MqttCode.NOTIFY_WIFI_UPDATE
 import com.xplora.commonservice.model.HttpApi.MqttCode.NOTIFY_XCOIN_COST
@@ -44,6 +45,7 @@ import com.xplora.commonservice.model.HttpApi.MqttCode.REQUEST_UPLOAD_LOCATION_T
 import com.xplora.commonservice.model.HttpApi.MqttCode.REQUEST_UPLOAD_POWER_SAVING_MODE
 import com.xplora.commonservice.model.HttpApi.MqttCode.REQUEST_UPLOAD_VERSION
 import com.xplora.commonservice.model.HttpApi.MqttCode.REQUEST_WATCH_MODEL
+import com.xplora.commonservice.model.http.FcmResultReq
 import com.xplora.commonservice.model.http.GetContactListRepo
 import com.xplora.commonservice.model.http.GetWifiRepo
 import com.xplora.commonservice.model.http.PercentReq
@@ -69,9 +71,11 @@ import com.xplora.commonservice.modules.goplay.BaseContentManager
 import com.xplora.commonservice.modules.goplay.GoplayContentManager.getContentInfo
 import com.xplora.commonservice.modules.http.FlowableFactory.getFlowable
 import com.xplora.commonservice.modules.http.RetrofitFactory
+import com.xplora.commonservice.modules.http.RetrofitFactory.retrofit
 import com.xplora.commonservice.modules.http.TokenManager.refreshToken
 import com.xplora.commonservice.modules.http.XPHttpService
 import com.xplora.commonservice.modules.http.XPHttpServiceExecutor
+import com.xplora.commonservice.modules.http.XPHttpServiceExecutor.TAG
 import com.xplora.commonservice.modules.service.position.Position
 import com.xplora.commonservice.modules.service.position.Position.Companion.MODE_START_TRACKING
 import com.xplora.commonservice.modules.service.position.WifiManager
@@ -94,16 +98,14 @@ class XpTopic(topic: String, qos: AWSIotQos) : AWSIotTopic(topic, qos) {
         val msg = Gson().fromJson(message!!.stringPayload, BaseMessage::class.java)
         msg.data!!.xpCb?.let { cbUrl ->
             Logger.d(AwsIotManager.TAG, "xpCb not empty : $cbUrl")
-/*            GlobalScope.launch {
-                RetrofitFactory.getCbRetrofit("$cbUrl/")
-                    .create(XPHttpService::class.java)
-                    .xpCb(cbUrl, msg.data!!.xpTid)
+            GlobalScope.launch {
+                retrofit().pushCallback(msg.data!!.xpPushId)
                     .flowable
                     .subscribeOn(Schedulers.io())
-                    .subscribe { result ->
-                        Logger.d(AwsIotManager.TAG, "xpCb result -> $result")
-                    }
-            }*/
+                    .subscribe({}, { error ->
+                        Logger.w("$TAG-reportPushCallback", "error -> ${error.message}")
+                    })
+            }
         }
         when (msg.data!!.xpEt.toInt()) {
             REQUEST_UPLOAD_LOCATION -> {
@@ -382,6 +384,18 @@ class XpTopic(topic: String, qos: AWSIotQos) : AWSIotTopic(topic, qos) {
                     }
                 }
             }
+            NOTIFY_TEMPERATURE -> {
+                GlobalScope.launch {
+                    val pushId = msg.data!!.xpPushId
+                    XPHttpServiceExecutor.execute(
+                        pushId,
+                        null,
+                        getFlowable(HttpApi.Watch.TEMP_CONTROL, null, pushId)
+                    ).let {
+                        Logger.d("tempCtrl", "get temp ctrl threshold : $it")
+                    }
+                }
+            }
         }
     }
 }

+ 36 - 8
app/src/main/java/com/xplora/commonservice/modules/service/position/Position.kt

@@ -9,6 +9,7 @@ import com.xplora.commonservice.BaseApplication.Companion.globalContext
 import com.xplora.commonservice.BaseApplication.Companion.positionInfo
 import com.xplora.commonservice.model.Config.POSITIONING_DURATION
 import com.xplora.commonservice.model.Config.POSITIONING_STEP_THRESHOLD
+import com.xplora.commonservice.model.Config.POSITION_MIN_GPS_COUNT
 import com.xplora.commonservice.model.Config.STEP_REPORT_TIME_THRESHOLD
 import com.xplora.commonservice.model.HttpApi
 import com.xplora.commonservice.model.NetworkType
@@ -16,7 +17,13 @@ import com.xplora.commonservice.model.http.BaseRequest
 import com.xplora.commonservice.model.http.FcmResultReq
 import com.xplora.commonservice.model.http.PercentReq
 import com.xplora.commonservice.model.http.etc.GetXCoinRepo
-import com.xplora.commonservice.model.http.location.*
+import com.xplora.commonservice.model.http.location.CellLocationReq
+import com.xplora.commonservice.model.http.location.CellTowers
+import com.xplora.commonservice.model.http.location.CombainPositionReq
+import com.xplora.commonservice.model.http.location.GpsLocationReq
+import com.xplora.commonservice.model.http.location.LocationTrackingStatusReq
+import com.xplora.commonservice.model.http.location.MultiPositionReq
+import com.xplora.commonservice.model.http.location.WifiAPs
 import com.xplora.commonservice.model.http.step.StepCountReq
 import com.xplora.commonservice.modules.WatchStateChangeImpl.watchBaseInfo
 import com.xplora.commonservice.modules.XPAlarmManager.cancelLiveTrackingTimer
@@ -28,7 +35,15 @@ import com.xplora.commonservice.modules.http.XPHttpServiceExecutor
 import com.xplora.commonservice.modules.service.WeatherService
 import com.xplora.commonservice.utils.Logger
 import io.reactivex.schedulers.Schedulers
-import kotlinx.coroutines.*
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.DelicateCoroutinesApi
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.async
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
 
 @OptIn(DelicateCoroutinesApi::class)
 class Position {
@@ -83,6 +98,8 @@ class Position {
     private var preSent = 0
     private val multiplePositions = ArrayList<CombainPositionReq>()
 
+    private var isLastReportGpsCount = 0
+
     fun executePosition(pushId: String?, mode: Int) {
         Logger.d(TAG, "begin executePosition $mode")
         if (pushId != null) {
@@ -143,21 +160,21 @@ class Position {
         }
         if (watchBaseInfo.networkType == NetworkType.NETWORK_NO) {
             Logger.w(TAG, "no network, return")
-            if(mode != MODE_ONCE) updateMode(mode)
+            if (mode != MODE_ONCE) updateMode(mode)
             return
         }
 
         val step = queryCurrentStep()
         val cellInfo = CellManager.cellInfo ?: run {
             Logger.w(TAG, "no cellInfo, return")
-            if(mode != MODE_ONCE) updateMode(mode)
+            if (mode != MODE_ONCE) updateMode(mode)
             return
         }
         val cid = if (cellInfo.values.isNotEmpty() && cellInfo.values.first().isNotEmpty()) {
             cellInfo.values.first().first().id
         } else {
             Logger.w(TAG, "no cid, return")
-            if(mode != MODE_ONCE) updateMode(mode)
+            if (mode != MODE_ONCE) updateMode(mode)
             return
         }
         /*        val cid = cellInfo.values.first().first().id ?: run {
@@ -344,7 +361,8 @@ class Position {
                     rad = it.rad
                 }
                 shouldReport = true
-            }?:let {
+                isLastReportGpsCount++
+            } ?: let {
                 req.apply {
                     gps = false
                 }
@@ -357,8 +375,15 @@ class Position {
                 }
                 shouldReport = true
             }
-            if(shouldReport) {
+
+            if (isLastReportGpsCount > POSITION_MIN_GPS_COUNT && !req.gps) {
+                shouldReport = false
+                isLastReportGpsCount = 0
+            }
+
+            if (shouldReport) {
                 reportPositionResult(pushId, req, aps, cellInfo, mode)
+                if (!req.gps) isLastReportGpsCount = 0
             } else {
                 if (mode == MODE_ONCE) {
                     if (now - watchBaseInfo.lastReportStepTime >= STEP_REPORT_TIME_THRESHOLD) {
@@ -372,7 +397,10 @@ class Position {
                         refreshXCoin()
                         Logger.w(TAG, "position mode once, no gps no wifi/cell, report steps")
                     }
-                    Logger.w(TAG, "position mode once, no gps no wifi/cell, STEP_REPORT_TIME_THRESHOLD not reach, report nothing")
+                    Logger.w(
+                        TAG,
+                        "position mode once, no gps no wifi/cell, STEP_REPORT_TIME_THRESHOLD not reach, report nothing"
+                    )
                 } else {
                     Logger.w(TAG, "position mode tracking, no gps no wifi/cell, report nothing")
                 }

+ 7 - 0
libaws-mqtt-android/src/main/java/com/amazonaws/services/iot/client/mqtt/AwsIotMqttConnectionListener.java

@@ -15,6 +15,8 @@
 
 package com.amazonaws.services.iot.client.mqtt;
 
+import android.content.Intent;
+
 import com.amazonaws.services.iot.client.core.AbstractAwsIotClient;
 import com.amazonaws.services.iot.client.core.AwsIotMessageCallback;
 
@@ -45,6 +47,11 @@ public class AwsIotMqttConnectionListener implements IMqttActionListener {
 
     @Override
     public void onSuccess(IMqttToken arg0) {
+/*        final boolean isSessionPresent = arg0.getSessionPresent();
+        Intent i = new Intent();
+        i.setAction("com.xplora.action.MQTT");
+        i.putExtra("isSessionPresent", isSessionPresent);
+        LOGGER.log(Level.INFO, "onSuccess : " + isSessionPresent);*/
         client.scheduleTask(new Runnable() {
             @Override
             public void run() {