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)
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login