はじめに
-
Elixir楽しんでいますか


- ElixirでIoTができるナウでヤングでcoolなNervesにデータ通信端末をさしこんでanywhereで通信を楽しみたいとおもっています
前回
- 「Customizing Your Own Nerves System の前半をまずやってみる (Elixir)」の続きからやってみます
- 前回の記事のファームウェアでは、ほとんど素の状態と変わらないので
usb_modeswitchは使えません
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.」をやってみます
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
- https://github.com/nerves-networking/vintage_net_mobile#serial-at-command-debugging
- に従って、Elixircomを追加しておきます
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"
-


-
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してみる
iex> System.find_executable("lsusb")
nil
- がーん、ない
- Linuxのカスタマイズどうやってやればいいんだろう...
- わらにもすがるおもいで
nerves lsusbでぐぐる - お、しかも日本語で記事がみつかる
- 作って学ぶNerves、BBBでCO2計測
-
h Toolshedするとあった! - @pojiroさん、ありがとうございます!
iex> lsusb
...
Bus 001 Device 004: ID 1004:61dd NTT DOCOMO, INC. docomo L02C
...
-
1004がLGで、61ddがモード -
61ddモードがストレージモードだからいかんっぽい - これを
618fのモデムモードにしないといけない- このへんの話は、
L-02C Linuxとかで検索して先人の方の記事から得た情報です
- このへんの話は、
-
usb_modeswitchは使えるから簡単にいくだろうとおもいましたが、なかなかうまくいきませんでした - いろいろ試したり、調べたりするなかで以下の記事の通りにやるとモードが切り替わりました!
- Debian GNU/kFreeBSDでL-02Cを使ってpppする
- ありがとうございます!
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
...
- やったー
- モデムモードになっちょります
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
-
ATで始まるものは自分で打ち込んだものです -
OKは応答です -
CONNECTとはでていますが、モバイル通信はできていません - 別のターミナルで
ssh nerves.localしてifconfigしてみますがppp0はありません - そういえば、「団長! いつでもどこでも温度・湿度が測れるのであります! (Elixir, SORACOM Air for セルラー)」でやっていたときには、
wvdialというコマンドをつかいました- きっと
wvdialがよろしくやってくれたのだろうとおもいます
- きっと
Wrapping up 


$\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機器を持ち運べばいい気がしてきました...
Raspberry Pi 2(Nerves) + HUAWEI Mobile WiFi E5785
- Raspberry Pi 2(Nerves) + HUAWEI Mobile WiFi E5785の図
- ブレッドボードは不器用につなげたもので本記事とはほとんど関係ありません
$\huge{Enjoy Elixir!!!}$


