2012-04-03 16:20:43

FlucardでプログラムとかCGIとか

テーマ:メモ
Flucardを先々月購入して中身をいろいろと調べてみたらARMでLinuxを動かしてることがわかりました。
本来とはちょっと違った使い方なので真似される方は自己責任でお願いします<(_ _)>


・telnetでログイン
なんとflucardのWiFiアクセスポイントに接続してtelnetでログインできちゃいます。
ただしファームウェアヴァージョンが新しいものはtelnetが無効にされているみたいなので試される方はダウングレードしてみてください。
ver3.58でtelnetdが起動しているのを確認しました。

ターミナルから
telnet 192.168.1.1または
telnet flu.card
でログイン。

ご覧のとおりLinuxで動いています。

CPUはARM9で5TEJというアーキテクチャのものが使われているようです。
#cat /proc/cpuinfo
Processor    : ARM926EJ-S rev 5 (v5l)
BogoMIPS    : 200.29
Features    : swp half fastmult edsp java
CPU implementer    : 0x41
CPU architecture: 5TEJ
CPU variant    : 0x0
CPU part    : 0x926
CPU revision    : 5

Hardware    : KeyASIC Ka2000 EVM
Revision    : 0000
Serial        : 0000000000000000


・Flucardで自作プログラムをコンパイルしてみる
CPUアーキテクチャが分かったら自作のプログラムをコンパイルして動かしてみたい衝動に駆られますよね(^_^;A

まずはコンパイラの入手&インストール。
ARM用のgccコンパイラで商用のSourcery CodeBenchというものがあります。
無料で使えるLite Editionでも十分なのでこれを使います。
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
のARM processorsの欄にあるDownload the GNU/Linux Releaseをクリックします。
するとメールアドレスとパスワードを入力する画面がでるので適宜入力してGet Lite!をクリック。
入力したメールアドレスにダウンロード先のアドレスが送られてくるのでそれをクリック。
一番上にある最新のDownload Sourcery CodeBench Lite 2011.09-70をクリック。
適宜使ってるOSに合わせて一覧からダウンロード。
ダ ウンロードしてインストールしたらarm-none-linux-gbueabi-xxxといった開発に必要なコマンドが一式出来上がるので実行パスを通 しておく。(他は知りませんがLinuxの場合は自動でパスを通してくれました。ログインしなおすと適用されてます。)

お決まりのHello Worldを表示してみる。

#include <stdio.h>
int main()
{
   printf("Hello World!!\n");
   return 0;
}
↑これをエディタでhello_world.cと保存して
arm-none-linux-gnueabi-gcc -static -o hello_world hello_world.c
と打ち込んでコンパイルします。
よくわかりませんが-staticオプションを付けないとダイナミックリンクになってしまい、実行時にライブラリを要求してしまいエラーになるので必ずスタティックでビルドします。
バイナリが出来上がったらFlucardにアップロードするかFlucardにコピーします。

・Webページからアップロードする場合

アップロードしたファイルはFlucard内の/DCIM/122_TREKというフォルダに保存されます。

・Flucardにカードリーダー等からコピーする場合
/DCIM/122_TREKというフォルダにhello_worldをコピーするだけです。

実行するにはtelnetでログインして
telnet 192.168.1.1
cd /mnt/sd/DCIM/122_TREK
./hello_world
とするとHello World!!が表示されれば成功です。

コンパイルしたhello_world実行バイナリはスタティックビルドのためかHello World!!と表示するだけなのに640KB以上もあります。
stripしても500KBくらいなのでSDカードにコピーしておいて実行パスにシンボリックリンクしたほうが良いです。
/mnt/mtdにマウントされているNORフラッシュメモリは1MBで残りが7割ほど空いてますがここに保存するのは危険です。
WiFiアクセスポイントのコンフィグファイルがあるのでここを弄るのはできるだけ避けましょう。

・パスの通った場所に自作プログラムをシンボリックリンクを張る場合
ln -s /mnt/sd/DCIM/122_TREK/hello_world /usr/bin/hello_world
↑こうするとどこからでもhello_worldを実行できます。

しかし、ルートシステムは書き換え不可の領域にマウントされているようで電源を切ってしまったらせっかく張ったシンボリックリンクが消えてしまいます。
そこでFlucardをアップデートする時に実行されるautorun.shスクリプトにリンク情報を書いておき、いつ起動してもリンクが切れないようにしておくという回避策をとりました。

↓autorun.shの中身
#!/bin/sh
ln -s /mnt/sd/DCIM/122_TREK/hello_world /usr/bin/hello_world
sleep 1

これをFlucardのルートに置いておき消さないようにしておけばいつ起動してもリンク状態は保ったままを維持することができます。

・CGI経由で自作プログラムを実行してみる
FlucardのLinuxシステム内の/www/cgi-binはCGIプログラムを実行するバイナリが置かれている場所です。
ここに自分で作ったプログラムをリンクすればインタラクティブで面白いことができそうです。
今度はCGI経由でブラウザにHello World!!を表示するプログラムを作ってみます。

#inlude <stdio.h>
int main()
{
   printf("content-type: text/html\n\n");
   printf("<html><body>\n");
   printf("Hello World!!\n");
   printf("</body></html>\n");
   return 0;
}
↑さっきのhello_world.cを改造してヘッダとHTMLタグを埋め込みます。
arm-none-linux-gnueabi-gcc -static -o hello_world hello_world.c

さっきと同じように122_TREKフォルダにhello_worldをコピーしておきます。
今度はこれを
ln -s /mnt/sd/DCIM/122_TREK/hello_world /www/cgi-bin/hello_world
として/www/cgi-bin/内にシンボリックリンクを張ります。

そしてブラウザからflu.card/cgi-bin/hello_worldにアクセスすると

CGI経由でブラウザからHello World!!を表示することができました。


Un-CGIをつかってスクリプトで書いて見る
Hello World!!が表示できたのでPOSTメソッドのフォームを使ったCGIプログラムができればもっと面白いものができそうです。
しかしブラウザからPOSTメソッドで入力されたデータをC言語で取り出すのはちょっとややこしいので
(perlやphpであれば文字列操作に強力なのですが..)
ややこしい部分を一手に引き受けてくれるUn-CGIをFlucard向けにコンパイルしてみました。
以下の例は入力フォームに名前と年齢とコメントを入力してCGIスクリプトでHTMLに書き出すものです。

入力フォーム(form.html)のソース
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>コメント入力</title>
</head>
<body>
<form method=POST action="cgi-bin/uncgi/myscript">
あなたのお名前
<input type=text size=30 name=name>
<p>
年齢<br>
<select name=age multiple>
<option> 0~20歳未満
<option> 20~50歳未満
<option> 50歳以上
</select>
<p>
コメント
<br>
<textarea name=_comments rows=10 cols=60></textarea><br>
<p>
<input type=submit value="送信する">
</form>
</body>
</html>


CGIスクリプト(myscript)
#!/bin/sh
echo 'Content-type: text/html; charset=UTF-8'
echo ''
echo '<html>'
echo '<head>'
echo '<title>コメント</title>'
echo '<meta http-equiv="content-type" content="text/html; charset=UTF-8">'
echo '</head>'
echo "$WWW_name さん (年齢:$WWW_age)からのコメントです。"
echo '<br>'
echo "$WWW_comments"
echo '</body></html>'




Un-CGIのおかげでbashスクリプトでこんなに簡単にインタラクティブなWebが作れました。
Un-CGIはフォームの各パーツの名前を$WWW_hogeといった形式の変数でCGIに渡してくれます。


以上でいままでやったことをまとめてみました。
私にはセンスがないのでFlucardで何か面白いものを作ってくださる方がいればいいなと思って書きました。(他力本願w)


Flucardのコントロールピクチャも変更できるよ!(詳しくは画像をクリック)



☆2012/4/20更新☆
・rubyのsocket.soが生成されてなかったためsocketライブラリが使用できない不具合を解消しました。

deploy_20120420.zip


☆2012/4/11更新☆

osakanataroさんが
autorun.shの動作をDCIM/122_TREK/fluconfig.txtの内容を編集することで変えられるスクリプトを書いてくださいました<(_ _)>

http://blog.osakana.net/sw/flucard/flucard-autorun-20120411.zip


☆2012/4/10更新☆
・rubyが動くようになりました。

deploy_20120410.zip

ファームウェアヴァージョンが新しいもの(3.62以上?)はtelnetd機能が無効化されているようなので以下のコマンドをautorun.shに追加しました。
killall telnetd
sleep 1

mount -t devpts /dev/pts
/mnt/sd/DCIM/122_TREK/busybox telnetd -l /bin/sh &
sleep 1

しかしtelnetログインすると当方の環境ではログイン直後にコネクションが落ちてしまいました。
調べてみると、
 __getpagesize: Assertion `_rtld_global_ro._dl_pagesize != 0' failed.
という謎のメッセージが・・・。
とりあえずsshログインはできるようです。


☆2012/4/9更新☆
・perlが動くようになりました。

・dropbearによるsshログインができるようになりました。(scp, sftpも使えます。)
ssh 192.168.1.1
password
でログインできます。
autorun.shのdropbear -A -N root -C admin -U 0 -G 0でsshdを起動しています。
パスワードは-Cオプションのadminを書き換えると変更できます。

また、公開鍵暗号を使ってパスワードなしで認証ログインすることもできます。
-クライアント側で公開鍵を作りFlucardに転送-
ssh-keygen -t rsa -f ~/.ssh
scp ~/.ssh/id_rsa.pub 192.168.1.1:/etc/dropbear/authorized_keys

-Flucard側の操作-
killall dropbear
dropbear -A -N root -C '-' -U 0 -G 0 -R /etc/dropbear/authorized_keys -s

-認証ログイン-
ssh 192.168.1.1 または
ssh -i ~/.ssh/id_rsa 192.168.1.1

deploy_20120409.zip



☆2012/4/6更新☆
・フル機能のbusyboxをコンパイルして載せました。
122_TREK/busyboxから適当に追加したいコマンドを引き出してください。

・実行バイナリの動的リンクに対応しました。
自作バイナリをstaticでコンパイルしなくても動くようになります。
122_TREK/lib内にあるシェアードライブラリをFlucardの/libにシンボリックリンクしています。
↓動的リンクでコンパイルしたバイナリの依存ライブラリの確認方法
arm-none-linux-gnueabi-readelf -a hoge | grep NEEDED

・PHPが使えるようになりました。
122_TREK/etc/php.ini           phpコンフィグファイル
122_TREK/www/php/info.php        phpのinfo()
122_TREK/www/php/exif_thumbnail.php  JPEGのEXIFサムネイル表示テスト

・FTPが常時使えるようになりました。
put/getできます。

deploy_20120406.zip


AD
いいね!した人  |  コメント(11)  |  リブログ(0)

コメント

[コメントをする]

11 ■無題

これはすごく夢が広がりますね-!
公開ありがとうございます。

PHPが5.4系になったらうれしいな。

10 ■Re:Re:Can we refer to the develop kit?

>とんすけさん
Thank you very much!~
^^

9 ■Re:Can we refer to the develop kit?

>KeyASIC AEさん
i'm really pleased to hear that.^^
i hope many people use this.
thanks

8 ■Can we refer to the develop kit?

Dear Moderator,

I'm AE from KeyASIC Co.
The deploy_20120420.zip is very interesting and complete for developers.
Can we release the develop kit base on your deploy_20120420.zip to all the developer?

7 ■Re:Re:データの見え方

>とんすけさん
ご回答いただきましてありがとうございました。
残念ですがあきらめたいと思います。

6 ■Re:データの見え方

>flufluさん
USBカードリーダでFlucardをマウントした状態でtelnetやsshでログインしてファイルを作成した場合は一度アンマウントして取り出さないとPC側に反映されないですね。
PCはカード挿入時に最初に読み込んだファイル構成をバッファに記憶してるのだと思います。
その後PCが作成したファイルとバッファを照らし合わせて中身を表示しているのだと思います。
なのでFlucard側で書換えたファイル構成は一度取り出さないとPC側で反映しないのだと思います。

5 ■データの見え方

telnetやsshでアクセスした状態でSDカードの
直下にファイルを書き込んでも/mnt/sdに
ファイルが現れないのは仕様でしょうか?
(syncとかやってみても同様)

逆にターミナルで/mnt/sdに適当にファイル作成
してもSDカードの直下にも現れません。
(syncとかやってみても同様)

いったんカードを抜き差しすると現れます。

USBとWiFi排他処理の関係でこうしてるのでしょうか?
どちらから書いても見える方法はありますか?

4 ■書き忘れてました

autorun.shは、自由に改造して使ってください

3 ■Re:telnetdとsshd

>osakanataroさん
スクリプトを使わせて頂いたところtelnetログインできました<(_ _)>

2 ■Re:telnetdとsshd

>osakanataroさん
はじめまして♪
これはわかりやすいですね。
早速ブログで紹介させて頂きたいと思います。

ひとつ質問させて頂きたいことがありましてosakanataroさんのブログで拝見したところ、最新ファームでtelnetログインができたとのことですが、フル機能のbusyboxからtelnetdを起動されたこと以外で何か特別な操作をされてますでしょうか?
telnetdサーバーは正常にlistenしてるのですが私の環境では接続後すぐに切れてしまう謎のエラーに見舞われております。

1 ■telnetdとsshd

/領域のファイル置き換えを行わないとtelnetdが動きますね

autorun.shの動作をDCIM/122_TREK/fluconfig.txt の内容を変えることで変えられるようにしてみました。

http://blog.osakana.net/sw/flucard/flucard-autorun-20120411.zip

コメント投稿

AD

Ameba人気のブログ

Amebaトピックス

      ランキング

      • 総合
      • 新登場
      • 急上昇
      • トレンド

      ブログをはじめる

      たくさんの芸能人・有名人が
      書いているAmebaブログを
      無料で簡単にはじめることができます。

      公式トップブロガーへ応募

      多くの方にご紹介したいブログを
      執筆する方を「公式トップブロガー」
      として認定しております。

      芸能人・有名人ブログを開設

      Amebaブログでは、芸能人・有名人ブログを
      ご希望される著名人の方/事務所様を
      随時募集しております。