Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read data from BLE device

Tags:

I am trying to read data from a bluetooth device (BR-LE4.0-S2). I was able to connect BLE device, but not able to read data from it.I don't have any specification about BLE services and it's characteristics. Here what my issue is - (void)peripheral:didUpdateValueForCharacteristic:error: not getting called. I followed tutorial "https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/PerformingCommonCentralRoleTasks/PerformingCommonCentralRoleTasks.html#//apple_ref/doc/uid/TP40013257-CH3-SW2" .Following is my code.

What my requirement is to read data continuously from BLE device. Any help is greatly appreciated.

- (void)viewDidLoad {     self.myCentralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];     self.peripheral = [[CBPeripheral alloc] init];     self.peripheral.delegate = self;     [super viewDidLoad]; }  - (void) centralManagerDidUpdateState:(CBCentralManager *)central {      switch (central.state) {         case CBCentralManagerStatePoweredOn:         [self.myCentralManager scanForPeripheralsWithServices:nil options:nil];             break;         default:             NSLog(@"Central Manager did change state");             break;     }  }  - (void)centralManager:(CBCentralManager *)central  didDiscoverPeripheral:(CBPeripheral *)peripheral      advertisementData:(NSDictionary *)advertisementData                   RSSI:(NSNumber *)RSSI {      NSLog(@"Discovered %@", peripheral.name);     [self.myCentralManager stopScan];     NSLog(@"Scanning stopped");      if (self.peripheral != peripheral) {         self.peripheral = peripheral;         NSLog(@"Connecting to peripheral %@", peripheral);         // Connects to the discovered peripheral     [self.myCentralManager connectPeripheral:peripheral options:nil];     } }  - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {      NSLog(@"Peripheral connected");      NSLog(@"Peripheral services : %@",peripheral.services );      [self.peripheral setDelegate:self];      [peripheral discoverServices:nil];  } - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {      if (error) {         NSLog(@"Error discovering service: %@", [error localizedDescription]);         return;     }      for (CBService *service in peripheral.services) {         [peripheral discoverCharacteristics:nil forService:nil];     } }  - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service              error:(NSError *)error {      int i = 0;     for (CBCharacteristic *characteristic in service.characteristics) {  [peripheral setNotifyValue:YES forCharacteristic: characteristic];      } }  - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic              error:(NSError *)error {      NSData *data = characteristic.value;     NSString *value = [[NSString alloc] initWithData:characteristic.value encoding:NSUTF8StringEncoding];      NSLog(@"Value %@",value);     NSString *stringFromData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];      NSLog(@"Data ====== %@", stringFromData); }   - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic              error:(NSError *)error {      if (error) {         NSLog(@"Error changing notification state: %@",               [error localizedDescription]);     }     NSString *value = [[NSString alloc] initWithData:self.interestingCharacteristic.value encoding:NSUTF8StringEncoding];      NSLog(@"Value %@",value);      NSLog(@"description: %@, descriptors: %@, properties: %d, service :%@, value:%@", characteristic.description, characteristic.descriptors, characteristic.properties, characteristic.service, characteristic.value);     NSData *data = characteristic.value;      if (characteristic.isNotifying) {         NSString *stringFromData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];         [peripheral readValueForCharacteristic:characteristic];          NSLog(@"Data ====== %@", @"ccdc");      } else {         [self.myCentralManager cancelPeripheralConnection:peripheral];      }  }  - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {     NSLog(@"Peripheral Disconnected");     self.peripheral = nil;      // We're disconnected, so start scanning again     NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];      [self.myCentralManager scanForPeripheralsWithServices:nil options:scanOptions]; } 
like image 713
Ab'initio Avatar asked Nov 12 '13 12:11

Ab'initio


People also ask

What is raw data in BLE scanner?

Raw data is an array of hexadecimal values read from your device characteristic, or advertisement data, which starts with the vendor ID on 2 bytes, followed with the manufacturer data.

How do you use a BLE scanner?

Run the example "BLE Scan" from the Workbench window. If you use the TI SensorTag, press the "activate" button on the tag. If everything works, the app should automatically detect BLE devices within range and display the signal strength for each device.


1 Answers

To read a value from a BLE peripheral device, follow these steps

  1. Scan for avilable devices

    NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey]; [self.myCentralManager scanForPeripheralsWithServices:nil options:options];` 
  2. On detecting a device, will get a call back to "didDiscoverPeripheral" delegate method. Then establish a connection with detected BLE device

    -(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {      //Connect detected device....     if (!peripheral.isConnected) {         peripheral.delegate = self;         [bluetoothManager_ connectPeripheral:peripheral options:nil];      } } 
  3. On successful connection, request for all the services available in the BLE device

    - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{ NSLog(@"Peripheral Connected");      // Make sure we get the discovery callbacks     peripheral.delegate = self;      // Search only for services that match our UUID     [peripheral discoverServices:nil]; } 
  4. Request all the characteristics available in each services

    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {      if (error) {         NSLog(@"Error discovering services: %@", [error localizedDescription]);         return;     }     // Loop through the newly filled peripheral.services array, just in case there's more than one.     for (CBService *service in peripheral.services) {         [peripheral discoverCharacteristics:nil forService:service];     } } 
  5. Once we get the required characteristics detail, we need to subscribe to it, which lets the peripheral know we want the data it contains

    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{      // Deal with errors (if any)     if (error) {         NSLog(@"Error discovering characteristics: %@", [error localizedDescription]);         return;     }      // Again, we loop through the array, just in case.     for (CBCharacteristic *characteristic in service.characteristics) {         if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:REQUIRED_CHARA_ID]]) {             // If it is, subscribe to it             [peripheral setNotifyValue:YES forCharacteristic:characteristic];         }     } } 
  6. Completing all these steps, BLE device will let you know the notification status change through delegate method

    - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{      if (error) {         NSLog(@"Error changing notification state: %@", error.localizedDescription);     }      // Notification has started     if (characteristic.isNotifying) {         NSLog(@"Notification began on %@", characteristic);     } } 

You will recieve any notification from BLE device in the following method

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {     if (error) {         NSLog(@"Error reading characteristics: %@", [error localizedDescription]);         return;     }      if (characteristic.value != nil) {           //value here.             } } 
like image 52
itZme Avatar answered Sep 22 '22 19:09

itZme