BleBluetooth.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. package com.taiyi.pulse.fastble.bluetooth;
  2. import android.annotation.TargetApi;
  3. import android.bluetooth.BluetoothGatt;
  4. import android.bluetooth.BluetoothGattCallback;
  5. import android.bluetooth.BluetoothGattCharacteristic;
  6. import android.bluetooth.BluetoothGattDescriptor;
  7. import android.bluetooth.BluetoothProfile;
  8. import android.os.Build;
  9. import android.os.Bundle;
  10. import android.os.Handler;
  11. import android.os.Looper;
  12. import android.os.Message;
  13. import com.taiyi.pulse.fastble.BleManager;
  14. import com.taiyi.pulse.fastble.callback.BleGattCallback;
  15. import com.taiyi.pulse.fastble.callback.BleIndicateCallback;
  16. import com.taiyi.pulse.fastble.callback.BleMtuChangedCallback;
  17. import com.taiyi.pulse.fastble.callback.BleNotifyCallback;
  18. import com.taiyi.pulse.fastble.callback.BleReadCallback;
  19. import com.taiyi.pulse.fastble.callback.BleRssiCallback;
  20. import com.taiyi.pulse.fastble.callback.BleWriteCallback;
  21. import com.taiyi.pulse.fastble.data.BleConnectStateParameter;
  22. import com.taiyi.pulse.fastble.data.BleDevice;
  23. import com.taiyi.pulse.fastble.data.BleMsg;
  24. import com.taiyi.pulse.fastble.exception.ConnectException;
  25. import com.taiyi.pulse.fastble.exception.OtherException;
  26. import com.taiyi.pulse.fastble.exception.TimeoutException;
  27. import com.taiyi.pulse.fastble.utils.BleLog;
  28. import java.lang.reflect.Method;
  29. import java.util.HashMap;
  30. import java.util.Iterator;
  31. import java.util.Map;
  32. import static android.bluetooth.BluetoothDevice.TRANSPORT_LE;
  33. @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
  34. public class BleBluetooth {
  35. private BleGattCallback bleGattCallback;
  36. private BleRssiCallback bleRssiCallback;
  37. private BleMtuChangedCallback bleMtuChangedCallback;
  38. private HashMap<String, BleNotifyCallback> bleNotifyCallbackHashMap = new HashMap<>();
  39. private HashMap<String, BleIndicateCallback> bleIndicateCallbackHashMap = new HashMap<>();
  40. private HashMap<String, BleWriteCallback> bleWriteCallbackHashMap = new HashMap<>();
  41. private HashMap<String, BleReadCallback> bleReadCallbackHashMap = new HashMap<>();
  42. private LastState lastState;
  43. private boolean isActiveDisconnect = false;
  44. private BleDevice bleDevice;
  45. private BluetoothGatt bluetoothGatt;
  46. private MainHandler mainHandler = new MainHandler(Looper.getMainLooper());
  47. private int connectRetryCount = 0;
  48. public BleBluetooth(BleDevice bleDevice) {
  49. this.bleDevice = bleDevice;
  50. }
  51. public BleConnector newBleConnector() {
  52. return new BleConnector(this);
  53. }
  54. public synchronized void addConnectGattCallback(BleGattCallback callback) {
  55. bleGattCallback = callback;
  56. }
  57. public synchronized void removeConnectGattCallback() {
  58. bleGattCallback = null;
  59. }
  60. public synchronized void addNotifyCallback(String uuid, BleNotifyCallback bleNotifyCallback) {
  61. bleNotifyCallbackHashMap.put(uuid, bleNotifyCallback);
  62. }
  63. public synchronized void addIndicateCallback(String uuid, BleIndicateCallback bleIndicateCallback) {
  64. bleIndicateCallbackHashMap.put(uuid, bleIndicateCallback);
  65. }
  66. public synchronized void addWriteCallback(String uuid, BleWriteCallback bleWriteCallback) {
  67. bleWriteCallbackHashMap.put(uuid, bleWriteCallback);
  68. }
  69. public synchronized void addReadCallback(String uuid, BleReadCallback bleReadCallback) {
  70. bleReadCallbackHashMap.put(uuid, bleReadCallback);
  71. }
  72. public synchronized void removeNotifyCallback(String uuid) {
  73. if (bleNotifyCallbackHashMap.containsKey(uuid))
  74. bleNotifyCallbackHashMap.remove(uuid);
  75. }
  76. public synchronized void removeIndicateCallback(String uuid) {
  77. if (bleIndicateCallbackHashMap.containsKey(uuid))
  78. bleIndicateCallbackHashMap.remove(uuid);
  79. }
  80. public synchronized void removeWriteCallback(String uuid) {
  81. if (bleWriteCallbackHashMap.containsKey(uuid))
  82. bleWriteCallbackHashMap.remove(uuid);
  83. }
  84. public synchronized void removeReadCallback(String uuid) {
  85. if (bleReadCallbackHashMap.containsKey(uuid))
  86. bleReadCallbackHashMap.remove(uuid);
  87. }
  88. public synchronized void clearCharacterCallback() {
  89. if (bleNotifyCallbackHashMap != null)
  90. bleNotifyCallbackHashMap.clear();
  91. if (bleIndicateCallbackHashMap != null)
  92. bleIndicateCallbackHashMap.clear();
  93. if (bleWriteCallbackHashMap != null)
  94. bleWriteCallbackHashMap.clear();
  95. if (bleReadCallbackHashMap != null)
  96. bleReadCallbackHashMap.clear();
  97. }
  98. public synchronized void addRssiCallback(BleRssiCallback callback) {
  99. bleRssiCallback = callback;
  100. }
  101. public synchronized void removeRssiCallback() {
  102. bleRssiCallback = null;
  103. }
  104. public synchronized void addMtuChangedCallback(BleMtuChangedCallback callback) {
  105. bleMtuChangedCallback = callback;
  106. }
  107. public synchronized void removeMtuChangedCallback() {
  108. bleMtuChangedCallback = null;
  109. }
  110. public String getDeviceKey() {
  111. return bleDevice.getKey();
  112. }
  113. public BleDevice getDevice() {
  114. return bleDevice;
  115. }
  116. public BluetoothGatt getBluetoothGatt() {
  117. return bluetoothGatt;
  118. }
  119. public synchronized BluetoothGatt connect(BleDevice bleDevice,
  120. boolean autoConnect,
  121. BleGattCallback callback) {
  122. return connect(bleDevice, autoConnect, callback, 0);
  123. }
  124. public synchronized BluetoothGatt connect(BleDevice bleDevice,
  125. boolean autoConnect,
  126. BleGattCallback callback,
  127. int connectRetryCount) {
  128. BleLog.i("connect device: " + bleDevice.getName()
  129. + "\nmac: " + bleDevice.getMac()
  130. + "\nautoConnect: " + autoConnect
  131. + "\ncurrentThread: " + Thread.currentThread().getId()
  132. + "\nconnectCount:" + (connectRetryCount + 1));
  133. if (connectRetryCount == 0) {
  134. this.connectRetryCount = 0;
  135. }
  136. addConnectGattCallback(callback);
  137. lastState = LastState.CONNECT_CONNECTING;
  138. Message message = mainHandler.obtainMessage();
  139. message.what = BleMsg.MSG_CONNECT_OVER_TIME;
  140. mainHandler.sendMessageDelayed(message, BleManager.getInstance().getConnectOverTime());
  141. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  142. bluetoothGatt = bleDevice.getDevice().connectGatt(BleManager.getInstance().getContext(),
  143. autoConnect, coreGattCallback, TRANSPORT_LE);
  144. } else {
  145. bluetoothGatt = bleDevice.getDevice().connectGatt(BleManager.getInstance().getContext(),
  146. autoConnect, coreGattCallback);
  147. }
  148. if (bluetoothGatt != null) {
  149. if (bleGattCallback != null) {
  150. bleGattCallback.onStartConnect();
  151. }
  152. } else {
  153. disconnectGatt();
  154. refreshDeviceCache();
  155. closeBluetoothGatt();
  156. lastState = LastState.CONNECT_FAILURE;
  157. BleManager.getInstance().getMultipleBluetoothController().removeConnectingBle(
  158. BleBluetooth.this);
  159. if (bleGattCallback != null)
  160. bleGattCallback.onConnectFail(bleDevice, new OtherException("GATT connect exception occurred!"));
  161. }
  162. return bluetoothGatt;
  163. }
  164. public synchronized void disconnect() {
  165. isActiveDisconnect = true;
  166. disconnectGatt();
  167. }
  168. public synchronized void destroy() {
  169. lastState = LastState.CONNECT_IDLE;
  170. disconnectGatt();
  171. refreshDeviceCache();
  172. closeBluetoothGatt();
  173. removeConnectGattCallback();
  174. removeRssiCallback();
  175. removeMtuChangedCallback();
  176. clearCharacterCallback();
  177. mainHandler.removeCallbacksAndMessages(null);
  178. }
  179. private synchronized void disconnectGatt() {
  180. if (bluetoothGatt != null) {
  181. bluetoothGatt.disconnect();
  182. }
  183. }
  184. private synchronized void refreshDeviceCache() {
  185. try {
  186. final Method refresh = BluetoothGatt.class.getMethod("refresh");
  187. if (refresh != null && bluetoothGatt != null) {
  188. boolean success = (Boolean) refresh.invoke(bluetoothGatt);
  189. BleLog.i("refreshDeviceCache, is success: " + success);
  190. }
  191. } catch (Exception e) {
  192. BleLog.i("exception occur while refreshing device: " + e.getMessage());
  193. e.printStackTrace();
  194. }
  195. }
  196. private synchronized void closeBluetoothGatt() {
  197. if (bluetoothGatt != null) {
  198. bluetoothGatt.close();
  199. }
  200. }
  201. private final class MainHandler extends Handler {
  202. MainHandler(Looper looper) {
  203. super(looper);
  204. }
  205. @Override
  206. public void handleMessage(Message msg) {
  207. switch (msg.what) {
  208. case BleMsg.MSG_CONNECT_FAIL: {
  209. disconnectGatt();
  210. refreshDeviceCache();
  211. closeBluetoothGatt();
  212. if (connectRetryCount < BleManager.getInstance().getReConnectCount()) {
  213. BleLog.e("Connect fail, try reconnect " + BleManager.getInstance().getReConnectInterval() + " millisecond later");
  214. ++connectRetryCount;
  215. Message message = mainHandler.obtainMessage();
  216. message.what = BleMsg.MSG_RECONNECT;
  217. mainHandler.sendMessageDelayed(message, BleManager.getInstance().getReConnectInterval());
  218. } else {
  219. lastState = LastState.CONNECT_FAILURE;
  220. BleManager.getInstance().getMultipleBluetoothController().removeConnectingBle(
  221. BleBluetooth.this);
  222. BleConnectStateParameter para = (BleConnectStateParameter) msg.obj;
  223. int status = para.getStatus();
  224. if (bleGattCallback != null)
  225. bleGattCallback.onConnectFail(bleDevice, new ConnectException(bluetoothGatt, status));
  226. }
  227. }
  228. break;
  229. case BleMsg.MSG_DISCONNECTED: {
  230. lastState = LastState.CONNECT_DISCONNECT;
  231. BleManager.getInstance().getMultipleBluetoothController().removeBleBluetooth(
  232. BleBluetooth.this);
  233. disconnect();
  234. refreshDeviceCache();
  235. closeBluetoothGatt();
  236. removeRssiCallback();
  237. removeMtuChangedCallback();
  238. clearCharacterCallback();
  239. mainHandler.removeCallbacksAndMessages(null);
  240. BleConnectStateParameter para = (BleConnectStateParameter) msg.obj;
  241. boolean isActive = para.isActive();
  242. int status = para.getStatus();
  243. if (bleGattCallback != null)
  244. bleGattCallback.onDisConnected(isActive, bleDevice, bluetoothGatt, status);
  245. }
  246. break;
  247. case BleMsg.MSG_RECONNECT: {
  248. connect(bleDevice, false, bleGattCallback, connectRetryCount);
  249. }
  250. break;
  251. case BleMsg.MSG_CONNECT_OVER_TIME: {
  252. disconnectGatt();
  253. refreshDeviceCache();
  254. closeBluetoothGatt();
  255. lastState = LastState.CONNECT_FAILURE;
  256. BleManager.getInstance().getMultipleBluetoothController().removeConnectingBle(
  257. BleBluetooth.this);
  258. if (bleGattCallback != null)
  259. bleGattCallback.onConnectFail(bleDevice, new TimeoutException());
  260. }
  261. break;
  262. case BleMsg.MSG_DISCOVER_SERVICES: {
  263. if (bluetoothGatt != null) {
  264. boolean discoverServiceResult = bluetoothGatt.discoverServices();
  265. if (!discoverServiceResult) {
  266. Message message = mainHandler.obtainMessage();
  267. message.what = BleMsg.MSG_DISCOVER_FAIL;
  268. mainHandler.sendMessage(message);
  269. }
  270. } else {
  271. Message message = mainHandler.obtainMessage();
  272. message.what = BleMsg.MSG_DISCOVER_FAIL;
  273. mainHandler.sendMessage(message);
  274. }
  275. }
  276. break;
  277. case BleMsg.MSG_DISCOVER_FAIL: {
  278. disconnectGatt();
  279. refreshDeviceCache();
  280. closeBluetoothGatt();
  281. lastState = LastState.CONNECT_FAILURE;
  282. BleManager.getInstance().getMultipleBluetoothController().removeConnectingBle(
  283. BleBluetooth.this);
  284. if (bleGattCallback != null)
  285. bleGattCallback.onConnectFail(bleDevice,
  286. new OtherException("GATT discover services exception occurred!"));
  287. }
  288. break;
  289. case BleMsg.MSG_DISCOVER_SUCCESS: {
  290. lastState = LastState.CONNECT_CONNECTED;
  291. isActiveDisconnect = false;
  292. BleManager.getInstance().getMultipleBluetoothController().removeConnectingBle(
  293. BleBluetooth.this);
  294. BleManager.getInstance().getMultipleBluetoothController().addBleBluetooth(
  295. BleBluetooth.this);
  296. BleConnectStateParameter para = (BleConnectStateParameter) msg.obj;
  297. int status = para.getStatus();
  298. if (bleGattCallback != null)
  299. bleGattCallback.onConnectSuccess(bleDevice, bluetoothGatt, status);
  300. }
  301. break;
  302. default:
  303. super.handleMessage(msg);
  304. break;
  305. }
  306. }
  307. }
  308. private BluetoothGattCallback coreGattCallback = new BluetoothGattCallback() {
  309. @Override
  310. public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
  311. super.onConnectionStateChange(gatt, status, newState);
  312. BleLog.i("BluetoothGattCallback:onConnectionStateChange "
  313. + '\n' + "status: " + status
  314. + '\n' + "newState: " + newState
  315. + '\n' + "currentThread: " + Thread.currentThread().getId());
  316. bluetoothGatt = gatt;
  317. mainHandler.removeMessages(BleMsg.MSG_CONNECT_OVER_TIME);
  318. if (newState == BluetoothProfile.STATE_CONNECTED) {
  319. Message message = mainHandler.obtainMessage();
  320. message.what = BleMsg.MSG_DISCOVER_SERVICES;
  321. mainHandler.sendMessageDelayed(message, 500);
  322. } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
  323. if (lastState == LastState.CONNECT_CONNECTING) {
  324. Message message = mainHandler.obtainMessage();
  325. message.what = BleMsg.MSG_CONNECT_FAIL;
  326. message.obj = new BleConnectStateParameter(status);
  327. mainHandler.sendMessage(message);
  328. } else if (lastState == LastState.CONNECT_CONNECTED) {
  329. Message message = mainHandler.obtainMessage();
  330. message.what = BleMsg.MSG_DISCONNECTED;
  331. BleConnectStateParameter para = new BleConnectStateParameter(status);
  332. para.setActive(isActiveDisconnect);
  333. message.obj = para;
  334. mainHandler.sendMessage(message);
  335. }
  336. }
  337. }
  338. @Override
  339. public void onServicesDiscovered(BluetoothGatt gatt, int status) {
  340. super.onServicesDiscovered(gatt, status);
  341. BleLog.i("BluetoothGattCallback:onServicesDiscovered "
  342. + '\n' + "status: " + status
  343. + '\n' + "currentThread: " + Thread.currentThread().getId());
  344. bluetoothGatt = gatt;
  345. if (status == BluetoothGatt.GATT_SUCCESS) {
  346. Message message = mainHandler.obtainMessage();
  347. message.what = BleMsg.MSG_DISCOVER_SUCCESS;
  348. message.obj = new BleConnectStateParameter(status);
  349. mainHandler.sendMessage(message);
  350. } else {
  351. Message message = mainHandler.obtainMessage();
  352. message.what = BleMsg.MSG_DISCOVER_FAIL;
  353. mainHandler.sendMessage(message);
  354. }
  355. }
  356. @Override
  357. public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
  358. super.onCharacteristicChanged(gatt, characteristic);
  359. Iterator iterator = bleNotifyCallbackHashMap.entrySet().iterator();
  360. while (iterator.hasNext()) {
  361. Map.Entry entry = (Map.Entry) iterator.next();
  362. Object callback = entry.getValue();
  363. if (callback instanceof BleNotifyCallback) {
  364. BleNotifyCallback bleNotifyCallback = (BleNotifyCallback) callback;
  365. if (characteristic.getUuid().toString().equalsIgnoreCase(bleNotifyCallback.getKey())) {
  366. Handler handler = bleNotifyCallback.getHandler();
  367. if (handler != null) {
  368. Message message = handler.obtainMessage();
  369. message.what = BleMsg.MSG_CHA_NOTIFY_DATA_CHANGE;
  370. message.obj = bleNotifyCallback;
  371. Bundle bundle = new Bundle();
  372. bundle.putByteArray(BleMsg.KEY_NOTIFY_BUNDLE_VALUE, characteristic.getValue());
  373. message.setData(bundle);
  374. handler.sendMessage(message);
  375. }
  376. }
  377. }
  378. }
  379. iterator = bleIndicateCallbackHashMap.entrySet().iterator();
  380. while (iterator.hasNext()) {
  381. Map.Entry entry = (Map.Entry) iterator.next();
  382. Object callback = entry.getValue();
  383. if (callback instanceof BleIndicateCallback) {
  384. BleIndicateCallback bleIndicateCallback = (BleIndicateCallback) callback;
  385. if (characteristic.getUuid().toString().equalsIgnoreCase(bleIndicateCallback.getKey())) {
  386. Handler handler = bleIndicateCallback.getHandler();
  387. if (handler != null) {
  388. Message message = handler.obtainMessage();
  389. message.what = BleMsg.MSG_CHA_INDICATE_DATA_CHANGE;
  390. message.obj = bleIndicateCallback;
  391. Bundle bundle = new Bundle();
  392. bundle.putByteArray(BleMsg.KEY_INDICATE_BUNDLE_VALUE, characteristic.getValue());
  393. message.setData(bundle);
  394. handler.sendMessage(message);
  395. }
  396. }
  397. }
  398. }
  399. }
  400. @Override
  401. public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
  402. super.onDescriptorWrite(gatt, descriptor, status);
  403. Iterator iterator = bleNotifyCallbackHashMap.entrySet().iterator();
  404. while (iterator.hasNext()) {
  405. Map.Entry entry = (Map.Entry) iterator.next();
  406. Object callback = entry.getValue();
  407. if (callback instanceof BleNotifyCallback) {
  408. BleNotifyCallback bleNotifyCallback = (BleNotifyCallback) callback;
  409. if (descriptor.getCharacteristic().getUuid().toString().equalsIgnoreCase(bleNotifyCallback.getKey())) {
  410. Handler handler = bleNotifyCallback.getHandler();
  411. if (handler != null) {
  412. Message message = handler.obtainMessage();
  413. message.what = BleMsg.MSG_CHA_NOTIFY_RESULT;
  414. message.obj = bleNotifyCallback;
  415. Bundle bundle = new Bundle();
  416. bundle.putInt(BleMsg.KEY_NOTIFY_BUNDLE_STATUS, status);
  417. message.setData(bundle);
  418. handler.sendMessage(message);
  419. }
  420. }
  421. }
  422. }
  423. iterator = bleIndicateCallbackHashMap.entrySet().iterator();
  424. while (iterator.hasNext()) {
  425. Map.Entry entry = (Map.Entry) iterator.next();
  426. Object callback = entry.getValue();
  427. if (callback instanceof BleIndicateCallback) {
  428. BleIndicateCallback bleIndicateCallback = (BleIndicateCallback) callback;
  429. if (descriptor.getCharacteristic().getUuid().toString().equalsIgnoreCase(bleIndicateCallback.getKey())) {
  430. Handler handler = bleIndicateCallback.getHandler();
  431. if (handler != null) {
  432. Message message = handler.obtainMessage();
  433. message.what = BleMsg.MSG_CHA_INDICATE_RESULT;
  434. message.obj = bleIndicateCallback;
  435. Bundle bundle = new Bundle();
  436. bundle.putInt(BleMsg.KEY_INDICATE_BUNDLE_STATUS, status);
  437. message.setData(bundle);
  438. handler.sendMessage(message);
  439. }
  440. }
  441. }
  442. }
  443. }
  444. @Override
  445. public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
  446. super.onCharacteristicWrite(gatt, characteristic, status);
  447. Iterator iterator = bleWriteCallbackHashMap.entrySet().iterator();
  448. while (iterator.hasNext()) {
  449. Map.Entry entry = (Map.Entry) iterator.next();
  450. Object callback = entry.getValue();
  451. if (callback instanceof BleWriteCallback) {
  452. BleWriteCallback bleWriteCallback = (BleWriteCallback) callback;
  453. if (characteristic.getUuid().toString().equalsIgnoreCase(bleWriteCallback.getKey())) {
  454. Handler handler = bleWriteCallback.getHandler();
  455. if (handler != null) {
  456. Message message = handler.obtainMessage();
  457. message.what = BleMsg.MSG_CHA_WRITE_RESULT;
  458. message.obj = bleWriteCallback;
  459. Bundle bundle = new Bundle();
  460. bundle.putInt(BleMsg.KEY_WRITE_BUNDLE_STATUS, status);
  461. bundle.putByteArray(BleMsg.KEY_WRITE_BUNDLE_VALUE, characteristic.getValue());
  462. message.setData(bundle);
  463. handler.sendMessage(message);
  464. }
  465. }
  466. }
  467. }
  468. }
  469. @Override
  470. public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
  471. super.onCharacteristicRead(gatt, characteristic, status);
  472. Iterator iterator = bleReadCallbackHashMap.entrySet().iterator();
  473. while (iterator.hasNext()) {
  474. Map.Entry entry = (Map.Entry) iterator.next();
  475. Object callback = entry.getValue();
  476. if (callback instanceof BleReadCallback) {
  477. BleReadCallback bleReadCallback = (BleReadCallback) callback;
  478. if (characteristic.getUuid().toString().equalsIgnoreCase(bleReadCallback.getKey())) {
  479. Handler handler = bleReadCallback.getHandler();
  480. if (handler != null) {
  481. Message message = handler.obtainMessage();
  482. message.what = BleMsg.MSG_CHA_READ_RESULT;
  483. message.obj = bleReadCallback;
  484. Bundle bundle = new Bundle();
  485. bundle.putInt(BleMsg.KEY_READ_BUNDLE_STATUS, status);
  486. bundle.putByteArray(BleMsg.KEY_READ_BUNDLE_VALUE, characteristic.getValue());
  487. message.setData(bundle);
  488. handler.sendMessage(message);
  489. }
  490. }
  491. }
  492. }
  493. }
  494. @Override
  495. public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
  496. super.onReadRemoteRssi(gatt, rssi, status);
  497. if (bleRssiCallback != null) {
  498. Handler handler = bleRssiCallback.getHandler();
  499. if (handler != null) {
  500. Message message = handler.obtainMessage();
  501. message.what = BleMsg.MSG_READ_RSSI_RESULT;
  502. message.obj = bleRssiCallback;
  503. Bundle bundle = new Bundle();
  504. bundle.putInt(BleMsg.KEY_READ_RSSI_BUNDLE_STATUS, status);
  505. bundle.putInt(BleMsg.KEY_READ_RSSI_BUNDLE_VALUE, rssi);
  506. message.setData(bundle);
  507. handler.sendMessage(message);
  508. }
  509. }
  510. }
  511. @Override
  512. public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
  513. super.onMtuChanged(gatt, mtu, status);
  514. if (bleMtuChangedCallback != null) {
  515. Handler handler = bleMtuChangedCallback.getHandler();
  516. if (handler != null) {
  517. Message message = handler.obtainMessage();
  518. message.what = BleMsg.MSG_SET_MTU_RESULT;
  519. message.obj = bleMtuChangedCallback;
  520. Bundle bundle = new Bundle();
  521. bundle.putInt(BleMsg.KEY_SET_MTU_BUNDLE_STATUS, status);
  522. bundle.putInt(BleMsg.KEY_SET_MTU_BUNDLE_VALUE, mtu);
  523. message.setData(bundle);
  524. handler.sendMessage(message);
  525. }
  526. }
  527. }
  528. };
  529. enum LastState {
  530. CONNECT_IDLE,
  531. CONNECT_CONNECTING,
  532. CONNECT_CONNECTED,
  533. CONNECT_FAILURE,
  534. CONNECT_DISCONNECT
  535. }
  536. }