はじめに
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データを理解するプログラムを実行できます。
      右下には、AndroidからUDPを受け入れ、NMEAを仮想COMポートにさらに転送するプログラムがあります。 upd2comプログラムはポート3に送信します。たとえば、この場合、SAS Planetはポート4から受け入れます(これはVSPEを使用して編成されます)。 小さな赤い点は、私が今それをすべてテストしているところです。
ご清聴ありがとうございました。この記事がおもしろかったと思います。
使用したソース
NMEAデータ
Wired_tether_1_4.apk
仮想シリアルポートエミュレータ
UDPリスナーC#サンプル
テザリングと逆テザリング
HBOT 0.93を使用したルートHTCの欲求