From d855210a2e11c6050bff95ef3acee149e8a31d5a Mon Sep 17 00:00:00 2001 From: xiaowusky Date: Mon, 11 Dec 2023 15:06:50 +0800 Subject: [PATCH] =?UTF-8?q?desc:=E6=9C=89=E6=97=A0=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E9=80=9A=E8=BF=87socket=E8=BF=9E=E6=8E=A5=E5=85=AC=E7=BD=918.8?= =?UTF-8?q?.8.8DNS=E6=9C=8D=E5=8A=A1=E6=9D=A5=E5=88=A4=E6=96=AD=EF=BC=8C?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E6=94=B6=E5=8F=91=E5=8C=85=E7=9A=84=E5=BF=AB?= =?UTF-8?q?=E6=85=A2=E6=A8=A1=E6=8B=9F=E4=BF=A1=E5=8F=B7=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../safetywatcher/watcher/net/DevicesApi.kt | 59 +++++++++++-------- .../watcher/services/HeartbeatService.kt | 19 ++++++ .../safetywatcher/watcher/ui/CloudActivity.kt | 13 ++++ .../watcher/ui/view/CommonTopBar.kt | 16 +++-- .../safetywatcher/watcher/utils/SimHelper.kt | 44 +++++++++++++- app/src/main/res/values/strings.xml | 2 + 6 files changed, 122 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/net/DevicesApi.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/net/DevicesApi.kt index 956a034..d1409ae 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/net/DevicesApi.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/net/DevicesApi.kt @@ -10,6 +10,7 @@ import com.yinuo.safetywatcher.watcher.bean.GetRtspUrlResponse import com.yinuo.safetywatcher.watcher.bean.LastTimeResponse import com.yinuo.safetywatcher.watcher.bean.TrafficReqInfo import com.yinuo.safetywatcher.watcher.utils.LztekUtil +import com.yinuo.safetywatcher.watcher.utils.SimHelper import io.reactivex.rxjava3.core.Observable import retrofit2.http.Body import retrofit2.http.GET @@ -23,50 +24,62 @@ import retrofit2.http.Query class DevicesApi : BaseObserve(Api::class.java) { fun heartBeat(sn: String) { - observe(api.heartBeat(sn), object : RequestNoResultCallBack() { - override fun onError(error: String?) { - } - - override fun onComplete() { - } - }) + if (SimHelper.isNetOk()) { + observe(api.heartBeat(sn), object : RequestNoResultCallBack() { + override fun onError(error: String?) { + } + + override fun onComplete() { + } + }) + } } fun getPushUrl(sn: String, callBack: RequestResultCallBack) { - observe(api.getPushUrl(sn), callBack) + if (SimHelper.isNetOk()) { + observe(api.getPushUrl(sn), callBack) + } } fun updateTrafficInfo() { - val trafficReqInfo = TrafficReqInfo() - observe(api.updateTrafficInfo(trafficReqInfo), null) + if (SimHelper.isNetOk()) { + val trafficReqInfo = TrafficReqInfo() + observe(api.updateTrafficInfo(trafficReqInfo), null) + } } suspend fun uploadGasData( gasList: List = emptyList() ): BaseResponse? { - try { - val gasReq = GasRequest(detections = gasList) - return api.uploadGasData(gasReq) - } catch (e: Exception) { - e.printStackTrace() + if (SimHelper.isNetOk()) { + try { + val gasReq = GasRequest(detections = gasList) + return api.uploadGasData(gasReq) + } catch (e: Exception) { + e.printStackTrace() + } } return null } suspend fun getDetectionLastTime(): LastTimeResponse? { - try { - return api.getDetectionLastTime(LztekUtil.getSn()) - } catch (e: Exception) { - e.printStackTrace() + if (SimHelper.isNetOk()) { + try { + return api.getDetectionLastTime(LztekUtil.getSn()) + } catch (e: Exception) { + e.printStackTrace() + } } return null } suspend fun getVideoLastTime(): LastTimeResponse? { - try { - return api.getVideoLastTime(LztekUtil.getSn()) - } catch (e: Exception) { - e.printStackTrace() + if (SimHelper.isNetOk()) { + try { + return api.getVideoLastTime(LztekUtil.getSn()) + } catch (e: Exception) { + e.printStackTrace() + } } return null } diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/services/HeartbeatService.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/services/HeartbeatService.kt index 12bb1cc..c740bae 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/services/HeartbeatService.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/services/HeartbeatService.kt @@ -9,6 +9,11 @@ import com.yinuo.safetywatcher.watcher.bean.GetRtspUrlResponse import com.yinuo.safetywatcher.watcher.constant.HEARTBEAT_TIME import com.yinuo.safetywatcher.watcher.net.DevicesApi import com.yinuo.safetywatcher.watcher.utils.LztekUtil +import com.yinuo.safetywatcher.watcher.utils.SimHelper +import java.io.IOException +import java.net.InetSocketAddress +import java.net.Socket +import java.net.SocketAddress private const val ACTION_START = "com.yinuo.safetywatcher.watcher.services.action.Heartbeat" @@ -33,6 +38,7 @@ class HeartbeatService : IntentService("HeartbeatService") { @SuppressLint("HardwareIds") private fun handleActionStart(intent: Intent) { heartConter++ + SimHelper.setNetStatus(isOnline()) // 心跳 devicesApi.heartBeat(LztekUtil.getSn()) // 获取推流地址 @@ -78,4 +84,17 @@ class HeartbeatService : IntentService("HeartbeatService") { context.startService(intent) } } + + fun isOnline(): Boolean { + return try { + val timeoutMs = 1500 + val sock = Socket() + val sockaddr: SocketAddress = InetSocketAddress("8.8.8.8", 53) + sock.connect(sockaddr, timeoutMs) + sock.close() + true + } catch (e: IOException) { + false + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/CloudActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/CloudActivity.kt index b5cf38a..1e09593 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/CloudActivity.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/CloudActivity.kt @@ -14,6 +14,7 @@ import com.yinuo.safetywatcher.watcher.bean.GasReqBean import com.yinuo.safetywatcher.watcher.constant.GAS_CLOUD_UPLOAD_SIZE_ONCE import com.yinuo.safetywatcher.watcher.net.DevicesApi import com.yinuo.safetywatcher.watcher.net.UploadFileApi +import com.yinuo.safetywatcher.watcher.utils.SimHelper import com.yinuo.safetywatcher.watcher.utils.showToast import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers @@ -52,6 +53,10 @@ class CloudActivity : NoOptionsActivity() { showToast(getString(R.string.repeat_click_sync_tip)) return@setOnClickListener } + if (!SimHelper.isNetOk()){ + showToast(getString(R.string.net_off)) + return@setOnClickListener + } showLoadingDialog() GlobalScope.launch(Dispatchers.IO) { uploadSensorData() @@ -63,6 +68,10 @@ class CloudActivity : NoOptionsActivity() { showToast(getString(R.string.repeat_click_sync_tip)) return@setOnClickListener } + if (!SimHelper.isNetOk()){ + showToast(getString(R.string.net_off)) + return@setOnClickListener + } showLoadingDialog() GlobalScope.launch(Dispatchers.IO) { uploadVideo() @@ -74,6 +83,10 @@ class CloudActivity : NoOptionsActivity() { showToast(getString(R.string.repeat_click_sync_tip)) return@setOnClickListener } + if (!SimHelper.isNetOk()){ + showToast(getString(R.string.net_off)) + return@setOnClickListener + } showLoadingDialog() uploadOnece() } diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonTopBar.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonTopBar.kt index c23058d..9fe7cb2 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonTopBar.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/view/CommonTopBar.kt @@ -95,17 +95,21 @@ class CommonTopBar : LinearLayout { private val simCallback = object : SimHelper.OnSimLevelCallback { override fun onEnable(enable: Boolean) { Log.i(this@CommonTopBar.javaClass.name, "simCallback onEnable = $enable") - if (enable) { - mBinding?.fourG?.visibility = VISIBLE - } else { - mBinding?.fourG?.visibility = GONE + mBinding?.fourG?.post { + if (enable) { + mBinding?.fourG?.visibility = VISIBLE + } else { + mBinding?.fourG?.visibility = GONE + } } } override fun onLevel(level: Int) { Log.i(this@CommonTopBar.javaClass.name, "simCallback onLevel = $level") - val showLevel = (level + 1) * 20 - mBinding?.fourG?.setImageLevel(showLevel) + mBinding?.fourG?.post { + val showLevel = (level + 1) * 20 + mBinding?.fourG?.setImageLevel(showLevel) + } } } diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/SimHelper.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/SimHelper.kt index 92b61df..6f09855 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/SimHelper.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/SimHelper.kt @@ -6,12 +6,14 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter +import android.net.TrafficStats import android.telephony.PhoneStateListener import android.telephony.SignalStrength import android.telephony.SubscriptionInfo import android.telephony.SubscriptionManager import android.telephony.TelephonyManager import android.util.Log +import com.common.commonlib.utils.LogUtils object SimHelper { @@ -36,8 +38,8 @@ object SimHelper { } fun init(context: Context) { - watchSimState(context) - watchSimRssi(context) +// watchSimState(context) +// watchSimRssi(context) } private fun watchSimRssi(context: Context) { @@ -106,4 +108,42 @@ object SimHelper { } return null } + + private var isNetOK = false + + fun setNetStatus(status: Boolean) { + LogUtils.w("setNetStatus $status") + isNetOK = status + val netSpeed = getNetSpeed() + callbacks.forEach { + it.onEnable(status) + it.onLevel(netSpeed) + } + } + + fun isNetOk(): Boolean { + return isNetOK + } + + var lastTime = 0L + var lastTxBytes = 0L; + var lastRxBytes = 0L; + private fun getNetSpeed(): Int { + val totalTxBytes = TrafficStats.getTotalTxBytes() + val totalRxBytes = TrafficStats.getTotalRxBytes() + val currentTimeMillis = System.currentTimeMillis() + + val timeOffset = currentTimeMillis - lastTime + val rxOffset = totalRxBytes - lastRxBytes + val txOffset = totalTxBytes - lastTxBytes + Log.i( + "setNetStatus", + "txbyte = $totalTxBytes rxbyte = $totalRxBytes timeOffset = $timeOffset" + ) + + lastTime = currentTimeMillis + lastRxBytes = totalRxBytes + lastTxBytes = totalTxBytes + return ((rxOffset + txOffset) / timeOffset).toInt() + } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b7e2aa5..9081289 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -90,4 +90,6 @@ 通道开启 通道关闭 + + 无网络连接,请稍后再试!