mattintosh note

どこかのエンジニアモドキの備忘録

Raspberry Pi でワイヤレスディスプレイを作る

先日、ジャンクで良いディスプレイが手に入ったので長年使っていた Princeton PTFBHF-19W をメインPCから取り外した。デスクトップをメインに使っていた頃にデュアルディスプレイ環境用として2台同時購入して、ノートPCに切り替えてから1台余っていたが、これで2台とも余ってしまうことになった。

手放すのもなんとなくもったいないので Raspberry Pi 1 Model B+ を使って X Window System 用のワイヤレスディスプレイとして使うことにした。

(「ワイヤレスディスプレイ」と言うかどうかは怪しい)

環境

HW OS Interface
メイン 汎用機 Kubuntu Wired (1000Mbps)
AP Raspberry Pi 2 Model B+ Arch Linux ARM Wireless
Logitec LAN-WH300NU2 (RTL8192CU / 300Mbps)
X Window Server Raspberry Pi 1 Model B Arch Linux ARM Wireless
Planex GW-USNANO2A (RTL8188CUS / 150Mbps)

その前に、以前設定した hostapd の導入手順が若干間違っていたのでやり直した。

802.11b/g/n 系の無線LANアダプタで使われている Realtek RTL8192CU は純正の hostapd に対応していない。RealtekLinux 用ドライバのソースを公開しているので自前でコンパイルすればいいのだが、手を抜いてバイナリだけ拾ってきてしまった。そのため、純正の hostapd.conf の設定が RTL8192CU に適した状態になっていなかった。

Raspberry Pi 2 Model B 上で RTL8192CU 用のドライバをコンパイルする。ドライバは Realtek のページからダウンロードしてくる。

http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=4&PNid=48&PFid=48&Level=5&Conn=4&DownTypeID=3&GetDown=false&Downloads=true#2772

ダウンロードしたファイルを解凍する。ZIP なのが解せない。

unzip 0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip

なんか色々入っているが、とりあえず関連するのはこのあたりか。

RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911
└── wpa_supplicant_hostapd
    ├── rtl_hostapd_2G.conf
    ├── wpa_supplicant_hostapd-0.8_rtw_r7475.20130812
    │   └── hostapd
    │       ├── Android.mk
    │       ├── bsd_hostapd.conf
    │       ├── ChangeLog
    │       ├── config_file.c
    │       ├── config_file.h
    │       ├── ctrl_iface.c
    │       ├── ctrl_iface.h
    │       ├── defconfig
    │       ├── dump_state.c
    │       ├── dump_state.h
    │       ├── eap_register.c
    │       ├── eap_register.h
    │       ├── eap_testing.txt
    │       ├── hlr_auc_gw.c
    │       ├── hlr_auc_gw.milenage_db
    │       ├── hostapd.8
    │       ├── hostapd.accept
    │       ├── hostapd_cli.1
    │       ├── hostapd_cli.c
    │       ├── hostapd.conf
    │       ├── hostapd.deny
    │       ├── hostapd.eap_user
    │       ├── hostapd.radius_clients
    │       ├── hostapd.sim_db
    │       ├── hostapd.vlan
    │       ├── hostapd.wpa_psk
    │       ├── logwatch
    │       ├── main.c
    │       ├── Makefile
    │       ├── nt_password_hash.c
    │       ├── README
    │       ├── README-WPS
    │       ├── src -> ../src
    │       └── wired.conf
    └── wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz

階層を降りていく途中で RTL8192CU 用の hostapd.conf を拾う。もともとある hostapd.conf はバックアップ。パスがかなり長くなるので PS1 にフルパスを表示するようにしている場合は変更しておいた方が楽かもしれない。

mv /etc/hostapd/hostapd.conf{,.orig}
cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd
cp rtl_hostapd_2G.conf /etc/hostapd/hostapd.conf

デフォルトだと設定は以下のようになっているので使う環境に合わせて変更しておく。

  • SSID: rtwap
  • channel: 6
  • wpa_passphrase 87654321

hostapd を使用した簡単な方法で WiFi に強力な暗号化を実装する によれば、平文パスワードは計算負荷が高くなるため wpa_passphrase で暗号化鍵を生成し、そちらを使う方がよいそうだ。hostapd.confwpa_passphrase 行をコメントアウトして wpa_psk 行を追加する。(以下は例)

