goo blog サービス終了のお知らせ 

寝ても覚めてもPSoC

電子工作とマイコンをやりはじめました。
ど素人ですので配信する情報の取り扱いには十分注意してください。

SilentMoonSDKでネイティブアプリ 完成

2010年02月23日 | ColdFire
”TwitterおみくじBOT for ColdFire”が完成しました!

MakeColdfireBin.batとソースのユーザー名とパスワードを書き換えてビルドし、コンソールでExecUser(1)とすればBOTが起動します。[e]キーで中断しない限り、約2分毎に処理を繰り返します。
Twitterで@ユーザー名付きでメッセージに”おみくじ”と入れて送信すると、運勢を返信してきます。

ビルドの注意点として、文字コードをUTF-8にそろえるためソースファイルもUTF-8となっています。CodeWarriorではUTF-8の設定ができないため(設定する方法があればぜひ教えてください)、ソースの編集はTeraPadで行い、ビルドだけIDEで行います。決して、IDE上でソースの編集を行わないでください。
ColdFire基板単独で動作するので特に配線は必要ありませんが、AN0はどこにも接続しないでください。なぜならば、乱数生成にAN0を使用しているからです。未接続でA/D変換すると出鱈目な数値を返してくるのを(強引に)利用しています

今回SilentMoonSDKでTwitterBOTを作りましたが、作成時に起きた問題点をまとめると以下のようになります。

1.標準ライブラリが少ないので必要なものは自作する必要がある
2.GetNetLine関数は1行取得の使いやすい関数だが254文字までしか受け取れない。255文字以上の場合はカットされる。今回はサンプルのためこの関数を使用したが、長い文字列を取得する必要がある場合は、Read関数とGetReceiveBuffer関数で処理しなければならない。
3.GetNetLine関数に関連するバグに悩まされたが、結局は自分が余計なパラメータを送信していたのが原因だった。疑ってゴメンよ...
4.XMLパーサはまともに作ると大変なので、出力形式が固定であるので単なる文字列処理として簡略化した。出力フォーマットが変更されたら若干修正作業が発生するwww
5.日本語文字の出力は&#nnnnというHTML実体参照形式になる。nnnnはUnicode十進数らしく、これをUTF-8文字列に変換するには、
 code = atoi(nnnn);
 utf8[0] = (BYTE)(0xE0|(code>>12));
 utf8[1] = (BYTE)(0x80|(((code>>8)&0x0f)<<2)|(code>>6)&0x03);
 utf8[2] = (BYTE)(0x80|(code&0x3f));
 utf8[3] = 0;
でOKだった。ここに変換の図が載っています。トン!
6.Twitterメッセージのidが大きすぐる!w 今後どーすんだろ?とりあえず今回は2分割しましたが...

とにかく他のプラットフォームのように文字列関数や数値関数が充実してたり、漢字コード変換も関数一発とはいかないのでこういうのは苦労しますね。とくに僕のようなメモリ大量、高速CPUになれた”ゆとり君”には。変換サーバを通せば楽なんだけど、それじゃー意味ないしなぁ...
あ、ちなみに長時間稼動させた事はないので安定度は未知数です


続いてTwitterBOTの仕組みです。これが正しいとかではなく、”この方法でできました”です。つまり俺流ですので、ご了承ください。

1.誰かから @BOTユーザー名 メッセージ としてリクエストしてもらいます。
2.BOTは mentions API で返信メッセージの一覧を取得します。
  ※通常は最新の返信メッセージを受け取るため、 since_id パラメータでidを指定します。
3.いろんな(余計な)データが取得できますが、最低限必要なパラメータは、
 status.id....メッセージのid
 status.text...メッセージ本文
 status.user.screen_name...返信ユーザー名
 です。出力データを見れば構造はすぐわかります。
4.受け取ったメッセージ本文の中にキーワード(今回は”おみくじ”)が存在したら、@返信ユーザー名 ほにゃららら~ と、 update API でつぶやきます。
5.取得したリスト分繰り返します。
6.API制限のため数分待機して2.に戻る。

このBOTでは mentions API のpage制御をしていません。巡回時に2page以上も返信リクエストがある場合はちゃんと処理する必要があります。そんな人気なBOTを作ってみたいですがw
とりあえずは countパラメータで 200 としておけば良いのではないでしょうか
くれぐれもスパムBOTにならないように気をつけないといけないですね。


いろいろ難がありましたが、ColdFire+SilentMoonSDKでのネイティブアプリ開発は、所詮はマイコンなので大きなものを対象としなければ非常に有効な手段だと思いました。(もう少しライブラリを整備する必要はありますが...)
現状PSoCではTCP/IPが使えないので、I2CやUARTでやりとりしたりして組み合わせると...夢広がりますwww

プロジェクトです。
ColdFire_Twitter_omikujiBOT.lzh
※twbot.cで定義されているUSERNAMEとUSERPWを自分の情報に書き換えてください。
※MakeColdfireBin.batのIPアドレスを自分の環境に書き換えてください。


※現在はBASIC認証が廃止されているため、そのままでは動作しません。