2019-08-15 18:59:43 +02:00
|
|
|
# IPv6-over-BLE: Connecting Linux with RIOT using BLE
|
|
|
|
|
|
|
|
This README contains information how to establish an IPv6-over-BLE connection
|
|
|
|
between Linux and RIOT (using GNRC and NimBLE).
|
|
|
|
|
|
|
|
**NOTE 1:** IPv6-over-BLE between RIOT and Linux is **highly experimental** at
|
|
|
|
the moment and does suffer stability issues!
|
|
|
|
|
|
|
|
**NOTE 2:** Currently, Linux does not support 6LoWPAN neighbor discovery (which
|
|
|
|
RIOT uses per default with BLE), so RIOT needs to be compiled to use stateless
|
2020-03-12 14:04:20 +01:00
|
|
|
address auto configuration (SLAAC) -> `CFLAGS=-DCONFIG_GNRC_IPV6_NIB_SLAAC=1`.
|
2019-08-15 18:59:43 +02:00
|
|
|
|
|
|
|
## Prerequisites
|
|
|
|
|
|
|
|
You need a BLE (NimBLE) capable RIOT board (currently only `nrf52`-based boards
|
|
|
|
are supported), and a Linux host with at least Bluetooth 4.0 capabilities.
|
|
|
|
|
|
|
|
Any Linux distribution should do fine, however this guide was tested with the
|
|
|
|
following:
|
|
|
|
- Mint 18.3
|
|
|
|
- Kernel 4.15.0
|
|
|
|
- bluez 5.37
|
|
|
|
- [optional] radvd 2.11
|
|
|
|
|
|
|
|
|
|
|
|
## Preparing the RIOT node
|
|
|
|
|
|
|
|
First, you compile and flash the `examples/gnrc_networking` application to your
|
|
|
|
RIOT device. When doing this, make sure to enable SLAAC
|
2020-03-12 14:04:20 +01:00
|
|
|
(`CFLAGS=-DCONFIG_GNRC_IPV6_NIB_SLAAC=1`), see note above.
|
2019-08-15 18:59:43 +02:00
|
|
|
|
|
|
|
Once the firmware is running, you can verify it by typing
|
|
|
|
|
|
|
|
ble info
|
|
|
|
|
|
|
|
This should give you some information about your device's BLE address and
|
|
|
|
status information about open connections. It should look similar to the
|
|
|
|
following:
|
|
|
|
|
|
|
|
Own Address: UU:VV:WW:XX:YY:ZZ -> [FE80::UUVV:WWFF:FEXX:YYZZ]
|
|
|
|
Free slots: 3/3
|
|
|
|
Advertising: no
|
|
|
|
Contexts:
|
|
|
|
[ 0] state: 0x8000 - unused
|
|
|
|
[ 1] state: 0x8000 - unused
|
|
|
|
[ 2] state: 0x8000 - unused
|
|
|
|
|
|
|
|
Once this is working, you need to tell the node to accept incoming connections
|
|
|
|
and start advertising itself:
|
|
|
|
|
|
|
|
ble adv
|
|
|
|
|
2019-10-23 21:18:08 +02:00
|
|
|
That's it, the node can now be seen and connected to from Linux.
|
2019-08-15 18:59:43 +02:00
|
|
|
|
|
|
|
|
|
|
|
## Establishing a connection from Linux
|
|
|
|
|
|
|
|
### Preparing Linux
|
|
|
|
|
|
|
|
First of all, the Linux kernel needs to be configured to use 6lowpan over BLE.
|
|
|
|
This needs to be done only once per session and consists of the following steps:
|
|
|
|
|
|
|
|
# Log in as a root user (IMPORTANT, as the following steps will not work
|
|
|
|
# using explicit `sudo` for each step...)
|
|
|
|
sudo su
|
|
|
|
|
|
|
|
# Mount debugfs file system, already the case on many distributions
|
|
|
|
mount -t debugfs none /sys/kernel/debug
|
|
|
|
|
|
|
|
# Load 6LoWPAN module
|
|
|
|
modprobe bluetooth_6lowpan
|
|
|
|
|
|
|
|
# Enable the bluetooth 6lowpan module.
|
|
|
|
echo 1 > /sys/kernel/debug/bluetooth/6lowpan_enable
|
|
|
|
|
|
|
|
Next, we should verify that our Bluetooth device is configured properly:
|
|
|
|
|
|
|
|
# Look for available HCI devices.
|
|
|
|
hciconfig
|
|
|
|
|
2021-09-03 13:02:08 +02:00
|
|
|
This should show us some information about the available Bluetooth devices. If no
|
2019-08-15 18:59:43 +02:00
|
|
|
device is listed here, something is wrong...
|
|
|
|
|
|
|
|
|
|
|
|
### Connecting to the RIOT node
|
|
|
|
|
|
|
|
When connecting to the RIOT device, you need to know the BLE address of the
|
|
|
|
device. There are two ways to find out:
|
|
|
|
|
|
|
|
a) use `ble info` or `ifconfig` on the RIOT device directly and copy the address
|
|
|
|
|
|
|
|
b) use `bluetoothctl` on Linux to scan for the device. Once `bluetoothctl` has
|
|
|
|
started, issue `scan on` to start scanning. The default name for the RIOT
|
|
|
|
device is set to `RIOT-GNRC`, so you should see it pop up.
|
|
|
|
|
|
|
|
c) use `hcitool lescan` on the Linux host (older tool, predecessor of
|
|
|
|
`bluetoothctl`...)
|
|
|
|
|
|
|
|
Once you have the address, you simply connect Linux to RIOT using the following
|
|
|
|
command:
|
|
|
|
|
|
|
|
# Put your device address here...
|
|
|
|
# Note: the 2 after the address denotes a BLE public random address, default
|
|
|
|
# used by `nimble_netif`
|
|
|
|
echo "connect UU:VV:WW:XX:YY:ZZ 2" > /sys/kernel/debug/bluetooth/6lowpan_control
|
|
|
|
|
2019-10-23 21:18:08 +02:00
|
|
|
That's it, you now have a IPv6 connection to your RIOT node. You can verify this
|
2019-08-15 18:59:43 +02:00
|
|
|
using `ifconfig`, where something like the following should be visible:
|
|
|
|
|
|
|
|
bt0 Link encap:UNSPEC HWaddr 00-19-86-00-16-CA-00-00-00-00-00-00-00-00-00-00
|
|
|
|
inet6 addr: fe80::19:86ff:fe00:16ca/64 Scope:Link
|
|
|
|
UP RUNNING MULTICAST MTU:1280 Metric:1
|
|
|
|
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
|
|
|
|
TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
|
|
|
|
collisions:0 txqueuelen:1000
|
|
|
|
RX bytes:0 (0.0 B) TX bytes:1624 (1.6 KB)
|
|
|
|
|
|
|
|
You should also be able to ping your RIOT node. The devices link local address
|
|
|
|
is also printed when running `ble info` on your RIOT device.
|
|
|
|
|
|
|
|
# Substitute the actual device address,
|
2021-11-29 17:27:50 +01:00
|
|
|
ping fe80::uuvv:wwff:fexx:yyzz%bt0
|
2019-08-15 18:59:43 +02:00
|
|
|
|
|
|
|
Now everything should be fine :-)
|
|
|
|
|
|
|
|
|
|
|
|
## [optional] Distributing a routeable Prefix
|
|
|
|
|
2019-10-23 21:18:08 +02:00
|
|
|
You can use the Router Advertisement Daemon (`radvd`) in Linux to automatically
|
2019-08-15 18:59:43 +02:00
|
|
|
distribute prefixes in your BLE network. For the following, you need to make
|
|
|
|
sure that `radvd` is installed on your Linux host.
|
|
|
|
|
|
|
|
As a first step, we need to enable IPv6 forwarding in Linux:
|
|
|
|
|
2022-02-08 19:50:05 +01:00
|
|
|
sudo sysctl -w net.ipv6.conf.all.forwarding=1
|
2019-08-15 18:59:43 +02:00
|
|
|
|
|
|
|
Next, we configure `radvd` (`etc/radvc.conf`) by using a configuration like
|
|
|
|
this:
|
|
|
|
|
|
|
|
interface bt0
|
|
|
|
{
|
|
|
|
AdvSendAdvert on;
|
|
|
|
prefix 2001:db8::/64
|
|
|
|
{
|
|
|
|
AdvOnLink off;
|
|
|
|
AdvAutonomous on;
|
|
|
|
AdvRouterAddr on;
|
|
|
|
};
|
|
|
|
abro 2001:db8::zzyy:xxff:feuu:vvww
|
|
|
|
{
|
|
|
|
AdvVersionLow 10;
|
|
|
|
AdvVersionHigh 2;
|
|
|
|
AdvValidLifeTime 2;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
This will tell Linux to advertise the prefix `2001:db8::/64`. Do not forget to
|
|
|
|
substitute the suffix of global address given in the `abro` section
|
|
|
|
with the one of the BLE device on your Linux host.
|
|
|
|
|
|
|
|
**NOTE:** The `abro` section is needed as otherwise the RIOT node will discard
|
|
|
|
router advertisements, as it is in 6LN configuration
|
|
|
|
(see https://tools.ietf.org/html/rfc6775#section-4.3).
|
|
|
|
|
2019-10-23 21:18:08 +02:00
|
|
|
With this, simply (re-)start the daemon:
|
2019-08-15 18:59:43 +02:00
|
|
|
|
|
|
|
sudo service radvd restart
|
|
|
|
|
|
|
|
or
|
|
|
|
|
|
|
|
sudo systemctl restart radvd
|
|
|
|
|
2019-10-23 21:18:08 +02:00
|
|
|
Again, that's it. Your RIOT node should now have an address using the above
|
2019-08-15 18:59:43 +02:00
|
|
|
prefix assigned. Simply verify with `ifconfig` on the RIOT node.
|
|
|
|
|
|
|
|
Also you should be able to ping the RIOT node from Linux:
|
|
|
|
|
|
|
|
# make sure to use the actual devices address here...
|
2021-11-29 17:27:50 +01:00
|
|
|
ping -I bt0 2001:db8::uuvv:wwff:fexx:yyzz
|