Check! SORACOM Air の接続はオンラインなのに、エンドポイントに送信できない場合の対処（WiFiとの競合）


こんにちは、オークファンの @dz_ こと大平かづみです。

Prologue - はじめに
====
上司からSIMアダプタ「[FS01BU](http://amzn.to/1VmF18Q "FS01BU - 富士ソフト")」をお借りしたので、[Raspberry Pi Zero](https://www.raspberrypi.org/products/pi-zero/ "Raspberry Pi Zero - Raspberry Pi") で SORACOM Air を使ってみました！

SIMアダプタとSORACOM Air の使い方はすでに情報がたくさん公開されていますので割愛します。（補足を後述）

ここでは、私が最終的にハマった WiFi とのルーティング競合の解決方法についてメモしておきます。友人の @rina0521 のアドバイスで解決しました！ありがとうございます！

![20160423_raspi-zero_soracom_001.jpg](https://qiita-image-store.s3.amazonaws.com/0/3812/71fda826-4b83-b543-48d0-e36b3f5fec6b.jpeg)

動作環境
====

| 用途 | デバイス |
|------|---------|
| PC | [Raspberry Pi Zero](https://www.raspberrypi.org/products/pi-zero/ "Raspberry Pi Zero - Raspberry Pi") |
| SIMアダプタ | [富士ソフト FS01BU](http://amzn.to/1VmF18Q "FS01BU - 富士ソフト") |
| Wifiアダプタ | [PLANEX GW-USNano2](https://www.planex.co.jp/product/wireless/gw-usnano2/ "無線LAN｜GW-USNano2｜PLANEX") |
| USBハブ | [ELECOM U2H-YS4BBK](http://amzn.to/1SEsA84 "ELECOM USBハブ USB2.0対応 個別スイッチ付 バスパワー シール付 4ポート ブラック U2H-YS4BBK") |

また、SORACOM 側で開通や設定が済んでいて接続できる状態であることを前提とします。私の場合は SORACOM Funnel を使う設定が済んでいます。

[トラブルシューティング] wvdial も動作して、SORACOM コンソールでもオンラインになったのに、エンドポイントに送信できない場合
====
状況
----
まず、私のUSB接続状況は、以下のようになっています。

```bash
$ lsusb
Bus 001 Device 010: ID 1c9e:6801 OMEGA TECHNOLOGY 
Bus 001 Device 006: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter [Realtek RTL818
8CUS]
...
```

この状態で FS01BU を認識させて、SORACOM へ接続しておきます。

```bash
# FS01BU の認識
$ sudo modprobe usbserial vendor=0x1c9e product=0x6801

# wvdial で通信開始
$ sudo wvdial &   # <-- & でバックグラウンドで動かす
```

このとき、 [SORACOM ユーザーコンソール](https://console.soracom.io "SORACOM ユーザーコンソール") では「セッション状態」が「オンライン」になってるはずです。
![20160424_soracom_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/72a46efa-73c2-18ec-e317-320b1020f39c.png)

さっそく、SORACOM のエンドポイントに接続してみましょう。

```bash
# SORACOM Funnel のエンドポイントにTCPでデータ送信を試みる
$ nc funnel.soracom.io 23080
{"test":"ok"} [ENTER]

```
応答が返ってきません…(´;ω;\`)

通常は `200` や、誤ったJSONを送った場合でも `400: Invalid JSON` などとすぐに応答があるはずなのに、ありません。

でも、`curl` や `ping` でほかのURLへの接続してみると、問題なくできる状態です。はて？

原因
----
どうやら、通信が WiFi 経由になっているようです。ルーティングを明示的に設定する必要がありそうです。

対処
----
ということで、こちらの情報を参考に、とりいそぎ一時的なルーティング設定を行いました。恒久的な設定についても書かれているので、適宜ご参照くださいませ。

- [Linuxルーティング追加 | server-memo.net](http://www.server-memo.net/centos-settings/network/linux-routeing.html "Linuxルーティング追加 | server-memo.net")

以下は私が行った対処です。

```bash
# nslookup がない場合は、インストール
$ sudo apt-get install dnsutils

# エンドポイントのIPアドレスを調べる
$ nslookup funnel.soracom.io
...
Non-authoritative answer:
Name:   funnel.soracom.io
Address: {funnel.soracom.ioのIPアドレス}

# SIMアダプタの情報を取得する (ppp0)
$ ifconfig
...

ppp0      Link encap:Point-to-Point Protocol  
          inet addr:10.240.xx.xx  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:130 (130.0 B)  TX bytes:181 (181.0 B)
...

# 一時的に、ルーティングを追加する
$ sudo route add -net [エンドポイントのIPアドレス] netmask 255.255.255.255 gw [ppp0 の inet addr] ppp0
```

さぁ、エンドポイントにデータを送ってみましょう！

```bash
# SORACOM Funnel のエンドポイントにTCPでデータを送信する
$ nc funnel.soracom.io 23080
{"test":"ok"} [ENTER]
200
```

無事に送信されましたー！！ヾ(o´∀`o)ﾉ

パチパチパチパチー

[補足] SORACOM Air および、USBドングル「FS01BU」の利用について
====
補足ですが、SORACOM Air の開通・利用開始については、本家サイトを参考に進めました。

- [SORACOM の利用を始める | Getting Started | SORACOM Developers](https://dev.soracom.io/jp/start/begin_soracom/ "SORACOM の利用を始める | Getting Started | SORACOM Developers")

また、SIMアダプタ「FS01BU」を使って SORACOM を利用する方法については、 @tseigo さんの記事を参考にしました。ありがとうございます！

- [USBドングルと絡めてSORACOM Air（データ通信のみ）をRaspberry Piにつなげたメモ – 1ft-seabass.jp.MEMO](http://www.1ft-seabass.jp/memo/2015/11/16/soracom-air-raspberry-pi-firststep/ "USBドングルと絡めてSORACOM Air（データ通信のみ）をRaspberry Piにつなげたメモ – 1ft-seabass.jp.MEMO")

なお、上記記事で、 `wvdial` のインストール時に失敗するとあったのですが、私は以下のように成功しました。うまくいった理由はわからないのですが、この手順の前に、 `apt-get upgrade` や再起動したことがよかったのかもしれません。

```bash
$ sudo apt-get install wvdial

...

Success!  You can run "wvdial" to connect to the internet.
  (You can also change your configuration by editing /etc/wvdial.conf)

Processing triggers for libc-bin (2.19-18+deb8u3) ...
Processing triggers for systemd (215-17+deb8u3) ...
```

Epilogue - おわりに
====
なかなか触る機会がなかった SORACOM 、ついにデビューしてみました！

ちなみに、今回 Raspberry Pi Zero で試したところ、この子は非力なので、 wvdial を常駐で動かしている間は SSH接続がもたつくレベルでCPUを持っていかれるようでしたヾ(ω` )/

でも Raspberry Pi Zero はかわいいので許す！ヾ(oﾟｘﾟo)ﾉ