海外製端末上でネットワークが動いているデモを日本国内で公に見せることができなくなるので、回避するには以下の方法が考えられる。
- 海外のSIMを差してローミングと言い張って、グレ-な感じで逃げる
- 技適マークのとれた無線LANカードをMicroUSB経由で接続
- 有線LANカードをMicroUSB経由で接続
- MicroUSBと母艦PCを使って接続
ということで、これ用にUSB LANカードを買って調査しても、お金がかかるので(カーネルコンフィグ見ればどれが動くくらいはわかるけどさ)、MicroUSBケーブルを使って母艦PCのネットワーク経由でインターネットに接続する方法をとることにした。
Firefox OSと言っても内部のレイヤーはAndroidを流用しているのでそこらのノウハウをある程度使える。
用意するもの
- 母艦のLinux。Windowsでもいけると思うけど試してない。Linuxはなんでもいけるはず
- MicroUSBケーブル
- Android SDK。adbコマンドが必要なため。最近のUbuntuとかはadbコマンドを自分のレポジトリとかに持ってるからadbコマンドをすでにインストールしてる人はいらない
Firefox OS側のrndisを有効にする
rndisってのは、Androidガジェットドライバで実装されてるUSBネットワークインターフェイスのこと。Androidと同じようにsetpropコマンドでこれを有効にするadb shell setprop sys.usb.config 'rndis,adb'なお、リモートデバッグを有効にしないとadbコマンドは使えない。
ネットワークの設定
IPアドレスを10.1.2.3にするのであれば、以下のようにするadb shell ifconfig rndis0 10.1.2.3 netmask 255.255.255.0DNSの設定はsetpropで。面倒なのでGoogleのDNSサービスを設定する
adb shell setprop net.dns1 '8.8.8.8'ルーティングテーブルの追加も。母艦のIPアドレスを10.1.2.1とすると、
adb shell route add default gw 10.1.2.1 dev rndis0
オフライン自動認識をオフにする
ここだけはFirefox OS固有の話。無線LANとか3GのコネクションがないとGecko内部でオフラインと認識してしまうので、この自動認識をオフにする。これをオフにすると、offlineイベントとか使えなくなるので要注意。adbコマンドを使って、prefs.jsファイルを取得。<your profile>は各デバイス次第だけど、.defaultというSUFFIXがついているディレクトリのこと。
adb pull /data/b2g/mozilla/<your profile>/prefs.jsこのファイルに以下の行を追加
prefs("network.gonk.manage-offline-status", false);そして、それをアップロード
adb push prefs.js /data/b2g/mozilla/<your profile>/prefs.jsで再起動。
母艦側の設定
上記の設定を行うとAndroidガジェットドライバによって、母艦のLinux上ではusb0とかusb1とかデバイス名のネットワークデバイスが使えるようになる。なのでiptablesでNAT用のルールを書けば自ずと使えるんだけど、Ubuntuで/etc/network/interfaceに以下のような自動構成を書くのが自分の好み。allow-hotplug usb0 iface usb0 inet static address 10.1.2.1 netmask 255.255.255.0 network 10.1.2.0 broadcast 10.1.2.255 up iptables -A POSTROUTING -t nat -J MASQUERADE -s 10.1.2.0/24 up sysctl -w net.ipv4.ip_foward=1 up route add -host 10.1.2.3 down iptables -D POSTROUTING -t nat -J MASQUERADE -s 10.1.2.0/24このような自動構成を書いておけば、ifup usb0で設定が有効になって、ifdown usb0で設定が破棄される。
ということで、MicroUSBケーブル経由でネットワークが使えるようになった。