Save 37% off PRO during our Black Friday Sale! »

Everything About Bluetooth (淺談藍牙 4.0) - Peripheral 篇

8a6e58b272b266faf22d8a3b2927624f?s=47 Johnny Sung
February 04, 2016
24

Everything About Bluetooth (淺談藍牙 4.0) - Peripheral 篇

2016.01.22 @ Android Taipei
講解 Bluetooth 的 GATT 的概念,並以 Android 實作
Example code:
Peripheral - BLE CPU Temp
https://github.com/j796160836/Ble-CPUTemp-Android
Central - BLE Temperature Receiver
https://github.com/j796160836/BleTemperatureReceiver-Android

8a6e58b272b266faf22d8a3b2927624f?s=128

Johnny Sung

February 04, 2016
Tweet

Transcript

  1. EVERYTHING ABOUT BLUETOOTH Johnny Sung 02. Peripheral mode in Android

  2. https://fb.com/j796160836 Johnny Sung Mobile devices Developer https://plus.google.com/+JohnnySung http://about.me/j796160836

  3. None
  4. None
  5. (Samsung S6 Edge) Peripheral Central (LG Nexus 5)

  6. 8)"5*4#-&

  7. 2.0 2.0 + 4.0 Dual Mode 4.0 Bluetooth SMART READY

    Bluetooth Bluetooth SMART
  8. Bluetooth low energy Protocol Stack

  9. • Peripheral ヰ鼹酤縨 • Central • Broadcaster • Observer GAP

    Roles
  10. Peripheral Central

  11. Peripheral Central

  12. Peripheral Central

  13. GATT

  14. • Service • Characteristic • Data • Descriptor GATT

  15. • Heart Rate Service • Heart Rate Measurement • Data

    • Descriptor 00002A37-0000-1000-8000-00805F9B34FB GATT Heart Rate Monitor 0000180D-0000-1000-8000-00805F9B34FB Property: Notify
  16. Property: Indicate • Health Thermometer • Temperature Measurement • Data

    • Descriptor GATT Health Thermometer 00001809-0000-1000-8000-00805F9B34FB 00002A1C-0000-1000-8000-00805F9B34FB
  17. • Read • Write • Notify • Indicate Characteristic Properties

  18. UUID 00002A37-0000-1000-8000-00805F9B34FB 0x2A37 Heart Rate Measurement

  19. • an indicate operation is identical to a notify operation

    except that indications are acknowledged, while notifications are not. Notify vs Indicate http://mbientlab.com/blog/bluetooth-low-energy-introduction/
  20. https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx? u=org.bluetooth.service.health_thermometer.xml

  21. None
  22. None
  23. None
  24. None
  25. Property: Indicate • Health Thermometer • Temperature Measurement • Data

    • Descriptor GATT Health Thermometer 00001809-0000-1000-8000-00805F9B34FB 00002A1C-0000-1000-8000-00805F9B34FB
  26. *.1-&.&/5*/ "/%30*%

  27. • Central • Android 4.3 (API Level 18) • Peripheral

    • Android 5.0 (API Level 21) • Specific BLE chip Requirement in Android
  28. What? Specific BLE chip ?

  29. http://altbeacon.github.io/android-beacon-library/beacon-transmitter-devices.html

  30. BluetoothManager manager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
 BluetoothAdapter adapter = manager.getAdapter();
 


    adapter.isMultipleAdvertisementSupported(); Check if devices support Peripheral mode
  31. None
  32. PERIPHERAL

  33. <uses-permission android:name="android.permission.BLUETOOTH"/>
 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
 
 <uses-feature
 android:name="android.hardware.bluetooth_le"
 android:required="true"/> BluetoothQFSNJTTJPOT "OESPJE.BOJGFTUYNM

  34. BluetoothQFSNJTTJPOT $IFDLTZTUFNGFBUVSF getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE) @Override
 public void onActivityResult(int requestCode , int

    resultCode, Intent data) {
 if (requestCode == REQUEST_ENABLE_BT) {
 if (resultCode == Activity.RESULT_OK) {
 // Bluetooth has turned on
 } else {
 // User did not enable Bluetooth or an error occurred
 }
 }
 } Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
 startActivityForResult(enableIntent, REQUEST_ENABLE_BT); 3FRVFTUUPFOBCMF#MVFUPPUI
  35. BluetoothGattService hrmService = new BluetoothGattService(SERVICE_HEALTH_THERMOMETER_UUID,
 BluetoothGattService.SERVICE_TYPE_PRIMARY); BluetoothGattCharacteristic tempChar =
 new

    BluetoothGattCharacteristic(CHAR_TEMP_UUID, BluetoothGattCharacteristic.PROPERTY_INDICATE, BluetoothGattCharacteristic.PERMISSION_READ); tempChar.addDescriptor(new BluetoothGattDescriptor(
 UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"),
 (BluetoothGattDescriptor.PERMISSION_READ | BluetoothGattDescriptor.PERMISSION_WRITE))); 
 hrmService.addCharacteristic(tempChar); 1SFQBSFTFSWJDFTUSVDUVSF Health Thermometer 2A1C 1809
  36. AdvertiseData.Builder datas = new AdvertiseData.Builder();
 AdvertiseSettings.Builder settings = new AdvertiseSettings.Builder();


    
 datas.addServiceUuid(new ParcelUuid(hrmService.getUuid()));
 BluetoothLeAdvertiser advertiser = adapter.getBluetoothLeAdvertiser();
 advertiser.startAdvertising(settings.build(), datas.build(), advertiseCallback); BluetoothManager manager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
 BluetoothAdapter adapter = bluetoothManager.getAdapter(); BluetoothGattServer gattServer = manager.openGattServer(context, gattServerCallback); gattServer.addService(hrmService); 0QFOTFSWFS "EWFSUJTFUPPUIFST
  37. AdvertiseCallback advertiseCallback = new AdvertiseCallback() {
 @Override
 public void onStartSuccess(AdvertiseSettings

    settingsInEffect) {
 // ...
 }
 
 @Override
 public void onStartFailure(int errorCode) {
 // ...
 }
 }; "EWFSUJTFDBMMCBDL
  38. private HashSet<BluetoothDevice> bleDevices = new HashSet<>(); 
 private final BluetoothGattServerCallback

    gattServerCallback = new BluetoothGattServerCallback() {
 @Override
 public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
 super.onConnectionStateChange(device, status, newState);
 if (status == BluetoothGatt.GATT_SUCCESS) {
 if (newState == BluetoothGatt.STATE_CONNECTED) {
 // Connect
 bleDevices.add(device);
 } else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
 // Disconnect
 bleDevices.remove(device);
 }
 } else {
 // Disconnect with error
 bleDevices.remove(device);
 }
 }
 // ... (略)
 }; )BOEMFEFWJDFDPOOFDU
  39. private final BluetoothGattServerCallback gattServerCallback = new BluetoothGattServerCallback() { 
 //

    ... (略)
 
 @Override
 public void onCharacteristicReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattCharacteristic characteristic) {
 // ... gattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS,
 offset, characteristic.getValue());
 }
 
 // ... (略)
 }; 3FBEJOH$IBSBDUFSJTUJD
  40. 8SJUJOH$IBSBDUFSJTUJD http://developer.android.com/reference/android/bluetooth/ BluetoothGattServerCallback.html#onCharacteristicWriteRequest(android.bluetooth.BluetoothDevice, int, android.bluetooth.BluetoothGattCharacteristic, boolean, boolean, int, byte[]) private

    final BluetoothGattServerCallback gattServerCallback = new BluetoothGattServerCallback() {
 // ... (略)
 @Override
 public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId, BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean responseNeeded,
 int offset, byte[] value) {
 // ...
 ByteBuffer buffer = ByteBuffer.wrap(value);
 buffer.order(ByteOrder.LITTLE_ENDIAN); 
 characteristic.setValue(buffer.getInt(),
 BluetoothGattCharacteristic.FORMAT_UINT16, 0);
 
 if (responseNeeded) {
 gattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, null);
 }
 } // ... (略)
 };
  41. private final BluetoothGattServerCallback mGattServerCallback = new BluetoothGattServerCallback() {
 // ...

    (略)
 @Override
 public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded,
 int offset, byte[] value) { 
 super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value);
 if (responseNeeded) {
 gattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, null);
 }
 } // ... (略)
 }; 8SJUJOH%FTDSJQUPS
  42. public void sendNotificationToDevices( BluetoothGattCharacteristic characteristic) {
 boolean indicate = (characteristic.getProperties()


    & BluetoothGattCharacteristic.PROPERTY_INDICATE)
 == BluetoothGattCharacteristic.PROPERTY_INDICATE;
 for (BluetoothDevice device : bleDevices) {
 gattServer.notifyCharacteristicChanged(device, characteristic, indicate);
 }
 } 4FOE$IBSBDUFSJTUJD/PUJGZ
  43. Q&A

  44. ADDITIONAL SLIDES

  45. The story About Nexus 5

  46. http://altbeacon.github.io/android-beacon-library/beacon-transmitter-devices.html

  47. None
  48. https://code.google.com/p/android-developer-preview/issues/detail?id=1570

  49. We introduced BLE peripheral mode in Android 5.0 Lollipop. Nexus

    6 and Nexus 9 are the first two production Nexus devices that support BLE peripheral mode. Due to hardware chipset dependency, older Nexus devices (4/5/7) will not have access to the feature on Lollipop. #52 Won’t Fix