Contents
はじめに
巷でIoTブームが起きている中、さくらインターネット株式会社がsakura.ioたるサービスの正式リリースを開始しました。
今回はIoTとsakura.ioについて解説したいと思います。
IoTとは
近年IoTという単語がバズっていますが、IoTとはそもそもどういうものなのでしょうか。
IoTはInternet of Thingsの略であり、日本では「モノのインターネット」と言われています。
これは、あらゆるモノがインターネットに繋がりデータを交換することで、互いに状態の可視化・制御をし合うことを意味します。
IoTのよくある例としては以下のようなものがあります。
- ドアの開閉や会議室の使用状況
- GPSトラッカー
- 気温・気圧の共有
- 故障事前検知
これらのことは全て2010年までにはすでに実現可能だったことですし、この程度のことでIoTと言われても全くイノベーティブとは思えませんよね。
それもそのはずで、IoTという考え自体は1999年から既に存在したものなのです。ではなぜバズってるのでしょうか?
その大きな理由は低価格化です。
2010年はじめではLTEモデムは最大手のQualcomm社が独占している市場であり、150ドルするのが当たり前の時代でした。
そのような中、Altair等の企業がIoT向けの低価格LTEモデムを開発し、価格が下がったことにより、現在のIoTブームに至ります。
IoTの障壁
価格的問題
さて、低価格化したモデムですが、モデムを搭載したArduinoシールドは以下のものがあります。
はい、どちらも3万円します。
モデム自体が低価格化されたとは言え、我々がホビーユースで使えるように市販されているモデム(のArduinoシールド)は非常に高価です。
また携帯回線を使用するため、モデムとは別に回線契約をする必要があります。IoT向けの回線としては、SORACOMが提供しているSORACOM Airが維持費が月額300円程度と安く、実用的です。
技術的問題
さて、高いお金を払ってモデムを手に入れたとして、どのようにプログラミングすれば良いのでしょうか。
上の図は、一般的なモデムを用いてIoT製品を開発する際のイメージです。
マイコンとモデムの通信にはUARTを用い、PPPプロトコルによる通信を行います。また、モデムの設定を行うにはATコマンドの知識が必要です。
PPP・TCP/IP・UDP・DNS等のプロトコルの実装は、LwIPと呼ばれるフリーのTCP/IPプロトコルスタックを用いることで比較的簡単に行うことができます。
また、LwIPを動かすに当たってRTOSを使用する必要があります。
- LwIPを用いてTCP/IPによる通信ができるようになると、HTTPによる通信もできるようになります。しかし、HTTPのままでは平文で通信を行うことになるためセキュリティに問題が生じます。SSLによる暗号化通信を行うためにはPolarSSLと呼ばれるオープンソースのSSLライブラリを用いるのが一般的です。
以上をまとめると、モデムを購入してIoTを実現するには以下の技術・知識が必要となります。
- 割り込みやDMAを用いたUARTの送受信バッファの作成
- 使用するマイコンへのRTOSのポーティング
- ATコマンド
- LwIP
- PolarSSL(セキュアな通信をする場合)
LwIPを一度でも触ったことがある方ならわかると思いますが、超メンドクサイです。
少なくとも、Lチカと同じレベルで実現できるようなものではありません。
(面倒とかそういう話とは別で、組み込み屋を名乗るなら上記のことはできるようにはなりたいですね笑)
これらの知識がなくてもIoTをできるように、以下のような通信部分を隠蔽したモジュールが出てきています。
3GIMは、TCP/IPによる通信やHTTP/GET・HTTP/POST(SSL対応)に特化したモジュールであり、UARTを使って簡単に接続することができます。
問題点として考えられるのは、3Gモデムなので消費電力が4Gと比べ大きいことと、価格が25,000円前後と高価なことでしょうか。
LwIP等の知識なしにTCP/IPの接続をできるという点で、技術料としては安いと考えられます。
さくらの通信モジュールに関しては後述します。
セキュリティ的問題
前節でPolarSSLを用いればSSLによるセキュアな通信が出来ると言いましたが、LwIPやPolarSSLに脆弱性が存在する可能性があります。(実際、PolarSSLに任意のコードを実行できる脆弱性が発見されたことがあります)
このような場合に製品回収をしなくていいように、IoTの製品を販売する場合にはファームウェアアップデートの機能を持たせる必要があります。
さくらの通信モジュール
さくらの通信モジュールはTCP/IPやその先の通信プロトコルまで全てを隠蔽し、チャンネル番号・変数の型・値・タイムスタンプの値を1セットとして送受信する機能を有したモジュールです。
マイコンとモジュールの接続はI2CまたはSPIで行われます。
先に紹介したモデム・モジュールと異なる点は、さくらの通信モジュールの接続先はインターネットではなく、専用のSIMを用いて接続される、専用回線である点です。
これにより、外部からのアクセスを遮断した閉域網でマイコン・サーバ間の通信は行われるため、ハッキングされる心配が非常に少なくなります。
また、sakura.ioサーバとコネクションを張り続けているため、データの受信もほぼリアルタイムに行うことができます。
sakura.ioでは、自身のWebサーバとデータをやり取りする方法としてIncoming WebhookとOutgoing Webhookが用意されています。
それ以外にもIBM BluemixやAWS IoT、myThings等のサービスと提携しており、サーバサイドのプログラミング知識がなくてもある程度のものは開発というメリットがあります。
価格面でも、モジュールの価格は8,000円程度と破格の安さとなっています。
モジュールの問題点を上げるとすれば、TCP/IPやHTTP等で汎用的な通信は行えないことが挙げられます。そのため、さくらの通信モジュールの仕様で自分が作りたいアプリケーションを実現できるかどうかは、あらかじめ検討する必要があります。とはいえ、個人でちょっとしたIoTなアプリケーションを作ろうという場合はこのモジュール1つで殆ど解決します。
各モジュールとの比較
モデム・3GIM・さくらの通信モジュールを比較すると以下のようになります。
モジュール | 初期費用 | 回線(月) | 入手性 | 汎用性 | プログラミング | FWアップデート |
3G, 4Gモデム | 20,000〜30,000 | 300円 〜 | × | ◎ | × | ー |
3GIM v2 | 25,000 程度 |
300円 〜 | ◯ | ◯ | ◯ | × |
さくら | 8,000 程度 |
60円 〜 | ◯ | △ | ◎ | ◯ |
さくらの通信モジュール
データ形式と通信
sakura.ioでやり取りするデータ形式は以下のようになっています。
名称 | サイズ | 内容 |
module ID | – | 各モジュールの固有ID |
channel ID | 7 bit | 何のデータであるかを識別するためのID |
type | 1 byte | データの型 |
value | 1〜8 byte | データの値。サイズはtypeに依存する |
timestamp | 8 byte | データに紐ついた時刻 |
また、データの型は以下のものがサポートされています。
int32_t | 4 バイト符号付き整数 |
uint32_t | 4 バイト符号なし整数 |
int64_t | 8 バイト符号付き整数 |
uint64_t | 8 バイト符号なし整数 |
float | 4 バイト(単精度)浮動小数点数 |
double | 8バイト(倍精度)浮動小数点数 |
uint8_t [8] | 8バイトのBYTE型 |
データの送受信
送信
enqueue命令により、データは最大32個までモジュールの送信キューに保存できます。
また、送信命令により、このデータを最大16チャンネルまで一度に送信できます。
17個キューにデータが保存されている状態で送信指令を行なった場合、「初めにキューイングされた16個のデータを初めに送信し、その後、最後に入力した1個のデータが送信される」という動作になります。
受信
クラウドからモジュールへのデータの受信は自動的に行われ、受信用のキューに蓄積されます。
キューは最大32個まで受信データを蓄えることができ、その数を超えるデータが送られてきた場合、そのデータは取りこぼされます。
実際どれくらい簡単なのか
Arduinoで温度情報をサーバに送信する例を見て見ましょう。
簡単のため、温度センサの初期化処理・エラー処理などは省いています。
void loop() {
float temp = hdc1000.getTemperature();
sakuraio.enqueueTx(0,temp);
sakuraio.send();
delay(5000);
}
はい終わり。簡単でしょ?
まとめ
IoT、しよ?
ちなみに私は現在サイコンのIoT化に挑戦中です…
ロボットと電子工作とプログラミング!
女の子は甘いもので出来てる?