LoginSignup
6
3

More than 1 year has passed since last update.

Nerves + L-02C(データ通信端末)でデータ通信にトライ(モデムモードにはなりました) (Elixir)

Last updated at Posted at 2021-05-16

はじめに

前回

iex> System.find_executable("usb_modeswitch")
nil

プロジェクト構造

project
├── custom_rpi2
└── your_project

nerves-networking/vintage_net_mobile

  • nerves-networking/vintage_net_mobileを使うとNervesでデータ通信できそうです
  • READMEにかいてある「These requirements are believed to be the minimum needed to be added to the official Nerves systems.」をやってみます

スクリーンショット 2021-05-15 21.45.34.png

custom_rpi2

  • READMEに書いてある通り、書き加えてみます
linux-5.4.defconfig
 CONFIG_CMA_SIZE_MBYTES=5
 CONFIG_PRINTK_TIME=y
 CONFIG_PANIC_TIMEOUT=10
+CONFIG_PPP=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_MPPE=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_USB_NET_CDC_NCM=m
+CONFIG_USB_NET_HUAWEI_CDC_NCM=m
+CONFIG_USB_NET_QMI_WWAN=m
+CONFIG_USB_SERIAL_OPTION=m
nerves_defconfig
 BR2_NERVES_ADDITIONAL_IMAGE_FILES="${NERVES_DEFCONFIG_DIR}/fwup.conf ${NERVES_DEFCONFIG_DIR}/cmdline.txt ${NERVES_DEFCONFIG_DIR}/config.txt"
 BR2_PACKAGE_NBTTY=y
 BR2_PACKAGE_NERVES_CONFIG=y
+BR2_PACKAGE_USB_MODESWITCH=y
+BR2_PACKAGE_PPPD=y
+BR2_PACKAGE_PPPD_FILTER=y
+BR2_PACKAGE_BUSYBOX_CONFIG_FRAGMENT_FILES="${NERVES_DEFCONFIG_DIR}/busybox.fragment"
busybox.fragment
CONFIG_MKNOD=y
CONFIG_WC=y

your_project

mix.exs
  defp deps do
    ...
    {:custom_rpi2, path: "../custom_rpi2", runtime: false, targets: :custom_rpi2, nerves: [compile: true]},
    {:elixircom, "~> 0.2.0"}
  end

ビルド

$ cd your_project
$ export MIX_TARGET=custom_rpi2
$ mix deps.get
$ mix firmware

microSDカードにやく

$ mix burn

Run

  • Nervesにsshではいります
$ ssh nerves.local

iex> System.find_executable("usb_modeswitch")
"/usr/sbin/usb_modeswitch" 
  • :tada::tada::tada:
  • usb_modeswitchが使えるようになったようです!

いろいろやってみる

  • ここからはいろいろ試行錯誤の過程を書いています
  • 結論 モバイル通信はまだできていません(ATコマンドを打ち込める状態にすることはできるようになりました)
  • わかってきたこともあるのでのちほどまとめるとして、しばらくお付き合いください

ATコマンドを打ち込んでみる

iex> Elixircom.run("/dev/ttyUSB2")
Unable to find specified port.

Please make sure your device is plugged in and ready to
be connected to.

{:error, :enoent}
  • うまくいっていません...

Circuits.UART.enumerate()

iex> Circuits.UART.enumerate()
%{"ttyAMA0" => %{}}
  • /dev/ttyUSB2というのがなさそう

lsusbしてみる

スクリーンショット 2021-05-16 15.27.08.png

iex> System.find_executable("lsusb")
nil
  • がーん、ない
    • Linuxのカスタマイズどうやってやればいいんだろう...
  • わらにもすがるおもいでnerves lsusbでぐぐる
  • お、しかも日本語で記事がみつかる
iex> lsusb
...
Bus 001 Device 004: ID 1004:61dd NTT DOCOMO, INC. docomo L02C
...
  • 1004がLGで、61ddがモード
  • 61ddモードがストレージモードだからいかんっぽい
  • これを618fのモデムモードにしないといけない
    • このへんの話は、L-02C Linuxとかで検索して先人の方の記事から得た情報です
  • usb_modeswitchは使えるから簡単にいくだろうとおもいましたが、なかなかうまくいきませんでした
  • いろいろ試したり、調べたりするなかで以下の記事の通りにやるとモードが切り替わりました!
