85 lines
4.0 KiB
Markdown
85 lines
4.0 KiB
Markdown
Bumble Examples
|
|
===============
|
|
|
|
NOTE:
|
|
To run python scripts from this directory when the Bumble package isn't installed in your environment,
|
|
put .. in your PYTHONPATH: `export PYTHONPATH=..`
|
|
|
|
# `run_controller.py`
|
|
Run two virtual controllers, one connected to a soft device written in python with a simple GATT server, and the other connected to an external host.
|
|
|
|
## Running `run_controller.py` with a BlueZ host running on Linux.
|
|
|
|
In this configuration, a BlueZ stack running on a Linux host is connected to a Bumble virtual
|
|
controller, attached to a local link bus to a second, in-process, virtual controller, itself
|
|
used by a virtual device with a GATT server.
|
|
|
|
### Running with two separate hosts (ex: a mac laptop and a Linux VM)
|
|
In this setup, the virtual controllers and host run on a mac desktop, and the BlueZ stack on a Linux VM. A UDP socket communicates HCI packets between the macOS host and the Linux guest.
|
|
|
|
#### Linux setup
|
|
In a terminal, run `socat` to bridge a UDP socket to a local PTY.
|
|
The PTY is used a virtual HCI UART.
|
|
(in this example, the mac's IP address seen from the Linux VM is `172.16.104.1`, replace it with
|
|
the appropriate address for your environment. (you may also use a port number other than `22333` used here)
|
|
```
|
|
socat -d -d -x PTY,link=./hci_pty,rawer UDP-SENDTO:172.16.104.1:22333,bind=:22333
|
|
```
|
|
|
|
In the local directory, `socat` creates a symbolic link named `hci_pty` that points to the PTY.
|
|
|
|
In a second terminal, run
|
|
```
|
|
sudo btattach -P h4 -B hci_pty
|
|
```
|
|
|
|
This tells BlueZ to use the PTY as an HCI UART controller.
|
|
|
|
(optional) In a third terminal, run `sudo btmon`. This monitors the HCI traffic with BlueZ, which is great to see what's going on.
|
|
|
|
In a fourth terminal, run `sudo bluetoothctl` to interact with BlueZ as a client. From there, you can scan, advertise, connect, etc.
|
|
|
|
#### Mac setup
|
|
In a macOS terminal, run
|
|
```
|
|
python run_controller.py device1.json udp:0.0.0.0:22333,172.16.104.161:22333
|
|
```
|
|
|
|
This configures one of the virtual controllers to use a UDP socket as its HCI transport. In this example, the ip address of the Linux VM is `172.16.104.161`, replace it with the appropriate
|
|
address for your environment.
|
|
|
|
Once both the Linux and macOS processes are started, you should be able to interact with the
|
|
`bluetoothctl` tool on the Linux side and scan/connect/discover the virtual device running on
|
|
the macOS side. Relevant log output in each of the terminal consoles should show what it going on.
|
|
|
|
### Running with a single Linux host
|
|
In setup, both the BlueZ stack and tools as well as the Bumble virtual stack are running on the same
|
|
host.
|
|
|
|
In a terminal, run the example as
|
|
```
|
|
python run_controller.py device1.json pty:hci_pty
|
|
```
|
|
|
|
In the local directory, a symbolic link named `hci_pty` that points to the PTY is created.
|
|
|
|
From this point, run the same steps as in the previous example to attach the PTY to BlueZ and use
|
|
`bluetoothctl` to interact with the virtual controller.
|
|
|
|
|
|
# `run_gatt_client.py`
|
|
Run a host application connected to a 'real' BLE controller over a UART HCI to a dev board running Zephyr in HCI mode (could be any other UART BLE controller, or BlueZ over a virtual UART). The application connects to a Bluetooth peer specified as an argument.
|
|
Once connected, the application hosts a GATT client that discovers all services and all attributes of the peer and displays them.
|
|
|
|
# `run_gatt_server.py`
|
|
Run a host application connected to a 'real' BLE controller over a UART HCI to a dev board running Zephyr in HCI mode (could be any other UART BLE controller, or BlueZ over a virtual UART). The application connects to a Bluetooth peer specified as an argument.
|
|
The application hosts a simple GATT server with basic
|
|
services and characteristics.
|
|
|
|
# `run_gatt_client_and_server.py`
|
|
|
|
# `run_advertiser.py`
|
|
|
|
# `run_scanner.py`
|
|
Run a host application connected to a 'real' BLE controller over a UART HCI to a dev board running Zephyr in HCI mode (could be any other UART BLE controller, or BlueZ over a virtual UART), that starts scanning and prints out the scan results.
|