Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Bluetooth Low Energy: vous saurez tout

Alexis DUQUE
February 09, 2017

Bluetooth Low Energy: vous saurez tout

Avec l’essor de l’IoT, le Bluetototh Low Energy a fait son apparition en permettant à des objets de communiquer avec votre smartphone : thermomètres, bracelets d’activité, mais aussi piloter votre cafetière préférée. Néanmoins, ce protocole radio reste souvent mystérieux pour les utilisateurs et les développeurs.

Cette présentation démystifiera son fonctionnement, son avenir avec l’arrivée du Bluetooth 5.0 et son implémentation sur les plateformes mobiles. Pour les plus bricoleurs de l'auditoire, nous verrons également comment créer rapidement son propre périphérique BLE en utilisant un kit de développement grand public.

Alexis DUQUE

February 09, 2017
Tweet

More Decks by Alexis DUQUE

Other Decks in Programming

Transcript

  1. Bluetooth LE, vous saurez tout ! SNOWCAMP 2017 Alexis DUQUE,

    Rtone
  2. About Me Alexis Duque Ingénieur Software embarqué/mobile/web/R&D chez Rtone Doctorant

    au laboratoire CITI, INSA de Lyon @alexis0duque alexisduque [email protected]
  3. Au programme • Comprendre le protocole BLE et ses évolutions

    • Concevoir son périphérique Bluetooth • Développer une application mobile • Éviter les pièges !
  4. Un peu de théorie … juste un peu :-)

  5. Bluetooth 1994 Harald Blåtand 24 MBit/s Portée de 1m à

    100m Standardisé par le Bluetooth SIG
  6. Bluetooth Low Energy 2010 Faible débit et faible conso. ~50

    kbps Portée de 10m à 50m Faible latence (~10ms) et protocole “non connecté” Chip radio presque toujours OFF Très petits paquets : MTU de 20 octets pour 4.0
  7. Classic Bluetooth + Bluetooth LE.

  8. En faire bon usage ....

  9. La couche PHY • Modulation GFSK 1 Mbps • Bande

    passante de 220KHz à 1MHz • RF 2.4 GHz (ISM) découpant en 23->79 canaux • Frequency Hopping (1600 hops/sec) • Time Division Duplex mode • Puissance en Tx 0.1 watt • Distance : 10m à 50m • 7 liens possibles (configuration en étoile)
  10. None
  11. Topologie

  12. Topologie Master Client Centrale Scanner Initiateur

  13. Topologie Slave Périphérique Advertiser GATT Serveur

  14. Advertising Broadcast et non connecté Informations sur le périphérique 31B

    de payload custom 2 types : ADV_DATA et SCAN_RESPONSE
  15. 4 paramètres à retenir Connection Interval Supervision Timeout Slave Latency

    Advertising Interval
  16. None
  17. Low Power ?

  18. Consommation Très Variables ! En veille : quelques uA Advertising

    : 30 uA => 1 an avec une pile CR2032 Scan : 20 mA Connecté et actif : 750 mA
  19. Ecrire une caractéristique Client Write Request Server Confirmation Client Write

    Command Server
  20. Lire une caractéristique Valeur Client Read Request Server

  21. Les Notifications Client Indication Server Confirmation Client Notification Server

  22. Les évolutions 2010 2013 2017 2011

  23. Bluetooth 4.0 -4.1 (2010 - 2013) 1er version de Bluetooth

    Low Energy version Orienté bas débit, faible latence, basse conso Mise à jour mineurs en 2013 : 4.1 • Support du multi rôle
  24. Bluetooth 4.2 • Support de l’IPv6 et Bluetooth 6LoWPAN •

    Secure pairing: (AES-CCM + ECDH) • Privacy • Réduction de la consommation • Encore + rapide : débit x 2.5 • Data Length Extension: taille des paquets x 10 • Voice-over-BLE
  25. Sécurité Bluetooth Low Energy Security ?

  26. Lockpicking in the IoT, Chaos Communication Congress “75 Percent of

    Bluetooth Smart Locks Can Be Hacked” How to hack a smartlock ? Nulock Keyless Matthew Garrett .... “The password is sent unencrypted” … “There's a command that resets the password to 123456” ...
  27. LE Legacy – Problèmes Mike Ryan (2013) La clé LTK

    est transmise over-the-air La clé TK est vaut O en “Just work” Protection contre le Passive Eyesdropping Protection contre MITM
  28. LE Security Mode 1 Bluetooth 4.0, 4.1 4 modes •

    No Security – No Authentication and No Encryption • Unauthenticated pairing + encryption • Authenticated pairing + encryption • Authenticated LE Secure Connections pairing + encryption
  29. LE Security Mode 2 2 modes • Unauthenticated pairing with

    data signing • Authenticated pairing with data signing
  30. LE Secure Connections – Elliptic Curve Diffie Hellman Échange des

    clés publiques/privées avec le protocole ECDH AES-CMAC pour l’authentification Protection contre le Passive Eyesdropping Protection contre MITM
  31. LE Secure Connections – Elliptic Curve Diffie Hellman

  32. Les outils

  33. Les Sniffers TI CC2540 USB Ubertooth

  34. TI CC2540 USB

  35. Ubertooth

  36. Les applications mobiles

  37. Les applications mobiles

  38. BTSnoop HCI Log adb pull /sdcard/btsnoop_hci.log open-bluedroid-log.sh

  39. Côté embarqué

  40. Quelques plateformes nRF52 DK ~ 50€ ReadBearLab nRF51822 ~ 40€

  41. Quelques plateformes RaspberryPi 3 ~40€ Intel Edison ~70€

  42. https://github.com/sandeepmistry

  43. Nordic nRF52 DK Notre code Stack et librairie BLE précompilée

    Cortex-M4
  44. Nordic nRF52 DK Notre code Stack et librairie BLE précompilée

  45. Plusieurs possibilités Programmer la carte avec les binaires du SDK

    Utiliser la plateforme MBED Utiliser les projets d’exemple du SDK Nordic avec Eclipse, Keil ou IAR Utiliser l’application nRF Connect https://devzone.nordicsemi.com/tutorials/
  46. nRF Connect for Desktop

  47. https://developer.mbed.org

  48. Programmer l’eval board avec nRF Go Studio

  49. Côté smartphone

  50. Un sérieux problème http://opensignal.com/reports/2015/08/android-fragmentation/

  51. Différentes approches

  52. Android https://developer.android.com/guide/topics/con nectivity/bluetooth-le.html Supportée depuis 4.3 - API 18 -

    Jelly Bean Mode Central uniquement Stable depuis 5.1 - API 21 - Lollipop Mode Périphérique (advertiser) depuis Lollipop
  53. iOS https://developer.apple.com/bluetooth/ CoreBluetooth Intégré à CoreBluetooth depuis iOS 8 Mode

    Périphérique (advertiser) Mode Central
  54. Plugin Cordova iOS, Android, Windows Phone (Presque) tout est faisable

    … backgound mode Ne pas hésiter à mettre la main à la patte https://github.com/randdusing/cordova-plugin-bluetoothle https://github.com/don/cordova-plugin-ble-central Apache 2 MIT
  55. Comparaison Fonctionnement et esprit similaires : NSLog(@"Reading value for characteristic

    %@", interestingCharacteristic); [peripheral readValueForCharacteristic:interestingCharacteristic]; … (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { NSData *data = characteristic.value; // parse the data as needed … } final BluetoothGattCharacteristic characteristic; final BluetoothGatt gatt = mBluetoothGatt; LOG.d(TAG, "Reading value for characteristic " + characteristic); gatt.readCharacteristic(characteristic); … @Override public final void onCharacteristicRead(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic, final int status) { if (status == BluetoothGatt.GATT_SUCCESS) { // parse the data as needed } } ble.read(device_id, service_uuid, characteristic_uuid, success, failure);
  56. Les étapes Scanner les périphériques à portée Se connecter utilisant

    l'adresse BD ou l’UUID Découvrir les services et caractéristiques disponibles Sauvegarder les handles, pour les réutiliser ! Écrire, lire ou souscrire aux notifications Ne pas oublier de (bien) se déconnecter
  57. PRO Tips Pour Android mais très souvent valables pour iOS

  58. Ne pas oublier les permissions Dans le manifest, dont ACCESS_COARSE_LOCATION

    depuis API21 <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  59. Demander les permissions Au runtime et avant de démarrer le

    scan String LOCATION_PERMSISSION = Manifest.permission.ACCESS_COARSE_LOCATION; private void checkForLocationPermissionsAndScan() { if (ContextCompat.checkSelfPermission(this, LOCATION_PERMSISSION) == PackageManager.PERMISSION_GRANTED) { if (!isBleEnabled()) { // REQUEST BLE PERMISSION } else { // START SCAN } } else { ActivityCompat.requestPermissions(this, new String[]{LOCATION_PERMSISSION}, REQUEST_ACCESS_COARSE_LOCATION); } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { // HANDLE RESULT }
  60. Ne pas utiliser auto-connect Le comportement est très variable selon

    les modèles de smartphone public void connect(final BluetoothDevice device) { if (mConnected) return; if (mBluetoothGatt != null) { mBluetoothGatt.close(); mBluetoothGatt = null; } final boolean autoConnect = false; mUserDisconnected = !autoConnect; // We will receive Linkloss events only when the device is connected with autoConnect=true mBluetoothGatt = device.connectGatt(mContext, autoConnect, getGattCallback()); }
  61. Toujours découvrir les services Après s’être connecté correctement @Override public

    final void onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState) { if (status == BluetoothGatt.GATT_SUCCESS && newState == BluetoothProfile.STATE_CONNECTED) { // Notify the parent activity/service mConnected = true; mCallbacks.onDeviceConnected(); mHandler.postDelayed(new Runnable() { @Override public void run() { if (gatt.getDevice().getBondState() != BluetoothDevice.BOND_BONDING) { gatt.discoverServices(); } } }, 600); // Add 600ms delay, Nordic Recommendation }
  62. Attendre d’être prêt ! En utilisant la callback onServicesDiscovered @Override

    public void onServicesDiscovered(BluetoothGatt gatt, int status) { super.onServicesDiscovered(gatt, status); bleHandler.obtainMessage(MSG_SERVICES_DISCOVERED, gatt).sendToTarget(); } @Override public boolean handleMessage(Message msg) { switch (msg.what) { case MSG_SERVICES_DISCOVERED: // Discovery successful, fetch services, chars and descs... BluetoothGatt gatt = (BluetoothGatt) msg.obj; commService = gatt.getService(DATA_SERVICE_ID); inputChar = commService.getCharacteristic(INPUT_CHAR_ID); outputChar = commService.getCharacteristic(OUTPUT_CHAR_ID); break; } }
  63. Ecrire 20 bytes maximum ! Sauf pour les devices qui

    supportent requestMtu() // Should always be called on our BLE thread! private void writeDataToChar(byte[] data) { if(data.length > 20) { throw new IllegalArgumentException(); } outputChar.setValue(data); gatt.writeCharacteristic(characteristic); } @Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic c, int status) { if (status == BluetoothGatt.GATT_SUCCESS && c.getUuid().equals(outputChar.getUuid())) { // Write operation successful, proceed with next chunk! } }
  64. Ne pas oublier le champ descriptor Lors de l’activation des

    notifactions private void enableDataNotifications(BluetoothGatt gatt BluetoothGattCharacteristic c) { gatt.setCharacteristicNotification(c, true); } // This is usually needed as well... BluetoothGattDescriptor desc = c.getDescriptor(INPUT_DESC_ID); // Could also be ENABLE_NOTIFICATION_VALUE desc.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); gatt.writeDescriptor(desc); }
  65. Déconnexion : close() vs disconnect() close() == "unregister app" disconnect()

    == fermer la connection Ne pas hésiter à faire les 2: gatt.disconnect(); gatt.close();
  66. En cas d’erreur Ne pas avoir de se déconnecter, fermer

    la connexion et se connecter de nouveau : les erreur de type GATT_ERROR sont souvent irrécupérables Réinitialiser le BluetoothAdapter
  67. En cas d’erreur Jeter un oeil au code source du

    Framework Logger les appels aux callbacks BluetoothGattCallback et leur paramètres mais ne pas mettre de breakpoint !
  68. Background mode

  69. Ce que l’on peut faire Scanner des périphériques Démarrer une

    app si un périphérique est détecté Même après redémarrage d’Android Android Beacon Library Google Nearby
  70. Ce que l’on peut faire Scanner des périphériques Se connecter

    à des périphériques Lire/écrite des caractéristiques et recevoir des notifications Mais Il faut obligatoirement filtrer sur 1 service L’interval de scan est augmenté
  71. Bluetooth 5.0

  72. Bluetooth 5.0 Vitesse de modulation multipliée par 2 • Débit

    5x sup. à 4.0 Augmentation des capacités d’advertising • Payload du Scan Response x7
  73. Bluetooth 5.0 Portée multipliée par 4 : 50m en indoor

    et 200m en outdoor • Puissance Tx doublée • Nouveau codage PHY
  74. Bluetooth 5.0 Meilleurs gestion des interférences et de la coexistence

    avec Wifi, et BLE
  75. Bluetooth 5.0 Modification de la couche PHY Mais backward compatible

    Upgrade hardware du chip radio nécessaire
  76. Bluetooth 5.0 Upgrade Hardware nécessaire ! 835

  77. nRF5240 • Cortex M4 • NFC tag-A interface and antenna

    • ANT + BLE + 802.15.4
  78. nFR5240 ARM Cryptocell-310 • Secure Element • Secure Boot •

    Secure/Authenticated Debugging • AES - Courbes Elliptiques
  79. Merci Question ?