2006年05月26日

PCMCIAカードの状態をさぐる。(その1 挫折物語)

カードが生きているか、死んでいるか簡単に分かりそうなものだけど、
まったく見つけることが出来ないせらくんです。

さて、現在ざうもにのサーチ中に電源を切られても、
安全に動作する方法を捜索中です。

案として、
$cardctl status
からsuspendかbusyかを受け取って調べてみる方法を考えてみました。
が、標準出力を受け取るだけなんてかっこ悪い(俺基準)ので、
cardctlのソースコードの中にもっと簡単な方法がないか探って見ます。


■ソースコード
http://pcmcia-cs.sourceforge.net/から
pcmcia-csのソースを落として展開するとcardmgrの中に入っています。


■発見
ソースを覗いていくと、ioctl(fd, DS_GET_STATUS, &status)というやり方で、
カードの情報をゲットしていることが分かりました。

ioctlはシステムコールなんでいいとして、他のパラメータが意味不明です。
ひとつづつ、調べてみます。


■fd
何をopenした結果なんでしょうか。
ソースをひたすら追っていくと
static int open_sock(int sock)
という関数の中でopenした結果を返しているみたいです。

fd = open(fn, O_RDONLY);

謎なパスを開いています。「fn」。いったいなんでしょうか。
追ってみることにします。
謎はすぐ上の行にありました。

mknod(fn, (S_IFCHR|S_IREAD|S_IWRITE), dev)

どうやらシステムコールmknodを使って、新しくデバイスを作成して開いているようですね。
どんなデバイスでしょうか?
これもすぐ上にありました。

dev_t dev = (major<<8) + sock;

ここでmajorという数字を追ってみましょう。
ソースを追うと/proc/devicesにある下の数字のようです。

$cat /proc/devices
Character devices:
<略>
253 pcmcia
254 corgi-bl

Block devices:
<略>


pcmciaの頭の頭にある253を拾っているようです。
ここで253という数字はデバイスのメジャー番号を表しているようです。


■デバイスについてあれこれ
では、少し話しが分かりにくくなってきたので、LINUXのデバイスに
ついて調べてみたいと思います。

LINUXのデバイスは二つの種類に分けることが出来ます。
それは、ブロックデバイスとキャラクタデバイスです。

ブロックデバイスは、ブロック単位で読み書きするデバイスで
例えば「1ブロック512バイトでハードディスクから読み出す」といったことが
可能なようです。ハードディスクなんかに使われるようです。

そして、キャラクタデバイスとは1バイトずつ読み書きするデバイスと
なります。キーボードとかに使われるようです。


■メジャー番号についてあれこれ
さて、続きましてメジャー番号です。
デバイスを認識する番号には、メジャー番号とマイナー番号があります。
メジャー番号はカーネルがデバイスを認識するための番号。
マイナー番号はデバイスのドライバ内で使用するための番号です。


■閑話休題(話を元に戻すと)
上記の話を統合すると、俺のZaurusはPCMCIAをキャラクタデバイスとして
メジャー番号253で認識しているようです。

さて、もう一度mknod()を見てみましょう。

dev_t dev = (major<<8) + sock;
mknod(fn, (S_IFCHR|S_IREAD|S_IWRITE), dev)


sockはSocket番号を表しているようです。
($cardctl suspend 0 とかで0)
つまり、mknodで使うdevは、上位8ビットがメジャー番号、
下位8ビットがマイナー番号を表しているようです。

そして、上記のmknod()の引数にS_IFCHRとあります。
なんかキャラクタデバイスを設定しているように見えます。

つまり、パス「fn」に読み書き可能でキャラクタ型の
メジャー番号253、マイナー番号0のデバイスファイルを作れ!
と言う事をやっているようです。

本当かな?
ためしに作ってみます。


■ソース
manで調べてみるとmknod()に必要なヘッダーは
#include
#include
#include
#include
のようです。
さて、検証用のソースです。


#include
#include
#include
#include
#include

