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

    LoPy stops detecting BLE advertisements

    Scheduled Pinned Locked Moved Issues & Bugs
    lopybluetoothblebeaconibeacon
    123 Posts 15 Posters 84.1k Views 14 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.
    • D Offline
      Duane Kaufman
      last edited by

      Hello,

      I recently started playing with my LoPy, and have a similar issue trying to harvest multiple advertisements at the same time.

      Using other BLE tools, I know I have three devices advertising within range, yet I only get data from one of them when using code like in the Example for 'bluetooth.resolve_adv_data(data, data_type)' in the PyCom documentation.

      In the Example code, how does one get a different advertising packet when calling bluetooth.get_adv()? Is it supposed to be simply chance timing that uncovers all of the device advertising that can be seen?

      As you can probably tell, I am also a BLE newbie!

      Thanks in advance!
      Duane

      papasmurphP 1 Reply Last reply Reply Quote 0
      • papasmurphP Offline
        papasmurph @Duane Kaufman
        last edited by

        @Duane-Kaufman I could detect multiple beacons. Note that they have to be kept apart to not interfere with each other. For each call to get_adv you get another advertisement from the queue, but the queue can only keep up to 8 values. Without any time.sleep (or at least very short), Python easily keeps up.

        D 1 Reply Last reply Reply Quote 0
        • D Offline
          Duane Kaufman @papasmurph
          last edited by

          @papasmurph Thanks for replying!

          I'll keep in mind the physical separation issue. a couple of mine were pretty close together (but their advertisements should have been pretty asynchronous)

          So, I should loop on get_adv until it returns None to exhaust it? I guess I never thought of that, but then again, the Example code should loop pretty fast on the get_adv call anyway?:

          link to Example code

          Sincerely,
          Duane

          papasmurphP 2 Replies Last reply Reply Quote 0
          • papasmurphP Offline
            papasmurph @Duane Kaufman
            last edited by

            @Duane-Kaufman I've noted that they can still completely "scramble" the communication. Yes, wait for None, and you should capture all if only the loop is fast enough.

            1 Reply Last reply Reply Quote 0
            • papasmurphP Offline
              papasmurph @Duane Kaufman
              last edited by

              @Duane-Kaufman I note that 1.7 works better in detecting pings, even though no enhancement was listed for this specifically. It remains to see if it ever stops scanning.

              S J D 3 Replies Last reply Reply Quote 0
              • S Offline
                stef @papasmurph
                last edited by

                @papasmurph
                Some BT enhancement have been listed on the official ESP32 board for the last framework version .
                My test with the last ESP Framework in C see no bug for BT detection even with more than 12h of scanning.
                Will flash one of my lopy with 1.7 and report here the result.
                Stéphane A.

                papasmurphP 1 Reply Last reply Reply Quote 0
                • papasmurphP Offline
                  papasmurph @stef
                  last edited by

                  @stef That sounds promising. I'm now testing it continuously.

                  1 Reply Last reply Reply Quote 0
                  • J Offline
                    jmarcelino @papasmurph
                    last edited by jmarcelino

                    @papasmurph
                    Yes, BLE scan type has been changed to BLE_SCAN_TYPE_PASSIVE in the latest build which should help with beacons (at the cost of losing the device name for devices which only return it after a SCAN_REQ query from an active scan)

                    papasmurphP 1 Reply Last reply Reply Quote 0
                    • papasmurphP Offline
                      papasmurph @jmarcelino
                      last edited by papasmurph

                      @jmarcelino Sadly, scanning (or detection) still stops though. After an hour or so get_adv stopped returning data, despite there being beacons close by that I hadn't moved. A hard reset got it started again.

                      papasmurphP 1 Reply Last reply Reply Quote 0
                      • papasmurphP Offline
                        papasmurph @papasmurph
                        last edited by

                        @papasmurph When this happens, neither is it possible to attach to the LoPy's WiFi access point. My code still runs though.

                        1 Reply Last reply Reply Quote 0
                        • D Offline
                          Duane Kaufman @papasmurph
                          last edited by

                          @papasmurph I think I might have a bad board, as I have not been able to get BLE to see devices I can detect with my phone around me. My code:

                          `from network import Bluetooth
                          import time
                          import binascii

                          bluetooth = Bluetooth()
                          bluetooth.init()

                          bluetooth.start_scan(20) # start scanning with 10s timeout
                          while bluetooth.isscanning():
                          time.sleep(1)
                          adv_list = []
                          adv_list = bluetooth.get_adv()
                          if adv_list != None:
                          for adv in adv_list:
                          print("Time: {0} adv.mac: {1}".format(time.time(), binascii.hexlify(adv.mac)))
                          else:
                          print("Time: {0} adv.mac: {1}".format(time.time(), "None"))
                          `
                          and I get:
                          MicroPython v1.8.6-607-g9c8a0e9e on 2017-05-01; LoPy with ESP32
                          Login as: micro
                          Password:
                          Login succeeded!
                          Type "help()" for more information.

                          import BLE_Raw
                          Time: 229 adv.mac: None
                          Time: 230 adv.mac: None
                          Time: 231 adv.mac: None
                          Time: 232 adv.mac: None
                          Time: 233 adv.mac: None
                          Time: 234 adv.mac: None
                          Time: 235 adv.mac: None
                          Time: 236 adv.mac: None
                          Time: 237 adv.mac: None
                          Time: 238 adv.mac: None
                          Time: 239 adv.mac: None
                          Time: 240 adv.mac: None
                          Time: 241 adv.mac: None
                          Time: 242 adv.mac: None
                          Time: 243 adv.mac: None
                          Time: 244 adv.mac: None
                          Time: 245 adv.mac: None
                          Time: 246 adv.mac: None
                          Time: 247 adv.mac: None
                          Time: 248 adv.mac: None`

                          Thanks for your review,
                          Duane
                          `

                          papasmurphP 1 Reply Last reply Reply Quote 0
                          • papasmurphP Offline
                            papasmurph @Duane Kaufman
                            last edited by papasmurph

                            @Duane-Kaufman get_adv returns a single tuple, not an array, so "for" doesn't make sense here. See the code I posted initially.

                            Example: (mac=b'\xb4\x99Lm\x80\xcd', addr_type=0, adv_type=0, rssi=-87, data=b'\x02\x01\x06\x03\x02\xf0\xff\x15\xffBH\xcd\x80mL\x99\xb4\xa2@\x10\x01\x00\x00\xff\xff\x0f\xff\xff\xff\x00\x00')

                            D 1 Reply Last reply Reply Quote 1
                            • D Offline
                              Duane Kaufman @papasmurph
                              last edited by

                              @papasmurph Thanks for looking this over. Changed code to this, but still no response:

                              import time
                              import binascii
                              
                              bluetooth = Bluetooth()
                              bluetooth.init()
                              
                              bluetooth.start_scan(20)    # start scanning with 10s timeout
                              while bluetooth.isscanning():
                              	time.sleep(1)
                              	adv_list = bluetooth.get_adv()
                              	if adv_list != None:
                              		print("Time: {0} adv.rssi: {1}".format(time.time(), adv.rssi))
                              	else:
                              		print("Time: {0} adv.mac: {1}".format(time.time(), "None"))```
                              
                              and I still get nothing :( as before
                              
                              Duane
                              papasmurphP 1 Reply Last reply Reply Quote 0
                              • papasmurphP Offline
                                papasmurph @Duane Kaufman
                                last edited by papasmurph

                                @Duane-Kaufman It works fine if you fix a few bugs. Well, at least it did for me.

                                from network import Bluetooth
                                import time
                                
                                bluetooth = Bluetooth()
                                bluetooth.init()
                                bluetooth.start_scan(20)
                                
                                while bluetooth.isscanning():
                                    adv_list = bluetooth.get_adv()
                                    if adv_list != None:
                                        print("Time: {0} adv.rssi: {1}".format(time.time(), adv_list.rssi))
                                
                                    time.sleep(0.05)
                                
                                print("I give up!")
                                
                                D 1 Reply Last reply Reply Quote 0
                                • D Offline
                                  Duane Kaufman @papasmurph
                                  last edited by

                                  @papasmurph Using your code (modified a little :):

                                  import time
                                  
                                  bluetooth = Bluetooth()
                                  bluetooth.init()
                                  bluetooth.start_scan(20)
                                  
                                  while bluetooth.isscanning():
                                      adv_list = bluetooth.get_adv()
                                      if adv_list != None:
                                          print("Time: {0} adv.rssi: {1}".format(time.time(), adv_list))
                                  
                                      time.sleep(1.0)
                                  
                                  print("I give up!")```
                                  
                                  I do not get anything (generally). Once in a great while, I will pick up one of the three BLE devices nearby, but probably only 1 in ten times I run the script.
                                  
                                  Duane
                                  papasmurphP 1 Reply Last reply Reply Quote 0
                                  • papasmurphP Offline
                                    papasmurph @Duane Kaufman
                                    last edited by

                                    @Duane-Kaufman I don't strictly see all advertisements either and after some time (randomly, but usually after an hour or so) it stops entirely, so something is wrong. In my own code I now use the event callback, which enables it to do other things in parallel, but it still happens though.

                                    1 Reply Last reply Reply Quote 0
                                    • R Offline
                                      RichardTXD @papasmurph
                                      last edited by

                                      @papasmurph
                                      Hi.
                                      I've been working on this, following your progress and the great community support - thanks. This is a show stopper for me if it can't be made to scan reliably 24/7.

                                      Have you made progress?

                                      I found that it just stops scanning early without an error message. I told it to scan for "-1" seconds = forever. I thought it was broken packets but I (currently) think that is wrong.

                                      I've been tinkering with your code. I found it sensitive to putting in a gc.collect() just before fetching a packet (device = bluetooth.get etc) - that made the difference between scanning for approx 1 minute to many minutes (still going after 10 and I must leave the office).
                                      Much more testing required.

                                      papasmurphP 1 Reply Last reply Reply Quote 0
                                      • papasmurphP Offline
                                        papasmurph @RichardTXD
                                        last edited by

                                        @RichardTXD With callback to an event handler it can work for an hour or so, but still eventually stops. It's time Pycom takes a look at it.

                                        S R 2 Replies Last reply Reply Quote 0
                                        • S Offline
                                          stef @papasmurph
                                          last edited by

                                          @papasmurph ,
                                          I confirm that , still stoping after time . nothing to do but reset.
                                          New firmware doesn't matter .

                                          1 Reply Last reply Reply Quote 0
                                          • R Offline
                                            RichardTXD @papasmurph
                                            last edited by

                                            @papasmurph
                                            I am Running WiPy 2.0 with latest firmware flashed yesterday.
                                            Windows 7 and Atom. I'm using an expansion board.
                                            I set my PC to not shutdown/go to sleep etc.

                                            Hi. There is also a concern with callback. I tried it also. Then I went back to a non-call back program. The callback was still triggering.
                                            It would appear that unless you press reset of the board, the callback lingers in memory.
                                            I would not be surprised at a difference. I'm guessing memory is deallocated when the callback is terminated and that may be at the heart of it all.

                                            @stef
                                            Hi. You are quite correct. It is unstable.
                                            I've seen different crashes depending on if garbage collection is done. If I don't garbage collect it seems to crash quicker - I will go back to testing that later.

                                            I'm still trying to get a feel for how and where it crashes but so far it seems random - a few hours to tens of minutes.

                                            I modded the program to tell me how many beacons were received. I have a lot of beacons in the office. I empty the queue on each iteration.

                                            I did 3 tests late yesterday.
                                            I set it to scan for -1 seconds = infinitely
                                            There is a garbage collection before each read of bluetooth into its variable.
                                            I press reset between each program run
                                            Test-1. It received 103,139 beacons and failed after about 2.5 hours
                                            Test-2. It received 17,094 beacons and failed - not all that long.
                                            Test-3. It received 31,945 beacons and failed.
                                            Each fail was the code hanging up. Stopped.
                                            I just now put in an elapsed seconds on the end of each result.
                                            The outer while loop repeats till it is not scanning. An inner loop empties the queue. I assume it was still scanning, yet nothing was received.

                                            Until we get past this issue, I can't ship product of course, same as others I suppose. I'm trying to think of a workaround.

                                            papasmurphP 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
                                            • 2
                                            • 3
                                            • 4
                                            • 5
                                            • 6
                                            • 7
                                            • 1 / 7
                                            • First post
                                              Last post

                                            Pycom on Twitter

                                            Pycom