はじめに
Androidスマートフォンを、QualcommのRmNetインターフェースを介し、LinuxでQMI制御のWWANデバイスとして認識させ、インターネット接続できるようにする方法を記載します。
AndroidのRILを切り離す方法を見つけるのにだいぶ苦労したので、誰かの役に立てばと思います。
RNDISでUSBテザリングするのが一番手っ取り早いですが
- root権限を取得した環境で操作を誤ると、端末が文鎮化したり、モデムが故障するおそれがあります。
- RILデーモンを停止している間は緊急通報を含む通話の発着信が不可能となるので、使用後に必ずRILデーモンを起動するか、端末を再起動してください
手順
環境
- moto g53y 5G (XT2335-4) (root化済)
- Debian 13 (ADB導入済み)
流れとしては、まずAndroid側でRILデーモンを停止します。するとモデムを外部から自由に操作できるようになるので、RmNetインターフェース経由でModemManagerを使用してインターネットに接続します。
1. USB接続モードを変更する
RmNetインターフェースを認識させるために、USB接続モードを変更します。
hoge@debian:~$ adb shell su -c 'setprop sys.usb.config diag,serial_cdev,rmnet,adb'
qmi_wwanモジュールが当たっているUSBデバイスと/dev/cdc-wdm0が存在していたらOKです。
hoge@debian:~$ lsusb
...
Bus 003 Device 037: ID 05c6:9091 Qualcomm, Inc. Intex Aqua Fish & Jolla C
...
hoge@debian:~$ lsusb -t
...
/: Bus 003.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/12p, 480M
|__ Port 001: Dev 037, If 0, Class=Vendor Specific Class, Driver=[none], 480M
|__ Port 001: Dev 037, If 1, Class=Vendor Specific Class, Driver=[none], 480M
|__ Port 001: Dev 037, If 2, Class=Vendor Specific Class, Driver=qmi_wwan, 480M
|__ Port 001: Dev 037, If 3, Class=Vendor Specific Class, Driver=usbfs, 480M
...
hoge@debian:~$ ls -l /dev/cdc*
crw------- 1 root root 180, 0 Feb 9 22:31 /dev/cdc-wdm0
qmi_wwanモジュールが当たらない場合
qmi_wwanモジュールを読み込みます。
hoge@debian:~$ sudo modprobe qmi_wwan
hoge@debian:~$ lsmod | grep qmi
qmi_wwan 40960 0
cdc_wdm 32768 2 qmi_wwan
usbnet 65536 3 rndis_host,qmi_wwan,cdc_ether
usbcore 409600 15 usbserial,xhci_hcd,usbnet,btmtk,rndis_host,cdc_wdm,usb_wwan,uvcvideo,qmi_wwan,btusb,xhci_pci,cdc_ether,option
2. RILデーモンの停止
モデムを自由に操作できるようにするために、AndroidのRILデーモンを停止します。
RILデーモンを停止すると、Android側でインターネット接続と緊急通報を含む通話の発着信ができなくなります。
再びRILデーモンを起動するにはadb shell su -c 'start [RILデーモンのプロセス名]'を実行します。
RILデーモンのプロセス名はベンダーによって異なる可能性があります。getprop | grep rilでRILデーモンのプロセス名を特定します。
hoge@debian:~$ adb shell su -c 'getprop | grep ril'
[gsm.version.ril-impl]: [Qualcomm RIL 1.0]
[init.svc.vendor.qcrild]: [running]
[init.svc.vendor.qcrild2]: [running]
...
自分の環境では、vendor.qcrildとvendor.qcrild2がRILデーモンとして動いていました。
RILデーモンを停止します。
hoge@debian:~$ adb shell su -c 'stop vendor.qcrild'
hoge@debian:~$ adb shell su -c 'stop vendor.qcrild2'
hoge@debian:~$ adb shell su -c 'getprop | grep ril'
[gsm.version.ril-impl]: [Qualcomm RIL 1.0]
[init.svc.vendor.qcrild]: [stopped]
[init.svc.vendor.qcrild2]: [stopped]
3. モデムに接続する
NetworkManagerを使うのが一番簡単だと思います。自動でIPアドレスも振ってくれます。
予め、インターフェース名を確認しておきます。
hoge@debian:~$ mmcli -L
/org/freedesktop/ModemManager1/Modem/0 [QUALCOMM INCORPORATED] 0
hoge@debian:~$ mmcli -m 0 | grep ports
| ports: cdc-wdm0 (qmi), wwp0s20f0u1i2 (net)
まず、APNプロファイルを追加します(povo2.0の例)。
hoge@debian:~$ nmcli connection add con-name "povo2.0" type gsm ifname "*" apn povo.jp
Connection 'povo2.0' (ff6fe0c1-dbc1-4694-a6c8-ff96e1ef15d8) successfully added.
次に、cdc-wdm0インターフェースをアクティブにします。
hoge@debian:~$ nmcli device up cdc-wdm0
Device 'cdc-wdm0' successfully activated with 'ff6fe0c1-dbc1-4694-a6c8-ff96e1ef15d8'.
キャリア網からIPアドレスが振られ、インターネット通信ができるようになりました。
hoge@debian:~$ ip addr show wwp0s20f0u1i2
23: wwp0s20f0u1i2: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1440 qdisc fq_codel state UNKNOWN group default qlen 1000
link/none
inet 10.45.XXX.XX/30 brd 10.45.126.79 scope global noprefixroute wwp0s20f0u1i2
valid_lft forever preferred_lft forever
inet6 2001:268:98d0:7dce:XXXX:XXXX:XXXX:XXXX/64 scope global noprefixroute
valid_lft forever preferred_lft forever
hoge@debian:~$ curl v4.ident.me
106.146.XX.XX
hoge@debian:~$ curl v6.ident.me
2001:268:98d0:7dce:XXXX:XXXX:XXXX:XXXX
GUIからも確認できます。
おわりに
AndroidのRILデーモンを停止するのが肝です。RNDISと違って、RmNetはモデムを丸ごと制御できるので、セル情報など色々と検証しがいがありそうです。
今回はLinuxを使いましたが、ドライバーの問題が無ければ、Windowsでも使えそうです(未検証)。