🌐

YoctoでSORACOM SIMを使ってLTE通信をやってみる

2024/06/14に公開

YoctoでSORACOM使いたかったのでレシピ作りました。Soracom Onyx – LTE™ USB ドングル (SC-QGLC4-C1)を使い、Raspberry Pi 4Bで動作確認しました。
購入はこちら(https://soracom.jp/store/7326/)

SORACOMさんが提供してくださっているLinux用のセットアップスクリプトを参考に作っています。

前提条件として以下の構成である必要があります。

  • systemdを使用すること
  • wvdialのPPP接続処理はsystemdのサービスとして起動させる
  • 接続断時の再接続はwvdialに頑張ってもらう方向で

本当はNetworkManagerとModemManagerを使っても動くんですけど、なんか挙動がつかめないので。。。

レシピの構造

こんな感じで作ります。recipies-soracom-sim以下は適当なLayerの下に置いてください。
当然そのlayerをbblayer.confに追加しておく必要があります。

./recipes-soracom-sim/
└── soracom-sim
    ├── files
    │   ├── 30-soracom.rules
    │   ├── wvdial
    │   ├── wvdial.conf
    │   └── wvdial.service
    └── soracom-sim_0.1.bb

各ファイルの内容

以下の内容でファイルを作成します。

soracom-sim_0.1.bb

recipiesファイルの中身は以下のようになります。ライセンスはとりあえずCLOSEDにしてあります。do_install()の最後にあるシンボリックリンクを張ることでサービスの自動起動を設定しています。テストの時などはここマスクして手動で確認するのが良いと思います。

SUMMARY = "SORACOM LTE Module setting"
DESCRIPTION = "SORACOM LTE Module settings for ONYX Modem"
LICENSE = "CLOSED"

SRC_URI = "file://30-soracom.rules \
        file://wvdial.conf \
        file://wvdial \
        file://wvdial.service \
          "

S = "${WORKDIR}"

python do_display_banner() {
    bb.plain("***********************************************");
    bb.plain("*                                             *");
    bb.plain("*  SORACOM LTE Module Recipies for ONYX       *");
    bb.plain("*                                             *");
    bb.plain("***********************************************");
}

addtask display_banner before do_build

do_install:append() {
    rm -f ${D}${sysconfdir}/ppp/peers/wvdial
}

do_install() {

    install -d ${D}${sysconfdir}
    install -m 0644 ${S}/wvdial.conf ${D}${sysconfdir}/wvdial.conf

    install -d ${D}${sysconfdir}/udev/rules.d
    install -m 0644 ${S}/30-soracom.rules ${D}${sysconfdir}/udev/rules.d/30-soracom.rules

    install -d ${D}${sysconfdir}/ppp/peers
    install -m 0755 ${S}/wvdial ${D}${sysconfdir}/ppp/peers/wvdial

    install -d ${D}${systemd_system_unitdir}
    install -d ${D}${sysconfdir}/systemd/system/multi-user.target.wants
    install -m 0644 ${WORKDIR}/wvdial.service ${D}${systemd_system_unitdir}/wvdial.service

    # Enable systemd service
    ln -s ${D}${systemd_system_unitdir}/wvdial.service ${D}${sysconfdir}/systemd/system/multi-user.target.wants/wvdial.service
}

FILES:${PN} += "${sysconfdir}/wvdial.conf \
                ${sysconfdir}/ppp/peers/wvdial \
                ${sysconfdir}/udev/rules.d/30-soracom.rules \
                ${systemd_system_unitdir}/wvdial.service \
                ${sysconfdir}/systemd/system/multi-user.target.wants/wvdial.service \
"

SYSTEMD_SERVICE:${PN} = "wvdial.service"
SYSTEMD_AUTO_ENABLE = "enable"

30-soracom.rules(udev ルールファイル)

udevのルールファイルです。LTEモジュールが接続されたらインターフェイスをアップしますが、今回はsystemdのサービスでwvdialを起動するので本当はいらないです。

# 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"

wvdial.conf

wvdialの設定ファイルです。APN設定変えればほかのSIMも使えるはず。

[Dialer Defaults]
Init1 = AT+CFUN=1
Init2 = ATZ
Init3 = AT+CGDCONT=1,"IP","soracom.io"
Dial Attempts = 0
Stupid Mode = 1
Modem Type = Analog Modem
Dial Command = ATD
Stupid Mode = yes
Baud = 460800
New PPPD = yes
ISDN = 0
APN = soracom.io
Phone = *99***1#
Username = sora
Password = sora
Carrier Check = no
Auto DNS = 1
Check Def Route = 1

wvdial

pppdの設定ファイルです。

noauth
name wvdial
usepeerdns
replacedefaultroute
persist
mtu 1464
novj
novjccomp
noipv6
maxfail 1

wvdial.service

systemd用の設定ファイルです。

[Unit]
Description=WvDial Service
After=network.target

[Service]
ExecStart=/usr/bin/wvdial
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

イメージの作成

local.confの修正

以下を追記します。

IMAGE_INSTALL:append = " wvdial ppp soracom-sim usb-modeswitch"

イメージのビルド

修正が終わったらbitbake core-image-minimalとしてビルドし、作成されたイメージの動作確認を行います。ログを見て正常に通信できていればOKです。
かならず有効なSIMを挿したUSB通信モジュールを接続してから起動するようにしてください。

Discussion