int main()
{
int fd;
char * fn = "/var/lib/pcmcia/testtest";
int dev = (253<<8);
if (mknod(fn, (S_IFCHR|S_IREAD|S_IWRITE), dev) == 0) {
fd = open(fn, O_RDONLY);
// unlink(fn);
if (fd >= 0) printf("fd =%d\n" ,fd);
}
return 0;

}






■コンパイル
次にコンパイルです。
$gcc pcmcia.c -o pcmcia_test
/tmp/ccPE0qKD.o: In function `main':
/tmp/ccPE0qKD.o(.text+0x3c): undefined reference to `mknod'
/tmp/ccPE0qKD.o(.text+0x3c): relocation truncated to fit: R_ARM_PC24 mknod
collect2: ld returned 1 exit status





うげー、俺の環境(dev_img1.3)ではmknodがみつからねぇ・・・。




調査、しゅーりょう。




>まじっすか。
まじです。
posted by せらくん at 20:03| 晴れ| Comment(49) | TrackBack(0) | ZAURUSなプログラミング | このブログの読者になる | 更新情報をチェックする

2006年05月22日

Zaurusでのcardctlの使い方(を間違えた編)

さくっと次バージョンを作ってから更新しようかなっと思っていたら、
2週間過ぎてしまったせらくんです。

そんな感じで穴埋め記事でも。

■はじめに
Ver.1.0.0でZaurusをリセットマシーンにしてしまうという、最悪の機能を
搭載していたざうもにですが、コメントを見る限りVer.1.0.0_1で修正に成功したみたいです。

原因は「内蔵ハードディスクを停止していた!」という、
なんともひどいありさまです。

こんなひどいバグにもかかわらず、冷静に報告していただいた皆様、
ありがとうございます。そして、ごめんなさい。


■具体的には その1
cardctlというコマンドがあります。これは、PCMCIAカード制御ユーティリティで
ZaurusではCFカードの挿入や排出に使われています。

ためしにこのコマンドを使ってカード状況を見てみましょう。
コンソールから下のコマンドを打ってみましょう。
※$は打つ必要がありません。

$cardctl status

Socket 0:
no card
Socket 1:
no card

表示されました?

「えー、俺のはSocket1には、no cardなんて書いてないぜ!
何かが刺さっているぜ!」

といったあなた。
あなたの機種はハードディスク搭載ですね。うらやましいです。
※俺の持っているSL-860にはハードディスク乗っていません・・。

次に一番目のSocketだけのステータスを見てみましょう
コマンドの語尾に0を追加しています。

$cardctl status 0

no card

ふむ。0番目のカードの状態が表示されています。

どうやら、カード番号を指定しないとSocketの0と1の
操作を同時に行うようです。


■具体的には その2
では、次にカードをresumeしてみましょう。
PHSカードをさしているとLEDがぴかぴかします。

$cardctl resume

ふむ。PHSカードがぴかぴかし始めました。

次にsuspnedしてみましょう。

$cardctl suspend・・・ストップ!

その1を見て分かるとおり、Socketを指定しないと、
socket0、1の両方を操作します。

つまり、socket1にハードディスクが刺さっていると、
ハードディスクも停止します!!

停止したまま、ハードディスクのswapやソフト、データにアクセスすると
Zaurusがリセットすることに・・・。あな、おそろしや。


■対策
といったわけで、ざうもにVer1.0.0_1では
「cardctl suspend」を
「cardctl suspend 0」に
変更したのでした。


■TIPS
たまにPHSカードがビジーです!となったときは、
「cardctl suspend 0」
とコマンドラインから打ってあげると、うまくいけるかも。
※ハードディスクが止まっても責任取れませんが・・。


■近況
MobileMapの起動に成功!
したのはいいけども、通信中に電源を切るとフリーズするバグの
直し方が不明。
電源を切った後って、SIGNALは何か来ます?

現在、cardctlのソースを解読しながら、カードのステータスを
読み出す方法を模索中。そして、挫折中・・・。


posted by せらくん at 22:24| 曇り| Comment(5) | TrackBack(0) | ZAURUSなプログラミング | このブログの読者になる | 更新情報をチェックする

2006年05月02日

位置情報取得!ざうもにVer.0.0.1リリース

