Commit e09a56b8 authored by p x's avatar p x
Browse files

整理车辆移动和感知物

parent 1b561d38
......@@ -20,6 +20,10 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 允许程序写入外部存储设备 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 允许程序读取所有者数据 -->
<uses-permission android:name="android.permission.READ_OWNER_DATA" /> <!-- 访问WiFi状态,需要WiFi信息用于网络定位 -->
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 8.0 安装未知程序权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
......@@ -43,11 +47,21 @@
android:name="com.minedata.minenavi.apikey"
android:value="57ac7a0d56494912a0c28e651fa4a40a" /> <!-- android:screenOrientation="userLandscape" -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<activity
android:name=".ui.LoginActivity"
android:exported="true"
android:theme="@style/Theme.SuZhouAvp"
android:screenOrientation="landscape">
android:screenOrientation="landscape"
android:theme="@style/Theme.SuZhouAvp">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
......@@ -65,19 +79,19 @@
android:hardwareAccelerated="false"
android:launchMode="singleTask"
android:resizeableActivity="false"
android:screenOrientation="fullUser"/>
android:screenOrientation="fullUser" />
<!-- <activity-->
<!-- android:name=".ui.BootActivity"-->
<!-- android:exported="true"-->
<!-- android:screenOrientation="landscape"-->
<!-- android:theme="@style/SplashTheme">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->
<!-- <activity-->
<!-- android:name=".ui.BootActivity"-->
<!-- android:exported="true"-->
<!-- android:screenOrientation="landscape"-->
<!-- android:theme="@style/SplashTheme">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->
<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
</application>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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.bean
/**
* 感知目标物实体
****/
class PerTarget : ArrayList<PerTargetItem>()
* websocket解析目标感知物的接受数据
*
**/
class PerceptionBean : ArrayList<PerceptionBeanItem>()
data class PerTargetItem(
data class PerceptionBeanItem(
val accessTime: Long,
val deviceId: String,
val participants: List<Participant>,
val receiveTime: Int,
val receiveTime: Long,
val reportTime: Long,
// val statistic: Statistic
)
......@@ -21,7 +22,7 @@ data class Participant(
val latitude: Double,
val longitude: Double,
val ptcId: String,
val ptcType: String,
val ptcType: String,//
val speed: Double
)
......
......@@ -2,6 +2,7 @@ package com.sd.cavphmi.ui
import android.Manifest
import android.content.Intent
import android.os.Build
import androidx.lifecycle.ViewModelProvider
import com.permissionx.guolindev.PermissionX
import com.sd.cavphmi.BR
......@@ -61,14 +62,20 @@ class BootActivity : BaseActivity<ActivityBootBinding, MyBaseViewModel>() {
fun requestPers() {
var list = listOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
var pers = mutableListOf<String>(
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_PHONE_STATE
)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
pers.add(Manifest.permission.READ_EXTERNAL_STORAGE)
pers.add(Manifest.permission.MANAGE_EXTERNAL_STORAGE)
}else{
pers.add(Manifest.permission.READ_EXTERNAL_STORAGE)
}
PermissionX.init(this)
.permissions(list)
.permissions(pers.toList())
.onExplainRequestReason { scope, deniedList ->
scope.showRequestReasonDialog(
deniedList,
......
......@@ -98,41 +98,33 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>(),
//联网车辆位姿数据
binding.btVehicle.setOnClickListener {
mainVm.subVehicle().observe(this) {
var a = 1
}
}
//感知目标物
binding.btTarget.setOnClickListener {
mainVm.subTarget().observe(this) {
if (it.size == 0) {
if (it.isEmpty()) {
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
if (item.ptcType == "car") {
unityPtc.pType = 1
var parts = it.flatMap { it.participants }
var ptcList = parts.map {
var unityPtc = UnityPtc().apply {
lat = it.latitude
lon = it.longitude
ptcid = it.ptcId
heading = it.heading
if (it.ptcType == "car") {
pType = 1
} else {
unityPtc.pType = 2
pType = 2
}
// unityPtc.aniTime=ptc.aniTime
// unityPtc.aniTime = 1
// unityPtc.isFlash=ptc.isFlash
// unityPtc.isRed=ptc.isRed
// unityPtc.isFlash = true
// unityPtc.isRed = true
ptcList.add(unityPtc)
}
HighMapApi.setPtcData(ptcList)
return@map unityPtc
}
HighMapApi.setPtcData(ptcList)
}
}
//v2x 预警
......
......@@ -101,18 +101,10 @@ class UnityFragment : Fragment(), IUnityPlayerLifecycleEvents {
unityMapVm.loadTileJson()
}
// 可选:向 Unity 发送消息的方法
fun sendMessageToUnity(gameObjectName: String, methodName: String, message: String) {
// mUnityPlayer?.sendMessage(gameObjectName, methodName, message)
// UnityPlayer.UnitySendMessage()
}
companion object {
@JvmStatic
fun newInstance() = UnityFragment()
}
}
\ No newline at end of file
package com.sd.cavphmi.utils
object MyContants {
// const val IS_DEBUG = true
const val IS_DEBUG = true
//测试环境
// var HOST = "https://itg-dev.cu-sc.com:19443/"
//开发环境切勿动
var HOST = "https://itg-yz.cu-sc.com:13443"
//智网生产环境地址用于拼接3dtile.json
var HOST_HTTP_3 = "https://itg-yz.cu-sc.com:13443"
/***测试环境socket token***/
private val WSTOKEN =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI0MTc0NDY3NGNlOGM0MDZmOTVkZTVkYWYyMWVlOWQ0ZiIsImNyZWF0ZVRpbWUiOjE3NTUwNzYxMTgxMjQsInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6ImNoZW5ieTUxIn0.aPYHCxXgQHj4eYGGZnce5MPJCtmMoRcIIHcNXzMMOHE"
// /***测试环境socket token***/
// private val WSTOKEN =
// "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI0MTc0NDY3NGNlOGM0MDZmOTVkZTVkYWYyMWVlOWQ0ZiIsImNyZWF0ZVRpbWUiOjE3NTUwNzYxMTgxMjQsInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6ImNoZW5ieTUxIn0.aPYHCxXgQHj4eYGGZnce5MPJCtmMoRcIIHcNXzMMOHE"
//登录后拿到Token
var HTTP_TOKEN =
......@@ -18,23 +18,26 @@ object MyContants {
//仅仅用于测试接口联通性,这里可不传
// private val reType = "51world"
//跟踪车辆的ID 267(模拟) skywell.1ggvlp16.car10 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://172.24.124.130:19443/wsplus/socket?token=121&reType=freedo&vehicleId=7&"
//跟踪车辆的ID 15(模拟) skywell.1ggvlp16.car10 skywell.1ggvlp16.car8
//智网测试、开发地址
var BASE_HOST =
if (IS_DEBUG) "172.24.124.130:19443" else "itg-yz.cu-sc.com:19443"
//websocket地址
private var WSHOST = if (IS_DEBUG) "wss://${BASE_HOST}/wsplus/socket?token=121&reType=freedo&" else "wss://${BASE_HOST}/wsplus/socket?token=121&reType=freedo&"
var vehicleId = "17"
/**网联车辆位姿 用于实车测试喽数据***/
var WS_VEH_LOC = "${WSHOST}msgType=2&vehicleId=${vehicleId}"
// var PORT = if (IS_DEBUG) "123" else "34534"
/***感知目标物 &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=***/
// var WS_VEH_LOC = "${WSHOST}msgType=2"
var WS_VEH_LOC = "wss://172.24.124.130:19443/wsplus/socket?token=121&reType=freedo&msgType=2&vehicleId=7"
var WS_FEEL_TARGET = "${WSHOST}&msgType=1"
/***V2X预警 vehicleId 传了就是获取某一辆车的预警 &vehicleId=***/
var WS_V2X = "${WSHOST}msgType=4"
/***网联车辆状态 &vehicleId=''***/
var WS_VEH_STATU = "${WSHOST}msgType=6"
......
......@@ -8,13 +8,13 @@ import com.google.gson.Gson
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.AvpStatuBean
import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.PerTarget
import com.sd.cavphmi.bean.PerTargetTest
import com.sd.cavphmi.bean.PerceptionBean
import com.sd.cavphmi.bean.SpaceInfoBean
import com.sd.cavphmi.bean.V2xStartBean
import com.sd.cavphmi.bean.VToXImgBean
import com.sd.cavphmi.bean.VehDetailBean
import com.sd.cavphmi.bean.VehicleStats
import com.sd.cavphmi.highmap.HighMapApi
import com.sd.cavphmi.net.MyResult
import com.sd.cavphmi.repositorys.AvpDataRepo
import com.sd.cavphmi.utils.FileIoUtils
......@@ -23,7 +23,6 @@ import com.sd.cavphmi.utils.ToastHelper
import com.sd.cavphmi.websockets.FeelTargetWSClient
import com.sd.cavphmi.websockets.V2xWSClient
import com.sd.cavphmi.websockets.VecLocWSClient
import com.sd.cavphmi.websockets.VehStatuWSClient
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.launch
......@@ -72,7 +71,7 @@ class MainVm @Inject constructor(
lateinit var mockVM: MockVM
//是否需要模拟
var isMock = true
var isMock = false
//车辆位姿数据
var carVehicle = MutableLiveData<CarVehicle>()
......@@ -81,7 +80,7 @@ class MainVm @Inject constructor(
var vehDetail = MutableLiveData<VehDetailBean>()
//感知目标物
var targetPre = MutableLiveData<PerTargetTest>()
var targetPre = MutableLiveData<PerceptionBean>()
//v2x 预警
var v2xStartBean = MutableLiveData<V2xStartBean>()
......@@ -196,12 +195,17 @@ class MainVm @Inject constructor(
viewModelScope.launch {
//下载到sd卡下面的DownLoad文件夹下面
FileIoUtils.writeToFile(str, "CarVehicle.txt")
var bean = gson.fromJson(str, CarVehicle::class.java)
carVehicle.postValue(bean)
var carBean = gson.fromJson(str, CarVehicle::class.java)
// carVehicle.postValue(carBean)
//更新主车位置
var car=carBean.first()
HighMapApi.setCarPosition(car.heading, car.latitude, car.longitude, 20.80189)
}
}
}
vecLocWSClient.connect()
if (!vecLocWSClient.isOpen){
vecLocWSClient.connect()
}
} catch (e: Exception) {
e.printStackTrace()
}
......@@ -213,7 +217,7 @@ class MainVm @Inject constructor(
/**感知目标物数据
*传入intersectionCode=17 拼接 代表获取某区域的感知物,目前没有数据
*/
fun subTarget(): LiveData<PerTargetTest> {
fun subTarget(): LiveData<PerceptionBean> {
if (isMock) {
mockVM.onSubTargetMock(targetPre)
} else {
......@@ -222,12 +226,14 @@ class MainVm @Inject constructor(
override fun onMsg(str: String) {
viewModelScope.launch {
FileIoUtils.writeToFile(str, "PerTarget.txt")
var bean = gson.fromJson(str, PerTargetTest::class.java)
var bean = gson.fromJson(str, PerceptionBean::class.java)
targetPre.postValue(bean)
}
}
}
feelTargetWSClient.connect()
if (!feelTargetWSClient.isOpen){
feelTargetWSClient.connect()
}
} catch (e: Exception) {
e.printStackTrace()
}
......@@ -254,7 +260,9 @@ class MainVm @Inject constructor(
}
}
}
v2xWSClient.connect()
if (v2xWSClient.isOpen == false){
v2xWSClient.connect()
}
} catch (e: Exception) {
e.printStackTrace()
}
......
package com.sd.cavphmi.viewmodels
import android.content.Context
import androidx.databinding.ObservableField
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.google.gson.Gson
import com.sd.cavphmi.bean.CarPanelBean
import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.CarVehicleItem
import com.sd.cavphmi.bean.PerTarget
import com.sd.cavphmi.bean.PerTargetTest
import com.sd.cavphmi.bean.PerceptionBean
import com.sd.cavphmi.bean.V2xStartBean
import com.sd.cavphmi.highmap.HighMapApi
import com.sd.cavphmi.utils.FileIoUtils
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
......@@ -45,32 +42,34 @@ class MockVM @Inject constructor(
) {
viewModelScope.launch {
val dst = mutableListOf<String>()
FileIoUtils.getAssetMock(context, "mock/CarVehicle.txt", dst)
FileIoUtils.getAssetMock(context, "mock/CarVehicle_15.txt", dst)
dst.forEach { str ->
delay(1000)
val bean = parseDataBean(str, CarVehicle::class.java)
println("------模拟车辆位姿数据 = ${bean}")
println("------车速 = ${bean.first().speed}")
println("------电量 = ${bean.first().soc}")
// println("------模拟车辆位姿数据 = ${bean}")
// println("------车速 = ${bean.first().speed}")
// println("------电量 = ${bean.first().soc}")
carVehicle.value = bean
var car = bean.first()
HighMapApi.setCarPosition(car.heading, car.latitude, car.longitude, 20.80189)
delay(100)
}
}
}
//感知目标物
fun onSubTargetMock(targetPre: MutableLiveData<PerTargetTest>) {
fun onSubTargetMock(targetPre: MutableLiveData<PerceptionBean>) {
viewModelScope.launch {
val parts = mutableListOf<String>()
FileIoUtils.getAssetMock(context, "mock/PerTarget.txt", parts)
parts.forEach { str ->
delay(1000)
var bean = parseDataBean(str, PerTargetTest::class.java)
var bean = parseDataBean(str, PerceptionBean::class.java)
// println("------模拟感知目标物数据 = ${bean}")
// println("------模拟感知目标物typeName = ${bean.typeName}")
// println("------模拟感知目标物type = ${bean.type}")
// println("------模拟感知目标物level = ${bean.type}")
targetPre.value = bean
delay(1000)
}
}
}
......
......@@ -43,11 +43,10 @@ class FeelTargetWSClient : WebSocketClient {
return
onDataCb?.onMsg(message)
// onSocketCb?.onMessage(message)
}
override fun onMessage(bytes: ByteBuffer?) {
System.out.println(TAG + " received ByteBuffer")
// System.out.println(TAG + " received ByteBuffer")
}
......
......@@ -44,17 +44,14 @@ class VecLocWSClient : WebSocketClient {
return
onDataCb?.onMsg(message)
// onSocketCb?.onMessage(message)
}
override fun onMessage(bytes: ByteBuffer?) {
// System.out.println(TAG + " received ByteBuffer")
}
override fun onClose(code: Int, reason: String?, remote: Boolean) {
// System.out.println(TAG + " closed with exit code " + code + " additional info: " + reason);
}
override fun onError(ex: Exception?) {
......
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path
name="external-path"
path="." />
</paths>
</resources>
\ 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