Commit bb95327c authored by 罗小雨's avatar 罗小雨
Browse files

本地模拟感知物数据实现变红、清除感知物

parent 36c48341
package com.sd.cavphmi.bean
/**
* 感知目标物实体
****/
class PerTargetTest : ArrayList<PerTargetTestItem>()
data class PerTargetTestItem(
val id: String,
val accessTime: Long,
val deviceId: String,
val deviceCode: String,
val intersectionCode: String,
val participants: List<ParticipantTest>,
val receiveTime: Long,
val reportTime: Long,
// val statistic: Statistic
)
data class ParticipantTest(
val color: Int,
val gear: Int,
val heading: Double,
val latitude: Double,
val longitude: Double,
val ptcId: String,
val ptcType: String,
val speed: Double,
var aniTime:Long,
var isFlash:Boolean,
var isRed:Boolean
)
data class StatisticTest(
val ambulance: Int,
val bike: Int,
val bus: Int,
val car: Int,
val coach: Int,
val concrete_mixer: Int,
val conical_barrel: Int,
val electric_bicycle: Int,
val engine_emergency: Int,
val fire_truck: Int,
val heavy_truck: Int,
val large_truck: Int,
val micro_truck: Int,
val midibus: Int,
val minibus: Int,
val motorcycle: Int,
val mpv: Int,
val pedestrian: Int,
val pickup: Int,
val police_car: Int,
val small_truck: Int,
val spillage: Int,
val suv: Int,
val tank_truck: Int,
val tricycle: Int,
val truck: Int,
val unknown: Int
)
\ No newline at end of file
package com.sd.cavphmi.highmap package com.sd.cavphmi.highmap
import com.google.gson.Gson import com.google.gson.Gson
import com.ltzw.adasdriver.highmap.TileJsonBean
import com.unity3d.player.UnityPlayer import com.unity3d.player.UnityPlayer
......
package com.sd.cavphmi.highmap package com.sd.cavphmi.highmap
import com.ltzw.adasdriver.utils.MyContants
/** /**
* 感知物数据 * 感知物数据
......
package com.sd.cavphmi.highmap package com.sd.cavphmi.highmap
import com.ltzw.adasdriver.utils.MyContants import com.sd.cavphmi.utils.MyContants
/** /**
* 给unity 初始化json * 给unity 初始化json
......
package com.sd.cavphmi.ui package com.sd.cavphmi.ui
import android.os.Handler
import android.util.Log
import android.view.KeyEvent import android.view.KeyEvent
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.widget.Toast import android.widget.Toast
...@@ -10,6 +12,8 @@ import com.sd.cavphmi.R ...@@ -10,6 +12,8 @@ import com.sd.cavphmi.R
import com.sd.cavphmi.base.BaseActivity import com.sd.cavphmi.base.BaseActivity
import com.sd.cavphmi.base.MyBaseViewModel import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.databinding.ActivityMainBinding import com.sd.cavphmi.databinding.ActivityMainBinding
import com.sd.cavphmi.highmap.HighMapApi
import com.sd.cavphmi.highmap.UnityPtc
import com.sd.cavphmi.intfaces.OnConCan import com.sd.cavphmi.intfaces.OnConCan
import com.sd.cavphmi.ui.fragment.CarPanelFragment import com.sd.cavphmi.ui.fragment.CarPanelFragment
import com.sd.cavphmi.ui.fragment.ExoPlayFragment import com.sd.cavphmi.ui.fragment.ExoPlayFragment
...@@ -59,7 +63,6 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>(), ...@@ -59,7 +63,6 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>(),
//exo播放器 //exo播放器
private val exoPlayFragment by lazy { ExoPlayFragment.newInstance() } private val exoPlayFragment by lazy { ExoPlayFragment.newInstance() }
override fun initView() { override fun initView() {
mainVm.mockVM = mockVM mainVm.mockVM = mockVM
//车辆仪表 //车辆仪表
...@@ -102,15 +105,45 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>(), ...@@ -102,15 +105,45 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>(),
} }
//感知目标物 //感知目标物
binding.btTarget.setOnClickListener { binding.btTarget.setOnClickListener {
mainVm.subTarget() mainVm.subTarget().observe(this) {
if(it.size==0){
HighMapApi.clearPtcData()
return@observe
}
it.forEachIndexed { index, perTargetTestItem ->
var list = perTargetTestItem.participants
val ptcList: MutableList<UnityPtc> = ArrayList(list.size)
list.forEachIndexed { index, item ->
var unityPtc = UnityPtc()
unityPtc.lat = item.latitude
unityPtc.lon = item.longitude
unityPtc.ptcid = item.ptcId
unityPtc.heading = item.heading
// unityPtc.aniTime=ptc.aniTime
unityPtc.aniTime = 1
if (item.ptcType == "car") {
unityPtc.pType = 1
} else {
unityPtc.pType = 2
}
// unityPtc.isFlash=ptc.isFlash
// unityPtc.isRed=ptc.isRed
unityPtc.isFlash = true
unityPtc.isRed = true
ptcList.add(unityPtc)
}
HighMapApi.setPtcData(ptcList)
}
}
} }
//v2x 预警 //v2x 预警
binding.btV2x.setOnClickListener { binding.btV2x.setOnClickListener {
mainVm.subStartV2x() mainVm.subStartV2x()
} }
//模拟选择车辆 //模拟选择车辆
binding.btSetcar.setOnClickListener{ binding.btSetcar.setOnClickListener {
var list= listOf("skywell.1ggvlp16.car10","skywell.1ggvlp16.car8") var list = listOf("skywell.1ggvlp16.car10", "skywell.1ggvlp16.car8")
val dialog = CustomListDialog(this, "选择车辆", list) val dialog = CustomListDialog(this, "选择车辆", list)
dialog.setOnItemClickListener(this) dialog.setOnItemClickListener(this)
dialog.show() dialog.show()
......
...@@ -117,11 +117,11 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, CarPanelVM>() { ...@@ -117,11 +117,11 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, CarPanelVM>() {
override fun initListener() { override fun initListener() {
mainVm.carVehicle.observe(this) { mainVm.carVehicle.observe(this) {
//更新车辆仪表,这里模拟只取第一个
viewModel.setCarPanelBean(it) viewModel.setCarPanelBean(it)
for( item in it){ for( item in it){
Log.e("Car", "------车辆位姿数据----$item") Log.e("Car", "------车辆位姿数据----$item")
HighMapApi.setCarPosition(20.80189f,item.heading,item.latitude,item.longitude) HighMapApi.setCarPosition(item.heading,item.latitude,item.longitude,item.elevation.toDouble())
// HighMapApi.setCarPosition(item.heading,item.latitude,item.longitude,20.80189)
} }
} }
......
...@@ -6,7 +6,8 @@ object MyContants { ...@@ -6,7 +6,8 @@ object MyContants {
// var HOST = "https://itg-dev.cu-sc.com:19443/" // var HOST = "https://itg-dev.cu-sc.com:19443/"
//开发环境切勿动 //开发环境切勿动
var HOST = "https://itg-yz.cu-sc.com:13443" var HOST = "https://itg-yz.cu-sc.com:13443"
//智网生产环境地址用于拼接3dtile.json
var HOST_HTTP_3 = "https://itg-yz.cu-sc.com:13443"
/***测试环境socket token***/ /***测试环境socket token***/
private val WSTOKEN = private val WSTOKEN =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI0MTc0NDY3NGNlOGM0MDZmOTVkZTVkYWYyMWVlOWQ0ZiIsImNyZWF0ZVRpbWUiOjE3NTUwNzYxMTgxMjQsInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6ImNoZW5ieTUxIn0.aPYHCxXgQHj4eYGGZnce5MPJCtmMoRcIIHcNXzMMOHE" "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI0MTc0NDY3NGNlOGM0MDZmOTVkZTVkYWYyMWVlOWQ0ZiIsImNyZWF0ZVRpbWUiOjE3NTUwNzYxMTgxMjQsInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6ImNoZW5ieTUxIn0.aPYHCxXgQHj4eYGGZnce5MPJCtmMoRcIIHcNXzMMOHE"
...@@ -19,12 +20,13 @@ object MyContants { ...@@ -19,12 +20,13 @@ object MyContants {
// private val reType = "51world" // private val reType = "51world"
//跟踪车辆的ID 267(模拟) skywell.1ggvlp16.car10 skywell.1ggvlp16.car8 //跟踪车辆的ID 267(模拟) skywell.1ggvlp16.car10 skywell.1ggvlp16.car8
private val VEHICLEID = "skywell.1ggvlp16.car8" private val VEHICLEID = "skywell.1ggvlp16.car8"
// var WSHOST = "wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?token=${WSTOKEN}&vehicleId=${VEHICLEID}&" var WSHOST = "wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?token=${WSTOKEN}&vehicleId=${VEHICLEID}&"
var WSHOST = "wss://172.24.124.130:19443/wsplus/socket?token=121&reType=freedo&vehicleId=7&" // var WSHOST = "wss://172.24.124.130:19443/wsplus/socket?token=121&reType=freedo&vehicleId=7&"
// var PORT = if (IS_DEBUG) "123" else "34534" // var PORT = if (IS_DEBUG) "123" else "34534"
/***感知目标物 &intersectionCode=17 停车场 不传就是整个园区***/ /***感知目标物 &intersectionCode=17 停车场 不传就是整个园区***/
var WS_FEEL_TARGET = "${WSHOST}msgType=1&intersectionCode=17" // var WS_FEEL_TARGET = "${WSHOST}msgType=1&intersectionCode=17"
var WS_FEEL_TARGET = "wss://172.24.124.130:19443/wsplus/socket?token=121&reType=freedo&&msgType=1&intersectionCode=17"
/***网联车辆位姿 &vehicleId=***/ /***网联车辆位姿 &vehicleId=***/
// var WS_VEH_LOC = "${WSHOST}msgType=2" // var WS_VEH_LOC = "${WSHOST}msgType=2"
......
...@@ -9,6 +9,7 @@ import com.sd.cavphmi.base.MyBaseViewModel ...@@ -9,6 +9,7 @@ import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.AvpStatuBean import com.sd.cavphmi.bean.AvpStatuBean
import com.sd.cavphmi.bean.CarVehicle import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.PerTarget import com.sd.cavphmi.bean.PerTarget
import com.sd.cavphmi.bean.PerTargetTest
import com.sd.cavphmi.bean.SpaceInfoBean import com.sd.cavphmi.bean.SpaceInfoBean
import com.sd.cavphmi.bean.V2xStartBean import com.sd.cavphmi.bean.V2xStartBean
import com.sd.cavphmi.bean.VToXImgBean import com.sd.cavphmi.bean.VToXImgBean
...@@ -71,7 +72,7 @@ class MainVm @Inject constructor( ...@@ -71,7 +72,7 @@ class MainVm @Inject constructor(
lateinit var mockVM: MockVM lateinit var mockVM: MockVM
//是否需要模拟 //是否需要模拟
var isMock = false var isMock = true
//车辆位姿数据 //车辆位姿数据
var carVehicle = MutableLiveData<CarVehicle>() var carVehicle = MutableLiveData<CarVehicle>()
...@@ -80,7 +81,7 @@ class MainVm @Inject constructor( ...@@ -80,7 +81,7 @@ class MainVm @Inject constructor(
var vehDetail = MutableLiveData<VehDetailBean>() var vehDetail = MutableLiveData<VehDetailBean>()
//感知目标物 //感知目标物
var targetPre = MutableLiveData<PerTarget>() var targetPre = MutableLiveData<PerTargetTest>()
//v2x 预警 //v2x 预警
var v2xStartBean = MutableLiveData<V2xStartBean>() var v2xStartBean = MutableLiveData<V2xStartBean>()
...@@ -212,7 +213,7 @@ class MainVm @Inject constructor( ...@@ -212,7 +213,7 @@ class MainVm @Inject constructor(
/**感知目标物数据 /**感知目标物数据
*传入intersectionCode=17 拼接 代表获取某区域的感知物,目前没有数据 *传入intersectionCode=17 拼接 代表获取某区域的感知物,目前没有数据
*/ */
fun subTarget(): LiveData<PerTarget> { fun subTarget(): LiveData<PerTargetTest> {
if (isMock) { if (isMock) {
mockVM.onSubTargetMock(targetPre) mockVM.onSubTargetMock(targetPre)
} else { } else {
...@@ -221,7 +222,7 @@ class MainVm @Inject constructor( ...@@ -221,7 +222,7 @@ class MainVm @Inject constructor(
override fun onMsg(str: String) { override fun onMsg(str: String) {
viewModelScope.launch { viewModelScope.launch {
FileIoUtils.writeToFile(str, "PerTarget.txt") FileIoUtils.writeToFile(str, "PerTarget.txt")
var bean = gson.fromJson(str, PerTarget::class.java) var bean = gson.fromJson(str, PerTargetTest::class.java)
targetPre.postValue(bean) targetPre.postValue(bean)
} }
} }
......
...@@ -10,6 +10,7 @@ import com.sd.cavphmi.bean.CarPanelBean ...@@ -10,6 +10,7 @@ import com.sd.cavphmi.bean.CarPanelBean
import com.sd.cavphmi.bean.CarVehicle import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.CarVehicleItem import com.sd.cavphmi.bean.CarVehicleItem
import com.sd.cavphmi.bean.PerTarget import com.sd.cavphmi.bean.PerTarget
import com.sd.cavphmi.bean.PerTargetTest
import com.sd.cavphmi.bean.V2xStartBean import com.sd.cavphmi.bean.V2xStartBean
import com.sd.cavphmi.utils.FileIoUtils import com.sd.cavphmi.utils.FileIoUtils
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
...@@ -58,13 +59,13 @@ class MockVM @Inject constructor( ...@@ -58,13 +59,13 @@ class MockVM @Inject constructor(
//感知目标物 //感知目标物
fun onSubTargetMock(targetPre: MutableLiveData<PerTarget>) { fun onSubTargetMock(targetPre: MutableLiveData<PerTargetTest>) {
viewModelScope.launch { viewModelScope.launch {
val parts = mutableListOf<String>() val parts = mutableListOf<String>()
FileIoUtils.getAssetMock(context, "mock/PerTarget.txt", parts) FileIoUtils.getAssetMock(context, "mock/PerTarget.txt", parts)
parts.forEach { str -> parts.forEach { str ->
delay(1000) delay(1000)
var bean = parseDataBean(str, PerTarget::class.java) var bean = parseDataBean(str, PerTargetTest::class.java)
// println("------模拟感知目标物数据 = ${bean}") // println("------模拟感知目标物数据 = ${bean}")
// println("------模拟感知目标物typeName = ${bean.typeName}") // println("------模拟感知目标物typeName = ${bean.typeName}")
// println("------模拟感知目标物type = ${bean.type}") // println("------模拟感知目标物type = ${bean.type}")
......
...@@ -3,15 +3,27 @@ package com.sd.cavphmi.websockets ...@@ -3,15 +3,27 @@ package com.sd.cavphmi.websockets
import org.java_websocket.client.WebSocketClient import org.java_websocket.client.WebSocketClient
import org.java_websocket.drafts.Draft import org.java_websocket.drafts.Draft
import org.java_websocket.handshake.ServerHandshake import org.java_websocket.handshake.ServerHandshake
import java.net.Socket
import java.net.URI import java.net.URI
import java.nio.ByteBuffer import java.nio.ByteBuffer
import java.security.SecureRandom
import java.security.cert.X509Certificate
import javax.net.ssl.SSLContext
import javax.net.ssl.SSLEngine
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.TrustManager
import javax.net.ssl.X509ExtendedTrustManager
/*****感知目标物**/ /*****感知目标物**/
class FeelTargetWSClient : WebSocketClient { class FeelTargetWSClient : WebSocketClient {
private val TAG = "-----FeelTargetWSClient" private val TAG = "-----FeelTargetWSClient"
constructor(serverUri: URI) : super(serverUri) constructor(serverUri: URI) : super(serverUri){
if(serverUri.toString().contains("wss://")){
trustAllHosts()
}
}
constructor(serverUri: URI?, protocolDraft: Draft?) : super(serverUri, protocolDraft) constructor(serverUri: URI?, protocolDraft: Draft?) : super(serverUri, protocolDraft)
...@@ -55,5 +67,63 @@ class FeelTargetWSClient : WebSocketClient { ...@@ -55,5 +67,63 @@ class FeelTargetWSClient : WebSocketClient {
fun onMsg(str: String) fun onMsg(str: String)
} }
private fun trustAllHosts() {
val trustAllCerts =
arrayOf<TrustManager>(object : X509ExtendedTrustManager() {
override fun checkClientTrusted(
chain: Array<out X509Certificate?>?,
authType: String?,
socket: Socket?
) {
}
override fun checkServerTrusted(
chain: Array<out X509Certificate?>?,
authType: String?,
socket: Socket?
) {
}
override fun checkClientTrusted(
chain: Array<out X509Certificate?>?,
authType: String?,
engine: SSLEngine?
) {
}
override fun checkServerTrusted(
chain: Array<out X509Certificate?>?,
authType: String?,
engine: SSLEngine?
) {
}
override fun checkClientTrusted(
chain: Array<out X509Certificate?>?,
authType: String?
) {
}
override fun checkServerTrusted(
chain: Array<out X509Certificate?>?,
authType: String?
) {
}
override fun getAcceptedIssuers(): Array<out X509Certificate?>? {
return null
}
})
try {
val ssl = SSLContext.getInstance("SSL")
ssl.init(null, trustAllCerts, SecureRandom())
val socketFactory: SSLSocketFactory? = ssl.getSocketFactory()
this.setSocketFactory(socketFactory)
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
}
} }
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
...@@ -8,7 +8,11 @@ ...@@ -8,7 +8,11 @@
android:orientation="vertical" android:orientation="vertical"
tools:context=".ui.LoginActivity"> tools:context=".ui.LoginActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
...@@ -23,7 +27,7 @@ ...@@ -23,7 +27,7 @@
android:textColor="#3D3D3D" android:textColor="#3D3D3D"
android:textSize="16sp" /> android:textSize="16sp" />
</RelativeLayout> </RelativeLayout>
<ImageView <ImageView
...@@ -139,5 +143,8 @@ ...@@ -139,5 +143,8 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</ScrollView>
\ No newline at end of file
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