MTBeacon.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package com.mt.lib.mtblesdk;
  2. import android.bluetooth.BluetoothDevice;
  3. public class MTBeacon {
  4. private static final String CLOCK_UUID = "5368656E-5A68-656E-545A-E28094E28094";
  5. private BluetoothDevice device;
  6. private int averagerssi = 0;
  7. private int rssi;
  8. private byte[] scanRecord;
  9. private int search_count = 0;
  10. private int major;
  11. private int minor;
  12. private int Txpower;
  13. private String UUID;
  14. private int battery = 0;
  15. private String ClockID = "";
  16. private boolean IsClock = false;
  17. private int Ibeancon_Offset = 0; // 偏移
  18. private int MT_inf_offset = 0; // 偏移
  19. public MTBeacon(BluetoothDevice device, int rssi, byte[] scanRecord) {
  20. this.device = device;
  21. this.rssi = rssi;
  22. this.scanRecord = scanRecord;
  23. this.averagerssi = rssi;
  24. GetOffset(this.scanRecord); // 分析提取数据
  25. }
  26. // 获取设备信息
  27. public BluetoothDevice GetDevice() {
  28. return device;
  29. }
  30. // 防抖
  31. public int CheckSearchcount() {
  32. search_count++;
  33. return search_count;
  34. }
  35. // 刷新信息
  36. public boolean ReflashInf(BluetoothDevice device, int rssi,
  37. byte[] scanRecord) {
  38. this.device = device;
  39. this.rssi = rssi;
  40. this.scanRecord = scanRecord;
  41. averagerssi = (averagerssi + rssi) / 2;
  42. search_count = 0; // 防抖
  43. GetOffset(this.scanRecord);
  44. return true;
  45. }
  46. // 获取major、minor、TXpower、UUID、电量、锁ID号
  47. public int GetMajor() {
  48. return major;
  49. }
  50. public int GetMinor() {
  51. return minor;
  52. }
  53. public int GetTxpower() {
  54. return Txpower;
  55. }
  56. public String GetUUID() {
  57. return UUID;
  58. }
  59. public int GetEnergy() {
  60. return scanRecord[MT_inf_offset + 3];
  61. }
  62. public String getClockID() {
  63. return device.getAddress();
  64. // return ClockID;
  65. }
  66. // 获取当前rssi值
  67. public int GetCurrentRssi() {
  68. return rssi;
  69. }
  70. // 获取防抖后rssi值
  71. public int GetAveragerssi() {
  72. return averagerssi;
  73. }
  74. // 获取当前距离
  75. public double GetCurrentDistance() {
  76. return CalculateDistance(rssi);
  77. }
  78. // 获取防抖距离
  79. public double GetAveragerDistance() {
  80. return CalculateDistance(averagerssi);
  81. }
  82. // 获取电池电量信息
  83. public int GetBattery() {
  84. return battery;
  85. }
  86. /************************* 辅助方法 *******************************/
  87. // rssi换算成距离
  88. private double CalculateDistance(int rssi) {
  89. double distance = 0;
  90. double ratio = rssi * 1.0 / Txpower;
  91. if (ratio < 1.0) {
  92. distance = Math.pow(ratio, 10);
  93. } else {
  94. distance = (0.89976) * Math.pow(ratio, 7.7095) + 0.111;
  95. }
  96. return distance;
  97. }
  98. // 分析数据
  99. private void GetOffset(byte[] scanRecord) {
  100. for (int i = 0; i < scanRecord.length;) {
  101. if ((scanRecord[i] == 26) && (scanRecord[i + 1] == -1)
  102. && (scanRecord[i + 2] == 76) && (scanRecord[i + 3] == 0)
  103. && (scanRecord[i + 4] == 2) && (scanRecord[i + 5] == 21)) {
  104. Ibeancon_Offset = i;
  105. major = ((0xFF & scanRecord[i + 22]) * 256 + (0xFF & scanRecord[i + 23]));
  106. minor = ((0xFF & scanRecord[i + 24]) * 256 + (0xFF & scanRecord[i + 25]));
  107. Txpower = scanRecord[i + 26];
  108. UUID = "";
  109. for (int j = i + 6; j < i + 22; j++) { // uuid
  110. String hex = Integer.toHexString(scanRecord[j] & 0xFF);
  111. if (hex.length() == 1) {
  112. hex = '0' + hex;
  113. }
  114. if ((j == (i + 10)) || (j == (i + 12)) || (j == (i + 14))
  115. || (j == (i + 16)))
  116. UUID += '-';
  117. UUID += hex;
  118. }
  119. UUID = UUID.toUpperCase();
  120. if(UUID.equals(CLOCK_UUID)){
  121. IsClock = true;
  122. }
  123. }
  124. if ((scanRecord[i] == 3) && (scanRecord[i + 1] == -86)) {
  125. MT_inf_offset = i;
  126. battery = scanRecord[i + 3];
  127. }
  128. // 解析锁的ID
  129. if (scanRecord[i + 1] == (0x06 & 0xff)) {
  130. ClockID = "";
  131. for (int j = 0; j < scanRecord[i] - 2; j++) {
  132. char hex = (char) (scanRecord[i + j + 2] & 0xFF);
  133. ClockID += hex;
  134. }
  135. }
  136. i += (scanRecord[i] + 1);
  137. if ((i >= (scanRecord.length)) || (0x00 == scanRecord[i])) {
  138. break;
  139. }
  140. }
  141. }
  142. // 判断是否为锁
  143. public boolean isIsClock() {
  144. return IsClock;
  145. }
  146. }