your_project/rootfs_overlay/etc/usb_modeswitch.d/L02C.conf
DefaultVendor= 0x1004
DefaultProduct=0x61dd

TargetVendor= 0x1004
TargetProduct=0x618f

MessageContent=5553424312345678000000000000061b000000020000000000000000000000
NeedResponse=1
CheckSuccess=20
  • 記事の通りL02C.confを用意します
  • Nervesプロジェクトの下のrootfs_overlay配下におくといい感じにLinuxのファイルとしておいてくれます
  • 上の例ではLinuxの中では/etc/usb_modeswitch.d/L02C.confとして配置されます
  • 気を取り直してビルド、そしてまた焼く
$ mix firmware
$ mix upload nerves.local
  • やけたらssh nerves.localして試してみます
iex> lsusb  
Bus 001 Device 004: ID 1004:61dd NTT DOCOMO, INC. docomo L02C

iex> File.read("/etc/usb_modeswitch.d/L02C.conf") |> elem(1) |> IO.puts
DefaultVendor= 0x1004
DefaultProduct=0x61dd

TargetVendor= 0x1004
TargetProduct=0x618f

MessageContent=5553424312345678000000000000061b000000020000000000000000000000
NeedResponse=1
CheckSuccess=20
  • うん、ちゃんと/etc/usb_modeswitch.d/L02C.confは配置されています
iex> :os.cmd('usb_modeswitch -c /etc/usb_modeswitch.d/L02C.conf') |> List.to_string |> IO.puts
Look for target devices ...
 No devices in target mode or class found
Look for default devices ...
 Found devices in default mode (1)
Access device 004 on bus 001
Get the current device configuration ...
Current configuration number is 1
Use interface number 0
 with class 8
Use endpoints 0x01 (out) and 0x81 (in)
Looking for active drivers ...
 OK, driver detached
Set up interface 0
Use endpoint 0x01 for message sending ...
Trying to send message 1 to endpoint 0x01 ...
 OK, message successfully sent
Read the response to message 1 (CSW) ...
 Response successfully read (13 bytes), status 0
Reset response endpoint 0x81
Reset message endpoint 0x01

Check for mode switch (max. 20 times, once per second) ...

iex> lsusb
...
Bus 001 Device 005: ID 1004:618f NTT DOCOMO, INC. docomo L02C
...
  • やったー
  • モデムモードになっちょります :tada:
iex> Circuits.UART.enumerate()
%{
  "ttyAMA0" => %{},
  "ttyUSB0" => %{
    description: "docomo L02C",
    manufacturer: "NTT DOCOMO, INC.",
    product_id: 24975,
    vendor_id: 4100
  },
  "ttyUSB1" => %{
    description: "docomo L02C",
    manufacturer: "NTT DOCOMO, INC.",
    product_id: 24975,
    vendor_id: 4100
  },
  "ttyUSB2" => %{
    description: "docomo L02C",
    manufacturer: "NTT DOCOMO, INC.",
    product_id: 24975,
    vendor_id: 4100
  },
  "ttyUSB3" => %{
    description: "docomo L02C",
    manufacturer: "NTT DOCOMO, INC.",
    product_id: 24975,
    vendor_id: 4100
  }
}
  • 結果がかわりました
  • 続いてATコマンドを打ち込んでみます
iex> Elixircom.run("/dev/ttyUSB2")
AT
OK
ATH
OK
ATZ
OK
ATQ0 V1 E1 S0=0 &C1 &D2
OK
AT+COPS=1,2,"44010"
OK
AT+CGDCONT=1,"IP","soracom.io"
OK
AT$QCPDPP=1,1,"sora","sora"
OK
ATD*99***1#
CONNECT

Wrapping up :lgtm::lgtm::lgtm::lgtm:

$\huge{Enjoy Elixir!!!}$

できたこと、わかったこと

  • L-02CをNerves上でモデムモードにすることはできました
  • Nervesをカスタマイズすることはサンプルがないとなにもできませんが、Linuxにコマンドを追加する方法を雰囲気だけなんとなく理解しました
  • System.find_executable/1 で、このコマンドあるんだっけなあを調べられます
  • :os.cmd('cmd args') |> List.to_string |> IO.putsと実行すると、シェルで実行した雰囲気の結果が得られます
