Home

Awesome

Bluetooth Network Access Point for Raspberry Pi

Introduction

Bluetooth allows classical networking (TCP/IP). Although the throughput is limited, it has a number of advantages, like low power consumption. One drawback is that it does not work out of the box, it needs some additional packages and the configuration is not simple.

This project mainly collects and combines files and code-snippets I found in the internet to provide an easy to install version of a bluetooth network access point. It is targeted at Raspberry Pis running Raspbian Jessie, but it should also run on other flavors of Linux, as long as they provide a Bluez5 stack.

Architecture

Depending on your needs, you can choose to setup the system as a server, a client or a nap (network access point).

A server provides access to the system. This setup is the right choice if you are running a standalone system and want to query settings or control it e.g. from a browser. This is an ideal setup to use with smartphones and tablets (at least under Android), because once paired the smartphone/tablet will automatically use the bluetooth-connection for networking.

A client needs a second bluetooth-device to establish a connection. The second device must be a server or a nap. With this setup, you can provide an internet connection to a Pi (e.g. a Pi-Zero) using a second pi as a nap.

A nap is a special version of the server. It bridges incoming connections to an existing network interface (typically ethernet) and allows clients to transparently access the network. Depending on your network configuration, the nap itself can be invisible for the clients.

All the functionality is wrapped in a Systemd-service named btnap.service. For servers and naps, this service automatically configures a network bridge. For every incoming connection it creates a new bluetooth-based network interface bnepX and adds it to the bridge. The difference between the server and the nap is that the latter also adds an existing network interface to the bridge, so all connected clients will use that interface for access to the network. Depending on your needs, you could also configure routing from the bridge-device to an existing network device, but this setup is not directly supported by this project.

For clients, the btnap.service will just establish a connection to the provided remote bluetooth device.

Installation

To install, just run the following commands (on Raspbian Jessie-Lite you have to install git first):

git clone https://github.com/bablokb/pi-btnap
sudo pi-btnap/tools/install-btnap  server [ifname] | client

The argument to install-btnap selects the role of the system. If you select the server role and provide an interface name, the system will act as a network-access-point (it adds the interface to the bridge). You can change the role afterwards by editing /etc/btnap.conf (see the section Configuration below).

The scripts installs some additional packages needed by the python-script. It adds a template configuration file (/etc/btnap.conf) and it enables (but doesn't start) the btnap.service. You could edit the install script before installation and provide your own defaults for a number of variables, but it is better to change the generated configuration file.

There are some install-time only configuration options (e.g. additional installation of dnsmasq). Please check the install-script and change as needed.

Configuration

All configuration is done in the file /etc/btnap.conf:

MODE="server"             # values: server|client

# server configuration
BR_DEV="br0"                # bridge-device
BR_IP="192.168.20.99/24"    # IP of bridge/network-size
BR_GW="192.168.20.1"        # GW-IP for bridge
ADD_IF=""                   # add eth0 to convert the server to a nap

# client configuration
REMOTE_DEV=""           # MAC of remote BT nap server

DEBUG=""                # set to anything to enable debug-messages

If the bridge IP (variable BR_IP) is in the range of your home-network, btnap-clients can access your server even if in nap-mode.