nRF51 IoT SDK
 All Data Structures Functions Variables Typedefs Enumerations Enumerator Groups Pages
Connecting devices to the router

Use the following procedure to establish a connection between an nRF51 device and the Linux router. Depending on the Linux variant that you are using, the commands may differ slightly.

# Log in as a root user.
sudo su
# Mount debugfs file system.
mount -t debugfs none /sys/kernel/debug
# Load 6LoWPAN module.
modprobe bluetooth_6lowpan
# Set PSM channel as 0x23 (35).
echo 35 > /sys/kernel/debug/bluetooth/6lowpan_psm
# Look for available HCI devices.
hciconfig
# Reset HCI device - for example hci0 device.
hciconfig hci0 reset
# Read 00:AA:BB:XX:YY:ZZ address of the nRF51 device.
hcitool lescan
# Connect to the device.
echo "connect 00:AA:BB:XX:YY:ZZ 1" > /sys/kernel/debug/bluetooth/6lowpan_control
# Check if you have established a connection.
ifconfig
# Try to ping the device using its link-local address, for example, on bt0 interface.
ping6 -i bt0 fe80::2aa:bbff:fexx:yyzz
# Disconnect from the device.
echo "disconnect 00:AA:BB:XX:YY:ZZ" > /sys/kernel/debug/bluetooth/6lowpan_control
# Check if there are active connections left.
ifconfig

Some of the commands, like loading the 6LoWPAN module or setting the PSM value, can be called only once per Linux session. If you are not familiar with the required Linux commands, check the following sections for more information about each command.

Root access

Several of the commands require administrator credentials, so you should log in as a root user by issuing the sudo su command.

# Log in as root user.
sudo su
# Proceed with caution.

Bluetooth 6LoWPAN module initialization

Current versions of the Linux kernel provide support for 6LoWPAN in Bluetooth low energy in a stand-alone module. The module must be compiled and enabled. After initializing the module, you will have access to the essential debugfs files.

You must initialize the module after each reboot. Once initialized, you do not need to repeat the steps for each connection.

debugfs file system

In most Linux distributions, the debugfs file system is mounted to /sys/kernel/debug. However, Raspbian OS does not automatically mount the debugfs file system. Therefore, you must mount it manually before 6LoWPAN can use it:

# Mount debugfs file system.
mount -t debugfs none /sys/kernel/debug
# Check the contents of the folder.
ls /sys/kernel/debug

You must mount the debugfs file system once after every reboot. Alternatively, you can make the mount persistent by editing the /etc/fstab file.

6LoWPAN initialization

To initialize the 6LoWPAN module, you must first load it:

modprobe bluetooth_6lowpan

Next, set the Protocol Service Multiplexer number (PSM) in the module. It must be set to the PSM of the Internet Protocol Support Profile (IPSP), which is 0x23 in hex or 35 decimal.

To set the correct PSM number:

echo 35 > /sys/kernel/debug/bluetooth/6lowpan_psm

To verify that the module is indeed loaded:

lsmod | grep bluetooth_6lowpan

Bluetooth 6LoWPAN commands

To use 6LoWPAN communication, both a GAP connection and an L2CAP connection oriented channel must be established. You can control both of them by issuing the debugfs command 6lowpan_control. Use this command to connect a device to or disconnect it from the Linux router.

The parameters of this command are:

  • Command: for example "connect" or "disconnect"
  • Bluetooth Device Address (BDA): for example "00:AA:BB:XX:YY:ZZ"
  • Type of address: for example 1 (public address) or 2 (random static address)

To establish a 6LoWPAN connection:

echo "connect 00:AA:BB:XX:YY:ZZ 2" > /sys/kernel/debug/bluetooth/6lowpan_control
Note
On some Linux kernel versions, you might need to repeat this procedure several times to successfully establish a connection.

To disconnect a device from the router:

echo "disconnect 00:AA:BB:XX:YY:ZZ 2" > /sys/kernel/debug/bluetooth/6lowpan_control

HCI commands

HCI commands are used to configure Bluetooth devices. The device name hciX is assigned to the device installed in the system.

To display basic status information, for example, about interface type, BD address, MTU, and flags (up, running, ...):

hciconfig

To check that the Bluetooth device installed in the system has low-energy support:

hciconfig hciX lestates

To reset the HCI device hciX (to ensure that it is cleared before starting):

hciconfig hciX reset

To discover all advertising devices:

hcitool lescan

Figure 1 displays an example of the output of the hcitool command.

hcitoollescan.png
Figure 1. Scan using hcitool.

To list all connected BLE devices:

hcitool con

Bluetooth 6LoWPAN commands

To use 6LoWPAN communication, both a GAP connection and an L2CAP connection oriented channel must be established. You can control both of them by issuing the debugfs command 6lowpan_control. Use this command to connect a device to or disconnect it from the Linux router.

The parameters of this command are:

  • Command: for example "connect" or "disconnect"
  • Bluetooth Device Address (BDA): for example "00:AA:BB:XX:YY:ZZ"
  • Type of address: for example 1 (public address) or 2 (random static address)

To establish a 6LoWPAN connection:

echo "connect 00:AA:BB:XX:YY:ZZ 1" > /sys/kernel/debug/bluetooth/6lowpan_control
Note
On some Linux kernel versions, you might need to repeat this procedure several times to successfully establish a connection. See Linux interfaces for information about how to check if the connection was established.

To disconnect a device from the router:

echo "disconnect 00:AA:BB:XX:YY:ZZ 1" > /sys/kernel/debug/bluetooth/6lowpan_control

Linux interfaces

You can use the ifconfig command to display and configure Linux network interfaces that are currently active. After successfully establishing a 6LoWPAN connection, you should see a newly added btX interface on the list.

To display all active network interfaces:

ifconfig

Specify an interface name (for example, bt0) to display information about that interface:

ifconfig bt0


ifconfig.png
Figure 2. Display information about the bt0 interface using ifconfig.

Ping devices

Communication between Linux and the device through IPv6 can use different types of protocols. One of these protocols is ICMPv6, which has diagnostic capabilities by sending and receiving echo request and echo response messages.

Use the IPv6 link-local address (see Creating link-local IPv6 addresses) to ping a specific device:

ping6 -I bt0 fe80::2AA:BBFF:FEXX:YYZZ


ping1.png
Figure 3. Ping6 command with a unicast address.

Send an echo request to an IPv6 multicast all nodes address to discover all devices that are currently attached to the router:

ping6 -I bt0 ff02::1

In this case, not only the device will respond, but also the btX interface itself.

ping2.png
Figure 4. Ping6 command with multicast all node address.

The device will only send an echo response message if the application supports it (for example, when using Nordic's stack).