[[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 を使わなくても動きました。
- Android 端末と twitter の時刻が大きくずれているとtwitter の認証がうまくいかない場合があります。
** 演習 [#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 端末にコピーし、インストールし、ボードと接続し、動作確認
をしてください。
- 解答例
 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,lastTime2;
    private long minimumHoldTime=100000; 
    private long minimumHoldTime2=120000; 
      // 最小状態保持時間(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);
 	   Date date = new Date();
 	   long timeNow=date.getTime();
 	   if(timeNow-lastTime2>minimumHoldTime2){
 	      if((vals & 0x01)!=0){
 	          this.adkService.sendCommandToActivity("twitter tweet", "Port 7 ON at "+date.toString());		   
 	      }
 	      if((vals & 0x02)!=0){
 	          this.adkService.sendCommandToActivity("twitter tweet", "Port 6 ON at "+date.toString());		   
 	      }
 	      lastTime2=timeNow;
 	   }
 	   
    }
    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){
 		   
 	   }
    }
 }
*** AdkTwitter を改造してなにか面白いアプリケーションを作ってみてください。 [#fb752acb]
** Arduino-Android-Wiki システムの紹介 [#a868f3a0]
- AdkWikiConnectorService
----
#counter

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS