« MR-RX47Tを入手! | トップページ | i.MX508(Cortex-A8)のバウンダリスキャン »

2012.08.04

ルネサス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);
  }
}

|

« MR-RX47Tを入手! | トップページ | i.MX508(Cortex-A8)のバウンダリスキャン »

コメント

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

コメントを書く



(ウェブ上には掲載しません)




« MR-RX47Tを入手! | トップページ | i.MX508(Cortex-A8)のバウンダリスキャン »