Search code examples
pythonbluetoothraspberry-pibluetooth-lowenergyraspbian

Running a bluepy scan script on boot on a Raspberry Pi 3b


Good day. I am using a Raspberry Pi 3 model B running Raspbian Stretch. I have a Python script named bluepyscanner.py which is basically a Python 3 variation of the bluepy scanner sample code with a small addition for a .txt log file.

from bluepy.btle import Scanner, DefaultDelegate

class ScanDelegate(DefaultDelegate):
    def __init__(self):
        DefaultDelegate.__init__(self)

    def handleDiscovery(self, dev, isNewDev, isNewData):
        if isNewDev:
            print("Discovered device", dev.addr)
        elif isNewData:
            print("Received new data from", dev.addr)

scanner = Scanner().withDelegate(ScanDelegate())
devices = scanner.scan(10.0)

for dev in devices:
    print("Device {} ({}), RSSI={} dB".format(dev.addr, dev.addrType, dev.rssi))
    for (adtype, desc, value) in dev.getScanData():
        print("  {} = {}".format(desc, value))
        with open('bluepyscanlog.txt', 'a') as the_file:
            the_file.write("{}={}\n".format(desc, value))

I can run this script perfectly when I launch it from terminal with

$ sudo python3 /home/pi/bluepyscanner.py 

However, I am somehow unable to get this script to run automatically on boot. I have tried the following three methods separately and none has worked so far:

  1. rc.local (https://www.raspberrypi.org/documentation/linux/usage/rc-local.md): I appended the following line to /etc/rc.local

    python3 /home/pi/bluepyscanner.py

  2. Cron (https://www.raspberrypi.org/documentation/linux/usage/cron.md): I used the Cron GUI and added a recurring task to be launched "at reboot"

    sudo python3 /home/pi/bluepyscanner.py

  3. systemd (https://www.raspberrypi.org/documentation/linux/usage/systemd.md): I followed the instructions on the linked documentation page with main.py replaced by my bluepyscanner.py and the working directory replaced by /home/pi

Can anyone give me a pointer on what might have gone wrong? Bluetooth is enabled and bluepy is installed in accordance with this. I don't think the script has run because, unlike when ran from terminal, bluepyscanlog.txt was not created.

Thank you in advance for your time.


Solution

  • Please make these changes into your script

    ...
     with open('/home/pi/bluepyscanlog.txt', 'a+') as the_file:
    ...
    

    and make the proper changes in your /etc/rc.local

    sudo python3 /home/pi/bluepyscanner.py
    

    May be you can see previous copies of bluepyscanlog.txt at / If this doesn't do the job bluetooth service may be starting after rc.local is executed. Do this modifications in your /etc/rd.local as sudo

    ....
    sudo service bluetooth start
    sudo python3 /home/pi/bluepyscanner.py > /home/pi/bb.log
    
    exit 0
    

    Ensure that exit 0 is the last command in the file. If you created rc.local manually ensure it gets execution rights.

    sudo chmod +x /etc/rc.local
    

    You will see that your script is being executed. In my raspberry these are the contents of bb.log

    Discovered device d2:xx:XX:XX:XX:XX
    Device d2:xx:XX:XX:XX:XX (random), RSSI=-62 dB
      Flags = 06
      0x12 = 08001000
      Incomplete 128b Services = xxxxxxxxxxxxxxxxxxxxxxxxx
      16b Service Data = xxxxxxxxxxxxxx
      Complete Local Name = xxxxxxxxxxx
      Tx Power = 05
    

    (Xs mask original content)