SORACOM Onyx LTE USB ドングル SC-QGLC4-C1がつながらない場合に試してみること

# はじめに
手元の RaspberryPi にて「[SORACOM Onyx LTE USB ドングル SC-QGLC4-C1](https://soracom.jp/store/7326/)」のセットアップを行ったところ、以下のエラーによりうまく認識されない現象がおきていました。

```
pi@raspberrypi:~ $ ifconfig ppp0
ppp0: インタフェース情報を取得中にエラーが発生しました: デバイスが見つかりません
```

試行錯誤の末原因が判明しましたので解決手順をまとめておきます。

なお公式のセットアップ手順はこちらに記載されてあるとおり。
[ガイド: Raspberry Pi \(Raspberry Pi OS\) の設定 \| SORACOM Onyx LTE USB ドングルをセットアップする \| SORACOM Users](https://users.soracom.io/ja-jp/guides/usb-dongles/soracom-onyx/raspberrypi/)

# 事前準備
公式のドキュメントに従い、SORACOM Onyx LTE USB ドングルを Raspberry Pi の USB ポートに差し込み、認識された状態にしておいてください。

```
pi@raspberrypi:~ $ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3
```

`setup_air.sh` を削除した、ダウンロードできていない方は公式ドキュメントの手順に従いダウンロードしておいてください。

## 解決手順
以下の3コマンドを順次実行すればOK!

```
sudo bash setup_air.sh uninstall
sudo bash setup_air.sh
sudo reboot
```

## 確認方法
RaspberryPi が再起動したらコンソールにログインし、`ifconfig ppp0`コマンドで接続確認できます。

```
pi@raspberrypi:~ $ ifconfig ppp0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1464
        inet 10.xxx.xxx.xxx  netmask 255.255.255.255  destination 10.64.64.64
        ppp  txqueuelen 3  (Point-to-Pointプロトコル)
        RX packets 26  bytes 2242 (2.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 31  bytes 1933 (1.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

`ping pong.soracom.io` コマンドにてSORACOMプラットフォームへの接続も確認できます。

```
pi@raspberrypi:~ $ ping pong.soracom.io
PING pong.soracom.io (100.127.100.127) 56(84) bytes of data.
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=1 ttl=64 time=43.2 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=2 ttl=64 time=56.7 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=3 ttl=64 time=54.8 ms
```

もしSORACOMプラットフォームへ接続できない場合は以下のようなレスポンスになりますので、うまく接続できていないことがわかります。

```
pi@raspberrypi:~ $ ping pong.soracom.io
PING pong.soracom.io (100.127.100.127) 56(84) bytes of data.
From 172.31.2.105 (172.31.2.105) icmp_seq=37 Packet filtered
From 172.31.2.105 (172.31.2.105) icmp_seq=294 Packet filtered
From 172.31.2.105 (172.31.2.105) icmp_seq=324 Packet filtered
```

# 原因について
手元の RaspberryPi では2021年1月頃により他の SORACOM USBドングルを使ってテストを行っていたことに起因するものでした。

先に SORACOM より提供されている、`setup_air.sh` にてセットアップして利用していたのですが、今回改めて SORACOM Onyx LTE USB ドングルを利用するにあたり、`setup_air.sh` の最新版をダウンロードして実行してもうまく動作しないことが判明しました。

## ルールファイルが更新されていなかった
原因は`setup_air.sh`にて作成される、USBデバイス接続時のルールファイル

```
/etc/udev/rules.d/30-soracom.rules
```

が古いままで、更新されていなかったためでした。
以下の通りルールファイルには最下行にOnyx用のルールが更新されていませんでした。

```
pi@raspberrypi:~ $ cat /etc/udev/rules.d/30-soracom.rules
# FS01BU
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1c9e", ATTRS{idProduct}=="98f                                                                             f", RUN+="/usr/sbin/usb_modeswitch -v 1c9e -p 98ff -M '5553424312345678000000008                                                                             0000606f50402527000000000000000000000'"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1c9e", ATTRS{idProduct}=="98f                                                                             f", RUN+="/bin/bash -c 'modprobe option && echo 1c9e 6801 > /sys/bus/usb-serial/                                                                             drivers/option1/new_id'"

 

KERNEL=="ttyUSB*", ATTRS{../idVendor}=="1c9e", ATTRS{../idProduct}=="6801", ATTR                                                                             S{bNumEndpoints}=="02", ATTRS{bInterfaceNumber}=="02", SYMLINK+="modem", ENV{SYS                                                                             TEMD_WANTS}="ifup@wwan0.service"

 

# AK-020
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="a403", RUN+="/usr/sbi                                                                             n/usb_modeswitch --std-eject --default-vendor 0x15eb --default-product 0xa403 --                                                                             target-vendor 0x15eb --target-product 0x7d0e"
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="7d0e", RUN+="/sbin/mo                                                                             dprobe usbserial vendor=0x15eb product=0x7d0e"

 

KERNEL=="ttyUSB*", ATTRS{../idVendor}=="15eb", ATTRS{../idProduct}=="7d0e", ATTR                                                                             S{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="02", SYMLINK+="modem", ENV{SYS                                                                             TEMD_WANTS}="ifup@wwan0.service"

 

# MS2131 or MS2372
ACTION=="add", ATTR{idVendor}=="12d1", ATTR{idProduct}=="14fe", RUN+="usb_modesw                                                                             itch '/%k'"
KERNEL=="ttyUSB*", ATTRS{../idVendor}=="12d1", ATTRS{../idProduct}=="1506", ATTR                                                                             S{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="00", SYMLINK+="modem", ENV{SYS                                                                             TEMD_WANTS}="ifup@wwan0.service"

 

# UX302NC-R
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="11f6", ATTRS{idProduct}=="103                                                                             5", RUN+="/usr/sbin/usb_modeswitch -v 11f6 -p 1035 -M '5553424312345678000000008                                                                             0000606f50402527000000000000000000000'"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="11f6", ATTRS{idProduct}=="103                                                                             4", RUN+="/bin/bash -c 'modprobe option && echo 11f6 1034 > /sys/bus/usb-serial/                                                                             drivers/option1/new_id'"

 

KERNEL=="ttyUSB*", ATTRS{../idVendor}=="11f6", ATTRS{../idProduct}=="1034", ATTR                                                                             S{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="01", SYMLINK+="modem", ENV{SYS                                                                             TEMD_WANTS}="ifup@wwan0.service"

 

# GH-UDG-MCLTE (modem mode only)
KERNEL=="ttyACM0", SUBSYSTEM=="tty", ATTRS{idVendor}=="1ecb", ATTRS{idProduct}==                                                                             "0202", SYMLINK+="modem", ENV{SYSTEMD_WANTS}="ifup@wwan0.service"
```

## ルールファイルを一度削除すれば良い

`setup_air.sh` には `uninstall`  オプションが用意されてあり、アンインストール時には、このルールファイルが削除されることがシェルスクリプトに書いてありましたので、アンインストール＆インストールを実行することで無事解決できました。


正しくインストールができていれば、最下行に`# FC-QGLC4-C0 (EG25-G) a.k.a. "Onyx"`の設定が追加されていることがわかります。

```
pi@raspberrypi:~ $ cat /etc/udev/rules.d/30-soracom.rules 
# FS01BU
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1c9e", ATTRS{idProduct}=="98ff", RUN+="/usr/sbin/usb_modeswitch -v 1c9e -p 98ff -M '55534243123456780000000080000606f50402527000000000000000000000'"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1c9e", ATTRS{idProduct}=="98ff", RUN+="/bin/bash -c 'modprobe option && echo 1c9e 6801 > /sys/bus/usb-serial/drivers/option1/new_id'"

KERNEL=="ttyUSB*", ATTRS{../idVendor}=="1c9e", ATTRS{../idProduct}=="6801", ATTRS{bNumEndpoints}=="02", ATTRS{bInterfaceNumber}=="02", SYMLINK+="modem", ENV{SYSTEMD_WANTS}="ifup@wwan0.service"

# AK-020
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="a403", RUN+="/usr/sbin/usb_modeswitch --std-eject --default-vendor 0x15eb --default-product 0xa403 --target-vendor 0x15eb --target-product 0x7d0e"
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="7d0e", RUN+="/sbin/modprobe usbserial vendor=0x15eb product=0x7d0e"

KERNEL=="ttyUSB*", ATTRS{../idVendor}=="15eb", ATTRS{../idProduct}=="7d0e", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="02", SYMLINK+="modem", ENV{SYSTEMD_WANTS}="ifup@wwan0.service"

# MS2131 or MS2372
ACTION=="add", ATTR{idVendor}=="12d1", ATTR{idProduct}=="14fe", RUN+="usb_modeswitch '/%k'"
KERNEL=="ttyUSB*", ATTRS{../idVendor}=="12d1", ATTRS{../idProduct}=="1506", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="00", SYMLINK+="modem", ENV{SYSTEMD_WANTS}="ifup@wwan0.service"

# UX302NC-R
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="11f6", ATTRS{idProduct}=="1035", RUN+="/usr/sbin/usb_modeswitch -v 11f6 -p 1035 -M '55534243123456780000000080000606f50402527000000000000000000000'"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="11f6", ATTRS{idProduct}=="1034", RUN+="/bin/bash -c 'modprobe option && echo 11f6 1034 > /sys/bus/usb-serial/drivers/option1/new_id'"

KERNEL=="ttyUSB*", ATTRS{../idVendor}=="11f6", ATTRS{../idProduct}=="1034", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="01", SYMLINK+="modem", ENV{SYSTEMD_WANTS}="ifup@wwan0.service"

# GH-UDG-MCLTE (modem mode only)
KERNEL=="ttyACM0", SUBSYSTEM=="tty", ATTRS{idVendor}=="1ecb", ATTRS{idProduct}=="0202", SYMLINK+="modem", ENV{SYSTEMD_WANTS}="ifup@wwan0.service"

# FC-QGLC4-C0 (EG25-G) a.k.a. "Onyx"
KERNEL=="ttyUSB*", ATTRS{../idVendor}=="2c7c", ATTRS{../idProduct}=="0125", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="02", SYMLINK+="modem", ENV{SYSTEMD_WANTS}="ifup@wwan0.service"
```

# おわりに
原因がわかってしまえば簡単なことなんですが、たどり着くまでにドライバの原因を疑ったり、電圧不足の原因疑ったり、デバイスの初期不良かもしれないと、別のSORACOM Onyx LTE USB ドングルで確認したりと･･･多くの時間をかけてしまったのがお恥ずかしい。
皆様も他のSORACOM USBドングルから乗り換える際にはお気を付けくださいませ。