Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Bluetooth GPSから位置情報を読む方法

From Wiki
Jump to: navigation, search
Article Metadata
Article
Translated:
By fnjwikimng
Last edited: hamishwillee (23 Jul 2013)

Bluetooth GPS(BT-GPS)は、携帯端末やPDA用に最もよく販売されているアクセサリー類の一つです。この簡単な装置は、GPS衛星システムに接続し、誤差5メートル以内の精度で現在の位置情報を取得することができます。JavaMEアプリケーションはその情報にアクセスすることが可能です。ここで必要なことは、その端末がBluetoothを搭載していることと、それをJavaAPIとして扱えることだけです。

Contents

JSR 179 - Location API

Location API(JSR 179)を実装している端末では、位置データを読むためにBluetooth API(JSR 82)を直接使う必要はありません。Location APIが、位置データを取得するために必要なことを全て行うからです。

  • Bluetoothローカルエリア内における、GPSモジュールの検索
  • GPS端末とのペアリング
  • 位置データの取得
  • (ローレベルの)NMEA文を解析し、それを(ハイレベルの)Javaオブジェクトに変換する

JSR179でGPS位置を使用する方法について知る場合、ドキュメント MIDP: Location API Developer's Guide v2.0 をダウンロードします。ドキュメントには、ソースコードとテスト可能なアプリケーションが含まれています。


JSR 82 - Bluetooth API

端末にLocation API(JSR 179)が実装されていない場合、Bluetooth GPSモジュールから位置データを取得することができます。しかし、その取得については、手動で行う必要があります。手順として、次の作業を行う必要があります。

Bluetooth GPSから位置情報を読むために、次の作業を実装する必要があります。

  1. Bluetooth GPS機器を検索する
  2. GPS機器に接続する
  3. NMEA文を読み取り、解析する

Bluetooth機器を検索するのに必要となる最初のステップは、RFCOMMサービスの実装です。 サンプルコードでは、その作業を全て行うクラス "BTManager.class" をインクルードしています。クラスについての詳細を得る場合は、記事 How to search for Bluetooth devices and services をご覧ください。

BT-GPS(Bluetooth GPS)からデータを読むため、Gpsbtクラスを作成します。最初に行うことは、BT-GPS用にURLアドレスを格納するため、いくつかの変数を作成することです。

  // current bluetooth device
public String btUrl = "";
public String btName = "";
 
public void setDevice(String btUrl, String btName) {
this.btUrl = btUrl;
this.btName = btName;
}

ここで、端末に接続し、データ読込みを開始する必要があります。

    public void start() {
if (isActive) {
stop();
}
connect();
if (isConnected) {
isActive = true;
Thread t = new Thread(this);
t.start();
}
}
 
public void connect() {
if (btUrl == null || (btUrl.trim().compareTo("") == 0)) {
isConnected = false;
return;
}
try {
conn = (StreamConnection) Connector.open(btUrl, Connector.READ_WRITE);
in = new DataInputStream(conn.openInputStream());
isConnected = true;
mode = 0;
} catch (IOException e) {
close();
}
}
 
public void run() {
isActive = true;
while (isActive) {
// check if connection is still open
if (!isConnected && isActive) {
// connect to gps device
connect();
} else {
// read NMEA Strings
readNMEASentences();
}
}
close();
isActive = false;
}

お気づきになられたかもしれませんが、スレッドを使用してループ読出しを実装しています。BT-GPSは常にデータを送っているため、コネクションバッファがオーバーフローする前にデータを読み続ける必要があるからです。BT-GPSが送るデータはNMEA文で、その文はGPS状態に関する情報を含んでいます。ここで検索しているのはGPGGA文で、3D位置、精度を提供するのに必要な固定データ値です。

 public void readNMEASentences() {
try {
if (!isConnected) {
return;
}
// check characters available
int size = in.available();
if (size <= 0) {
return;
}
// read data
for (int j = 0; j < size; j++) {
int i = in.read();
if (i != -1) {
char l = (char) i;
switch (mode) {
case (STATE_SEARCH_SENTENCE_BEGIN): {
// search for the sentence begin
if (l == '$') {
// found begin of sentence
mode = 1;
sb.setLength(0);
}
}
break;
case (STATE_READ_DATA_TYPE): {
// check what kind of sentence we have
sb.append(l);
if (sb.length() == 6) {
if (sb.toString().startsWith("GPGGA")) {
mode = STATE_READ_SENTENCE;
sb.setLength(0);
} else {
mode = STATE_SEARCH_SENTENCE_BEGIN;
sb.setLength(0);
}
}
}
break;
case (STATE_READ_SENTENCE): {
// read data from sentence
sb.append(l);
if ((l == 13) || (l == 10) || (l == '$')) {
mode = STATE_SEARCH_SENTENCE_BEGIN;
currentInfo = new String(sb.toString());
}
}
break;
}
 
} else {
close();
}
}
 
} catch (Exception e) {
close();
}
}

文を取得した後に必要なのは、その情報を解析し、ユーザーに返すことだけです。

 public Location getLocation() {
Location location = new Location();
if (isConnected && isActive && currentInfo != null) {
location.parseGPGGA(currentInfo);
}
return location;
}

データの抽出が便利になるように、以下に示すLocationクラスを使います。このクラスは、 GGA文を解析し、位置データをラッピングします。また、GGA文中のトークンを分割するために、StringTokenizerクラスを使います。

public class Location {
 
// NMEA GPGGA Elements
String utc;
String latitude;
String northHemi;
String longitude;
String eastHemi;
String altitude;
int quality;
int nSat;
String horDilution;
String altitudeUnit;
String geoidalHeight;
String geoidalHeightUnit;
String diffCorrection;
String diffStationId;
 
/**
* Method that parses a NMEA string and returns Location. For more info check
* this page: http://www.gpsinformation.org/dale/nmea.htm#GGA
*
* @param value -
* string that represent NMEA GGA string
*/

public void parseGPGGA(String value) {
// Helper class to parse strings
StringTokenizer tok = new StringTokenizer(value, ",");
 
utc = tok.nextToken();
latitude = tok.nextToken();
northHemi = tok.nextToken();
longitude = tok.nextToken();
eastHemi = tok.nextToken();
quality = Integer.parseInt(tok.nextToken());
nSat = Integer.parseInt(tok.nextToken());
horDilution = tok.nextToken();
altitude = tok.nextToken();
altitudeUnit = tok.nextToken();
geoidalHeight = tok.nextToken();
geoidalHeightUnit = tok.nextToken();
diffCorrection = tok.nextToken();
diffStationId = tok.nextToken();
}
}

それはラッパーで、BT-GPSからNMEA文を読込み、位置情報を抽出することができるクラスです。GPS機器を検索し、接続し、画面上に位置情報を表示することができるアプリケーションの全ソースコードを確認できます。

And that's a wrap we now have a class capable of reading the NMEA sentences from the BT-GPS and retrieve location info. Check the full source code for an complete application that allows you to search for devices, connect to them and shows the location info on the screen.

ダウンロードサイト

参照リンク

This page was last modified on 23 July 2013, at 07:11.
264 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×