Commit a2a5b73b authored by 马乐's avatar 马乐

1.串口通信类优化

parent beb1af4a
plugins { plugins {
id 'com.android.application' id 'com.android.application'
id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.android'
// id 'kotlin-kapt'
} }
android { android {
namespace 'com.waytous.anticollision' namespace 'com.waytous.anticollision'
compileSdk 32 compileSdk 33
defaultConfig { defaultConfig {
applicationId "com.waytous.anticollision" applicationId "com.waytous.anticollision"
minSdk 21 minSdk 21
targetSdk 32 targetSdk 33
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
...@@ -41,25 +42,26 @@ android { ...@@ -41,25 +42,26 @@ android {
dependencies { dependencies {
implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.8.0' implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' implementation 'androidx.navigation:navigation-ui-ktx:2.4.1'
implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'com.squareup.okhttp3:okhttp:4.10.0'
implementation 'com.mapbox.maps:android:10.11.0' implementation 'com.mapbox.maps:android:10.11.0'
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-geojson:6.9.0' implementation 'com.mapbox.mapboxsdk:mapbox-sdk-geojson:6.9.0'
implementation 'io.netty:netty-buffer:4.1.87.Final' implementation 'io.netty:netty-buffer:4.1.87.Final'
implementation 'io.github.toggery:jt808-codec:2.0.3' implementation 'io.github.toggery:jt808-codec:2.0.3'
implementation 'com.blankj:utilcodex:1.31.1' implementation 'com.blankj:utilcodex:1.31.1'
implementation 'org.jetbrains.kotlin:kotlin-reflect:1.7.22' implementation 'com.blankj:utilcodex:1.31.1'
implementation 'org.jetbrains.kotlin:kotlin-reflect:1.7.20'
implementation 'com.geyifeng.immersionbar:immersionbar:3.2.2' implementation 'com.geyifeng.immersionbar:immersionbar:3.2.2'
implementation 'androidx.work:work-runtime-ktx:2.8.1'
implementation 'com.github.mik3y:usb-serial-for-android:3.5.1' implementation 'com.github.mik3y:usb-serial-for-android:3.5.1'
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
} }
\ No newline at end of file
...@@ -4,7 +4,12 @@ ...@@ -4,7 +4,12 @@
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<!-- 定位权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application <application
android:name=".MyApp" android:name=".MyApp"
......
package com.waytous.anticollision package com.waytous.anticollision
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.blankj.utilcode.util.BarUtils import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.ColorUtils import com.blankj.utilcode.util.ColorUtils
import com.waytous.anticollision.databinding.ActivitySplashBinding import com.waytous.anticollision.databinding.ActivitySplashBinding
import com.waytous.anticollision.ui.MainActivity
class SplashActivity : AppCompatActivity() { class SplashActivity : AppCompatActivity() {
...@@ -23,7 +24,9 @@ class SplashActivity : AppCompatActivity() { ...@@ -23,7 +24,9 @@ class SplashActivity : AppCompatActivity() {
"${getString(R.string.text_progress, 57)}%".also { binding.textProgress.text = it } "${getString(R.string.text_progress, 57)}%".also { binding.textProgress.text = it }
binding.loadingProgressBar.progress = 57 binding.loadingProgressBar.progress = 57
binding.loadingProgressBar.show() binding.loadingProgressBar.show()
binding.loadingProgressBar.postDelayed({
startActivity(Intent(this,MainActivity::class.java))
},2000)
} }
} }
\ No newline at end of file
...@@ -4,6 +4,7 @@ import com.hoho.android.usbserial.driver.FtdiSerialDriver ...@@ -4,6 +4,7 @@ import com.hoho.android.usbserial.driver.FtdiSerialDriver
import com.hoho.android.usbserial.driver.ProbeTable import com.hoho.android.usbserial.driver.ProbeTable
import com.hoho.android.usbserial.driver.UsbSerialProber import com.hoho.android.usbserial.driver.UsbSerialProber
class CustomProbe { class CustomProbe {
companion object{ companion object{
......
package com.waytous.anticollision.serial package com.waytous.anticollision.serial
import android.hardware.usb.UsbDevice
import com.hoho.android.usbserial.driver.UsbSerialDriver
/** /**
* USB串口设备信息 * USB串口设备信息
* @param deviceId 设备id * @param deviceId 设备id
* @param portNum usb port id * @param portNum usb port id
* @param baudRate 波特率 * @param baudRate 波特率
* */ * */
data class SerialDeviceInfo(val deviceId:Int,val portNum:Int,val baudRate:Int) data class SerialDeviceInfo(
\ No newline at end of file val deviceId: Int,
val portNum: Int,
val baudRate: Int,
val device: UsbDevice,
val driver: UsbSerialDriver?
)
\ No newline at end of file
...@@ -4,6 +4,8 @@ import android.hardware.usb.UsbManager ...@@ -4,6 +4,8 @@ import android.hardware.usb.UsbManager
import com.hoho.android.usbserial.driver.UsbSerialDriver import com.hoho.android.usbserial.driver.UsbSerialDriver
import com.hoho.android.usbserial.driver.UsbSerialProber import com.hoho.android.usbserial.driver.UsbSerialProber
const val BAUD_RATE = 19200
fun UsbManager.refresh():List<SerialDeviceInfo>{ fun UsbManager.refresh():List<SerialDeviceInfo>{
val usbDefaultProbe = UsbSerialProber.getDefaultProber() val usbDefaultProbe = UsbSerialProber.getDefaultProber()
val usbCustomProbe: UsbSerialProber = CustomProbe.getCustomProbe() val usbCustomProbe: UsbSerialProber = CustomProbe.getCustomProbe()
...@@ -13,12 +15,13 @@ fun UsbManager.refresh():List<SerialDeviceInfo>{ ...@@ -13,12 +15,13 @@ fun UsbManager.refresh():List<SerialDeviceInfo>{
if (driver == null) { if (driver == null) {
driver = usbCustomProbe.probeDevice(device) driver = usbCustomProbe.probeDevice(device)
} }
// if (driver != null) { if (driver != null) {
// deviceInfos.add(SerialDeviceInfo(device.deviceId,device.po)) driver.ports.forEach { serialPort->
// for (port in driver.ports.indices) listItems.add(ListItem(device, port, driver)) deviceInfos.add(SerialDeviceInfo(device.deviceId,serialPort.portNumber,BAUD_RATE,device,driver))
// } else { }
// listItems.add(ListItem(device, 0, null)) } else {
// } deviceInfos.add(SerialDeviceInfo(device.deviceId,0,BAUD_RATE,device,null))
}
} }
return deviceInfos
} }
\ No newline at end of file
...@@ -6,8 +6,12 @@ import com.waytous.anticollision.BuildConfig ...@@ -6,8 +6,12 @@ import com.waytous.anticollision.BuildConfig
import com.waytous.anticollision.config.DeviceConfig import com.waytous.anticollision.config.DeviceConfig
import com.waytous.anticollision.config.Settings import com.waytous.anticollision.config.Settings
import com.waytous.anticollision.listener.SessionListener import com.waytous.anticollision.listener.SessionListener
import com.waytous.anticollision.utils.* import com.waytous.anticollision.utils.ConnectStatus
import io.github.toggery.jt808.codec.* import com.waytous.anticollision.utils.Error
import com.waytous.anticollision.utils.NamedThreadFactory
import com.waytous.anticollision.utils.SignInStatus
import io.github.toggery.jt808.codec.Message
import io.github.toggery.jt808.codec.MessageMetadata
import io.github.toggery.jt808.messagebody.* import io.github.toggery.jt808.messagebody.*
import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBuf
import io.netty.buffer.UnpooledByteBufAllocator import io.netty.buffer.UnpooledByteBufAllocator
...@@ -73,7 +77,7 @@ internal class Schedule { ...@@ -73,7 +77,7 @@ internal class Schedule {
* jt808网络会话管理 * jt808网络会话管理
* @author male * @author male
* */ * */
internal class Session : ConnectListener, SyncMessageListener<AbstractToStringJoiner> { class Session : ConnectListener, SyncMessageListener<AbstractToStringJoiner> {
/** /**
* 消息内容解析器 * 消息内容解析器
...@@ -287,7 +291,6 @@ internal class Session : ConnectListener, SyncMessageListener<AbstractToStringJo ...@@ -287,7 +291,6 @@ internal class Session : ConnectListener, SyncMessageListener<AbstractToStringJo
* 开始心跳 * 开始心跳
* */ * */
private fun startHeartbeat() { private fun startHeartbeat() {
scheduleFutureTask = scheduler.scheduleAtFixedRate( scheduleFutureTask = scheduler.scheduleAtFixedRate(
::sendPing, ::sendPing,
0, 0,
...@@ -323,15 +326,15 @@ internal class Session : ConnectListener, SyncMessageListener<AbstractToStringJo ...@@ -323,15 +326,15 @@ internal class Session : ConnectListener, SyncMessageListener<AbstractToStringJo
* 发送心跳 * 发送心跳
* */ * */
private fun doSendMessage(name: String) = if (buffs.isNotEmpty()) { private fun doSendMessage(name: String) = if (buffs.isNotEmpty()) {
val byteArray = ByteArray(buffs[0].readableBytes())
buffs[0].readBytes(byteArray)
if (BuildConfig.DEBUG) {
LogUtils.d("【$name】:${HexUtil.dump(byteArray)}")
} else {
LogUtils.file("【$name】:${HexUtil.dump(byteArray)}")
}
tcpManager.send(byteArray)
synchronized(buffs) { synchronized(buffs) {
val byteArray = ByteArray(buffs[0].readableBytes())
buffs[0].readBytes(byteArray)
if (BuildConfig.DEBUG) {
LogUtils.d("【$name】:${HexUtil.dump(byteArray)}")
} else {
LogUtils.file("【$name】:${HexUtil.dump(byteArray)}")
}
tcpManager.send(byteArray)
buffs.removeAt(0) buffs.removeAt(0)
} }
true true
......
...@@ -32,6 +32,8 @@ class MainActivity : AppCompatActivity() { ...@@ -32,6 +32,8 @@ class MainActivity : AppCompatActivity() {
DeviceConfig.HostConfig.host = "47.100.112.218" DeviceConfig.HostConfig.host = "47.100.112.218"
DeviceConfig.HostConfig.port = 8808 DeviceConfig.HostConfig.port = 8808
// DeviceConfig.HostConfig.host = "192.168.9.48"
// DeviceConfig.HostConfig.port = 1022
val session = Session() val session = Session()
thread { session.login() } thread { session.login() }
} }
......
package com.waytous.anticollision.utils package com.waytous.anticollision.utils
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
/** /**
* 连接状态 * 连接状态
* */ * */
...@@ -29,4 +32,15 @@ enum class Error(val reason:String = "success") { ...@@ -29,4 +32,15 @@ enum class Error(val reason:String = "success") {
ServerUnknownError("server unknown error"), ServerUnknownError("server unknown error"),
JT808EncodeError("jt808 codec encode error"), JT808EncodeError("jt808 codec encode error"),
JT808DecodeError("jt808 codec decode error") JT808DecodeError("jt808 codec decode error")
}
fun AppCompatActivity.checkSelfPermissionCompat(permission: String) =
ActivityCompat.checkSelfPermission(this, permission)
fun AppCompatActivity.shouldShowRequestPermissionRationaleCompat(permission: String) =
ActivityCompat.shouldShowRequestPermissionRationale(this, permission)
fun AppCompatActivity.requestPermissionsCompat(permissionsArray: Array<String>,
requestCode: Int) {
ActivityCompat.requestPermissions(this, permissionsArray, requestCode)
} }
\ No newline at end of file
package com.waytous.anticollision.wm
import android.content.Context
import androidx.work.Worker
import androidx.work.WorkerParameters
class ConnectionWork(appContext: Context, workerParams: WorkerParameters): Worker(appContext,workerParams) {
override fun doWork(): Result {
return Result.retry()
}
}
\ 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