[[FrontPage]] * 12/15 ArduinoとAndroidとWeb の接続 ... IoT, Internet of Things の開発 [#m3524ea6] ** Twitter 使ってみよう [#nb7905e0] - web メールのメールアドレスを用意してtwitter にid登録をお願いします。 -- twitter ... http://twitter.com -- メールが届いていることを確認できる必要があります。 ** Androidのプログラム で twitter にアクセスするプログラム例 [#xfa4b2f8] - twitter4j を使うと比較的簡単に作成できます。 -- http://twitter4j.org/ja/index.html - プログラム例 -- http://www.adakoda.com/adakoda/2011/06/android-androidtwitter4joauth.html -- http://log.miraoto.com/2012/01/219/ -- http://d.hatena.ne.jp/tomstay/20110403/1301825089 - twitter developers -- https://dev.twitter.com ** [[OAuth]] [#la0628a8] - Android のプログラムが Twitter の認証を受けて、つぶやくため、アプリケーションを登録し、認証(OAuth)に必要な情報を入手します。 - Oauth -- http://yuroyoro.hatenablog.com/entry/20100506/1273137673 ** Arduino-Android-Twitter を連携させるプログラム [#tea516cf] *** 明るさが変わったら tweet するプログラム例[#l9110413] - 12/8 のプログラムに twitter につぶやく部分を追加し、明るさが変わったら、LED を点滅し、そのことをtwitter でつぶやくプログラムをdown load し、動作させてみます。 -- AdkTwitter *** プログラムの説明 [#iae7fddd] - 前回で説明した ArduinoProcessor クラス において、 this.adkService.sendCommandToActivity("twitter tweet", "LED ON at "+date.toString()); を実行すると、LED ON ... を twitter でつぶやきます。 this.adkService.sendCommandToActivity("twitter tweet", "LED OFF at "+date.toString()); を実行すると、LED OFF ... を twitter でつぶやきます。同じつぶやきを連続してつぶやくと、twitter はそれを受け取らないため、date.toString(); をつぶやきに加えて、毎回、ことなるつぶやきにしています。以下、ArduinoProcessor の内容です。 package org.yamalab.android.AdkTwitter; import java.util.Date; import android.util.Log; public class ArduinoProcessor { private static final String TAG = "AdkService"; private AdkService adkService; private long lastTime; private long minimumHoldTime=100000; // 最小状態保持時間(msec)。twitter の制限も。tweet は1日に1000回まで。1時間で42回まで。 private boolean led_on=false; public ArduinoProcessor(AdkService s){ adkService=s; } public void setAdkService(AdkService as){ adkService=as; } public void processDigitalInput(int vals){ // Log.d(TAG,"processDigitalInput-"+vals); } public void processAnalogInput(int port, int val){ // Log.d(TAG,"processAnalogInput-port="+port+" val="+val); if(port==0){ if(val<=10){ if(adkService==null) return; if(!led_on){ Date date = new Date(); long timeNow=date.getTime(); if(timeNow-lastTime>minimumHoldTime){ this.adkService.parseSetCommand("out-d-8=1"); this.adkService.sendCommandToActivity("twitter tweet", "LED ON at "+date.toString()); led_on=true; lastTime=timeNow; } } } else{ if(adkService==null) return; if(led_on){ Date date=new Date(); long timeNow=date.getTime(); if(timeNow-lastTime>minimumHoldTime){ this.adkService.parseSetCommand("out-d-8=0"); this.adkService.sendCommandToActivity("twitter tweet", "LED OFF at "+date.toString()); led_on=false; lastTime=timeNow; } } } } } public void wait(int t){ try{ Thread.sleep((long)t); } catch(InterruptedException e){ } } } - this.adkService.sendCommandToActivity("<文字列>") は、文字列を、AdkTwitterActivity の parseStringMessage に伝えます。 - AdkTwitterActivity クラスの parseStringMessage において、文字列の先頭が "twitter " であれば、 残りの文字列を、TwitterController クラスの、parseCommand に伝えます。 - parseCommand において、先頭が "tweet " であれば、のこりを twitter でつぶやきます。 -- twitter の認証を受ける前の場合はつぶやきません。 - GUI の twitter タブをクリックし、[twitter にログインしてつぶやく] ボタンをクリックすると、TwitterController クラスの onClick() メソッドが呼び出されます。もし、twitter の認証がまだ得られていなかった場合、new connectTwitterTask().execute(); が実行され、ここで、twitter のログイン画面の表示やログイン後のトークンの取り出しなどが行われます。 ** 注意事項 [#l3f5efc0] - Activity はすぐに止まってしまいます。Arduino と継続的に通信を行わせるためには、Service を使う方法があります。 - Main thread でWeb にアクセスするとエラーになります。非同期タスク(AsyncTask)などを使う必要があります。 -- Android 3.x からの仕様のようです。それ以前は AsyncTask を使わなくても動きました。 ** 演習 [#q81d62e2] *** OAuth の設定とテスト [#a960067e] - 1. Eclipse を起動して、前回に説明した方法([[ADK 開発環境の構築]])と同様にして、AdkTwitter をプロジェクトに加えます。 - 2. AdkTwitter の TwitterController.java の以下の部分を、先に https://dev.twitter.com で取得した Consumer key と Comsumer secret key と Callback url で置き換えて保存します。 public String CONSUMER_KEY = "*****************"; // dev.twitter.com で public String CONSUMER_SECRET = "*****************************"; // dev.twitter.com で public String CALLBACK_URL = "http://www.yama-lab.org" ; // "myapp://oauth"; - 3. AdkTwitterActivity.java の boolean emulatorDebug=false; を boolean emulatorDebug=true; に書き換えて保存します。 - 4. Android タブレットを Usb ケーブルで パソコンに接続します。 - 5. 実機デバッグにより、およそ2分おきに、twitter に書き込みが行われることを確認してください。 *** 簡単な改造 [#v5f398f4] - 前回、Arduino の 6,7 番ポートの ON/OFF を読み取れるように、回路を作成しましたが、その ON/OFF を Twitter につぶやくように ArduinoProcessor.java を書き換えてください。 -- 1. AdKThread.java の test メソッドを、 public void test(){ Message m1 = Message.obtain(null, MESSAGE_DIGITAL); byte dd=0x01; m1.obj = new DigitalMsg(dd); this.digitalVals=dd; sendMessage(m1); this.arduinoProcessor.processDigitalInput(dd); wait(5000); m1 = Message.obtain(null, MESSAGE_DIGITAL); dd=0x02; m1.obj = new DigitalMsg(dd); this.digitalVals=dd; sendMessage(m1); this.arduinoProcessor.processDigitalInput(dd); wait(5000); } に書き換えてください。 -- 2. processDigitalInput メソッドを、つぶやくように書き換えます。 -- 3. AdkTwitterActivity.java の boolean emulatorDebug=false; を boolean emulatorDebug=true; に書き換えて保存します。 -- 4. 実機デバッグで、ボードとは切り離した状態で動作確認してください。 -- 5. AdkTwitterActivity.java の boolean emulatorDebug=true; を boolean emulatorDebug=false; に書き換えて保存します。 -- 6. パッケージを作成し、Android 端末にコピーし、インストールし、ボードと接続し、動作確認 をしてください。 *** AdkTwitter を改造してなにか面白いアプリケーションを作ってみてください。 [#fb752acb] ** Arduino-Android-Wiki システムの紹介 [#a868f3a0] ---- #counter