Androidアプリ「GPS定期測位」を作ってみた

→ Galaxy SII/Android/Google Latitudeの不満点

といった不満があったので、Androidアプリ作成の練習も兼ねて「一定時間おきにGPS測位するだけ」のAndroidアプリを作ってみた。

無料なので、もし同様の不満を感じているかたがいらしたらどうぞ。
個人的にはけっこう満足。
Google Latitudeで、そんなにバッテリも使わず、1時間に1回程度は、むちゃくちゃな誤差もなく、位置履歴が採れるようになったので。

GPS定期測位(Android Market)

アプリのアイコン、GPS衛星のつもりなんだけど・・・そう見えなかったらゴメンナサイ。

GPSでの測位を一定時間おきに行う、ただそれだけのアプリです。

このアプリそのものは、測位結果を記録することを目的としていません。

このアプリがGPSで測位したタイミングで、Google Latitudeが位置情報履歴を残してくれることを期待しています。

■製作意図

Androidの「無線とネットワーク」での位置情報取得を有効にしていると、時として非常に精度が悪い位置情報が取得されることがあります。

しかし、それを嫌って「無線とネットワーク」での位置情報取得を無効にし、「GPS機能を使用」だけを有効にしていると、Google Latitudeは自分でGPSを起動して位置情報を取りに行こうとはしないようで、Googleマップやその他のアプリがGPSを使った時、ついでに位置情報履歴を記録するだけのようです。逆に言うとGPSを使わないでいると、いつまでたっても履歴が残りません。

ならば、定期的にGPSで測位してやるアプリを動かしておけば、Google Latitudeも定期的に履歴を残してくれるのではないか?というのが本アプリの製作意図です。

実際、本アプリを15分おきの設定で動作させておけば、1時間に1~2回程度は、Google Latitudeで履歴が残るようになりました。

■設定・動作について

GPS測位間隔は、15分・30分・1時間・2時間 から選択できます。
(注:間隔は目安であり、正確ではありません)

GPSを起動して一定時間内に測位できなければその回の測位はあきらめますが、
そのタイムリミットは 30秒・1分・2分 から選択できます。

有効に設定すると、Androidを再起動しても、起動時から定期測位動作は有効になります。

アプリの画面には、直近10回までの測位動作結果を表示します。
動作時刻 OK 測位成功 測位までにかかった秒数と、大まかな座標を表示
動作時刻 NG 測位失敗 失敗判定までの秒数

本アプリの測位機能は常時バックグラウンドで動作しているわけではなく、必要時のみ起動しますので、バッテリ使用は最小限だと思います。
(技術的に言うと、ServiceをAlarmManagerによって起動しています)

動作確認は GALAXY SII(Docomo SC-02C) Android 2.3.5 で行っています。

2011/11/25 Ver 1.0 初版


AndroidのAlarmManagerで設定したAlarmが消えてしまうことがあった

Androidのアプリを作っていた。
AlarmManagerでServiceを定期的に起動するようにしたが、気がついたら、Serviceが動かなくなっている。
なぜ? とググっていたら・・・

rokuta96のAndroidアプリ開発 アラーム3

システム時間変更イベントで、アラームがクリアされてしまうとのこと。

えーそんなのアリかよ・・・でもまあそういうイベント時にクリアしたくなるOSの気持ちもわかるな・・・
え、でもおれ今回のアプリを実験開始してから時刻設定とかタイムゾーン変更とかしたことないし、おかしくね?・・・・・・・・・あっ!

日付と時刻…ネットワーク自動設定!これかあ!

さっそくBroadcastReceiverを付けて確認してみたら、たしかに、ときどき、TIMEZONE_CHANGED や TIME_SET が発生していた。
これ気をつけないといけないのね。


XPortで、不特定多数の相手先とUDP通信する方法

LANTRONIXのXPortで、不特定多数の相手先とUDP通信する方法をググっていたら、以下のページが見つかった。

Sending UDP Datagrams to and from a Cobox, Xport, or WiPort

Undocumentedなモードがあって、

connectModeを 0xCC に設定
DatagramTypeを 0x00 に設定

すると、以下の形式のパケットをシリアルポートで送受信することで、UDPデータグラムを送受信するモードになる。
使用されるポートは送受信時共に 設定項目の Port No で設定したポートになるようだ。
(DatagramType 0x00 に設定すると、 Remote Port は設定できなくなる)

(余談: WordPress はなんで 0x00 … この x を全角に変換してしまうんだ??→いや全角エックスじゃないわ、&#215 の乗算記号か…計算式じゃないっちゅうの! → wp-includes/formatting.php の 55行目あたりの $dynamic_characters と $dynamic_replacements という置換用arrayの中(末尾)に、この余計なお世話な変換があったので、削った。)

■UDP送信

0x02 (スタートバイト)
0xC0 (相手先IPアドレス 1バイト目 例: 192)
0xA8 (相手先IPアドレス 2バイト目 例: 168)
0x00 (相手先IPアドレス 3バイト目 例: 0)
0x01 (相手先IPアドレス 4バイト目 例: 1)
0x00 (データバイト数 BigEndian H)
0x04 (データバイト数 BigEndian L 例: 4バイト)
0x30 (データ)
0x31 (データ)
0x32 (データ)
0x33 (データ)

上記の例の11バイトをXPortのシリアルポート RxDに受信させると、
XPortは 192.168.0.1:(Port Noで設定したポート) に “0123″ の4バイトを入れたデータグラムを送信する。

■UDP受信

また、LAN上の、たとえば 192.168.0.2 のマシンから XPortのIPアドレス:(Port Noで設定したポート) へUDPデータグラムが届き、
中にたとえば”ABC” の3バイトが入っていたとすると、XPortは

0x02 (スタートバイト)
0xC0 (送信元IPアドレス 1バイト目 例: 192)
0xA8 (送信元IPアドレス 2バイト目 例: 168)
0x00 (送信元IPアドレス 3バイト目 例: 0)
0x02 (送信元IPアドレス 4バイト目 例: 2)
0x00 (データバイト数 BigEndian H)
0x03 (データバイト数 BigEndian L 例: 3バイト)
0x41 (データ)
0x42 (データ)
0x43 (データ)

の10バイトのパケットをシリアルポートのTxDから送出する。

これで、不特定多数の相手との双方向UDP通信ができる。


GALAXY SII(Docomo SC-02C)の「位置情報履歴」がヘン

GALAXY SII(Docomo SC-02C)の、「位置情報とセキュリティ」設定画面には、「位置情報履歴」というのがあって、「最新の位置情報を100件まで保存」と書いてあるのだが…

そう言われたら、当然、FIFO・リングバッファ式に位置情報履歴が保存されてるんだろうなあ、と思うじゃないですか。見てみると、

最新のが1件と、あとは妙に古い日の位置情報がこんなふうに同時刻で多数残っている。
昨日やおととい(11/20, 11/19)もGPSは使ったのに、スルーされてる。
いつ見てもこんな感じ。なにこれ…(‘A`)どういうロジックでこうなってるのか全然わからないよ。


このサーバをSaaSes Osukini Server(VPS)から、さくらのVPSに移した

移したのは10月はじめ。
Googleのツールでみたページの平均読み込み時間チャート。

SaaSes使ってたときはどうも応答性が安定せず、やたら待たされることがあった。
さくらのVPSは安定している。


  • カテゴリー

  • 最近のコメント

  • Copyright © 1996-2010 xoのブログ. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress