BLEPacketSplitter.kt 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package com.narutohuo.xindazhou.ble.util
  2. /**
  3. * BLE分包处理器
  4. *
  5. * 处理数据包的分包和组包
  6. * 根据新大洲本田蓝牙协议文档的分包协议
  7. */
  8. class BLEPacketSplitter {
  9. /**
  10. * 分包数据
  11. *
  12. * @param data 原始数据
  13. * @param mtu MTU大小(最大传输单元)
  14. * @param businessId 业务ID(4字节)
  15. * @return 分包后的数据包列表
  16. */
  17. fun splitPacket(data: ByteArray, mtu: Int, businessId: Int): List<ByteArray> {
  18. val packets = mutableListOf<ByteArray>()
  19. val totalPackets = (data.size + mtu - 1) / mtu
  20. for (i in 0 until totalPackets) {
  21. val start = i * mtu
  22. val end = minOf(start + mtu, data.size)
  23. val packetData = data.sliceArray(start until end)
  24. val packet = buildSplitPacket(
  25. businessId = businessId,
  26. totalPackets = totalPackets,
  27. packetIndex = i,
  28. data = packetData
  29. )
  30. packets.add(packet)
  31. }
  32. return packets
  33. }
  34. /**
  35. * 构建分包数据包
  36. */
  37. private fun buildSplitPacket(
  38. businessId: Int,
  39. totalPackets: Int,
  40. packetIndex: Int,
  41. data: ByteArray
  42. ): ByteArray {
  43. val packet = mutableListOf<Byte>()
  44. // 包头(0x0A)
  45. packet.add(0x0A.toByte())
  46. // 业务ID(4字节,小端序)
  47. packet.add((businessId and 0xFF).toByte())
  48. packet.add(((businessId shr 8) and 0xFF).toByte())
  49. packet.add(((businessId shr 16) and 0xFF).toByte())
  50. packet.add(((businessId shr 24) and 0xFF).toByte())
  51. // 总包数(2字节,小端序)
  52. packet.add((totalPackets and 0xFF).toByte())
  53. packet.add(((totalPackets shr 8) and 0xFF).toByte())
  54. // 包序号(2字节,小端序)
  55. packet.add((packetIndex and 0xFF).toByte())
  56. packet.add(((packetIndex shr 8) and 0xFF).toByte())
  57. // 数据长度(2字节,小端序)
  58. val dataLength = data.size
  59. packet.add((dataLength and 0xFF).toByte())
  60. packet.add(((dataLength shr 8) and 0xFF).toByte())
  61. // 数据区
  62. packet.addAll(data.toList())
  63. // 应答状态(0x01=ACK)
  64. packet.add(0x01.toByte())
  65. // 包校验(异或校验)
  66. var checksum = 0x00
  67. for (i in 1 until packet.size) {
  68. checksum = checksum xor packet[i].toInt()
  69. }
  70. packet.add(checksum.toByte())
  71. // 包尾(0x0D)
  72. packet.add(0x0D.toByte())
  73. return packet.toByteArray()
  74. }
  75. /**
  76. * 组包数据
  77. *
  78. * @param packets 接收到的分包数据(Map<包序号, 数据>)
  79. * @return 组包后的完整数据
  80. */
  81. fun combinePackets(packets: Map<Int, ByteArray>): ByteArray {
  82. val sortedPackets = packets.toSortedMap()
  83. val result = mutableListOf<Byte>()
  84. sortedPackets.values.forEach { packetData ->
  85. result.addAll(packetData.toList())
  86. }
  87. return result.toByteArray()
  88. }
  89. }