FrontPage
12/15 ArduinoとAndroidとWeb の接続 ... IoT, Internet of Things の開発 †
Twitter 使ってみよう †
- web メールのメールアドレスを用意してtwitter にid登録をお願いします。
Androidのプログラム で twitter にアクセスするプログラム例 †
- twitter4j を使うと比較的簡単に作成できます。
- プログラム例
- Android のプログラムが Twitter の認証を受けて、つぶやくため、アプリケーションを登録し、認証(OAuth)に必要な情報を入手します。
- 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. 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 に書き込みが行われることを確認してください。
簡単な改造 †
- 前回、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