Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    WIPY 3.0 can't read device NOTIFY characteristic

    Scheduled Pinned Locked Moved WiPy 2&3
    wipy 3.0propnotifyble
    2 Posts 1 Posters 581 Views 1 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • L Offline
      LukeHally
      last edited by

      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)
      
      1 Reply Last reply Reply Quote 0
      • L Offline
        LukeHally
        last edited by

        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)
        
        1 Reply Last reply Reply Quote 0

        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
        • 1 / 1
        • First post
          Last post

        Pycom on Twitter

        Pycom