ルネサスRX62N/RX63NマイコンからTwitterに投稿するには
ルネサス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); } }
| 固定リンク
コメント
GR-SAKURAでお世話になったABAです。ツイートするサンプルで修正しておいた方が良さそうな所があったので、お知らせします。
supertweet改訂でPOST先が変わっています。/1/statuses/update.xml → /1.1/statuses/update.json
あと、サンプルだと150文字つぶやいているので140文字制限に引っかかります…。
投稿: ABA | 2013.03.27 11:53
恐れ入りますが、GRのことはもう思い出したくありません。
嫌な思いをいっぱいさせられました。
もうこりごりです。
投稿: なひたふ | 2013.03.27 12:37