どうも、Googleにアフェリエイト申し込んだら、
「Googleのマークを勝手に使うな馬鹿たれが!」
といわれたせらくんです。
(※モザイク入れました(笑))

それは、さておきボタン一発位置情報取得ツールこと、「ざうもに」が
出来たみたいです。
将来はモニター機能搭載を夢見て「ざうもに」です。

GWかなりつぶしてテストをしましたが、そこは作者、危険な操作は本能が避けてます・・。


■スクリーンショット
画面がださいっすね。
ざうもにVer.0.0.1


■準備
ざうもにVer.0.0.1
ざうもにVer.0.0.1_1
PHSカード(Willcom系)
WhatsUpOnZ(強制終了に便利・・・(笑))

■使い方
1.ipkを落として、インストール。
(まともにインストールできることを確認。)

2.Zaumoniを起動する。
(アルファベットのタイトルはZ押すと移れるから便利です。)

3.好きなブラウザを選んでSearchを押す。
netfront3 :qcop QPE/System 'execute(QString,QString)' netfront3
opera :qcop QPE/Network 'connectRequest()';sleep 15s;qcop QPE/System 'execute(QString,QString)' opera
(ネット接続後、Operaは15秒待って起動にしてみました。そのうち、まともな実装にしませう。)
none :ログをみて楽しむのみ。

4.しばし待つ。

5.フリーズしてもあわてない。(いざとなれば、WhatsUpOnZがいる!)

6.ログが出てくるので、ほくそ笑む。

7.その後、しばらく待つとブラウザが立ち上がる。

8.位置情報をゲット!


■注意点
サーチ中に電源を切るとフリーズします!ミスったー。気をつけて(05/03追記)
いまだ、人柱バージョンのようです。(05/10追記)

1. カードがビジーになっても泣かないように、動作原理の
ここを眺めといて下さい。

2.あわてない。

3. 本ソフトは完全無保証です。いかなる損害においても作者はびた一文責任を取りません。

4. 動かない!とだけ言われても「ごめんなさい」としか言いようがないですが、
動かない手順の報告は大歓迎です。


■機能
1.WILLCOMさんが提供してくれる郵便番号、緯度、経度情報を無許可で取得します。

2.緯度、経度を元にYahoo Mapを開きます。
(Googleは、変換がいるので対応はもう少し先)

以下、ぜひとも伝えたいこと。(苦労したとこ。使う人には関係ないけど・・・)
3.ネットに繋がっていたら、自動で切断

4.モデムが刺さっていない時にエラーを出す

5.キャンセル押すとZaumoniが終了されなかったのを強引に修正。

6.メニューボタンを押すと、メニューに飛ぶ。

7.ボタンのフォーカスをSearchに。マルチラインにフォーカスが食われるし・・。


■問題点
1.ソースがださい。
オブジェクト指向ってなんですか?
2.ダイアログごとにクラスを作るものなのかなぁ。
クラス分けのタイミングがわからない(デザインパターンですか)


■将来の予定
1.mobilemapの情報を試さなくては!
(1.3-5だと、失敗してしまった・・・。)

2.ログを取れるようにしなくては!

3.感度情報を拾えるようにしなくては!

4.複数測定して、平均を出す?
(測定結果ってそんなに変わりますか?
noneは再測定?している気分なんで試してみてください。
at@lbc2(測定停止)しないとだめなのかなぁ。)
俺の家だといつもおんなじアンテナです。
弱電界のテスト環境かっつーの。

4.C++を覚えなくては・・・。


■質問
mobilemapとかのQCOP情報ってどうなっているんですかね?
ハックの仕方等を知っている方は、どしどし情報ください!
(英語ぐらいだったら読むので。)


■ソース
なぜ、みんなtar.gzなのだろう。今回はzipで勘弁。
ざうもにVer.0.0.1ソース

■改版履歴
ざうもにVer.0.0.1 :新規リリース
ざうもにVer.0.0.1_1:cardctlの引数に0(Socket 0)を追加してみた。
posted by せらくん at 22:58| 雨| Comment(43) | TrackBack(7) | ZAURUSな遊び方 | このブログの読者になる | 更新情報をチェックする

2006年04月22日

コマンドライン一発で現在位置を取得してみる。

