From 8c107e571174bf975c44f5649f2e44c4144f7e08 Mon Sep 17 00:00:00 2001 From: xiaowusky Date: Tue, 6 Jun 2023 17:17:41 +0800 Subject: [PATCH] =?UTF-8?q?desc:=E5=B0=81=E8=A3=85=E5=BF=83=E8=B7=B3?= =?UTF-8?q?=E5=92=8C=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=E8=81=94=E8=B0=83?= =?UTF-8?q?=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + .../com/yinuo/safetywatcher/watcher/App.kt | 4 +- .../safetywatcher/watcher/net/HeartbeatApi.kt | 10 ++-- .../watcher/net/UploadFileApi.kt | 59 ++++++++----------- .../watcher/services/HeartbeatService.kt | 12 +++- .../safetywatcher/watcher/ui/CloudActivity.kt | 12 +++- .../safetywatcher/watcher/utils/LztekUtil.kt | 26 ++++++++ app/src/main/res/layout/activity_cloud.xml | 4 +- .../main/res/xml/network_security_config.xml | 4 ++ .../src/main/assets/baseUrl.properties | 4 +- 10 files changed, 86 insertions(+), 50 deletions(-) create mode 100644 app/src/main/res/xml/network_security_config.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 24af174..883453b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -30,6 +30,7 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/App.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/App.kt index 86881b2..e4f61d0 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/App.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/App.kt @@ -1,10 +1,10 @@ package com.yinuo.safetywatcher.watcher -import android.app.Application +import com.common.commonlib.CommonApplication import com.lztek.toolkit.Lztek import com.yinuo.safetywatcher.watcher.utils.LztekUtil -class App : Application() { +class App : CommonApplication() { override fun onCreate() { super.onCreate() diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/net/HeartbeatApi.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/net/HeartbeatApi.kt index 7eac53c..ab30736 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/net/HeartbeatApi.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/net/HeartbeatApi.kt @@ -4,8 +4,8 @@ import com.common.commonlib.net.BaseObserve import com.common.commonlib.net.bean.BaseResponse import com.common.commonlib.net.callback.RequestNoResultCallBack import io.reactivex.rxjava3.core.Observable -import retrofit2.http.FormUrlEncoded import retrofit2.http.GET +import retrofit2.http.Headers import retrofit2.http.Query /** @@ -13,7 +13,7 @@ import retrofit2.http.Query */ class HeartbeatApi : BaseObserve(Api::class.java) { - open fun heartBeat(sn: String) { + fun heartBeat(sn: String) { observe(api.heartBeat(sn), object : RequestNoResultCallBack() { override fun onError(error: String?) { } @@ -25,8 +25,8 @@ class HeartbeatApi : BaseObserve(Api::class.java) { interface Api { - @GET("xx/xxx") - @FormUrlEncoded - fun heartBeat(@Query("sn") sn: String): Observable + @Headers("baseurl:host") + @GET("/api/device/refresh") + fun heartBeat(@Query("deviceSn") sn: String): Observable } } \ No newline at end of file diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/net/UploadFileApi.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/net/UploadFileApi.kt index e8411cb..a7afe99 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/net/UploadFileApi.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/net/UploadFileApi.kt @@ -3,26 +3,30 @@ package com.yinuo.safetywatcher.watcher.net import com.common.commonlib.net.BaseObserve import com.common.commonlib.net.bean.BaseResponse import com.common.commonlib.net.callback.RequestResultCallBack +import com.yinuo.safetywatcher.watcher.utils.LztekUtil import io.reactivex.rxjava3.core.Observable import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody import okhttp3.RequestBody import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import retrofit2.http.Headers import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part import retrofit2.http.PartMap import java.io.File +const val FORM_DATA = "multipart/form-data"; /** * 文件上传 */ class UploadFileApi : BaseObserve(Api::class.java) { - open fun singleUpload(path: String) { + open fun singleUpload(path: String, videoTime: Long) { observe( - api.singleUpload(makeMultipartBodyPart(path)), + api.singleUpload(makeParamsMaps(videoTime), makeFileBodyPart(path)), object : RequestResultCallBack() { override fun onResult(result: BaseResponse) { } @@ -32,45 +36,30 @@ class UploadFileApi : BaseObserve(Api::class.java) { }) } - open fun multiUpload(paths: List) { - observe( - api.multiUpload(makefileMaps(paths)), - object : RequestResultCallBack() { - override fun onResult(result: BaseResponse) { - } - - override fun onError(error: String?) { - } - }) - } - - interface Api { + @Headers("baseurl:host") @Multipart - @POST("xxx/upload") - fun singleUpload(@Part file: MultipartBody.Part?): Observable - - @Multipart - @POST("xxx/uploads") - fun multiUpload(@PartMap fileMap: Map): Observable + @POST("/common/uploadVideo") + fun singleUpload( + @PartMap params: Map, + @Part file: MultipartBody.Part + ): Observable } - private fun makefileMaps(paths: List): Map { - val map = HashMap() - paths.forEach { - val file = File(it) - val part = makeMultipartBodyPart(it) - map["file; filename=${file.name}"] = part - } - return map - } - - private fun makeMultipartBodyPart(path: String): MultipartBody.Part { + private fun makeFileBodyPart(path: String): MultipartBody.Part { val file = File(path) - //构建requestbody + //构建requestBody val requestFile: RequestBody = - file.asRequestBody("multipart/form-data".toMediaTypeOrNull()) - //将resquestbody封装为MultipartBody.Part对象 + file.asRequestBody(FORM_DATA.toMediaTypeOrNull()) + //将requestBody封装为MultipartBody.Part对象 return MultipartBody.Part.createFormData("file", file.name, requestFile) } + + private fun makeParamsMaps(videoTime: Long): Map { + val map = HashMap() + map["deviceSn"] = LztekUtil.getSn().toRequestBody(FORM_DATA.toMediaTypeOrNull()) + map["videoTime"] = + videoTime.toString().toRequestBody(FORM_DATA.toMediaTypeOrNull()) + return map + } } \ No newline at end of file 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 5749721..299718e 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 @@ -1,9 +1,12 @@ package com.yinuo.safetywatcher.watcher.services +import android.annotation.SuppressLint import android.app.IntentService import android.content.Context import android.content.Intent -import android.util.Log +import com.yinuo.safetywatcher.watcher.net.HeartbeatApi +import com.yinuo.safetywatcher.watcher.utils.LztekUtil + private const val ACTION_START = "com.yinuo.safetywatcher.watcher.services.action.Heartbeat" @@ -12,6 +15,10 @@ private const val ACTION_START = "com.yinuo.safetywatcher.watcher.services.actio */ class HeartbeatService : IntentService("HeartbeatService") { + private val heartbeatApi by lazy { + HeartbeatApi() + } + override fun onHandleIntent(intent: Intent?) { when (intent?.action) { ACTION_START -> { @@ -20,8 +27,9 @@ class HeartbeatService : IntentService("HeartbeatService") { } } + @SuppressLint("HardwareIds") private fun handleActionStart(intent: Intent) { - Log.i("cyy", "heartBeat") + heartbeatApi.heartBeat(LztekUtil.getSn()) Thread.sleep(30000) handleActionStart(intent) } 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 9590069..a28b1be 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 @@ -4,12 +4,18 @@ import android.view.View import com.yinuo.safetywatcher.R import com.yinuo.safetywatcher.databinding.ActivityCloudBinding import com.yinuo.safetywatcher.watcher.base.NoOptionsActivity +import com.yinuo.safetywatcher.watcher.net.UploadFileApi +import com.yinuo.safetywatcher.xls.utils.PathUtils class CloudActivity : NoOptionsActivity() { private val mBinding: ActivityCloudBinding by lazy { ActivityCloudBinding.inflate(layoutInflater) } + private val uploadApi by lazy { + UploadFileApi() + } + override fun getTopBarTitle(): String? { return getString(R.string.cloud) } @@ -21,8 +27,10 @@ class CloudActivity : NoOptionsActivity() { override fun initView() { mBinding.apply { syncSensor.setOnClickListener { } - syncWarn.setOnClickListener { } - syncVedio.setOnClickListener { } + syncVedio.setOnClickListener { + val path = PathUtils.getExternalStorageDirectory() + "/test2.mp4" + uploadApi.singleUpload(path, System.currentTimeMillis()) + } syncOnce.setOnClickListener { } } } diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/LztekUtil.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/LztekUtil.kt index 162794a..50430fb 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/LztekUtil.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/LztekUtil.kt @@ -1,11 +1,15 @@ package com.yinuo.safetywatcher.watcher.utils import com.lztek.toolkit.Lztek +import java.math.BigInteger +import java.security.MessageDigest object LztekUtil { private var mLztek: Lztek? = null; + private var sn: String? = null; + fun setObject(value: Lztek) { mLztek = value } @@ -13,4 +17,26 @@ object LztekUtil { fun getLztek(): Lztek { return mLztek!! } + + fun getSn(): String { + if (sn == null) { + val mac = LztekUtil.getLztek().ethMac ?: "unKnow" + val md = MessageDigest.getInstance("MD5") // 生成一个MD5加密计算摘要 + md.update(mac.toByteArray()) // 计算md5函数 + /** + * digest()最后确定返回md5 hash值,返回值为8位字符串。 + * 因为md5 hash值是16位的hex值,实际上就是8位的字符 + * BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值 + * 一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方) + */ + /** + * digest()最后确定返回md5 hash值,返回值为8位字符串。 + * 因为md5 hash值是16位的hex值,实际上就是8位的字符 + * BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值 + * 一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方) + */ + sn = BigInteger(1, md.digest()).toString(16) // 16是表示转换为16进制数 + } + return sn!! + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_cloud.xml b/app/src/main/res/layout/activity_cloud.xml index 6a1895e..aadd12c 100644 --- a/app/src/main/res/layout/activity_cloud.xml +++ b/app/src/main/res/layout/activity_cloud.xml @@ -16,7 +16,7 @@ android:textColor="@color/white" android:textSize="@dimen/_30dp" /> - + android:textSize="@dimen/_30dp" />--> + + + \ No newline at end of file diff --git a/library-common/src/main/assets/baseUrl.properties b/library-common/src/main/assets/baseUrl.properties index c8eead0..e8ff8a6 100644 --- a/library-common/src/main/assets/baseUrl.properties +++ b/library-common/src/main/assets/baseUrl.properties @@ -1,2 +1,2 @@ -debug1 = https://www.wanandroid.com -debug2 = https://www.baidu +host=http://192.168.5.6:8080 +#host=http://192.168.51.123:8080