Raspberry PiでWi-Fi & BluetoothアダプターBlueBeach RTL8723BUを使う

Raspberry Pi(初代のType B)はUSB端子が2つ(Type Aは1つ)しかなく,Wi-FiBluetoothでそれぞれ1台ずつUSBアダプターを用意するとしたら,USBハブがないとすべてのUSBポートが埋まってしまう.そこでAmazon.co.jpAmazon.comで探し当てたのが以下のUSBドングルで,少し探した限りでは最安の1,199円!

ただこのアダプターはRaspberry Piに挿しただけでは無線LANは動かない*1シロモノで,ドライバー(ローダブルカーネルモジュール)ことkoファイルの作成が必要です.

やはり先人はいらっしゃるもので,既にGitHubに一式ありました.手順は以下のとおりです(不足している情報があればコメントいただければと思います).
※以下の手順を実施したバージョン等は以下のとおり:

pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.4 (stretch)
Release:	9.4
Codename:	stretch
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.14.70+ #1144 Tue Sep 18 17:20:50 BST 2018 armv6l GNU/Linux

 
1. まず作業の前に更新

pi@raspberrypi:~ $ sudo apt update
pi@raspberrypi:~ $ sudo apt upgrade
pi@raspberrypi:~ $ sudo reboot

 
2. lwfinger氏の最新ドライバーの取得

cd ~/
git clone https://github.com/lwfinger/rtl8723bu.git

 
3. MakefileをRaspbian用に変更

pi@raspberrypi:~ $ cd rtl8723bu/
pi@raspberrypi:~ $ nano Makefile

Ctrl+Wをして(nanoエディターでの検索操作)CONFIG_PLATFORM_I386_PC =を検索して,

CONFIG_PLATFORM_I386_PC = y

と記載されているところを

CONFIG_PLATFORM_I386_PC = n
CONFIG_RASPBIAN = y

にしてRaspbian用のビルドオプションとします.
次に再度Ctrl+Wをしてifeq ($(CONFIG_BT_COEXIST)を検索して,ヒットした行の上に

ifeq ($(CONFIG_RASPBIAN), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211
EXTRA_CFLAGS += -DRTW_USE_CFG80211_STA_EVENT # only enable when kernel >= 3.2
EXTRA_CFLAGS += -DCONFIG_P2P_IPS
ARCH := arm
CROSS_COMPILE := arm-linux-gnueabihf-
KVER := $(shell uname -r)
KSRC ?= /lib/modules/$(KVER)/build
MODULE_NAME := 8723bu
MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
endif

を記載します.
ここまでの操作でビルド準備は整っていますが,このままビルドするとステーションモードおよびアクセスポイントモード両方で動くものができあがってしまう*2ので,Raspberry Pi無線LANルーターなどに接続するのであればステーションモードだけでよいので,Ctrl+WをしてCONFIG_CONCURRENT_MODEを検索して

EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE

と有効になっているオプションを

#EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE

として無効にして,Ctrl+X(nanoエディターの終了操作)の後,Yを押して書き込んでnanoエディターを終了させます.

 
4. 管理者(管理者権限)でのビルド

pi@raspberrypi:~/rtl8723bu $ sudo -i
root@raspberrypi:~# cd /home/pi/rtl8723bu/
root@raspberrypi:/home/pi/rtl8723bu# make && make install

とすることで,ビルドとインストールを実施します.どれくらい時間がかかるか不明ですが,寝る前に実行すると間違いないです.この後,再起動すると無事にwlan0として認識されて使用できます.
 
5. アクセスポイントの設定

pi@raspberrypi:~ $ wpa_passphrase "AP-NAME" "PASSPHRASE" | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf

として,パスフレーズPASSPHRASEを暗号化しつつ,アクセスポイントのSSIDパスフレーズをwpa_supplicant.confに書き込みます.

pi@raspberrypi:~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

として,確認するとwpa_supplicant.confは

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
        ssid="AP-NAME"
        #psk="PASSPHRASE"
        psk=任意の文字列
}

というように記述が追記されていると思います.ここで,私の場合はSSIDをステルスで運用していますので,scan_ssid=1を追記するとともに,元々の暗号化前のパスフレーズは残しておく必要がないので以下のように記載して,再起動することで無事に無線LANルーターと接続できました.

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
        ssid="AP-NAME"
        scan_ssid=1
        psk=任意の文字列
}

 
6. Bluetoothの構成とファームウェアのバイナリーのコピー(2018/10/11追記)
上記までの5つのステップで無線LANはwlan0として機能するが,Bluetoothバイスを追加するとwlan0が正常に動かなくなる*3(2018/10/11確認).
したがって,Bluetoothのバイナリーファイル(configとfw)をコピーする必要があり,これもlwfinger氏のgithubから取得し,特定のディレクトリーにそれらをコピーして再起動する.

pi@raspberrypi:~ $ git clone https://github.com/lwfinger/rtl8723au_bt.git
pi@raspberrypi:~ $ cd rtl8723au_bt/Linux_BT_USB_2.11.20140423_8723BE/8723B
pi@raspberrypi:~ $ sudo cp rtl8723b_config /lib/firmware/rtl_bt/rtl8723b_config.bin
pi@raspberrypi:~ $ sudo cp rtl8723b_fw /lib/firmware/rtl_bt/rtl8723b_fw.bin

参考Webページ(URLのみ):

  1. http://matthewdippel.blogspot.com/2016/02/howto-build-rtl8723bu-for-raspbian.html
  2. https://github.com/lwfinger/rtl8723bu/issues/41
  3. http://www.atmarkit.co.jp/ait/articles/1601/23/news008.html
  4. https://github.com/lwfinger/rtl8723bu/issues/20
  5. https://raspmer.blogspot.com/2018/07/mantistek-wa150-wifibluetooth-rtl8723bu.html

*1:Bluetoothは認識されているが,Bluetoothのバイナリーも差し替えないとBluetoothバイス追加後無線LANが正常に動かなくなる(wlan0は認識され,既存のアクセスポイントの存在はわかっているが自動で接続しない.).

*2:wlan0とwlan1の2つが認識され,どちらかがステーションモードでもう一方がアクセスポイントモードになる.

*3:一度downしてupするとつながることがあった.