位置情報獲得し続けて二週間。せらくんです。

ボタン一発で位置情報!は、まだ完成は先ですけど、
コマンドライン一発で位置情報!は出来たみたいなので公開。

まぁ、人柱好き、実験大好きな人用です。


■完成
つーわけで、とりあえず「コマンド一発で位置情報 Yahoo編」
が完成しました。

えー、コマンドライン版です。ボタン一発はもう少し先に完成予定。
評価版なので、バグりそうな操作は確実にフリーズします。
そこんところ、自己責任で頼みます。


■必要なもの
at_serial(今回作ったやつ)
PHSカード(bitwarpについてきたVN-201だけでテスト)
ターミナル(おすすめはこれ)

■使い方
0. PHSカードをZAURUSに刺す
1. ネット接続が切れていることを確認
2. 適当にat_serial.zipを展開する
3. 展開して出来たat_serialをZAURUSにおいて
4. ターミナルから「./at_serial」と打つ
5. 下のログが表示される(ERRORが表示されても気にしない・・)
AT@LBC1
OK
AT@LBC?
ERROR
AT@LBC1
OK
AT@LBC?
2xx00xx
-
-
OK
AT@LBC1
OK
AT@LBC?
22xx0xx
N35:xx:xx
E139:xx:xx
OK
Display size = 480x640

6. Netfrontが起動して、ネットワークにつなぐか聞いてくる。
7. つなぐとYahooMapに地図が表示される。


■使い道
受験票をもって、駅を降りたとき迷子になりませんか?
こんなとき、このツールを使えば周りの地図をあっと言う間に表示できます!

あと、暇な時って近所のPHSアンテナを探しますよね!
そんなあなたに最適なお供になることでしょう!
(寂しい・・・、でも俺はこれがメインの使い道・・)


■動作保障
全部の機種で動くのだろうか・・・。
動かなかったら、ソースコード解析して原因をお知らせしてね。

あと、使った場合は自己責任で。壊れても僕には責任をとるだけの財産はありません。


■この先の展望
とりあえず、ログ出力させる予定。
どんなフォーマットだったら、使いやすいですかね。
今のところ、時間、緯度、経度のCSV形式ぐらいですけど。

こんなソフトと連携できる!なんて情報がありましたらお知らせください。
今なら、あなたの要望が通るかも!です。(もちろん、通らないかも・・・)


その内、電界強度の表示なんかもしようかな。
センスないので、数字の羅列・・・か?
posted by せらくん at 22:06| 晴れ| Comment(37) | TrackBack(2) | ZAURUSな遊び方 | このブログの読者になる | 更新情報をチェックする

2006年04月21日

シリアルポート通信でATコマンド(その4)

今日は天気もいいので、プログラム。せらくんです。

さて、シリアルポート通信でATコマンド編も今回で最終回。
次回からは「ボタン一発位置情報QT」を作ります。


■ソース
さて、ソフト自体の説明は他の記事で紹介するとして、
このカテゴリではプログラム的なお話を。

まずは、ソースコードを。
at_serial.h
at_serial.c
at_main.c

at_serial.hとat_serial.cは、ATコマンドをZAURUSに送るための
操作をまとめたものです。
at_main.cはat_serial.cの使い方のサンプルコードみたいなものです。


■インターフェース
この先、インターフェースの変更はありありですけど、
とりあえず、openとかwriteとかと同じインターフェースにしています。
int at_open(char * );
int at_close(int );
int at_write(int , char * , int);
int at_read(int , char * , int);

int at_open(char * );
引数には、"/dev/ttyS3"とかの開くデバイスが入ります。
戻り値はファイルディスクリプションです。

int at_close(int );
引数にはat_openで開いたディスクリプションを入れます。
開いたら、きちんと閉じましょう。

int at_write(int , char * , int);
引数は、ディスクリプション、書き込む文字列、文字数です。

int at_read(int , char * , int);
引数は、ディスクリプション、読み込むバッファ、文字数です。
戻り値は読み込んだ文字数です。0はタイムアウトをした時もこの値。

まぁ、わかりづらいと思うんで、サンプルのat_main.cでも眺めてね。


