LoPy stops detecting BLE advertisements
-
@papasmurph
Please report your findings here
https://github.com/pycom/pycom-micropython-sigfox/issues -
Same problem here , but solved it by perfoming a deepsleep beetween scans ( as deepsleep is acting like a reset).
I just finishing coding the same loop in C using ESP-IDF . will try it tomorow on a Generic ESP32 Board , will report here if i got the same bug . ( if not maybe that 's mean it's a Python Bug ) -
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 -
@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.
-
@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?:
Sincerely,
Duane -
@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.
-
@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.
-
@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. -
@stef That sounds promising. I'm now testing it continuously.
-
@papasmurph
Yes, BLE scan type has been changed toBLE_SCAN_TYPE_PASSIVEin 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) -
@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.
-
@papasmurph When this happens, neither is it possible to attach to the LoPy's WiFi access point. My code still runs though.
-
@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 binasciibluetooth = 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
` -
@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')
-
@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 -
@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!") -
@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 -
@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.
-
@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. -
@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.
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