2011-08-18 2 views
1

WM6의 NTRIP 클라이언트에서 쓰고 있습니다. 기본적으로 구성을 보내 소켓을 사용하여 서버에서 데이터를 가져옵니다. 하지만 같은 장치에서 GPRS 연결을 통해 작동시키지 못합니다.WM6 GPRS를 사용하는 소켓

이 메시지를 보내드립니다.

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

이 서버에. 나는 Wi-Fi 연결이있는 경우

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; 
      } 
     } 
} 

이 모두 잘 작동을 수행하여 연결을 만들거나 장치가 PC에 인터넷을 공유하는 PC와 액티브 싱크에 도킹 연결.

PC에서 인터넷을 끊고 Wi-Fi를 사용하지 않으면 호스트 이름을 IP 주소로 확인할 수 없습니다. 소켓 연결도하지 않습니다. 기본적으로 장치에서 모뎀을 사용하지 않고 GPRS 연결을 사용합니다. 이것은 GPRS 연결 여부와 관계없이 발생합니다.

저는 WM6이므로 연결 관리자 API - http://msdn.microsoft.com/en-us/library/aa458120을 살펴 봤습니다.

그러나 몇 가지 다른 게시물을 따라 stackoverflow 및 다른 포럼에서 찾을 수있었습니다. 작동하지 못하게되었습니다. 누구든지 GPRS 연결을 만들고 서버에 데이터를 보내는 방법을 알고 있습니다.

답변

1

실험을 많이 한 후에 나는 그것을 작동 시켰습니다.

이 OpenNetCF

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

다음에서 SDF에서은 ConnectionManager를 사용, 나는 연결의 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); 
      } 

예상대로 데이터를 보내고 받았습니다.

1

HttpRequest와 같은 상위 수준 네트워크 개체를 사용하는 경우 .NET Framework에서 연결 관리자 API를 자동으로 호출합니다. 로우 레벨 소켓을 사용하는 이유가 있습니까?

+0

나는 HttpRequest가 이것을 관리한다고 들었습니다. NTRIP에서 찾을 수있는 모든 예가 소켓 연결을 사용 했으므로 HttpRequest를 사용하여 액세스하려고 시도한 적이 없습니다. NTRIP에는 자체 프로토콜이 있습니다. 나 또는 서버가 연결을 끊을 때까지 서버에서 데이터를 스트리밍 할 때 서버에 대한 지속적인 연결을 유지해야합니다. 솔직히 말하면 소켓을 사용해야하는 것은 이번이 처음이라고합니다. – JonWillis

+0

NTRIP 프로토콜에 익숙하지 않지만 코드 샘플이 HTTP와 비슷합니다. NTRIP가 HTTP를 피기 백하면 HttpReqest 객체를 계속 사용할 수 있습니다. 그냥 생각 ... – tcarvin

+0

어쨌든, 그물에 샘플 무리가 있습니다. 다음은 충분히 간단하게 보이는 것입니다 : [link] (http://blogs.msdn.com/b/anthonywong/archive/2006/03/13/550686.aspx) – tcarvin

관련 문제