■注意点(というか、悩んだことコーナー)
open時は、O_NONBLOCKでノンブロックにしています。
なんかopenで帰ってこなくなることがあるんで。
readにselect使ってブロックしているから問題ないはずですよね。

writeで書くときのサイズは注意が必要です。
普通文字列だったら後ろに'\n'文字とかが勝手に加えられてます。
でも、これを送るとうまく動きません。
writeで書くときの文字数はジャストにする必要ありです。
AT@LBC1\r\nだったら、9になります。
※今回、悩んだっすよ。

closeしないで、cardctl suspnedすると実行中にサスペンドされます。
これも、結構悩んだっす。
突然サスペンドされるんで、何事かと。


■では
なにかアドバイスありましたら、コメントをば。

では、不具合が出ないことを祈って。

あっと、本ソースコードを使用しての損害などについては、
一切保障できませんのでお気をつけくださいね。


posted by せらくん at 00:00| 晴れ| Comment(1) | TrackBack(0) | ZAURUSなプログラミング | このブログの読者になる | 更新情報をチェックする

2006年04月18日

シリアルポート通信でATコマンド(その3)

情報処理試験が終わって一安心のせらくんです。

前回のATコマンドで位置情報を獲得するコードは、何度か起動してみると
たまにうまくいく程度のしょぼいものでした。

なので、今回はもう少しまじめに作成です。
起動して、ほったらかしとくと緯度、経度が表示されます。
コードは「続きを読む」から。

でも、このコード。位置情報の取得を一発目は失敗するんだよなぁ。
腹たったので、gotoでループして再度取得をしています。

エラー処理以外でgotoが活躍するCソースを見る機会はそんなにないですよ。必見!(駄目駄目)


■ボーレート(BAUDRATE)の変更
38400よりは115200で動いてほしい・・・。
と言った訳で、BAUDRATEを
#define BAUDRATE B38400から
#define BAUDRATE B115200
変更してみました。

うーん、体感的には早くなったようには思えないです・・・。


■Cソースからコマンド起動
これは普通にsystem()で起動できますね。
Windowsならこんな感じ。

#include
void main()
{
system("notepad");
}


manによるとlinuxでは、
system()は、/bin/sh -c command の形で実行するらしい。
あと、エラー時は-1、/bin/shが実行できなかった場合は127を返す。

つまり、こんな感じかな?
int err;
err = system("/sbin/cardctl resume");
if ( ( err == 127 ) || ( err < 0 ) ) {
perror("resumeに失敗した・・");
exit(-1);
}


busyの時(ioctl(): Device or resource busy)の時は256が帰ってきてますね。
でも、通信でモデムを使っているときは、
次のopen()でfdを獲得できずにexit()されるので、
今回は特に気にしない方針で進みます。


■perror()
システムエラーメッセージ (strerror() 関数) を取得して、エラー出力してくれる。
printf( "%s\n", strerror( errno ) );と同じ意味のよう。
便利なので採用。


■少しの間、眠っていて欲しい。
"/sbin/cardctl resume"した後、間髪いれずにopen()するのはちょっと無謀。
ちょっとの間でいいので待機していて欲しい・・・。

そんなときは、sleep()
括弧の中身は秒を指定。
unsigned int sleep(unsigned int seconds)
今回は、いたるところで活躍しております。


■モデム以外の時は落ちてほしい。
HDさしていても、何も刺さっていなくても、open()に成功してしまう・・・。
これは困ったと探していると、ManにTIOCMGETというものを見つける。
意味は不明だけど「モデムビット列の状態を取得する。」とあるので
モデムじゃなかったらエラーを返すかなぁとおもって試してみた。

見事に成功。

でも、俺の環境以外でも動くのだろうか・・・。

まぁ、とりあえずこんな感じ。

if ((err=ioctl (fd, TIOCMGET, &err)) < 0)
{
perror("モデムが見つからないよー:");
close(fd);
exit(-1);
}


■select()でタイムアウト
open時にO_NONBLOCKを使っていないので、read()出来ないときにブロックされて
フリーズしてしまいます。
でも、O_NONBLOCKを使うと、今度は訳の分からない文字列を拾って、
僕たちを困らせます。

