ルネサスRX62N/RX63Nマイコンには、ネットワークコントローラが内蔵されています。
この内蔵LANを使ったアプリケーションとして、ツイッターにつぶやくプログラムを公開します。
自作プログラムからTwitterにつぶやくにはOAUTHとかいう認証方法でログインしなければなりませんが、これはとても面倒くさいそうです。
そこで、この認証を代行してくれるWebのサービスを使います。
例えば、http://www.supertweet.net/ というのがあります。
このsupertweetにアカウントを作れば、supertweetへ簡単な認証(BASIC認証)でログインすれば、supertweetの中のプログラムがOAUTH認証を行ってTwitterへ代理で投稿してくれるというものです。こういうサービスは探せば他にもあると思います。
まず
http://www.supertweet.net/
でアカウントを登録します。
未確認ですが、自分でホストすることも出来るようです。
http://code.google.com/p/supertweet-twitter-api-oauth-proxy/downloads/list
登録したら、パスワードをActivateというリンクから登録します。パスを登録したら、以下のようにtelnetすることによって投稿できます。
telnet api.supertweet.net 80
(接続)
POST /1/statuses/update.xml HTTP/1.0
Host: api.supertweet.net
Authorization: Basic ●●●●●●● (user:passwordをbase64でエンコードしたもの)
Content-type: application/x-www-form-urlencoded
Content-Length: 13(status=の部分の文字のバイト数)
(改行)
status=aaaaaa(内容)
(改行)
こんな感じのテキストベースのやりとりをすればいいので、TELNETを使ってTwitterに投稿できるというわけです。
status=aaaaaaの部分がつぶやく内容で、Content-Length: 13の部分がその長さ(status=も含む)です。
ただし、supertweetでは2バイト文字が扱えないようなので、日本語は書けません。日本語でつぶやくにはhttp://twitter-basicauth.appspot.com/ を使うといいという話もあります。UTF-8なので漢字1つが2バイトではないので、ややこしいです。また検証して、近々書こうと思います。
ユーザ名とパスワードは username:password をbase64でエンコードしたものなのですが、改行コードとか厳密に決まっているようで、ちゃんと改行コードも含めてエンコードしないと認証が通りません。
linuxの端末があれば、 echo -n user:pass|base64
でエンコードして、それを貼り付けてください。なお、一見ぐちゃっとした文字列になりますが、暗号化しているわけではないので「つつぬけ」です。ご注意ください。くれぐれもbase64でエンコードされたusername:passwordの文字列をネットに貼り付けたりしないようにしてください。
なお、このプログラムはGR-SAKURA上で設計されましたが、特に何らかの制限をつけているわけではありません。内蔵ネットワークコントローラとRTC以外のリソースは使っていないので、あらゆるRX62N/RX63Nで動くはずです。
世界中に既に何億個とあるRXマイコンがつぶやきはじめる。すばらしい世界ではないですか!?
皆様のお持ちのボードでもつぶやかせたい、というご要望がございましたら、ぜひお寄せください。いろいろなボードに対応させますし、ライブラリも徐々にオープンにしていこうと思います。
現状では、ルネサスのWebコンパイラでコンパイルすればGR-SAKURA用のプログラムになりますし、特電のWebコンパイラでコンパイルすれば、究極RX62Nボードでも、RaXinoでも、Interface誌付録基板でも走るようになると思います。それ以外の各社のRX62N/RX63Nボードでも、外付けPHYのポート構成が上記の評価ボードと(約1/2以上の確率で)一致するようであれば、動いてしまうと思います。
「このボードでも動かしたい」というご要望がありましたら、ぜひお寄せください。
ぜひお試しください。
#include <rxduino.h>
#include <Ethernet.h>
#include <rtc.h>
byte mac[] = { 0x02, 0x00, 0x00, 0x00, 0x11, 0x49 };
TEthernet Ethernet;
EthernetClient client;
int sw_prev = 1;
int count = 0;
void debug(int num) {
digitalWrite(PIN_LED0, num & 1);
digitalWrite(PIN_LED1, num & 2);
digitalWrite(PIN_LED2, num & 4);
digitalWrite(PIN_LED3, num & 8);
}
void tweet(char *message) {
byte *server = Ethernet.gethostbyname("api.supertweet.net");
debug(6);
delay(50);
printf("Server addr = %d.%d.%d.%d\n",server[0],server[1],server[2],server[3]);
if (client.connect(server, 80)) {
debug(7);
delay(100);
char status[1024];
char *p = status;
p += sprintf(p,"POST /1/statuses/update.xml HTTP/1.0\r\n");
p += sprintf(p,"Host: api.supertweet.net\r\n");
p += sprintf(p,"Authorization: Basic bmFoa●●●●●●●●●●●●●●=\r\n");
p += sprintf(p,"Content-type: application/x-www-form-urlencoded\r\n");
char tmp[32];
sprintf(tmp,"Content-Length: %d\n",(int)strlen(message)+7);
p += sprintf(p,tmp);
p += sprintf(p,"\n");
p += sprintf(p,"status=");
p += sprintf(p,message);
p += sprintf(p,"\n");
p += sprintf(p,"\r\n");
client.write(status);
Serial.write(status);
debug(8);
}
else {
Serial.println("connection failed");
}
debug(9);
sw_prev = 0;
}
void setup() {
pinMode(PIN_LED0,OUTPUT);
pinMode(PIN_LED1,OUTPUT);
pinMode(PIN_LED2,OUTPUT);
pinMode(PIN_LED3,OUTPUT);
pinMode(PIN_SW ,INPUT);
debug(1);
Serial.begin(38400,SCI_USB0);
debug(2);
Serial.setDefault(); // printfをSerialに出力
Serial.println("connecting...");
Ethernet.begin(mac);
int year,mon,day,hour,min,sec;
RTC::getDateTime(year,mon,day,hour,min,sec);
debug(3);
while(1) {
Serial.print("MY IPADDR=");
Serial.println(Ethernet.localIP()); // IPアドレスを表示
if(stricmp(Ethernet.localIP(),"0.0.0.0")) break;
debug(4);
Serial.println("retry..");
Ethernet.dhcp();
}
debug(5);
char message[1024];
sprintf(message,"This tweet is from GR-SAKURA. But every RX62N/63N board has avility to tweet. I will soon support. Current RTC time is %d/%d/%d %d:%d:%d. Nahitafu. ",year,mon,day,hour,min,sec);
tweet(message);
while(client.connected()) {
Ethernet.processPackets();
if (client.available()) {
char c = client.read();
Serial.print(c);
debug(c);
}
}
}
void loop() {
if (client.available()) {
char c = client.read();
Serial.print(c);
debug(c);
}
}
最近のコメント