Getting BLE to behave on the Pi
Finding the Peripheral
Simply finding and getting the BLE connection isn't always as simple as it first appears. In this section I'll look at how to verify that you are actually advertising something and what tools are available to work out what is really going on. Here is where things potentially get tricky and, judging from forums across the web, where many have come unstuck.
BLE browsing programs such as LightBlue for iOS [7] or Mac [8] allow you to search for nearby advertising devices, interrogate their characteristics and write to them. Prototyping and trying out ideas becomes easier because you can concentrate on the Raspberry Pi side of things and get that working before moving on to the app side.
Other browsing programs are available for other platforms, so look for something that allows you to browse through the BLE devices nearby and to interrogate their services and characteristics. In LightBlue, if you click scan
, a few seconds later a list of the devices near you pop up, hopefully including the one you are running on your Rasp Pi.
It's instructive to setup BLE advertising and scanning on a phone and desktop so you know what to expect. Assuming you have a desktop handy, try this: Install LightBlue on both your desktop and phone. Open LightBlue on your phone and set up a fake peripheral (Figure 1). With the peripheral advertising, open LightBlue on your desktop and scan. The peripheral will pop up, and you will be able to drill down into its services and characteristics (Figure 2). Once this is running you'll see this extra peripheral appear in the list, allowing you to see what's being advertised and therefore what any other devices scanning for this should expect.


This trick is very useful. A lot of the process of learning about BLE, is discovering what each side of the BLE connection should expect, and having a tool to scan for arbitrary devices is hugely useful.
Where Now?
BLE is a nice way to connect devices for automating your home, without the need to connect to WiFi – or to connect devices where WiFi or Internet connection might not be available. However, getting BLE running on a Raspberry Pi isn't always simple. Knowing the main concepts and debugging tools will save you hours (see the "BLE Concepts" and "Useful Tools" boxouts).
BLE Concepts
Although the following list isn't exhaustive, you should know the following terms before navigating the BLE options and to understand responses on forums.
- Central and Peripheral. The central is the device that scans for the peripherals, which should be advertising. For example, the central might be your phone and the peripheral your Fitbit wristband.
- Scanning. The central scans for peripherals but might only scan for peripherals advertising a certain service. You need to make sure the service being advertised and the service being scanned for match up.
- Services. Services are the way devices describe themselves and each service is a collection of characteristics, which are roughly analogous to properties of a class or fields in a database table.
Useful Tools
What happens when BLE communication doesn't work? Where are the logs? What should you try?
Know your debugging tools. The first thing to check is compatibility of the BLE dongle. You'll either get errors about not being able to write to the device or just get nothing back from if it's not BLE compatible. I encourage you to research the device before buying.
On the Raspberry Pi you can run the hcidump
tool installed earlier. This monitors the BLE status and reports on all advertising and each connection made. To use it, run
hcidump -X
in one terminal on the Raspberry Pi. In another terminal, start up your BLE advertising script, such as
sudo node ble-peripheral.js
which dumps the activity.
This tool is useful when a central isn't connecting to the peripheral and you can't work out at what point the failure is occurring. The output of hcidump
shows you how far in the advertising, interrogating, and pairing process you got and will help find out at what point things break. In such cases, this log might report what point you've reached.
The rfkill
command is worth checking out because sometimes the BLE capability will be disabled on the Raspberry Pi, blocking all activity. To use this, run rfkill
, which shows which are blocked:
# rfkill list 0: hci0: Bluetooth Soft blocked: no Hard blocked: no 1: phy0: Wireless LAN Soft blocked: no Hard blocked: no
Although specifically for bleno, adding the following options to the command line provides more output, which is also helpful. Remember you're looking for the BLE to start advertising and, if it does, for a connection to be attempted:
sudo DEBUG=hci-blue,l2cap-ble node test2.js
Infos
- Bluetooth developer portal: https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
- heimcontrol.js: http://ni-c.github.io/heimcontrol.js
- Controlling a lamp: http://developer.radiusnetworks.com/2014/04/27/how-to-make-a-raspberry-pi-turn-on-a-lamp-with-an-ibeacon.html
- NOOBS: http://www.raspberrypi.org/documentation/installation/noobs.md
- bleno on GitHub: https://github.com/sandeepmistry/bleno
- noble on GitHub: https://github.com/sandeepmistry/noble
- LightBlue for iOS: https://itunes.apple.com/us/app/lightblue-bluetooth-low-energy/id557428110?mt=8
- LightBlue for Mac: https://itunes.apple.com/us/app/lightblue/id639944780?mt=12
« Previous 1 2 3 Next »
Buy this article as PDF
Pages: 6
(incl. VAT)