MainActivity.kt 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package com.iscs.comm
  2. import android.os.Bundle
  3. import androidx.activity.ComponentActivity
  4. import androidx.activity.compose.setContent
  5. import androidx.activity.enableEdgeToEdge
  6. import androidx.compose.foundation.layout.Arrangement
  7. import androidx.compose.foundation.layout.Column
  8. import androidx.compose.foundation.layout.PaddingValues
  9. import androidx.compose.foundation.layout.aspectRatio
  10. import androidx.compose.foundation.layout.fillMaxSize
  11. import androidx.compose.foundation.layout.fillMaxWidth
  12. import androidx.compose.foundation.layout.padding
  13. import androidx.compose.foundation.lazy.grid.GridCells
  14. import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
  15. import androidx.compose.foundation.lazy.grid.items
  16. import androidx.compose.material3.Card
  17. import androidx.compose.material3.Scaffold
  18. import androidx.compose.material3.Text
  19. import androidx.compose.runtime.Composable
  20. import androidx.compose.runtime.DisposableEffect
  21. import androidx.compose.runtime.LaunchedEffect
  22. import androidx.compose.runtime.mutableStateListOf
  23. import androidx.compose.ui.Modifier
  24. import androidx.compose.ui.unit.dp
  25. import androidx.compose.ui.unit.sp
  26. import com.iscs.comm.entity.device.Device
  27. import com.iscs.comm.enums.CommType
  28. import com.iscs.comm.enums.RunMode
  29. import com.iscs.comm.extension.BleFrameExt
  30. import com.iscs.comm.extension.BleFrameExt.buildBLEGetPowerCMD
  31. import com.iscs.comm.extension.BleFrameExt.buildBLEGetStatusCMD
  32. import com.iscs.comm.extension.BleFrameExt.buildBLESwitchRunModeCMD
  33. import com.iscs.comm.extension.BleFrameExt.buildBLETicketDataCMDList
  34. import com.iscs.comm.extension.BleFrameExt.getPower
  35. import com.iscs.comm.extension.BleFrameExt.getRunMode
  36. import com.iscs.comm.extension.BleFrameExt.getSendTicketResult
  37. import com.iscs.comm.extension.BleFrameExt.getSwitchRunModeResult
  38. import com.iscs.comm.extension.BleFrameExt.getToken
  39. import com.iscs.comm.extension.byteArrayToHexString
  40. import com.iscs.comm.intf.IDeviceListener
  41. import com.iscs.comm.manager.BleManager
  42. import com.iscs.comm.ui.theme.CommDemoTheme
  43. import com.iscs.comm.utils.ISCSLog
  44. import kotlinx.coroutines.delay
  45. class MainActivity : ComponentActivity() {
  46. val testJobJson =
  47. "{\"cardNo\":\"D2931A25\",\"data\":[{\"codeId\":1,\"dataList\":[{\"dataId\":87,\"equipName\":\"E_29\",\"equipRfidNo\":\"1B9105AF\",\"target\":0},{\"dataId\":88,\"equipName\":\"E_30\",\"equipRfidNo\":\"FB9091E5\",\"target\":0}],\"taskCode\":\"165\"}],\"lockList\":[{\"lockId\":1,\"rfid\":\"C097D395\"},{\"lockId\":2,\"rfid\":\"A04AD495\"}],\"password\":\"123456\"}"
  48. override fun onCreate(savedInstanceState: Bundle?) {
  49. super.onCreate(savedInstanceState)
  50. enableEdgeToEdge()
  51. setContent {
  52. CommDemoTheme {
  53. Scaffold(modifier = Modifier.fillMaxSize()) { pv ->
  54. buildDeviceList(pv)
  55. }
  56. }
  57. }
  58. }
  59. @Composable
  60. fun buildDeviceList(pv: PaddingValues) {
  61. val list = mutableStateListOf<Device>()
  62. val listener = object : IDeviceListener() {
  63. override fun onDeviceList(devices: List<Device>) {
  64. list.clear()
  65. list.addAll(devices.sortedBy { it.frame.cmd })
  66. }
  67. }
  68. LaunchedEffect("") {
  69. // 设置设备变化监听
  70. CommManager.addOnDeviceListener(listener)
  71. // SDK初始化
  72. CommManager.init(CommConfig().setCommType(CommType.CAN).setPort("can0").setBitrate(1000000))
  73. // 蓝牙钥匙功能测试
  74. repeat(10) {
  75. ISCSLog.i("xiaoming", "------------ start ------------")
  76. bleKeyTest("CC:BA:97:21:71:E6")
  77. bleKeyTest("CC:BA:97:21:72:0A")
  78. bleKeyTest("CC:BA:97:21:71:CA")
  79. ISCSLog.i("xiaoming", "------------- end -----------")
  80. delay(10000)
  81. }
  82. }
  83. DisposableEffect("") {
  84. // 移除页面监听
  85. CommManager.removeOnDeviceListener(listener)
  86. onDispose { }
  87. }
  88. LazyVerticalGrid(
  89. columns = GridCells.Adaptive(minSize = 100.dp),
  90. contentPadding = PaddingValues(10.dp, pv.calculateTopPadding() + 10.dp),
  91. horizontalArrangement = Arrangement.spacedBy(8.dp),
  92. verticalArrangement = Arrangement.spacedBy(8.dp),
  93. ) {
  94. items(list) { device ->
  95. Card(onClick = { openCtrlActivity(device.frame.cmd) }) {
  96. Column(
  97. modifier = Modifier
  98. .padding(5.dp)
  99. .aspectRatio(1.2f)
  100. .fillMaxWidth()
  101. ) {
  102. Text(device.frame.cmd.toString(16))
  103. Text("${device.deviceType}", fontSize = 12.sp)
  104. }
  105. }
  106. }
  107. }
  108. }
  109. private suspend fun bleKeyTest(mac: String) {
  110. // 测试蓝牙扫描
  111. val bm = BleManager(this@MainActivity.application, mac = mac)
  112. val result = bm.connect()
  113. if (result.connected) {
  114. // 获取设备token
  115. val token = bm.writeByResponse(BleFrameExt.buildBLEGetTokenCMD()).getToken()
  116. ISCSLog.i("xiaoming $mac", "获取设备token ${token.byteArrayToHexString()}")
  117. // 获取设备电量
  118. val power = bm.writeByResponse(token.buildBLEGetPowerCMD()).getPower()
  119. ISCSLog.i("xiaoming $mac", "当前设备电量:$power")
  120. // 获取当前设备运行模式
  121. val runMode = bm.writeByResponse(token.buildBLEGetStatusCMD()).getRunMode()
  122. ISCSLog.i("xiaoming $mac", "当前工作模式:$runMode")
  123. // 切换当前设备运行模式
  124. // val switch = bm.writeByResponse(token.buildBLESwitchRunModeCMD(RunMode.STBY)).getSwitchRunModeResult()
  125. // ISCSLog.i("xiaoming $mac", "切换工作模式:$switch")
  126. // 下发作业票
  127. val tickets = token.buildBLETicketDataCMDList(testJobJson)
  128. var ticketSendOk = true
  129. tickets.forEach {
  130. val ticket = bm.writeByResponse(it).getSendTicketResult()
  131. ISCSLog.i("xiaoming $mac", "下发作业票:分包${it.data[4].toInt()}发送结果:$ticket")
  132. if (ticket != 0) {
  133. ticketSendOk = false
  134. return@forEach
  135. }
  136. }
  137. ISCSLog.i("xiaoming $mac", "下发作业票:$ticketSendOk")
  138. // 作业票下发成功,修改设备运行模式为工作模式
  139. val switch = bm.writeByResponse(token.buildBLESwitchRunModeCMD(RunMode.WORK)).getSwitchRunModeResult()
  140. ISCSLog.i("xiaoming $mac", "切换工作模式:$switch")
  141. // 读取作业票信息
  142. // val pkgList = ArrayList<BleTicketDataPackage>()
  143. // val ticketInfo = bm.writeByResponse(token.buildBLEGetTicketInfoCMD()).getTicketPackageInfo()
  144. // pkgList.add(ticketInfo)
  145. // ISCSLog.i("xiaoming $mac", "读取作业票:首包信息:$ticketInfo")
  146. // // 校验是否有子包,如果有,继续读取子包数据
  147. // for (idx in 1 until ticketInfo.pkgTotal) {
  148. // val ticketSubPackageInfo = bm.writeByResponse(token.buildBLEGetTicketInfoCMD(idx, ticketInfo.pkgTotal)).getTicketPackageInfo()
  149. // pkgList.add(ticketSubPackageInfo)
  150. // ISCSLog.i("xiaoming $mac", "读取作业票:子包信息:$ticketSubPackageInfo")
  151. // }
  152. // var datas = byteArrayOf()
  153. // pkgList.forEach { datas += it.pkgData }
  154. // ISCSLog.i("xiaoming $mac", "读取作业票:${String(datas)}")
  155. } else {
  156. // 进行重连,这里可以封装尝试次数
  157. bleKeyTest(mac)
  158. }
  159. bm.disconnect()
  160. }
  161. }