mbed+FlashAirで直ツイート!
.
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!?
なんと、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.