BLE Client Characteristic Callback Error



  • I have a simple code that is set to scan for BLE devices and connect to the one with the correct name. Once connected, it gets the list of services and then goes through those services getting the list of characteristics. From these characteristics, I look at the properties to see if it is set for NOTIFY and if yes, register that characteristic for a notify callback. Everything works until it tries to register for the callback. I get an OSError saying the requested operation failed. I am running version 1.20.2.rc3 on a LoPy4.

    Here is my test code.

    from network import Bluetooth
    import time
    import ubinascii
    
    bt = Bluetooth(modem_sleep=False)
    bt.start_scan(-1)
    
    print('Scanning...', end="")
    
    def char_notify_callback(char):
        char_value = (char.value())
        print("Got new char: {} value: {}".format(ubinascii.hexlify(bytes(reversed(char.uuid()))).decode(), char_value))
    
    while True:
      adv = bt.get_adv()
      if adv and bt.resolve_adv_data(adv.data, Bluetooth.ADV_NAME_CMPL) == 'HUB_400000':
          print()
          try:
              conn = bt.connect(adv.mac)
              services = conn.services()
              for service in services:
                  time.sleep(0.050)
                  if type(service.uuid()) == bytes:
                      print('Reading chars from service = {}'.format(ubinascii.hexlify(bytes(reversed(service.uuid()))).decode()))
                  else:
                      print('Reading chars from service = %x' % service.uuid())
                  chars = service.characteristics()
                  for char in chars:
                      if (char.properties() & Bluetooth.PROP_NOTIFY):
                          char.callback(trigger=Bluetooth.CHAR_NOTIFY_EVENT, handler=char_notify_callback)
              break
          except Exception as e:
              print("Error while connecting or reading from the BLE device: {} - {}".format(type(e).__name__, e))
              conn.disconnect()
              break
      else:
          print(".", end="")
          time.sleep(0.050)
    
    while True:
        time.sleep(1)
    

    Here is the output that I get.
    5f2fdf07-6a88-4e62-b1d8-2d368d340b6d-image.png


Log in to reply
 

Pycom on Twitter