![](https://habrastorage.org/storage/05adab10/19656762/b704024f/0aefe0f8.png)
はじめに
Windowsでは、COMポートを介して送信されるGPSデバイスからのNMEAメッセージを必要とするアプリケーションがあります。 Androidでは、APIを使用してこのようなメッセージを生成できます。 一般に、Androidから仮想COMポートにデータを配信するというアイデアがありました。 これがどのように実装されたかに興味があるなら、猫をお願いします。
何をする必要がありましたか?
以下を実装する必要がありました。
- デバイスとPC間のTCP / IP接続を構成する
- Android'eでNMEAデータを取得する
- UDPを介してコンピューターに送信する
- コンピューターでUDPパケットを受信し、COMポートに送信します
TCP / IP接続
接続はRevers有線テザーを使用して編成されました。このため、電話でルート権限が取得され、 android-wired-tetherプログラムを使用して、PCへのTCP / IP接続が作成されました。 なぜWiFi経由ではないのですか? はい、そのような機会があります。Windows7で仮想WiFiアダプターを作成でき、Androidから既にそれに接続されます。 しかし、5分間の接続後、私のAtheros AR5B95アダプターはシステムをブルースクリーンに導きました。そのため、ワイヤーを介してすべて同じ接続を作成することが決定されました。また、デバイスを充電します。これは、GPSが動作しているときは重要ではありません(電力の点では非常に重要です)。
AndroidからのNMEAデータ、受信および送信
Androidのデータは、次のコードで取得されました。
//NMEA listener
LocationManager LM = (LocationManager) getSystemService(Context.LOCATION_SERVICE); ((LocationManager)getSystemService(Context.LOCATION_SERVICE)).requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,new LocationListener(){
@Override
public void onLocationChanged(Location loc) {}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status,Bundle extras) {} });
LM.addNmeaListener(new GpsStatus.NmeaListener() {
public void onNmeaReceived(long timestamp, String nmea) {
SendNmea2UDP(nmea);
}});
そして、PCのUDPポートに送信するSendNmea2UDPメソッドに転送されました。
public void SendNmea2UDP(String nmeastring)
{
message = nmeastring;
msg_length=message.length();
messageB = message.getBytes();
nmeapacket = new DatagramPacket(messageB, msg_length,local,server_port);
try
{
socket.send(nmeapacket);
}
catch(Exception e) {}
}
PC上のNMEAデータ
データを受信してコンピューターからCOMポートに送信するために、単純なアプリケーションがC#で作成されました。
Virtual Serial Ports Emulatorプログラムを使用して、2つの接続された仮想COMポートが作成され、そのうちの1つはPC上のプログラムからデータを受信し、2つ目の仮想COMポートでは、必要な任意の位置ですでに取得できます。
おわりに
プログラムのソースコードに興味がある人は、 AndroidとWindowsにあります。
その結果、COMポートからNMEAデータを理解するプログラムを実行できます。
![](https://habrastorage.org/storage/e9aee2a6/3aad5695/2751c15a/1bf56179.png)
右下には、AndroidからUDPを受け入れ、NMEAを仮想COMポートにさらに転送するプログラムがあります。 upd2comプログラムはポート3に送信します。たとえば、この場合、SAS Planetはポート4から受け入れます(これはVSPEを使用して編成されます)。 小さな赤い点は、私が今それをすべてテストしているところです。
ご清聴ありがとうございました。この記事がおもしろかったと思います。
使用したソース
NMEAデータ
Wired_tether_1_4.apk
仮想シリアルポートエミュレータ
UDPリスナーC#サンプル
テザリングと逆テザリング
HBOT 0.93を使用したルートHTCの欲求