そんな僕らを助けるのがselect()関数。
ファイルディスクリプタを監視して、read()が出来るまで待ってくれます。
read()で出来なかったら、タイムアウトしてくれます。


まず必要なのは、タイムアウト時間を決めるtimeval構造体。
struct timeval Timeout;
これに時間をいれて上げましょう。一応タイムアウトは5秒で。
Timeout.tv_usec = 0; /* マイクロ秒 */
Timeout.tv_sec = 5; /* 秒 */

※ここでJFにまちがいを発見!
Timeout.tv_usec = 0;はusecですよ。msecではないですよ。

次に必要なのはディスクリプションの集合体fd_set。
fd_set readfs;
select()は複数のディスクリプタを監視できる。
だから集合体に登録してまとめて監視をする。たとえ、1つしかディスクリプタがなくても・・。

まずは、ディスクリプションの集合体を初期化。
FD_ZERO(&readfs);
次に、今回は1つしかないファイルディスクリプタfdをわざわざ登録してあげます。
FD_SET(fd, &readfs);

これで準備完了。めんどくさいです。

準備したものをselect()の引数に入れていきます。
select(fd + 1, &readfs, NULL, NULL, &Timeout)

fd+1となっているところには、ファイルディスクリプタの最大値をいれます。
値は一個しかないのでfd。。数字は0から始まるので+1。合計 fd+1。

selectの戻り値はfd_setに残っているディスクリプタの数が出てくる。
今回はfdを一個しか使っていないので、fdの値がそのまま返ってくる。

ちなみに0が返ってきたときはタイムアウト、0より小さいときはエラー。

まとめると、こんな感じ。

int err;
struct timeval Timeout;

/* 入力ループでのタイムアウト値を設定 */
Timeout.tv_usec = 0; /* ミリ秒 */
Timeout.tv_sec = 5; /* 秒 */

/* select()に使用 */
FD_ZERO(&readfs);
FD_SET(fd, &readfs);

if((err=select(fd + 1, &readfs, NULL, NULL, &Timeout)) <= 0)
{
perror("selectタイムアウト");
close(fd);

exit (-1);
}


■これからの予定
とりあえず、関数に分けようかと。
さすがにgoto文はかっこ悪い。


■問題点
なんか、安定しない。
いろいろと遊んでいると、read()がブロッキングされてコマンドを受け付けなくなる事が・・・。
なのに、cuでつないでみるとうまく動くし。

なぜ?
お分かりの方、情報ください。

続きを読む
posted by せらくん at 22:56| 雨| Comment(1) | TrackBack(0) | ZAURUSなプログラミング | このブログの読者になる | 更新情報をチェックする

2006年04月12日

シリアルポート通信でATコマンド(その2)

さて、シリアルプログラムでATコマンドのお時間です。

前回は、モデムを制御するATコマンドってやつは、
シリアルにASCIIでコマンドを書き込むだけらしい、ってなお話でした。
こりゃ、簡単ってな訳でその検証コードを書いてみました。

続きを読む」にソースを貼り付けとります。

■解説
解説といってもJFのコードをぱくっとるだけですが・・・。
なんでシリアルの細かい話は分からんとです。

それでも動くからプログラムって素敵。


//#define MODEMDEVICE "/dev/ttyS1"
#define MODEMDEVICE "/dev/ttyS3"

ここは、PHSカードに位置がttyS3らしいので変更しただけっす。


write(fd , "AT@LBC1\r\n" , 9);
write(fd , "AT@LBC?\r\n" , 9);

出たー、今回の山場(これだけ)
read()で読むならwrite()で書けるだろうと。
どうせかくならATコマンドを書いてやれと。
試しにやってみたら、動いたし。ラッキー。

ここの肝は改行が\r\n(CR LF)になっているところ。
memn0ck.comさんところにありました。
発見に苦労したものの一度見つかると、"ATコマンド" LFでぐぐると簡単に見つかるし。

ちなみに、CRはキャリッジリターン(先頭に戻る)、LFはラインフィード(次の行へ)。
二つあわせて改行です。まぁ、豆知識。



