Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
p x
SuZhouAvp
Commits
aa341738
Commit
aa341738
authored
Jun 17, 2025
by
p x
Browse files
集成一部分订阅
parent
fecf07e4
Changes
17
Expand all
Hide whitespace changes
Inline
Side-by-side
README.md
View file @
aa341738
...
@@ -3,4 +3,5 @@
...
@@ -3,4 +3,5 @@
停车场泊车 苏州 约等于(长春) AVP
停车场泊车 苏州 约等于(长春) AVP
https://protobuf.dev/getting-started/javatutorial/
https://protobuf.dev/getting-started/javatutorial/
protoc --java_out=app
\s
rc
\m
ain
\j
ava
\
-I d:
\W
orkSpace
\s
uzhouavp
\a
pp
\s
rc
\m
ain
\p
roto
\
d:
\W
orkSpace
\s
uzhouavp
\a
pp
\s
rc
\m
ain
\p
roto
\r
esponse.proto
protoc --java_out=app
\s
rc
\m
ain
\j
ava
\
-I app
\s
rc
\m
ain
\p
roto
\
response.proto
\ No newline at end of file
protoc --java_out=app
\s
rc
\m
ain
\j
ava
\
-I d:
\W
orkSpace
\s
uzhouavp
\a
pp
\s
rc
\m
ain
\p
roto
\
response.proto
\ No newline at end of file
app/src/main/assets/avphmi-demo.vue
0 → 100644
View file @
aa341738
This diff is collapsed.
Click to expand it.
app/src/main/assets/mock/carvehicle.txt
0 → 100644
View file @
aa341738
This diff is collapsed.
Click to expand it.
app/src/main/assets/mock/target.txt
0 → 100644
View file @
aa341738
This diff is collapsed.
Click to expand it.
app/src/main/assets/setting.js
0 → 100644
View file @
aa341738
export
default
{
webSocket
:
{
// url: "ws://127.0.0.1:1884",
// url: "wss://10.166.5.5:10443/socket/ws?clientSource=100",
url
:
"
wss://sip-avp.isungent.cn:8443/socket/ws?clientSource=100
"
,
/* dic: {
// "/topic/vehicle": "/topic/vehicle/1556919708184276993",
"/topic/vehicle": "/topic/vehicle",
"/topic/dataMerge": "/topic/dataMerge",
"/topic/signal": "/topic/signal",
"/topic/v2xStart": "/topic/v2xStart",
"/topic/v2xEnd": "/topic/v2xEnd",
"/topic/vehicleStatus": "/topic/vehicleStatus",
"/topic/timeDelay": "/topic/timeDelay",
}, */
dic
:
{
/* "/topic/vehicle": "/topic/vehicle/1556919708184276993", */
"
/topic/vehicle
"
:
"
/avp/api/VL961/vehicle/1694264612474306561
"
,
"
/topic/dataMerge
"
:
"
/avp/api/VL961/dataMerge
"
,
"
/topic/signal
"
:
"
/avp/api/VL961/signal
"
,
"
/topic/v2xStart
"
:
"
/avp/api/VL961/v2xStart
"
,
"
/topic/v2xEnd
"
:
"
/avp/api/VL961/v2xEnd
"
,
"
/topic/vehicleStatus
"
:
"
/avp/api/VL961/vehicleStatus
"
,
"
/topic/timeDelay
"
:
"
/avp/api/VL961/timeDelay
"
,
"
/topic/points
"
:
"
/avp/api/VL961/points
"
,
},
},
cesiumSetting
:
{
defaultAccessToken
:
"
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJiMTgwZWJjMy1iNGVlLTRjYjctOWRlMy0xYmI3NzJmZDA3YzciLCJpZCI6MTAxNTkxLCJpYXQiOjE2NTgxNDAzMzB9.feULjgKOMAUASE9RnhPNkWhg2dvS9NCGupOeJF55I5M
"
,
},
};
app/src/main/java/com/sd/cavphmi/bean/CarVehicle.kt
0 → 100644
View file @
aa341738
package
com.sd.cavphmi.bean
/***车辆位资数据**/
data class
CarVehicle
(
val
vehicleData
:
List
<
CarVehicleData
>,
val
wsTime
:
Long
)
data class
CarVehicleData
(
val
altitude
:
Double
,
val
brake
:
Int
,
val
gasPedal
:
Int
,
val
gear
:
Int
,
val
heading
:
Float
,
val
latitude
:
Double
,
val
longitude
:
Double
,
val
obuCode
:
String
,
val
reportTime
:
Long
,
val
speed
:
Float
,
//m/s
val
vehicleId
:
String
,
val
vehiclePlate
:
String
,
val
vehiclePurpose
:
String
,
val
vehiclePurposeName
:
String
,
val
wheelAngle
:
Int
)
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/bean/PerTarget.kt
0 → 100644
View file @
aa341738
package
com.sd.cavphmi.bean
/**感知目标物
* {"objectData":[{"altitude":0.0,"deviceCode":"ALL","id":"rsm","latitude":0.0,"longitude":0.0,"participant":[{"gear":0,"heading":59.51892445105614,"latitude":43.836595395579934,"longitude":125.13730164662486,"ptcId":"0","ptcType":"non-motor","size":{"length":1.7816076278686523,"width":0.95207178592681885,"height":1.080740213394165},"speed":0.0030517578125}],"reportTime":1750148176068}],"wsTime":1750148130604}{"objectData":[{"altitude":0.0,"deviceCode":"ALL","id":"rsm","latitude":0.0,"longitude":0.0,"participant":[{"gear":0,"heading":59.51892445105614,"latitude":43.836595395579934,"longitude":125.13730164662486,"ptcId":"0","ptcType":"non-motor","size":{"length":1.7816076278686523,"width":0.95207178592681885,"height":1.080740213394165},"speed":0.0030517578125}],"reportTime":1750148176068}],"wsTime":1750148130604}
*
* ***/
data class
PerTarget
(
val
objectData
:
List
<
ObjectData
>,
val
wsTime
:
Long
)
data class
ObjectData
(
val
altitude
:
Double
,
val
deviceCode
:
String
,
val
id
:
String
,
val
latitude
:
Double
,
val
longitude
:
Double
,
val
participant
:
List
<
Participant
>,
val
reportTime
:
Long
)
data class
Participant
(
val
gear
:
Int
,
val
heading
:
Double
,
val
latitude
:
Double
,
val
longitude
:
Double
,
val
ptcId
:
String
,
val
ptcType
:
String
,
val
size
:
Size
,
val
speed
:
Double
)
data class
Size
(
val
height
:
Double
,
val
length
:
Double
,
val
width
:
Double
)
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/bean/VehicleStats.kt
0 → 100644
View file @
aa341738
package
com.sd.cavphmi.bean
//联网车辆状态数据
data class
VehicleStats
(
val
vehicleData
:
List
<
VehicleData
>,
val
wsTime
:
Long
)
data class
VehicleData
(
val
altitude
:
Double
,
val
brake
:
Int
,
val
gasPedal
:
Int
,
val
gear
:
Int
,
val
heading
:
Double
,
val
latitude
:
Double
,
val
longitude
:
Double
,
val
obuCode
:
String
,
val
reportTime
:
Long
,
val
speed
:
Double
,
val
vehicleId
:
String
,
val
vehiclePlate
:
String
,
val
vehiclePurpose
:
String
,
val
vehiclePurposeName
:
String
,
val
wheelAngle
:
Int
,
val
driveMode
:
Int
,
)
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/bean/WebSetBean.kt
View file @
aa341738
...
@@ -2,7 +2,8 @@ package com.sd.cavphmi.bean
...
@@ -2,7 +2,8 @@ package com.sd.cavphmi.bean
object
WebSetBean
{
object
WebSetBean
{
/* "/topic/vehicle"to "/topic/vehicle/1556919708184276993", */
/* "/topic/vehicle"to "/topic/vehicle/1556919708184276993", */
var
dic
=
mapOf
(
//目前只有车辆和感知
var
subDic
=
mapOf
(
"/topic/vehicle"
to
"/avp/api/VL961/vehicle/1694264612474306561"
,
"/topic/vehicle"
to
"/avp/api/VL961/vehicle/1694264612474306561"
,
"/topic/dataMerge"
to
"/avp/api/VL961/dataMerge"
,
"/topic/dataMerge"
to
"/avp/api/VL961/dataMerge"
,
"/topic/signal"
to
"/avp/api/VL961/signal"
,
"/topic/signal"
to
"/avp/api/VL961/signal"
,
...
@@ -10,6 +11,27 @@ object WebSetBean {
...
@@ -10,6 +11,27 @@ object WebSetBean {
"/topic/v2xEnd"
to
"/avp/api/VL961/v2xEnd"
,
"/topic/v2xEnd"
to
"/avp/api/VL961/v2xEnd"
,
"/topic/vehicleStatus"
to
"/avp/api/VL961/vehicleStatus"
,
"/topic/vehicleStatus"
to
"/avp/api/VL961/vehicleStatus"
,
"/topic/timeDelay"
to
"/avp/api/VL961/timeDelay"
,
"/topic/timeDelay"
to
"/avp/api/VL961/timeDelay"
,
"/topic/points"
to
"/avp/api/VL961/points"
,
"/topic/points"
to
"/avp/api/VL961/points"
,
//停车位变更
)
var
dic
=
mapOf
(
5231
to
"/topic/vehicle"
,
5232
to
"/topic/dataMerge"
,
5233
to
"topic/signa"
,
5234
to
"/topic/v2xStart"
,
5235
to
"/topic/v2xEnd"
,
5236
to
"/topic/vehicleStatus"
,
5237
to
"/topic/timeDelay"
,
1
to
"/topic/point"
,
)
)
// 5231: { action: setting.webSocket.dic["/topic/vehicle"] },
// 5232: { action: setting.webSocket.dic["/topic/dataMerge"] },
// 5233: { action: setting.webSocket.dic["/topic/signal"] },
// 5234: { action: setting.webSocket.dic["/topic/v2xStart"] },
// 5235: { action: setting.webSocket.dic["/topic/v2xEnd"] },
// 5236: { action: setting.webSocket.dic["/topic/vehicleStatus"] },
// 5237: { action: setting.webSocket.dic["/topic/timeDelay"] },
// 1: { action: setting.webSocket.dic["/topic/points"] },
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/bindadapters/ShowCarStatuObject.kt
0 → 100644
View file @
aa341738
package
com.sd.cavphmi.bindadapters
import
android.graphics.Typeface
import
android.text.SpannableStringBuilder
import
android.text.Spanned
import
android.text.style.RelativeSizeSpan
import
android.text.style.StyleSpan
import
android.widget.TextView
import
androidx.databinding.BindingAdapter
import
java.text.DecimalFormat
import
kotlin.math.absoluteValue
object
ShowCarStatuObject
{
@JvmStatic
@BindingAdapter
(
"showSpeed"
)
fun
showSpeed
(
tv
:
TextView
,
speed
:
Float
)
{
var
sb
=
SpannableStringBuilder
()
var
mixSpan
=
RelativeSizeSpan
(
1f
)
var
maxSpan
=
RelativeSizeSpan
(
2f
)
var
bold
=
StyleSpan
(
Typeface
.
BOLD
)
if
(
speed
>
0f
)
{
val
df
:
DecimalFormat
=
DecimalFormat
(
"#.0"
)
val
s
:
String
=
df
.
format
(
speed
.
times
(
3.6f
))
sb
.
append
(
"${s}km/h"
)
sb
.
setSpan
(
maxSpan
,
0
,
s
.
count
(),
Spanned
.
SPAN_INCLUSIVE_EXCLUSIVE
)
sb
.
setSpan
(
bold
,
0
,
s
.
count
(),
Spanned
.
SPAN_INCLUSIVE_EXCLUSIVE
)
sb
.
setSpan
(
mixSpan
,
s
.
count
(),
sb
.
count
(),
Spanned
.
SPAN_INCLUSIVE_EXCLUSIVE
)
tv
.
setText
(
sb
)
}
else
{
sb
=
SpannableStringBuilder
(
"0km/h"
)
sb
.
setSpan
(
maxSpan
,
0
,
1
,
Spanned
.
SPAN_INCLUSIVE_EXCLUSIVE
)
sb
.
setSpan
(
bold
,
0
,
1
,
Spanned
.
SPAN_INCLUSIVE_EXCLUSIVE
)
sb
.
setSpan
(
mixSpan
,
1
,
sb
.
count
(),
Spanned
.
SPAN_EXCLUSIVE_EXCLUSIVE
)
tv
.
setText
(
sb
)
}
}
@JvmStatic
@BindingAdapter
(
"showHeading"
)
fun
showHeading
(
tv
:
TextView
,
head
:
Int
)
{
var
heading
=
head
.
absoluteValue
when
(
heading
)
{
0
->
{
tv
.
setText
(
"正北"
)
}
90
->
{
tv
.
setText
(
"正东"
)
}
180
->
{
tv
.
setText
(
"正南"
)
}
270
->
{
tv
.
setText
(
"正北"
)
}
in
1
..
45
->
{
tv
.
setText
(
"北偏东"
)
}
in
46
..
89
->
{
tv
.
setText
(
"东偏北"
)
}
in
91
..
135
->
{
tv
.
setText
(
"东偏南"
)
}
in
136
..
179
->
{
tv
.
setText
(
"南偏东"
)
}
in
181
..
225
->
{
tv
.
setText
(
"南偏西"
)
}
in
226
..
269
->
{
tv
.
setText
(
"西偏南"
)
}
in
271
..
315
->
{
tv
.
setText
(
"西偏北"
)
}
in
316
..
359
->
{
tv
.
setText
(
"北偏西"
)
}
else
->
{
tv
.
setText
(
" - -"
)
}
}
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/repositorys/ParseSocketRepo.kt
0 → 100644
View file @
aa341738
package
com.sd.cavphmi.repositorys
import
com.google.gson.Gson
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.withContext
import
javax.inject.Inject
class
ParseSocketRepo
@Inject
constructor
()
{
var
gson
=
Gson
()
/**联网车辆状态数据***/
suspend
fun
<
T
>
genDataBean
(
str
:
String
,
clazz
:
Class
<
T
>):
T
{
return
withContext
(
Dispatchers
.
Default
)
{
gson
.
fromJson
(
str
,
clazz
)
}
}
// /**联网车辆状态数据***/
// suspend fun<T> genVehStatus():T {
//
// }
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/ui/MainActivity.kt
View file @
aa341738
...
@@ -7,8 +7,10 @@ import androidx.lifecycle.ViewModelProvider
...
@@ -7,8 +7,10 @@ import androidx.lifecycle.ViewModelProvider
import
com.sd.cavphmi.BR
import
com.sd.cavphmi.BR
import
com.sd.cavphmi.R
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.bean.CarVehicle
import
com.sd.cavphmi.bean.VehicleStats
import
com.sd.cavphmi.databinding.ActivityMainBinding
import
com.sd.cavphmi.databinding.ActivityMainBinding
import
com.sd.cavphmi.utils.DateUtils
import
com.sd.cavphmi.viewmodels.MainVm
import
com.sd.cavphmi.viewmodels.MainVm
import
dagger.hilt.android.AndroidEntryPoint
import
dagger.hilt.android.AndroidEntryPoint
...
@@ -43,23 +45,76 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
...
@@ -43,23 +45,76 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
}
}
override
fun
initListener
()
{
binding
.
btVehicle
.
setOnClickListener
{
viewModel
.
subVehicle
().
observe
(
this
)
{
topicVehicle
(
it
)
}
}
binding
.
btStatus
.
setOnClickListener
{
viewModel
.
subVehicleStatus
().
observe
(
this
)
{
// println("time = ${time}")
topicVehicleStatus
(
it
)
}
}
binding
.
btTarget
.
setOnClickListener
{
viewModel
.
subTarget
()
}
binding
.
btV2x
.
setOnClickListener
{
viewModel
.
subStartV2x
()
}
binding
.
btV2xend
.
setOnClickListener
{
viewModel
.
subEndV2x
()
}
binding
.
btChewei
.
setOnClickListener
{
viewModel
.
subPoints
()
}
}
/**车辆姿态**/
private
fun
topicVehicle
(
bean
:
CarVehicle
)
{
var
time
=
DateUtils
.
longToString
(
bean
.
wsTime
,
DateUtils
.
FORMAT_TIME
)
binding
.
tvTime
.
setText
(
time
)
if
(
bean
.
vehicleData
?.
isNotEmpty
()
?:
false
)
{
viewModel
.
heading
.
set
(
bean
.
vehicleData
.
get
(
0
).
heading
.
toInt
())
viewModel
.
speed
.
set
(
bean
.
vehicleData
.
get
(
0
).
speed
)
}
}
/**联网车辆状态数据topic**/
private
fun
topicVehicleStatus
(
bean
:
VehicleStats
)
{
if
(
bean
.
vehicleData
?.
isNotEmpty
()
?:
false
)
{
var
driveMode
=
bean
.
vehicleData
.
get
(
0
).
driveMode
var
str
=
when
(
driveMode
)
{
0
->
"自动驾驶"
1
->
"人工驾驶"
2
->
"远程驾驶"
else
->
"—— ——"
}
viewModel
.
driveMode
.
set
(
str
)
}
}
override
fun
dispatchKeyEvent
(
event
:
KeyEvent
):
Boolean
{
override
fun
dispatchKeyEvent
(
event
:
KeyEvent
):
Boolean
{
if
((
event
.
getKeyCode
()
==
KeyEvent
.
KEYCODE_BACK
)
||
event
.
getKeyCode
()
==
KeyEvent
.
KEYCODE_HOME
)
{
if
((
event
.
getKeyCode
()
==
KeyEvent
.
KEYCODE_BACK
)
||
event
.
getKeyCode
()
==
KeyEvent
.
KEYCODE_HOME
)
{
//如果是导航中,提示清除资源
val
dialog
=
AlertDialog
.
Builder
(
this
)
val
dialog
=
AlertDialog
.
Builder
(
this
)
// dialog.setIcon(android.R.drawable.ic_dialog_info)
// dialog.setIcon(android.R.drawable.ic_dialog_info)
dialog
.
setTitle
(
"提示"
)
dialog
.
setTitle
(
"提示"
)
dialog
.
setMessage
(
"确定退出应用"
)
dialog
.
setMessage
(
"确定退出应用"
)
dialog
.
setPositiveButton
(
dialog
.
setPositiveButton
(
"确定"
,
"确定"
,
DialogInterface
.
OnClickListener
{
dialog1
:
DialogInterface
?,
which
:
Int
->
DialogInterface
.
OnClickListener
{
dialog1
:
DialogInterface
?,
which
:
Int
->
viewModel
.
closeWS
()
dialog1
?.
dismiss
()
finish
()
viewModel
.
closeWS
()
})
finish
()
dialog
.
setNegativeButton
(
})
"取消"
,
dialog
.
setNegativeButton
(
DialogInterface
.
OnClickListener
{
dialog12
:
DialogInterface
?,
which
:
Int
->
})
"取消"
,
dialog
.
show
()
DialogInterface
.
OnClickListener
{
dialog12
:
DialogInterface
?,
which
:
Int
->
dialog12
?.
dismiss
()
})
dialog
.
show
()
return
true
return
true
}
else
{
}
else
{
...
...
app/src/main/java/com/sd/cavphmi/utils/FileIoUtils.kt
View file @
aa341738
...
@@ -7,6 +7,7 @@ import android.net.Uri
...
@@ -7,6 +7,7 @@ import android.net.Uri
import
android.os.Build
import
android.os.Build
import
android.os.Environment
import
android.os.Environment
import
android.provider.MediaStore
import
android.provider.MediaStore
import
android.util.Log
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.coroutineScope
import
kotlinx.coroutines.coroutineScope
import
kotlinx.coroutines.runBlocking
import
kotlinx.coroutines.runBlocking
...
@@ -47,12 +48,12 @@ object FileIoUtils {
...
@@ -47,12 +48,12 @@ object FileIoUtils {
}
}
suspend
fun
getAssetMock
(
context
:
Context
,
fileName
:
String
,
dst
:
MutableList
<
String
>)
:
Int
{
suspend
fun
getAssetMock
(
context
:
Context
,
fileName
:
String
,
dst
:
MutableList
<
String
>):
Int
{
val
assetManager
=
context
.
assets
val
assetManager
=
context
.
assets
var
bf
:
BufferedReader
?
=
null
var
bf
:
BufferedReader
?
=
null
try
{
try
{
val
inputReader
=
InputStreamReader
(
assetManager
.
open
(
fileName
))
val
inputReader
=
InputStreamReader
(
assetManager
.
open
(
fileName
))
bf
=
BufferedReader
(
inputReader
)
bf
=
BufferedReader
(
inputReader
)
var
line
=
""
var
line
=
""
while
(!
bf
.
run
{
while
(!
bf
.
run
{
line
=
readLine
()
line
=
readLine
()
...
@@ -334,7 +335,25 @@ object FileIoUtils {
...
@@ -334,7 +335,25 @@ object FileIoUtils {
}
catch
(
e
:
java
.
lang
.
Exception
)
{
}
catch
(
e
:
java
.
lang
.
Exception
)
{
e
.
printStackTrace
()
e
.
printStackTrace
()
}
}
}
private
var
fileWriter
:
FileWriter
?
=
null
suspend
fun
writeToFile
(
message
:
String
,
fileName
:
String
)
{
withContext
(
Dispatchers
.
IO
)
{
try
{
val
file
=
File
(
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_DOWNLOADS
),
fileName
)
fileWriter
=
FileWriter
(
file
,
true
)
// true for append mode
fileWriter
!!
.
append
(
"$message\n"
)
fileWriter
!!
.
flush
()
// Optional, to ensure immediate writing to file
}
catch
(
e
:
IOException
)
{
Log
.
e
(
"------writeToFile"
,
"Error initializing log file"
,
e
)
}
}
}
}
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/MainVm.kt
View file @
aa341738
package
com.sd.cavphmi.viewmodels
package
com.sd.cavphmi.viewmodels
import
android.content.Context
import
android.content.Context
import
androidx.databinding.ObservableField
import
androidx.lifecycle.LiveData
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.viewModelScope
import
androidx.lifecycle.viewModelScope
import
com.google.gson.Gson
import
com.google.gson.Gson
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.bean.CarVehicle
import
com.sd.cavphmi.bean.PerTarget
import
com.sd.cavphmi.bean.ReqBean
import
com.sd.cavphmi.bean.ReqBean
import
com.sd.cavphmi.bean.SpaceNoBean
import
com.sd.cavphmi.bean.SpaceNoBean
import
com.sd.cavphmi.bean.VToXImgBean
import
com.sd.cavphmi.bean.VToXImgBean
import
com.sd.cavphmi.bean.VehicleStats
import
com.sd.cavphmi.bean.WebSetBean
import
com.sd.cavphmi.bean.WebSetBean
import
com.sd.cavphmi.net.MyResult
import
com.sd.cavphmi.net.MyResult
import
com.sd.cavphmi.repositorys.ParseSocketRepo
import
com.sd.cavphmi.repositorys.SpaceNoRepo
import
com.sd.cavphmi.repositorys.SpaceNoRepo
import
com.sd.cavphmi.utils.MyContants
import
com.sd.cavphmi.utils.MyContants
import
com.sd.cavphmi.utils.ToastHelper
import
com.sd.cavphmi.utils.ToastHelper
import
com.sd.cavphmi.websockets.MyWebSocketClient
import
com.sd.cavphmi.websockets.MyWebSocketClient
import
com.sd.shupathwebview.utils.FileIoUtils
import
dagger.hilt.android.lifecycle.HiltViewModel
import
dagger.hilt.android.lifecycle.HiltViewModel
import
dagger.hilt.android.qualifiers.ApplicationContext
import
dagger.hilt.android.qualifiers.ApplicationContext
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
import
org.java_websocket.handshake.ServerHandshake
import
org.java_websocket.handshake.ServerHandshake
import
protocol.Response
import
java.net.URI
import
java.net.URI
import
java.nio.ByteBuffer
import
java.nio.ByteBuffer
import
javax.inject.Inject
import
javax.inject.Inject
...
@@ -25,13 +36,33 @@ import javax.inject.Inject
...
@@ -25,13 +36,33 @@ import javax.inject.Inject
@HiltViewModel
@HiltViewModel
class
MainVm
@Inject
constructor
(
class
MainVm
@Inject
constructor
(
@ApplicationContext
var
context
:
Context
,
@ApplicationContext
var
context
:
Context
,
var
spaceNoRepo
:
SpaceNoRepo
private
var
parseSocketRepo
:
ParseSocketRepo
// var spaceNoRepo: SpaceNoRepo
)
:
MyBaseViewModel
()
{
)
:
MyBaseViewModel
()
{
private
var
client
:
MyWebSocketClient
?
=
null
private
var
client
:
MyWebSocketClient
?
=
null
private
var
gson
=
Gson
()
private
var
gson
=
Gson
()
//车辆位姿数据
var
carVehicle
=
MutableLiveData
<
CarVehicle
>()
//联网车辆状态数据topic
var
vehicleStat
=
MutableLiveData
<
VehicleStats
>()
//感知目标物
var
targetPre
=
MutableLiveData
<
PerTarget
>()
//驾驶模式
var
driveMode
=
ObservableField
(
""
)
//航向角
var
heading
=
ObservableField
(
550
)
//速度
var
speed
=
ObservableField
(
0f
)
fun
startWS
()
{
fun
startWS
()
{
val
httpHeaders
=
mutableMapOf
<
String
,
String
>()
val
httpHeaders
=
mutableMapOf
<
String
,
String
>()
httpHeaders
.
put
(
"Cookie"
,
"username=nemo"
)
httpHeaders
.
put
(
"Cookie"
,
"username=nemo"
)
...
@@ -39,6 +70,7 @@ class MainVm @Inject constructor(
...
@@ -39,6 +70,7 @@ class MainVm @Inject constructor(
try
{
try
{
client
=
MyWebSocketClient
(
URI
(
MyContants
.
WS_HOST
))
client
=
MyWebSocketClient
(
URI
(
MyContants
.
WS_HOST
))
client
?.
onSocketCb
=
onSocketCb
client
?.
onSocketCb
=
onSocketCb
client
?.
onDataCb
=
onDataCb
client
?.
connect
()
client
?.
connect
()
}
catch
(
e
:
Exception
)
{
}
catch
(
e
:
Exception
)
{
...
@@ -51,35 +83,112 @@ class MainVm @Inject constructor(
...
@@ -51,35 +83,112 @@ class MainVm @Inject constructor(
}
}
}
}
var
onSocketCb
=
object
:
MyWebSocketClient
.
OnSocketCb
{
private
var
onSocketCb
=
object
:
MyWebSocketClient
.
OnSocketCb
{
override
fun
onOpen
(
handshakedata
:
ServerHandshake
?)
{
override
fun
onOpen
(
handshakedata
:
ServerHandshake
?)
{
println
(
"--------Thread.currentThread() = ${Thread.currentThread()}"
)
println
(
"--------Thread.currentThread() = ${Thread.currentThread()}"
)
subVehicle
()
}
override
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
{
}
}
override
fun
on
Message
(
message
:
String
?)
{
override
fun
on
Error
(
ex
:
Exception
?)
{
}
}
}
override
fun
onMessage
(
bytes
:
ByteBuffer
?)
{
private
var
onDataCb
=
object
:
MyWebSocketClient
.
OnDataCb
{
// SocketResponse.parseFrom(bytes)
override
fun
onVehicle
(
res
:
Response
.
SocketResponse
)
{
viewModelScope
.
launch
{
val
bean
=
parseSocketRepo
.
genDataBean
(
res
.
data
,
CarVehicle
::
class
.
java
)
println
(
"---车辆位姿数据 = ${bean}"
)
carVehicle
.
value
=
bean
FileIoUtils
.
writeToFile
(
gson
.
toJson
(
bean
),
"carvehicle.txt"
)
}
}
}
override
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
{
override
fun
onVehicleStats
(
res
:
Response
.
SocketResponse
)
{
viewModelScope
.
launch
{
val
bean
=
parseSocketRepo
.
genDataBean
(
res
.
data
,
VehicleStats
::
class
.
java
)
println
(
"---联网车辆状态数据 = ${bean}"
)
vehicleStat
.
value
=
bean
FileIoUtils
.
writeToFile
(
gson
.
toJson
(
bean
),
"vehicleS.txt"
)
}
}
}
override
fun
onError
(
ex
:
Exception
?)
{
override
fun
onTarget
(
res
:
Response
.
SocketResponse
)
{
viewModelScope
.
launch
{
var
bean
=
parseSocketRepo
.
genDataBean
(
res
.
data
,
PerTarget
::
class
.
java
)
println
(
"---感知目标物数据 = ${bean}"
)
targetPre
.
value
=
bean
FileIoUtils
.
writeToFile
(
gson
.
toJson
(
bean
),
"target.txt"
)
}
}
override
fun
onStartV2x
(
res
:
Response
.
SocketResponse
)
{
println
(
"--------onStartV2x"
)
}
}
override
fun
onEndV2x
(
res
:
Response
.
SocketResponse
)
{
println
(
"--------onEndV2x"
)
}
override
fun
onPoint
(
res
:
Response
.
SocketResponse
)
{
println
(
"--------onPoint"
)
}
}
}
/*** 2.2. 联网车辆位姿数据topic**/
fun
subVehicle
()
{
/*** 联网车辆位姿数据**/
var
reqStr
=
getSendData
(
"/topic/vehicle"
)
fun
subVehicle
():
LiveData
<
CarVehicle
>
{
val
reqStr
=
getSendData
(
"/topic/vehicle"
)
client
?.
send
(
reqStr
)
return
carVehicle
}
/** 联网车辆状态数据
*
* {"vehicleStats":{"total":0,"avp":0},"vehicleStatusList":[],"wsTime":1750138623719}
* */
fun
subVehicleStatus
():
LiveData
<
VehicleStats
>
{
val
reqStr
=
getSendData
(
"/topic/vehicleStatus"
)
client
?.
send
(
reqStr
)
return
vehicleStat
}
/**感知目标物数据
* {"objectData":[{"altitude":0.0,"deviceCode":"ALL","id":"rsm","latitude":0.0,"longitude":0.0,"participant":[],"reportTime":1750138879684}],"wsTime":1750138834204}
* **/
fun
subTarget
()
{
val
reqStr
=
getSendData
(
"/topic/dataMerge"
)
client
?.
send
(
reqStr
)
}
/**V2X预警开始
*
* **/
fun
subStartV2x
()
{
val
reqStr
=
getSendData
(
"/topic/v2xStart"
)
client
?.
send
(
reqStr
)
}
/*** V2X预警结束topic**/
fun
subEndV2x
()
{
var
reqStr
=
getSendData
(
"/topic/v2xEnd"
)
client
?.
send
(
reqStr
)
}
/*** 更新停车位**/
fun
subPoints
()
{
val
reqStr
=
getSendData
(
"/topic/points"
)
client
?.
send
(
reqStr
)
client
?.
send
(
reqStr
)
}
}
fun
getSendData
(
key
:
String
):
String
{
fun
getSendData
(
key
:
String
):
String
{
var
data
=
WebSetBean
.
d
ic
.
get
(
key
)
var
data
=
WebSetBean
.
subD
ic
.
get
(
key
)
var
req
=
ReqBean
()
var
req
=
ReqBean
()
req
.
data
=
data
!!
req
.
data
=
data
!!
var
str
=
gson
.
toJson
(
req
)
var
str
=
gson
.
toJson
(
req
)
...
@@ -93,18 +202,18 @@ class MainVm @Inject constructor(
...
@@ -93,18 +202,18 @@ class MainVm @Inject constructor(
}
}
fun
getSpaceData
()
{
fun
getSpaceData
()
{
viewModelScope
.
launch
{
//
viewModelScope.launch {
var
result
=
spaceNoRepo
.
getSpaceData
()
//
var result = spaceNoRepo.getSpaceData()
when
(
result
)
{
//
when (result) {
is
MyResult
.
Success
<
SpaceNoBean
>
->
{
//
is MyResult.Success<SpaceNoBean> -> {
var
a
=
0
//
var a = 0
}
//
}
//
else
->
{
//
else -> {
var
b
=
0
//
var b = 0
}
//
}
}
//
}
}
//
}
}
}
...
...
app/src/main/java/com/sd/cavphmi/websockets/MyWebSocketClient.kt
View file @
aa341738
...
@@ -4,7 +4,7 @@ package com.sd.cavphmi.websockets
...
@@ -4,7 +4,7 @@ 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
protocol.Response
.SocketResponse
import
protocol.Response
import
java.net.URI
import
java.net.URI
import
java.nio.ByteBuffer
import
java.nio.ByteBuffer
...
@@ -29,9 +29,9 @@ class MyWebSocketClient : WebSocketClient {
...
@@ -29,9 +29,9 @@ class MyWebSocketClient : WebSocketClient {
}
}
override
fun
onMessage
(
message
:
String
?)
{
override
fun
onMessage
(
message
:
String
?)
{
System
.
out
.
println
(
TAG
+
"received message: "
+
message
);
//
System.out.println(TAG + "received message: " + message);
onSocketCb
?.
onMessage
(
message
)
//
onSocketCb?.onMessage(message)
//处理各种推送消息
//处理各种推送消息
// let data = {};
// let data = {};
// let result = await decodeResponseProtoBuf(msg);
// let result = await decodeResponseProtoBuf(msg);
...
@@ -50,15 +50,33 @@ class MyWebSocketClient : WebSocketClient {
...
@@ -50,15 +50,33 @@ class MyWebSocketClient : WebSocketClient {
}
}
override
fun
onMessage
(
bytes
:
ByteBuffer
?)
{
override
fun
onMessage
(
bytes
:
ByteBuffer
?)
{
System
.
out
.
println
(
TAG
+
" received ByteBuffer"
)
// System.out.println(TAG + " received ByteBuffer")
var
socketResponse
=
SocketResponse
.
parseFrom
(
bytes
)
val
socketResponse
=
Response
.
SocketResponse
.
parseFrom
(
bytes
)
// socketResponse.
when
(
socketResponse
.
msgType
)
{
onSocketCb
?.
onMessage
(
bytes
)
5231
->
{
//联网车辆位姿数据
onDataCb
?.
onVehicle
(
socketResponse
)
}
5232
->
{
//感知目标物数据
onDataCb
?.
onTarget
(
socketResponse
)
}
5234
->
{
//V2X预警开始
onDataCb
?.
onStartV2x
(
socketResponse
)
}
5235
->
{
//V2X预警结束
onDataCb
?.
onEndV2x
(
socketResponse
)
}
5236
->
{
//联网车辆状态数据
onDataCb
?.
onVehicleStats
(
socketResponse
)
}
1
->
{
//更新停车场
onDataCb
?.
onPoint
(
socketResponse
)
}
}
}
}
override
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
{
override
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
{
System
.
out
.
println
(
TAG
+
" closed with exit code "
+
code
+
" additional info: "
+
reason
);
System
.
out
.
println
(
TAG
+
" closed with exit code "
+
code
+
" additional info: "
+
reason
);
onSocketCb
?.
onClose
(
code
,
reason
,
remote
)
onSocketCb
?.
onClose
(
code
,
reason
,
remote
)
}
}
override
fun
onError
(
ex
:
Exception
?)
{
override
fun
onError
(
ex
:
Exception
?)
{
...
@@ -70,11 +88,23 @@ class MyWebSocketClient : WebSocketClient {
...
@@ -70,11 +88,23 @@ class MyWebSocketClient : WebSocketClient {
interface
OnSocketCb
{
interface
OnSocketCb
{
fun
onOpen
(
handshakedata
:
ServerHandshake
?)
fun
onOpen
(
handshakedata
:
ServerHandshake
?)
fun
onMessage
(
message
:
String
?)
fun
onMessage
(
bytes
:
ByteBuffer
?)
// fun onMessage(message: String?)
// fun onMessage(socketResponse: Response.SocketResponse)
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
fun
onError
(
ex
:
Exception
?)
fun
onError
(
ex
:
Exception
?)
}
}
var
onDataCb
:
OnDataCb
?
=
null
interface
OnDataCb
{
fun
onVehicle
(
res
:
Response
.
SocketResponse
)
fun
onVehicleStats
(
res
:
Response
.
SocketResponse
)
fun
onTarget
(
res
:
Response
.
SocketResponse
)
fun
onStartV2x
(
res
:
Response
.
SocketResponse
)
fun
onEndV2x
(
res
:
Response
.
SocketResponse
)
fun
onPoint
(
res
:
Response
.
SocketResponse
)
}
}
}
\ No newline at end of file
app/src/main/res/layout/activity_main.xml
View file @
aa341738
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
>
<data>
<data>
<variable
<variable
name=
"vm"
name=
"vm"
type=
"com.sd.cavphmi.viewmodels.MainVm"
/>
type=
"com.sd.cavphmi.viewmodels.MainVm"
/>
</data>
</data>
<RelativeLayout
xmlns:tools=
"http://schemas.android.com/tools"
<RelativeLayout
android:id=
"@+id/main"
android:id=
"@+id/main"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
...
@@ -40,10 +40,12 @@
...
@@ -40,10 +40,12 @@
<TextView
<TextView
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"match_parent"
android:layout_marginLeft=
"2dp"
android:layout_marginLeft=
"3dp"
android:text=
"--"
android:gravity=
"center_vertical"
android:textColor=
"@color/text_black"
/>
android:textColor=
"@color/text_black"
app:showHeading=
"@{vm.heading}"
tools:text=
"23423"
/>
</LinearLayout>
</LinearLayout>
...
@@ -74,20 +76,21 @@
...
@@ -74,20 +76,21 @@
<LinearLayout
<LinearLayout
android:layout_width=
"0dp"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:
gravity=
"right | center_vertical
"
android:
layout_weight=
"1
"
android:
layout_weight=
"1
"
>
android:
gravity=
"right | center_vertical
"
>
<ImageView
<ImageView
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:
src=
"@drawable/drive_mode
"
android:
layout_marginRight=
"3dp
"
android:
layout_marginRight=
"3dp"
/>
android:
src=
"@drawable/drive_mode"
/>
<TextView
<TextView
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"自动驾驶"
android:text=
"@{vm.driveMode}"
android:textColor=
"@color/text_black"
/>
android:textColor=
"@color/text_black"
tools:text=
"自动驾驶"
/>
</LinearLayout>
</LinearLayout>
...
@@ -107,12 +110,50 @@
...
@@ -107,12 +110,50 @@
</LinearLayout>
</LinearLayout>
<
ImageView
<
LinearLayout
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:layout_below=
"@+id/ll_head"
android:layout_below=
"@+id/ll_head"
android:src=
"#907867"
/>
android:orientation=
"vertical"
android:src=
"#907867"
>
<Button
android:id=
"@+id/bt_vehicle"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"车辆位姿数据"
/>
<Button
android:id=
"@+id/bt_status"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"联网车辆状态数据"
/>
<Button
android:id=
"@+id/bt_target"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"感知目标物数据"
/>
<Button
android:id=
"@+id/bt_v2x"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"V2X预警开始"
/>
<Button
android:id=
"@+id/bt_v2xend"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"V2X预警结束"
/>
<Button
android:id=
"@+id/bt_chewei"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"更新停车位"
/>
</LinearLayout>
<RelativeLayout
<RelativeLayout
...
@@ -132,19 +173,20 @@
...
@@ -132,19 +173,20 @@
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_centerHorizontal=
"true"
android:layout_centerHorizontal=
"true"
android:layout_marginTop=
"
3
dp"
android:layout_marginTop=
"
2
dp"
android:text
=
"9.19Am
"
android:text
Color=
"@color/text_black
"
android:textColor=
"@color/text_black
"
/>
tools:text=
"9:19
"
/>
<TextView
<TextView
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_below=
"@
+
id/tv_time"
android:layout_below=
"@id/tv_time"
android:layout_centerHorizontal=
"true"
android:layout_centerHorizontal=
"true"
android:layout_marginTop=
"5dp"
android:layout_marginTop=
"10dp"
android:text=
"0 km/h"
android:textColor=
"@color/text_black"
android:textColor=
"@color/text_black"
android:textSize=
"20sp"
/>
android:textSize=
"12sp"
app:showSpeed=
"@{vm.speed}"
tools:text=
"0 km/h"
/>
</RelativeLayout>
</RelativeLayout>
...
...
app/src/test/java/com/sd/cavphmi/ExampleUnitTest.kt
View file @
aa341738
...
@@ -14,4 +14,15 @@ class ExampleUnitTest {
...
@@ -14,4 +14,15 @@ class ExampleUnitTest {
fun
addition_isCorrect
()
{
fun
addition_isCorrect
()
{
assertEquals
(
4
,
2
+
2
)
assertEquals
(
4
,
2
+
2
)
}
}
@Test
fun
testwhen
()
{
var
driveMode
=
2
var
str
=
when
(
driveMode
)
{
0
->
"自动驾驶"
1
->
"人工驾驶"
2
->
"远程驾驶"
else
->
"—— ——"
}
println
(
"str = ${str}"
)
}
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment