WIPY 3.0 can't read device NOTIFY characteristic
-
Hi Everyone. Thanks in advance to any help you can give me.
I just received my Wipy 3.0 and Track last Friday. I watched some videos Saturday morning and got lat long and modified the class to give me atomic clock time within a couple of hours, awesome! Connected to a BLE device and read out the services and characteristics in an hour, great!
I’ve got stuck though, trying to read the value of a notify property. I can detect that the property exists and get it’s UUID, properties, instance. But can’t read the actual value of the data. I can connect with a BLE scanner on my phone and with an arduino+HM10 and read the value so know the device is working.
It is giving me this error: OSError: the requested operation failed
A google hasn't turned up much. Is it possible to read notify and indicate properties with the Wipy?
Here is my code, slightly modified from the Pycom repo:
from network import Bluetooth import binascii import time bt = Bluetooth() bt.stop_scan() bt.start_scan(-1) while True: adv = bt.get_adv() if adv: mfg_data = bt.resolve_adv_data(adv.data, Bluetooth.ADV_MANUFACTURER_DATA) if bt.resolve_adv_data(adv.data, Bluetooth.ADV_NAME_CMPL) == 'earconnect': print('connected to: {}'.format(bt.resolve_adv_data(adv.data, Bluetooth.ADV_NAME_CMPL))) conn = bt.connect(adv.mac) services = conn.services() for service in services: time.sleep(0.050) if type(service.uuid()) == bytes: print('Reading bytes from service: {}'.format(service.uuid())) else: print('Reading chars from service: %x' % service.uuid()) chars = service.characteristics() for char in chars: #if ((char.properties()) & (Bluetooth.PROP_READ or Bluetooth.PROP_INDICATE or Bluetooth.PROP_NOTIFY)): if ((char.properties()) & (Bluetooth.PROP_NOTIFY)): #below returns the expected uuid print('char uuid: {}'.format(char.uuid())) print('char instance: {}'.format(char.instance())) print('char properties: {}'.format(char.properties())) #line below fails with error: OSError: the requested operation failed print('char read: {}'.format(char.read())) conn.disconnect() break else: #print('ADV does not exist') time.sleep(0.050)
-
In case someone else comes along looking for a solution to this problem. Simply add this callback before the while loop:
def char_notify_callback(char): char_value = (char.value()) print("Got new char: {} value: {}".format(char.uuid(), char_value))
And update the char condition:
if ((char.properties()) & (Bluetooth.PROP_NOTIFY)): characteristic.callback(trigger=Bluetooth.CHAR_NOTIFY_EVENT, handler=char_notify_callback, arg=None)