//if (buf[0]=='z') STOP=TRUE;
if (buf[0]=='E'||buf[0]=='-') STOP=TRUE;

ここは、おまけです。
先頭にEか-がきたら終わればいいやみたいな。
フリーズ必死なので、Ctrl-Cを有効に活用してください。

■使い方(かなり適当)
セルフコンパイルな環境で。serial_at.cでソースに保存したとして。
$gcc -o serial_at serial_at.c
$cardctl resume
$./serial_at

■将来の展望
これでボタンひとつで緯度、経度。の野望がまた一歩近づきました。
次は、「cardctl resume」をプログラムから実行させてみたいと思います。


アディオス!情報処理試験まで、あと4日。勉強しろよ、俺・・・。
続きを読む
posted by せらくん at 00:46| 雨| Comment(15) | TrackBack(0) | ZAURUSなプログラミング | このブログの読者になる | 更新情報をチェックする

2006年04月09日

Zaurusで位置情報取得してみる(その2:測地系について)

元ヒルズ族(偽装)のせらくんです。

■お詫び
前回の記事で、ぐーぐるにATコマンドで得た緯度経度を入れると400M以上も
誤差がでます。(borbisさん、すずきのさん情報ありがとうございます)
400M以上の誤差を気にしない方以外、ご迷惑をおかけ致しました。


■原因
原因は測地系でした。
現在、日本には二つの緯度経度があるようです。
その名は、世界測地系と日本測地系。

2002年の4月1日より、法的には日本測地系から世界測地系へ移行したようです。
(細かいことは、ここ)

で、今現在、日本測地系から世界測地系がごっちゃに使われている状況のようです。(うざっ)


■もっと原因
前回紹介したATコマンドの緯度、経度は日本測地系となるようです。(ウィルコム)
ちなみにGoogleは世界測地系です。
(2005年の12月1日に日本測地系から変更されたようです。(詳細はこれ))

日本測地系と世界測地系は400M以上の誤差があるんです・・。
前回、アンテナを探しにいっても見つからなかった方、ごめんなさい。


■対策
こことかで変換する以外の対策っす。

●その1
すずきのさんに頂いた情報だと、YahooのMAPを使うと良さそうです。
YahooのMAPは日本測地系のようです。
nl、elに緯度経度を入れてください。
http://map.yahoo.co.jp/pl?nl=35.39.25&el=139.43.56

コマンドラインならこう。(これぐらいならネットフロントでも・・)

$qcop QPE/System 'execute(QString,QString)' netfront3 "http://map.yahoo.co.jp/pl?nl=35.39.25&el=139.43.56"


●その2
borbisさんのサイトを使う。
これが最強ではないでしょうか?
posの後ろに緯度、経度を入れてください。(最後の000は必須)

http://borbis.hp.infoseek.co.jp/glocal.html?pos=N35.39.25.000E139.43.56.000
にアクセス。
そして、サイトを選んで検索ボタンを押すと、地図へ移動します。
大量の地図サイトを選択できます。すげー。

日本測地系から必要なところは世界測地系に変換してくれているみたいです。

コマンドラインならこう。

$qcop QPE/System 'execute(QString,QString)' opera "http://borbis.hp.infoseek.co.jp/glocal.html?pos=N35.39.25.000E139.43.56.000"

では、皆さん。
楽しい、地図生活を。
posted by せらくん at 03:33| 雨| Comment(0) | TrackBack(0) | ZAURUSな遊び方 | このブログの読者になる | 更新情報をチェックする

2006年04月06日

シリアルポート通信でATコマンド(その1)

ATコマンドを使ってボタン一発で地図と住所を表示させる方法を研究中。

まずはATコマンドの送信を調べねば。

■ATコマンドの送信
ATコマンドとは、モデムに向かってシリアル通信でASCII文字を
送信しているだけの模様。

つまり、ATから始まる文字列をシリアル(/dev/ttyS3)に
書き込むだけで良さそうです。

とはいえ、シリアル通信プログラムの書き方が分からない・・。


■シリアル通信
しばらく、探しているとシリアル通信のコードはJFにありました。
http://www.linux.or.jp/JF/JFdocs/Serial-Programming-HOWTO-3.html