iex> :os.cmd('ls -la /etc') |> List.to_string |> IO.puts
drwxr-xr-x    2 root     root            32 May  8 18:30 usb_modeswitch.d
-rw-r--r--    1 root     root          1523 Apr  7 10:06 usb_modeswitch.conf
drwxr-xr-x    3 root     root            30 May  8 18:30 udev
drwxr-xr-x    3 root     root           121 Apr  7 10:06 ssl
-rw-r--r--    1 root     root             9 Apr  7 10:06 shells
-rw-------    1 root     root           243 Apr  7 10:06 shadow
lrwxrwxrwx    1 root     root            18 Apr  7 10:06 resolv.conf -> ../tmp/resolv.conf
-rw-r--r--    1 root     root          2744 Apr  7 10:06 protocols
drwxr-xr-x    3 root     root            79 May  8 18:30 ppp
-rw-r--r--    1 root     root           340 Apr  7 10:06 passwd
lrwxrwxrwx    1 root     root            21 Apr  7 10:06 os-release -> ../usr/lib/os-release
-rw-r--r--    1 root     root             0 Apr  7 10:06 odbcinst.ini
-rw-r--r--    1 root     root             0 Apr  7 10:06 odbc.ini
-rw-r--r--    1 root     root           230 Apr  7 10:06 nsswitch.conf
-rw-r--r--    1 root     root           937 Apr  7 10:06 mke2fs.conf
drwxr-xr-x    2 root     root            44 Apr  7 10:06 libnl
-rw-r--r--    1 root     root           669 May  8 18:30 iex.exs
-rw-r--r--    1 root     root            20 Apr  7 10:06 hosts
-rw-r--r--    1 root     root           307 Apr  7 10:06 group
-rw-r--r--    1 root     root           349 Apr  7 10:06 fw_env.config
-rw-r--r--    1 root     root           752 May  8 18:30 erlinit.config
-rw-r--r--    1 root     root          1596 Apr  7 10:06 erl_inetrc
-rw-r--r--    1 root     root           685 Apr  7 10:06 e2scrub.conf
drwxr-xr-x    2 root     root            34 Apr  7 10:06 cron.d
drwxr-xr-x    2 root     root            27 May  8 18:30 chatscripts
-rw-r--r--    1 root     root           610 Apr  7 10:06 boardid.config
drwxr-xr-x   19 502      20             257 May  8 18:30 ..
drwxr-xr-x    9 root     root           486 May  8 18:30 .

できていないこと

  • Nerves with L-02Cでデータ通信はできていません

今後について

  • おそらく、https://github.com/nerves-networking/vintage_net_mobile#custom-modems にそって、L-02用のモデムがつくれたらいい感じにデータ通信してくれる気がしていますので引き続きやってみます
    • ななめ読み程度ですが、pppという文字面だけはみえましたのでいい感じにやってくれそうです
    • 少しやってみましたがうんともすんとも言わない感じなので、もう少し成果がでたら記事にします
    • この記事では、モデムモードに切り替えることしかできていませんが、だいぶ疲れました...
  • データ通信端末を変えてみたらどうなるのかは気になっています
    • とくにusb_modeswitchが不要な端末で試してみたいとおもっています
    • SORACOM IOT ストアで買い求めてみようかと検討中です(検討中です)
  • 外に持ち出したいという用途なら、Nervesのカスタマイズをがんばらなくても素の状態でデータ通信できる、HUAWEI Mobile WiFi E5785のようなモバイルWiFi機器を持ち運べばいい気がしてきました...
    • お家のWiFiにつなぐのと同じ要領でNervesをつないでデータ通信できました
    • IIJmioさんのSIMをつかいました
    • 持っているSIMのサイズがあわず、SORACOMさんのSIMではまだ試せていません
    • もうこれでいいかなあという気が若干しています...
      • それを言うと元も子もないといいますか...
      • けれどいろいろ試行錯誤した経験はきっとどこかで役立つだろうとおもっています
      • Nervesにデータ通信端末さしこんでデータ通信できました! と言ってみたい気もしています

Raspberry Pi 2(Nerves) + HUAWEI Mobile WiFi E5785

IMG_20210516_174625.jpg

  • Raspberry Pi 2(Nerves) + HUAWEI Mobile WiFi E5785の図
  • ブレッドボードは不器用につなげたもので本記事とはほとんど関係ありません

$\huge{Enjoy Elixir!!!}$

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3