FrontPage

12/15 ArduinoとAndroidとWeb の接続 ... IoT, Internet of Things の開発

Twitter 使ってみよう

  • web メールのメールアドレスを用意してtwitter にid登録をお願いします。
    • twitter ... http://twitter.com
    • メールが届いていることを確認できる必要があります。

Androidのプログラム で twitter にアクセスするプログラム例

OAuth

Arduino-Android-Twitter を連携させるプログラム

明るさが変わったら tweet するプログラム例

  • 12/8 のプログラムに twitter につぶやく部分を追加し、明るさが変わったら、LED を点滅し、そのことをtwitter でつぶやくプログラムをdown load し、動作させてみます。

プログラムの説明

  • 前回で説明した 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 のログイン画面の表示やログイン後のトークンの取り出しなどが行われます。

注意事項

  • Activity はすぐに止まってしまいます。Arduino と継続的に通信を行わせるためには、Service を使う方法があります。
  • Main thread でWeb にアクセスするとエラーになります。非同期タスク(AsyncTask?)などを使う必要があります。
    • Android 3.x からの仕様のようです。それ以前は AsyncTask? を使わなくても動きました。
  • Android 端末と twitter の時刻が大きくずれているとtwitter の認証がうまくいかない場合があります。

演習

OAuth の設定とテスト

  • 1. Eclipse を起動して、前回に説明した方法(ADK 開発環境の構築)と同様にして、AdkTwitter をプロジェクトに加えます。
  • 2. AdkTwitterTwitterController?.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 に書き込みが行われることを確認してください。

簡単な改造

  • 前回、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 を改造してなにか面白いアプリケーションを作ってみてください。

Arduino-Android-Wiki システムの紹介


Counter: 1554, today: 1, yesterday: 0

添付ファイル: filedev-twitter-10.jpg 393件 [詳細] filedev-twitter-9.jpg 435件 [詳細] filedev-twitter-8.jpg 410件 [詳細] filedev-twitter-7.jpg 411件 [詳細] filedev-twitter-6.jpg 222件 [詳細] filedev-twitter-5.jpg 390件 [詳細] filedev-twitter-4.jpg 406件 [詳細] filedev-twitter-3.jpg 384件 [詳細] filedev-twitter-2.jpg 355件 [詳細] filedev-twitter-1.jpg 368件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-12-15 (土) 16:18:29 (4149d)