YoctoでSORACOM SIMを使ってLTE通信をやってみる
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