ここにあるコードはread()だけですけど、/dev/ttyS3へファイルに書き込むかのように
文字列をwrite()してあげれば、モデムへATコマンドを送れるようです。


■今日の成果
実際にwrite()してみるとモデムへATコマンドが送られ、
read()でモデムから結果を受け取ることができました。
検証コードは後日掲載予定。(write()が加わっただけですけど・・)


■夢
その内、QTアプリにしたいものですが、
$cardctrl suspend や resumeの処理はどのタイミングで
やればいいのだろうか。

ZAURUSの右下にある地球アイコンのアプレットのソースがあれば参考になりそうだけど・・。

W-ZERO3 MonitorのZaurus版を作ればなぁ(無理)。
posted by せらくん at 23:15| 雨| Comment(1) | TrackBack(0) | ZAURUSなプログラミング | このブログの読者になる | 更新情報をチェックする

2006年04月05日

Zaurusで位置情報取得してみる(緯度、経度とか)

moss.comの徒然日記さんところでCUの使い道を見ながら、
ATコマンドの練習。
他に面白いものはないかとATコマンドで検索していると機械の体さんのところでW-ZERO3の位置情報の出し方を発見。
試しにZaurusでも打ってみると位置情報が表示される!
おぉ、面白い。
お好きな方はどうぞ、お試しあれ。

■いるもの
cu(シリアルコンソール)
(入手元:御存じテクノウ様)
PHSカード(VN-201:bitWarpで付いてきた奴)
SL-860C(他の機種は持ってないっす)

■やり方
通信中で無いことを確認して、コンソールから下のコマンドを打つ。

$cardctl resume
$cu -l /dev/ttyS3 -s 115200

"Connected."と表示され、
ATコマンドの待ち受けになるので下のを打つ。
AT@LBC1
AT@LBC?

すると・・・
211xxxx
N35:xx:xx
E139:xx:xx

と表示される!(xxxは自主規制(笑))
上から、郵便番号、緯度、経度

とりあえず、ここでCUから抜けます。
~.
(チルダ、ドット)

Disconnected.が表示されたらPHSカードを一旦止めます。
$cardctl suspend

これをしないと、モデムが使用中のままなのでお気をあれ。


■ぐーぐる先生にお聞きする
緯度、経度を出されても凡人にはどこにいるのか分かりません。
ここはぐーぐる先生にお聞きします。

とりあえず、ネットに接続。コマンドラインならこれ。
qcop QPE/Network 'connectRequest()'

次に、OPERAを起動(バージョンは7.25。NetFrontは地図出ない・・)。
で、下のURLに接続。「q=」以降の数字に緯度、経度をいれてください。
http://local.google.co.jp/local?q=35°39'37,139°43'45
2byte文字を避ける場合、これで。
http://local.google.co.jp/local?q=35%C2%B039'37,139%C2%B043'45


コマンドラインから行きたい方はこう。
$qcop QPE/System 'execute(QString,QString)' opera "http://local.google.co.jp/local?q=35%C2%B039'37,139%C2%B043'45"

ヒルズ族
ぐーぐるさん見事!現在位置付近の発見です。
あとはここに本当にアンテナがあるかどうか探しに行くだけです!?
※4/9追記:これだけだと測地系の違いから誤差が出ます。詳細はこちらへ。

■郵便番号から住所
ついでに郵便番号も確認。ここはinfoseekさんよろしく!
indata_zipの後ろに郵便番号を入れる。
http://www.infoseek.co.jp/Yubin?pg=yubin_out.html&indata_zip=1066101
コマンドラインならこう。(これぐらいならネットフロントでも・・)
$qcop QPE/System 'execute(QString,QString)' netfront3 "http://www.infoseek.co.jp/Yubin?pg=yubin_out.html&indata_zip=1066101"

続ヒルズ族

■将来の夢
ボタン一発で地図と住所が出るようにならないかなぁ。と研究中。

どこかで作ってないですかね?
posted by せらくん at 23:08| 雨| Comment(21) | TrackBack(2) | ZAURUSな遊び方 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。