Bluetooth is a wireless protocol on the 2.4 GHz band that has traditionally been used in wireless devices.
Relevance in Project
Reasoning
Ultimately, I chose Bluetooth as the wireless protocol for this project for the following reasons:
- There is already a Bluetooth 5 chip on the Raspberry Pi 4B+ [1], the chosen MCU for this project gateway, which makes it faster and cheaper to start programming the gateway.
- BLE is used by many of the other industrial machine health monitoring products that were benchmarked before development started on this project, which implies there has been some level of success in using BLE in industrial environments in the past.
- Bluetooth 5 has a practical range of up to 60m, which is 4x higher than the Bluetooth 4 standard.
- Bluetooth 5 has a max speed of 2 MBps, which allows higher throughput and lower battery strain than previous versions (lower strain because the faster data rate allows the radio to be transmitting for less time).
- It is easy to find online community support for programming Bluetooth in Python (chosen language for the gateway).
- Simplicity Studio 5, the chosen tool suite for programming the sensor node MCU, has a really nice Bluetooth configuration toolkit, including many Bluetooth examples that serve as nice templates for new projects.
Alternatives to Bluetooth
Future researchers in this project may decide that Bluetooth 5 Low Energy is not meeting the needs for this project, and that they have the technical knowledge and skill to change it to something else. There are many alternatives to Bluetooth that I have explored and benchmarked in some depth in Wireless Protocols.
Start Here
These are the resources provided by Silicon Labs. They are comprehensive and include everything you need to start working on a BLE project.
- Silicon Labs bluetooth documentation - through documentations of everything BLE from hardware to the API.
- Silicon Labs bluetooth examples - made examples that use BLE.
Bluetooth Learning Resources
Bluetooth protocol is extensively documented online, although there is a learning curve to figuring out the particulars of how it works. Before you start coding, you should have at least some familiarity with the following concepts:
- The difference between a 'server' device and a 'client' device.
- Generic Attribute Profile (GATT), and what is meant by 'services' and 'characteristics' (and to a much lesser extent, 'descriptors').
- Different kinds of BLE events, such as advertisement, connection requests, notifications, requests, and - which events require acknowledgement, which ones
Here are suggested reads for building background information to use Bluetooth (specifically Bluetooth Low Energy, AKA BLE) in our application.
Silicon Labs Bluetooth Whitepapers
- UG103.14: Bluetooth® LE Fundamentals - Good starting point for learning about the BLE stack in Silicon Labs products and the architecture they've built for developers.
- UG118: Bluetooth® Profile Toolkit Developer's Guide - Great read for configuring the BLE stack in Simplicity Studio.
- Bluetooth Software API Reference Manual
Silcon Labs Examples
- Silabs Workshop on PRS, ADC and LDMA - Vid 4/4, which does a very nice job of explaining what Bluetooth events might look like in a Simplicity Studio application that sends sensor data to another device.
Other Great Resources
- Ellisys YouTube Bluetooth Video Series - This is a fairly detailed, high-level explanation of the BLE protocol. I recommend watching episodes 1 - 9 for our purposes.
- Bluetooth Standard 16-bit UUID Numbers - Gives a list of Universally Unique Identifier (UUID) values that correspond with standard services and characteristics. Useful for creating creating services and characteristics.
Important Term Cheat Sheet
Attribute Data OperationsPacket Type | Direction of Information | Response Required? | Project-specific Example |
---|---|---|---|
Commands | client -> server | No | Flash a status LED to identify the right device in a list. |
Requests | client -> server | Yes | Poll for data at a set interval. |
Responses (in response to a request) | server -> client | No | Data sent from the node. |
Notifications | server -> client | No | A "node battery-low" alarm. |
Indications | server -> client | Yes | Node asking for the time period of data to collect. |
Confirmation (in response to an indication) | client -> server | No | Gateway telling the node what time period to collect. |