1

私はWM6のNTRIPクライアントで書いています。基本的に、最初に構成を送信することにより、ソケットを使用してサーバーからデータを取得しています。しかし、同じデバイス上のGPRS接続を介して動作させることはできません。

このメッセージを送信します。

Get / HTTP/1.0
User-Agent: NTRIP client
Accept: */*
Connection: close

このサーバーへ。

Hostname: mamba.gps.caltech.edu
Port: 2101

これで繋がります

string message = "GET / HTTP/1.0\r\nUser-Agent: NTRIP client\r\nAccept: */*\r\nConnection: close\r\n\r\n"
IPAddress ipAddress = Dns.GetHostEntry(hostname).AddressList[0];

_NTRIPCaster = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_NTRIPCaster.Connect(new IPEndPoint(ipAddress, Convert.ToInt32(port)));
_NTRIPCaster.Send(Encoding.ASCII.GetBytes(message));
for (int i = 0; i < 50; i++) //Wait for upto 5 seconds for a response
{
     Thread.Sleep(100);
     if (_NTRIPCaster.Available > 0)
     {
           Byte[] inBytes = new byte[_NTRIPCaster.Available];
           _NTRIPCaster.Receive(inBytes);
           sourceTable += Encoding.ASCII.GetString(inBytes, 0, inBytes.Length);
           //Check if all of the Source table has been recieved
           if (sourceTable.Contains("ENDSOURCETABLE")) 
           {
                 sourceTableRecieved = true;
                 break;
           }
      }
}

Wi-Fi接続がある場合、またはデバイスがPCにドッキングされていて、Active SyncがPCのインターネット接続を共有している場合、これはすべて正常に機能します。

PCでインターネットを切断し、Wi-Fiを無効にすると、ホスト名をIPアドレスに解決できなくなります。ソケット接続にも到達しません。基本的に、デバイスでモデムを使用しておらず、GPRS接続を使用していません。これは、GPRSが接続されているかどうかに関係なく発生します。

私はWM6を使用しているので、接続マネージャーAPI(http://msdn.microsoft.com/en-us/library/aa458120 )を確認しました。

しかし、他のいくつかの投稿をフォローした後、stackoverflowや他のフォーラムで見つけることができましたが、それを機能させることができませんでした。GPRS接続を確立してサーバーへのデータ送信を開始する方法を知っている人はいますか?

4

2 に答える 2

1

多くの実験の後、私はそれを機能させました。

OpenNetCF の SDF で ConnectionManager を使用

  ConnectionManager connectionManager = new ConnectionManager();
  connectionManager.Connect(false);
  Thread.Sleep(50); //Give it time to make a connection

次に、TCP/IP 方式の接続を使用しました。正直なところ、これが TCP プロトコルを使用するソケットとどのように異なるのかはわかりません。TCPClient オブジェクトには、それ自体がソケットである Client というプロパティがあることがわかります。以下のコードのサンプルを削除しました。

       using (NetworkStream ns = _client.GetStream())
       using (MemoryStream ms = new MemoryStream())
       {
           ns.Write(messageBytes, 0, messageBytes.Length);
           for (int i = 0; i < 50; i++)
           {
               Thread.Sleep(20);
               byte[] buffer = new byte[16 * 1024];
               int bytes;
               while ((bytes = ns.Read(buffer, 0, buffer.Length)) > 0)
               {
                   ms.Write(buffer, 0, bytes);
               }
               byte[] data = ms.ToArray();
               response += Encoding.ASCII.GetString(data, 0, data.Length);
           }

現在、期待どおりにデータを送受信しています。

于 2011-09-08T13:42:27.953 に答える
1

HttpRequest のような高レベルのネットワーク オブジェクトを使用すると、接続マネージャー API が .NET Framework によって自動的に呼び出されます。低レベルのソケットを使用している理由はありますか?

于 2011-08-18T19:14:01.543 に答える