mbed+FlashAirで直ツイート!

/media/uploads/ban4jp/fatweet02.jpg

Information

このページは、mbed Advent Calendar 2014 の15日目として作成されました。
http://www.adventar.org/calendars/523

FlashAirって色々と面白い

FlashAirは、WiFiで無線通信できるSDカードです。http://www.toshiba.co.jp/p-media/flashair/
Webサーバを搭載していて、スマホ等から簡単に写真にアクセスしたり、クラウドにアップロードする事ができる素晴らしい製品です。
最近ではGPIO機能に注目が集まり、知名度がアップしていますね。こういう遊び心は好きです。

さて、私もFlashAirで遊ぼうと色々と調査をし、https://flashair-developers.com/ja/ のお世話になっていたところ・・・

 HTTPS!?

/media/uploads/ban4jp/fatweet01.png

なんと、HTTPSをしゃべる事ができるHTTPClient機能が付いてる。
最近はWebAPIがHTTPSを求めてくる事が多くなってきていて、HTTPSに対応しているのは見逃せない。
だって、SSLオフロード機能がついてる無線モジュールって入手できないから。

では早速調査してみましょう。

FlashAirで直ツイートしたい!

ただ調査するだけではつまらないので、何か作りたいと思います。
真っ先に思い付いたのはツイッター。HTTPSを使うのだからプロキシは挟みたくない。という訳で"直ツイート"する事に決定。(∩´∀`)∩

(直ツイートとは、supertweetやStewgate UなどのAPIプロキシを使用しないツイートの事です。私が決めました。)

・・・が、直ツイートは意外とめんどくさいのであった。

 ・SSL必須 https://twitter.com/TwitterDevJP/statuses/412743654072020992
 ・OAuth認証
 ・RTCかそれに準ずるタイマー (OAuthのパラメータに現在時刻があって、大きくズレがあると認証に失敗します。)

当然、mbedのライブラリも無いので、ライブラリの作成から着手です。

その1:まずは青mbedで直ツイート

まずは青mbedでTwitterに呟くためのライブラリがそろっているか確認します。
SSLとOAuthのライブラリが必要なので、次のものを使わせていただきました。

残念ながら、現在のツイッターの仕様で直ツイートできるサンプルを見つけられなかったのでサクッと作ります。\ RTCが現在時刻と合っていないとOAuth認証に失敗するので、NTPClientも追加しました。

Import programCyaSSL-Twitter-OAuth4Tw

Twitter client that can be directly tweet. (Intermediate server is not required.)

レスポンスのJSONが最後まで受信できていませんが、呟けているので今回はよしとします。
(RTOSのスタックサイズ都合です。スタックサイズを大きく取れば受信できるはずです。)

その2:iSDIOライブラリを作成

FlashAirはiSDIO規格に準拠したSDカードだそうです。
iSDIOの仕様書は閲覧できるようです。無線系のモジュールはNDAとかNDAとかNDAとか・・・(ノД`)・゜・。

気を取り直して、iSDIOの本質はSDカード。ここはSDFileSystemをベースに拡張します。
メソッドがprotectedになっているので拡張しやすいですね。

Import libraryiSDIO

iSDIO Library for TOSHIBA FlashAir. include HTTP or HTTPS Client.

配線は通常のSDカードと同様にSPI接続です。
ただ、電源は200mA近く消費するらしいので、mbedボードによっては電力不足になるかもしれません。

拡張クラスSD_iSDIOを作成していろいろ試してみると上手く動かない事がありました。
SDFileSystemクラスはコンストラクタでSDカードを初期化せず、fopen関数で開く時に初期化を行っているようです。
今回はファイルアクセスが目的じゃなかったので、初期化をすっ飛ばしてコマンド送ってました。(^^ゞ

当面の対策として、main開始の直後でfopenで適当にファイルを開いて閉じ、SDカードの初期化を促す事にしました。

その3:HTTPClientライブラリを作成

基本構成は定評のあるDonatien GarnierさんのHTTPClientをベースとします。
思ったよりもすっきり組み込めました。

(ただ、時々エラーを返したり、固まったり、違うレスポンスを返したりとじゃじゃ馬になりました。(´・ω・`))

そしてこのあたりから時間が足りなく・・・

その4:NTPClientライブラリは作れない

そうです、FlashAirは基本的にHTTPClient専用なのです。UDPは喋れません。困りました。
時刻が合っていないと、OAuth認証で失敗してしまいます。

ググったところ、NiCTでタイムサーバのWebAPIが公開されていました。
http://www.nict.go.jp/JST/http.html

サクッと組み込みます。(時間ないので・・・( ;∀;))

その5:最後に合体!ツイートする!

それぞれ作ったライブラリを合体して動作を確認します。
ツイートできました!

Import programFlashAir_Twitter

東芝FlashAirを使って、直接ツイートするツイッタークライアントです。 supertweetやStewgate UなどのAPIプロキシを必要としません。 このプログラムは、mbed Advent Calendar 2014 をきっかけに作成されました。 http://www.adventar.org/calendars/523

直ツイートしてみて感想

さっくりまとめましたが実はまだ動作が不安定で、一度動かなくなると電源再投入しても動きません。
不思議です、どうもメモリ上に記憶しているのでしょうか。この辺りは要調査です。

しかし、家電量販店で買えるSDカードがここまで使えるとは驚きです。
専門店でしか買えないWiFiモジュールより大きなアドバンテージではないでしょうか。

今回の直ツイートでは、FlashAirの持つコマンドの一部しか使っていません。
送受信共に2048バイトの制限がある簡易なコマンドのほか、SDカード内のファイルを送受信データとして扱う機能もあるようです。
この機能を使えば、省メモリで大容量のデータが扱えるので、いずれ試してみたいですね。


明日は qa65000 さんです。よろしくお願いします。


Please log in to post comments.