Commit 816a069a authored by p x's avatar p x
Browse files

添加websocket

parent 1ccbc004
......@@ -55,7 +55,8 @@ dependencies {
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
//java web socket
implementation("org.java-websocket:Java-WebSocket:1.6.0")
// Hilt dependencies
val hilt_version = "2.56.1"
implementation("com.google.dagger:hilt-android:$hilt_version")
......@@ -68,7 +69,7 @@ dependencies {
implementation("com.guolindev.permissionx:permissionx:1.8.1")
//加密库
implementation("androidx.security:security-crypto:1.0.0")
implementation("com.gyf.immersionbar:immersionbar:2.3.3-beta15")
// implementation("com.gyf.immersionbar:immersionbar:2.3.3-beta15")
//网络
implementation("io.reactivex.rxjava3:rxjava:3.0.8")
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
package com.sd.cavphmi.bean
class SpaceNoBean {
}
\ No newline at end of file
package com.sd.cavphmi.bean
import com.sd.cavphmi.R
object VToXImgBean {
var imgs = mapOf(
"1" to R.drawable.abnormal,
"2" to R.drawable.admission,
"3" to R.drawable.advance,
"4" to R.drawable.change_lanes,
"5" to R.drawable.intersection,
"6" to R.drawable.weak,
)
}
\ No newline at end of file
package com.sd.cavphmi.bean
object WebSetBean {
/* "/topic/vehicle"to "/topic/vehicle/1556919708184276993", */
var dic = mapOf(
"/topic/vehicle" to "/avp/api/VL961/vehicle/1694264612474306561",
"/topic/dataMerge" to "/avp/api/VL961/dataMerge",
"/topic/signal" to "/avp/api/VL961/signal",
"/topic/v2xStart" to "/avp/api/VL961/v2xStart",
"/topic/v2xEnd" to "/avp/api/VL961/v2xEnd",
"/topic/vehicleStatus" to "/avp/api/VL961/vehicleStatus",
"/topic/timeDelay" to "/avp/api/VL961/timeDelay",
"/topic/points" to "/avp/api/VL961/points",
)
}
\ No newline at end of file
package com.sd.cavphmi.moudule
import com.sd.cavphmi.net.RetrofitApi
import com.sd.cavphmi.net.RetrofitApi.retrofitBuild
import com.sd.cavphmi.net.httpmothod.ClientRetrofitMethod
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import java.security.KeyStore
import java.util.*
import javax.inject.Qualifier
import javax.inject.Singleton
import javax.net.ssl.*
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class OriginOkHttpClient
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class AuthInterceptorOkHttpClient
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class NormalInterceptorOkHttpClient
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
var logging = HttpLoggingInterceptor()
init {
logging.level = HttpLoggingInterceptor.Level.BODY
}
@OriginOkHttpClient
@Provides
fun provideOriginOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(logging)
.build()
}
@NormalInterceptorOkHttpClient
@Provides
fun provideNormalInterceptorOkHttpClient(
// headParamsInterceptor: HeadParamsInterceptor,
): OkHttpClient {
return OkHttpClient.Builder()
.cache(RetrofitApi.cache)
// .addInterceptor(headParamsInterceptor)
.hostnameVerifier { hostname, session -> true }
.addInterceptor(logging)
.build()
}
//------------------API 方法---------------
@Singleton
@Provides
fun provideClientRetrofitService(@NormalInterceptorOkHttpClient okHttpClient: OkHttpClient): ClientRetrofitMethod {
return retrofitBuild.client(okHttpClient).build().create(ClientRetrofitMethod::class.java)
}
fun getSSlSocketFactory(): SslData {
val trustManagerFactory: TrustManagerFactory = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm()
)
trustManagerFactory.init(null as KeyStore?)
val trustManagers: Array<TrustManager> = trustManagerFactory.getTrustManagers()
check(!(trustManagers.size != 1 || trustManagers[0] !is X509TrustManager)) {
("Unexpected default trust managers:"
+ Arrays.toString(trustManagers))
}
val trustManager = trustManagers[0] as X509TrustManager
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, arrayOf<TrustManager>(trustManager), null)
val sslSocketFactory = sslContext.socketFactory
return SslData(sslSocketFactory, trustManager)
}
data class SslData(val sslSocketFactory: SSLSocketFactory, var trustManager: X509TrustManager)
}
\ No newline at end of file
package com.sd.cavphmi.net
import com.google.gson.JsonSyntaxException
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.disposables.Disposable
import retrofit2.HttpException
import java.net.SocketTimeoutException
abstract class MyBaseObserver<T> : Observer<MyBaseResource<T>> {
override fun onSubscribe(d: Disposable) {
// ToastHelper.showShort(context, "onSubscribe")
}
override fun onNext(t: MyBaseResource<T>) {
// onSuccess(t?.data ?: "" as T)
when (t?.code) {
200 -> onSuccess(t?.data ?: "" as T)
4001 -> loginTimeout()
else -> {
onFailed(t?.msg ?: "error")
}
}
}
override fun onError(e: Throwable) {
when (e) {
is HttpException -> {
// var body = e.response().errorBody()?.string() ?: "error"
onFailed(e.message.toString())
}
is JsonSyntaxException -> {
// onFailed("数据异常js")
e?.printStackTrace()
onFailed("0x00000001")
}
is SocketTimeoutException -> {
onFailed("Time Out")
}
else -> {
println(" -------------其他异常")
e?.printStackTrace()
onFailed(e?.message ?: "")
}
}
}
override fun onComplete() {
}
protected abstract fun loginTimeout()
protected abstract fun onSuccess(t: T)
protected abstract fun onFailed(error: String)
}
\ No newline at end of file
......@@ -4,18 +4,12 @@ package com.sd.cavphmi.net
* A generic class that holds a value with its loading status.
* @param <T>
</T> */
data class MyBaseResource<out T>(val data: T, var code: Int,var msg: String) {
// companion object {
// fun <T> success(data: T?): BaseResource<T> {
// return BaseResource(data, null)
// }
//
// fun <T> error(msg: String, data: T?): BaseResource<T> {
// return BaseResource(data, msg)
// }
//
// fun <T> loading(data: T?): BaseResource<T> {
// return BaseResource(data, null)
// }
// }
data class MyBaseResource<out T>(val data: T, var code: Int, var msg: String)
sealed class MyResult<out T> {
data class Success<out T>(val data: T) : MyResult<T>()
data class Error(var eCode: Int, var msg: String) : MyResult<Nothing>()
}
package com.sd.cavphmi.net.httpmothod
import com.sd.cavphmi.bean.SpaceNoBean
import com.sd.cavphmi.net.MyBaseResource
import io.reactivex.rxjava3.core.Observable
import okhttp3.RequestBody
import retrofit2.http.Body
import retrofit2.http.POST
interface ClientRetrofitMethod {
/**
* 获取配置文件
*/
// @Headers("Cache-Control:public,max-age=3600")
// @GET("http://59.175.163.12/serv-addr/server.json")
// fun getConfigurations(): Observable<List<ConfigurationBean>>
//
/**排序字段sortBy
排序方向order
*/
@POST("hkapi/pms/v1/parkingSpace/spaceNo")
suspend fun getSpaceData(@Body body: RequestBody): MyBaseResource<SpaceNoBean>
/**
* 话题根据评论ID查询所有回复
*/
// @GET("cm/topic/reply/v1/getByCommentId")
// fun getTopicByAnswerId(@Query("id") id: String): Observable<BaseResponse<List<UserAnswer>>>
}
\ No newline at end of file
package com.sd.cavphmi.repositorys
import com.sd.cavphmi.bean.SpaceNoBean
import com.sd.cavphmi.net.MyBaseResource
import com.sd.cavphmi.net.MyResult
import com.sd.cavphmi.net.RequestBodyUtil
import com.sd.cavphmi.net.httpmothod.ClientRetrofitMethod
import retrofit2.HttpException
import javax.inject.Inject
class SpaceNoRepo @Inject constructor(var clientRetrofitMethod: ClientRetrofitMethod) {
suspend fun getSpaceData(): MyResult<SpaceNoBean> {
var map = mutableMapOf("pageNo" to 20, "pageSize" to 1000)
var body = RequestBodyUtil.toRequestBody(map)
try {
var bean = clientRetrofitMethod.getSpaceData(body)
return MyResult.Success(bean.data)
} catch (e: HttpException) {
println("e.message = ${e.message}")
return MyResult.Error(e.code(), e.message() ?: "error")
}
}
}
\ No newline at end of file
......@@ -112,7 +112,7 @@ class BootActivity : BaseActivity<ActivityBootBinding, MyBaseViewModel>() {
ToastHelper.showShort(this, "权限被拒")
binding.root.postDelayed({
finish()
},150)
},500)
}
}
......
package com.sd.cavphmi.ui
import android.content.DialogInterface
import android.view.KeyEvent
import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.ViewModelProvider
import com.sd.cavphmi.BR
import com.sd.cavphmi.R
import com.sd.cavphmi.base.BaseActivity
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.databinding.ActivityMainBinding
import com.sd.cavphmi.viewmodels.MainVm
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
override fun getStatuBarColor(): Int {
return -1
......@@ -20,8 +24,8 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
return R.layout.activity_main
}
override fun initViewModel(): MyBaseViewModel {
return ViewModelProvider(this).get(MyBaseViewModel::class.java)
override fun initViewModel(): MainVm {
return ViewModelProvider(this).get(MainVm::class.java)
}
override fun initVariableId(): Int {
......@@ -30,8 +34,38 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
override fun initView() {
// viewModel.showVToTip()
viewModel.startWS()
}
override fun getToData() {
// viewModel.getSpaceData()
}
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK) || event.getKeyCode() == KeyEvent.KEYCODE_HOME) {
//如果是导航中,提示清除资源
val dialog = AlertDialog.Builder(this)
// dialog.setIcon(android.R.drawable.ic_dialog_info)
dialog.setTitle("提示")
dialog.setMessage("确定退出应用")
dialog.setPositiveButton(
"确定",
DialogInterface.OnClickListener { dialog1: DialogInterface?, which: Int ->
viewModel.closeWS()
finish()
})
dialog.setNegativeButton(
"取消",
DialogInterface.OnClickListener { dialog12: DialogInterface?, which: Int -> })
dialog.show()
return true
} else {
return super.dispatchKeyEvent(event)
}
}
}
\ No newline at end of file
This diff is collapsed.
......@@ -2,39 +2,12 @@ package com.sd.cavphmi.utils
object MyContants {
const val IS_DEBUG = true
var HOST = if (IS_DEBUG) "http://laravel.suiyigou.shop/" else "https://api.suixinsuiyi.cn/"
var PORT = if (IS_DEBUG) "123" else "34534"
var HOST = if (IS_DEBUG) "https://sip-avp.isungent.cn:8443" else ""
// var PORT = if (IS_DEBUG) "123" else "34534"
var SOCKET_HOSTNAME =
if (IS_DEBUG) "192.168.60.77" else ""
var SOCKET_RECEIVE_PORT =
if (IS_DEBUG) 8082 else 0
var WS_HOST =
if (IS_DEBUG) "wss://sip-avp.isungent.cn:8443/socket/ws?clientSource=100" else ""
var DOWNLOAD_APP_URL =
"https://app.mi.com/download/1325540?id=com.sxsy.easyclient&ref=search&nonce=-6756103978404716128%3A26875199&appClientId=2882303761517485445&appSignature=BJDg3ZbQJhRoaomIe0kkGJ32i6hbX9HduukAmwpZqpQ"
const val PERMISSON_REQUESTCODE: Int = 10
const val online = true
/**
* 智旅APK传智*/
const val LAT_LNG_INFO = "LAT_LNG_INFO"
/***当前速度***/
var CUR_SPEED = 0
const val MOCK_LAT = 39.9129
const val MOCK_LNG = 116.3723
// var CUR_LAT = MOCK_LAT
// var CUR_LNG = MOCK_LNG
var CUR_LAT = 0.0
var CUR_LNG = 0.0
// const val MOCK_LAT = 39.56
// const val MOCK_LNG = 116.20
// 116.372641,39.913242
}
\ No newline at end of file
This diff is collapsed.
package com.sd.cavphmi.utils
import android.content.Context
import android.text.SpannableString
import android.view.Gravity
import android.view.LayoutInflater
import android.widget.TextView
import android.view.View
import android.widget.ImageView
import android.widget.Toast
import androidx.annotation.DrawableRes
import com.sd.cavphmi.R
/**
......@@ -23,6 +25,19 @@ object ToastHelper {
show()
}
}
fun showCustViewShort(context: Context, @DrawableRes resId: Int) {
val customToastRoot =
LayoutInflater.from(context).inflate(R.layout.toast_tip, null)
// 获取布局中的视图元素
val imageView = customToastRoot.findViewById<ImageView>(R.id.img_tip)
imageView.setImageResource(resId)
val toast = Toast(context)
toast.view = customToastRoot
toast.duration=Toast.LENGTH_SHORT
// toast.setGravity(Gravity.TOP,0,0)
toast.show()
}
// /**
// * 短时间显示Toast
// */
......@@ -34,7 +49,6 @@ object ToastHelper {
// }
// /**
// * 短时间显示Toast
// *
......
......@@ -520,17 +520,17 @@ public class Utils {
*
* @return
*/
public boolean isMobilePhone() {
try {
if (ScreenUtil.getInstance().isScreenLandscape() && getTotalRam(mContext) <= 2.0f
&& getSdcardAvailableSize(SDKInitializer.getAppPath()) < (25L * 1024 * 1024 * 1024)) {
return false;
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
// public boolean isMobilePhone() {
// try {
// if (ScreenUtil.getInstance().isScreenLandscape() && getTotalRam(mContext) <= 2.0f
// && getSdcardAvailableSize(SDKInitializer.getAppPath()) < (25L * 1024 * 1024 * 1024)) {
// return false;
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// return true;
// }
/**
* 根据包名获取当前数据存储的路径后缀
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment