Python with Bluetooth

I’m making another attempt to write a Python script that can list the paired Bluetooth devices.

Add library dependencies for gatt bluetooth protocol.

sudo apt-get install libperl-dev libgtk2.0-dev libboost-python-dev libboost-thread-dev libbluetooth-dev libglib2.0-dev python-dev

Install the Python BlueZ libraries.

sudo apt-get install python-bluez

That allows the Python BlueZ library to install.

sudo pip install PyBluez
sudo pip3 install PyBluez

Add the gattlib to support the gatt bluetooth protocol. Make sure all apps are closed as the `gattlib` setup scripts use a lot of memory and will not complete without sufficient RAM.

sudo pip install gattlib
sudo pip3 install gattlib

The [test-device python script] is able to list paired Bluetooth devices.

python test/test-device list

The org.freedesktop.DBus.Properties has a block of data on the PLT_Legend Bluetooth headset.

dbus.Dictionary({dbus.String(u’Name’): dbus.String(u’PLT_Legend’, variant_level=1), dbus.String(u’Paired’): dbus.Boolean(True, variant_level=1), dbus.String(u’Modalias’): dbus.String(u’bluetooth:v0055p0113d005D’, variant_level=1), dbus.String(u’Adapter’): dbus.ObjectPath(‘/org/bluez/hci0′, variant_level=1), dbus.String(u’LegacyPairing’): dbus.Boolean(False, variant_level=1), dbus.String(u’Alias’): dbus.String(u’PLT_Legend’, variant_level=1), dbus.String(u’Connected’): dbus.Boolean(False, variant_level=1), dbus.String(u’UUIDs’): dbus.Array([dbus.String(u’00001108-0000-1000-8000-00805f9b34fb’), dbus.String(u’0000110b-0000-1000-8000-00805f9b34fb’), dbus.String(u’0000110c-0000-1000-8000-00805f9b34fb’), dbus.String(u’0000110e-0000-1000-8000-00805f9b34fb’), dbus.String(u’0000111e-0000-1000-8000-00805f9b34fb’), dbus.String(u’00001200-0000-1000-8000-00805f9b34fb’), dbus.String(u’82972387-294e-4d62-97b5-2668aa35f618′)], signature=dbus.Signature(‘s’), variant_level=1), dbus.String(u’Address’): dbus.String(u’48:C1:AC:E2:21:A7′, variant_level=1), dbus.String(u’Blocked’): dbus.Boolean(False, variant_level=1), dbus.String(u’Class’): dbus.UInt32(2360324L, variant_level=1), dbus.String(u’Trusted’): dbus.Boolean(True, variant_level=1), dbus.String(u’Icon’): dbus.String(u’audio-card’, variant_level=1)}, signature=dbus.Signature(‘sv’))

Resources:
[bluez]
[pybluez]
[Android Linux / Raspberry Pi Bluetooth communication]
[bluetooth commands]

List paired bluetooth devices.

pi@raspberrypi:~/ $ bluetoothctl
[NEW] Controller B8:27:EB:05:8D:D8 raspberrypi [default]
[NEW] Device 48:C1:AC:E2:21:A7 PLT_Legend

Get device info from `bluetoothctl` console.

[bluetooth]# info 48:C1:AC:E2:21:A7
Device 48:C1:AC:E2:21:A7
 Name: PLT_Legend
 Alias: PLT_Legend
 Class: 0x240404
 Icon: audio-card
 Paired: yes
 Trusted: yes
 Blocked: no
 Connected: no
 LegacyPairing: no
 UUID: Headset (00001108-0000-1000-8000-00805f9b34fb)
 UUID: Audio Sink (0000110b-0000-1000-8000-00805f9b34fb)
 UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
 UUID: A/V Remote Control (0000110e-0000-1000-8000-00805f9b34fb)
 UUID: Handsfree (0000111e-0000-1000-8000-00805f9b34fb)
 UUID: PnP Information (00001200-0000-1000-8000-00805f9b34fb)
 UUID: Vendor specific (82972387-294e-4d62-97b5-2668aa35f618)
 Modalias: bluetooth:v0055p0113d005D

Bluetooth – Installing and Using Bluetooth on the Raspberry Pi

Experimental

[jessie-backports] [issue]

Edit the deb sources list.

/etc/apt/sources.list.d/raspi.list

Add jessie-backports to the `raspi.list` by adding the following line to the file.

deb http://ftp.debian.org/debian jessie-backports main

Suppress the public key warnings.

gpg --keyserver pgpkeys.mit.edu --recv-key 8B48AD6246925553
gpg -a --export 8B48AD6246925553 | sudo apt-key add -

gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010
gpg -a --export 7638D0442B90D010 | sudo apt-key add -

Update apt-get.

sudo apt-get update

Install the bluetooth manager

Upgrade the packages.

sudo apt-get upgrade

Install `blueman`.

sudo apt-get -t jessie-backports install bluetooth blueman bluez python-gobject python-gobject-2 pulseaudio-module-bluetooth

Turn on bluetooth device on boot

If you require turning on your bluetooth device at boot time automatically, for instance when you require keyboard / mouse support. You can add a udev rule to enable that. Additionally, you need to make sure you have the package bluez-utils installed.

Create `/etc/udev/rules.d/50-bluetooth-hci-auto-poweron.rules` with the following content.

ACTION=="add", SUBSYSTEM=="bluetooth", KERNEL=="hci[0-9]*", RUN+="/bin/hciconfig %k up"

Use pavucontrol to configure pulse audio

[pavucontrol] is a GUI front-end for [PulseAudio].

sudo apt-get -t jessie-backports install pavucontrol

[blueman-project] [issue]
[enable analog out]
[Bluetooth – Installing and Using Bluetooth on the Raspberry Pi]
[Installing the Raspberry Pi Nano Bluetooth Dongle]

pi@raspberrypi:~/Documents/PythonScripts/Microphone $ bluetoothctl 
[NEW] Controller B8:27:EB:22:51:00 raspberrypi [default]
[NEW] Device 48:C1:AC:E2:21:A7 PLT_Legend
[bluetooth]# quit
pi@raspberrypi:~/Documents/PythonScripts/Microphone $ sudo l2ping -c 1 48:C1:AC:E2:21:A7
Ping: 48:C1:AC:E2:21:A7 from B8:27:EB:22:51:00 (data size 44) ...
16 bytes from 48:C1:AC:E2:21:A7 id 0 time 8.55ms
1 sent, 1 received, 0% loss
pi@raspberrypi:~ $ arecord -l
**** List of CAPTURE Hardware Devices ****

Windows IoT Core Insider Preview for Raspberry Pi 3

[Windows 10 IoT Core – The operating system built for your Internet of Things]

[Windows IoT Core Walkthrough]

Raspberry PI has two Windows IoT compatible Bluetooth dongles.

  • CSR Mini USB Bluetooth V4.0 Adapter – Class 2 Bluetooth 4.0 Smart Ready Adapter, low energy, dual power
  • ORICO BTA-403 Mini Bluetooth 4.0 USB Dongle – Low Energy Bluetooth 4.0 Adapter USB Micro Adapter Dongle [verified compatible]
  • [Download Windows 10 IoT Core Insider Preview]

    Download Windows 10 IoT Core Insider Preview – Build 16193 for RPI3 so that [Xamarin Forms BluetoothLE samples] work.

    The Windows 10 IoT Core files are installed under C:\Program Files (x86)\Microsoft IoT.

  • Build 14366 – Flashing the RPI2 build works on RPI3
  • The Windows IoT install creates a default user of `administrator` and default password of `p@ssw0rd`.
  • [Windows Insider Program]
    [Get Started]
    [Setup Visual Studio for IoT]
    [Enable your device for development]
    [Windows IoT Remote Client]
    [IoT Documentation and Samples]
    [Get started with your first Hello World IoT Windows Core App]
    [BTLE Samples]
    [Pairing a BLE Device and GATT Attribute Table Dump Tool]
    [How to: Enable Debugging of Unmanaged Code] (unfortunately Windows IoT Core doesn’t support debugging mixed mode yet…)
    [Audio Recorder App on Windows 10 IoT Core]
    [Bluetooth Programming with Windows Sockets]
    [Universal Windows app samples]

    Windows IoT Core provides a web interface accessible from the browser on port 8080. I.e. http://192.168.1.194:8080.

    Interesting Reads From First Week of June 2016

    [Google’s new tools let anyone create art using AI]
    [Intel’s new consumer head dreams of building J.A.R.V.I.S.]
    [Hubble shows the universe is expanding faster than we thought]
    [Microsoft has just what VR needs]
    [Why gaze tracking startup Cogisen is eyeing the Internet of Things]
    [The barbell effect of machine learning]
    [Artificial intelligence is changing SEO faster than you think]
    [Ericsson: IoT connections will crush mobile by 2018]

    Python Get Sunrise and Sunset

    Install the `astral` Python package.

    sudo pip install astral
    

    Display the sunrise and sunset.

    import datetime
    from astral import Location
    
    # Get sunrise and sunset for Monroe, WA
    l = Location()
    l.latitude = 47.887059
    l.longitude = -121.8792998
    l.timezone = 'US/Pacific'
    
    sunrise = l.sun()['dawn']
    sunriseHour = sunrise.strftime('%H')
    sunriseMinute = sunrise.strftime('%M')
    print 'sunrise hour='+str(sunriseHour)
    print 'sunrise minute='+str(sunriseMinute)
    
    sunset = l.sun()['sunset']
    sunsetHour = sunset.strftime('%H')
    sunsetMinute = sunset.strftime('%M')
    print 'sunset hour='+str(sunsetHour)
    print 'sunset minute='+str(sunsetMinute)
    

    Raspberry PI Set Time Zone

    After setting the time zone from the terminal, the Raspberry PI will report the correct time given an Internet connection.

    sudo dpkg-reconfigure tzdata
    

    The following code can read and print the hours, minutes, and seconds.

    import datetime
    
    hours = datetime.datetime.now().strftime('%H')
    minutes = datetime.datetime.now().strftime('%M')
    seconds = datetime.datetime.now().strftime('%S')
    print 'hours='+hours+' minutes='+minutes+' seconds='+seconds