$ wpa_passphrase rtwap 87654321 | printf 'wpa_%s\n' `grep '[^#]psk'`
wpa_psk=65a918de53333a864d822976d8664f6661985c1cac62e1db628ea445233c5c73

さらに同じ階層にある TAR を解凍し、hostapd/ まで降りて make。Raspberry Pi 2 Model B でだいたい30秒くらい。

tar xf wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz
cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812
cd hostapd
make

もともとあったものをバックアップして出来上がったバイナリをインストールする。

mv /usr/bin/hostapd{,.orig}
mv /usr/bin/hostapd_cli{,.orig}
cp hostapd hostapd_cli /usr/bin

これで hostapd は最適な状態(?)になった。


wpa_supplicant は純正のバイナリで使用することができるが、そのままのドライバでは動作しないため /usr/lib/systemd/system/wpa_supplicant@.serviceExecStart 行に -Dwext を追加する。

[Unit]
Description=WPA supplicant daemon (interface-specific version)
Requires=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
Before=network.target
Wants=network.target

# NetworkManager users will probably want the dbus version instead.

[Service]
Type=simple
ExecStart=/usr/bin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I -Dwext

[Install]
Alias=multi-user.target.wants/wpa_supplicant@%i.service

あとは /etc/wpa_supplicant/wpa_supplicant-wlan0.conf を作成しておいて systemctl enable wpa_supplicant@wlan0 としておく。

network={
        ssid="rtwap"
        #psk="87654321"
        psk=65a918de53333a864d822976d8664f6661985c1cac62e1db628ea445233c5c73
}

んで、ようやく X Window Server の設定。

autologin にしておこうかなぁと思ったけど、X はとりあえず手動で立ち上げることにした。

普通に xinit としてしまうと /etc/X11/xinit/xserverrc によって -nolisten tcp になってしまう。

#!/bin/sh
exec /usr/bin/X -nolisten tcp "$@"

なので ~/.xserverrc としてコピーして TCP のリスニングを有効にしておく。

cp /etc/X11/xinit/xserverrc ~/.xserverrc
#!/bin/sh
exec /usr/bin/X -listen tcp "$@"

これで xinit とすれば6000番が開いた状態になる(netstat コマンドで確認する場合、--numeric-ports オプションがない場合は :x11 表記になるので grep 6000 とかやっても出てこない)。

$ netstat -t4 --listen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:x11                   *:*                     LISTEN

~/.xinitrc は最小限に DPMS の無効化と dwm のみ。ワイヤレスモニター的な感じで使う予定なので電源は手動で切るほうが都合がいい。

xset -dpms
xset s off
exec /usr/bin/dwm

ぼちぼち出来上がったので無線強度の確認。ディスプレイと Raspberry Pi 1 Model B を持って玄関へ。PC用の3ピンケーブル(?)って根本の部分から電源分岐とか出来たりしないですかねぇ。そうなると Raspberry Pi の電源確保が非常に楽なのだけど。使い道がなかったタッチパッド付きワイヤレスキーボードの使い道が出来たのはよかったかも。

Raspberry Pi 1 Model B 用の Google Chrome / Chromium は提供されていない(わけではないと思う)けど、メインマシンから呼び出しているので YouTube なんかも見れる。ただ、Google Chrome / Chromium は母艦で起動していると多重起動しないようになっているのでダミーのプロファイルディレクトリを --user-data-dir=/path/to/dir で適当に作成してあげる必要がある。

なんとなくキッチンのラックに置いてみた。艦これも Raspberry Pi では少々厳しいけど X86 マシンで実行しているので普通にプレイできる(快適に、とは言えないが)。

あとは VirtualBox とかも引っ張ってくれば Raspberry Pi で Windows XP やら Windows 7 を動かしたりも出来たり…(何でもアリやないか)。

Windows XP on #RaspberryPi ssh -X example.local vboxmanage startvm WinXP ╭( ・ㅂ・)و ̑̑

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -


何かの監視用モニターとして使いたいのだけど作業机が狭いのでいまのところはキッチンに…。壁掛けにしたいなぁ。