Разъемы WM6 с использованием GPRS

Пишу в клиенте NTRIP на WM6. Обычно я получаю данные с сервера, используя сокеты, сначала отправляя конфигурацию. Но я не могу заставить его работать через соединение 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 или устройство подключено к ПК, а активная синхронизация использует подключение к Интернету ПК.

Если я отключу Интернет на ПК и отключу Wi-Fi, он не сможет преобразовать имя хоста в IP-адрес. Не доходит даже до разъемов подключения. В основном это не использование модема в устройстве и использование соединения GPRS. Это происходит независимо от того, подключен GPRS или нет.

Поскольку я использую WM6, я посмотрел на API диспетчера соединений - http://msdn.microsoft.com/en-us/library/aa458120.

Но после нескольких других сообщений, которые мне удалось найти в stackoverflow и других форумах, я не смог заставить его работать. Кто-нибудь знает, как я могу установить соединение GPRS и начать отправку данных на сервер.


person JonWillis    schedule 18.08.2011    source источник


Ответы (2)


Если вы используете сетевые объекты более высокого уровня, такие как HttpRequest, тогда API диспетчера соединений автоматически вызывается .NET Framework. Есть ли причина, по которой вы используете сокеты низкого уровня?

person tcarvin    schedule 18.08.2011
comment
Я тоже слышал, что HttpRequest управляет этим за вас, что было бы неплохо. Я никогда не пробовал получить к нему доступ с помощью HttpRequest, как и в каждом примере, который я мог найти на NTRIP-соединениях с использованием сокетов. У NTRIP есть собственный протокол. Я должен поддерживать постоянное соединение с сервером, пока я передаю с него данные, пока я или сервер не решу разорвать соединение. Скажу честно, я впервые использую сокеты. - person JonWillis; 18.08.2011
comment
Я не знаком с протоколом NTRIP, но как выглядит ваш образец кода HTTP. Если NTRIP подключается к HTTP, вы все равно можете использовать объект HttpReqest. Просто мысль... - person tcarvin; 19.08.2011
comment
Во всяком случае, в сети куча образцов. Вот вариант, который выглядит достаточно просто: ссылка - person tcarvin; 19.08.2011
comment
Я попробую использовать его завтра, но чувствую, что это не сработает. Я разработал приложение на ПК перед переносом на мобильное устройство, поэтому вместо этого должно быть легко добавить http-запрос. Я считаю, что мне может понадобиться TCP-соединение, а не HttpRequest, потому что после того, как я сделаю запрос, я получаю обратно постоянный поток данных. Это просто предположение :) p.s. NTRIP - это протокол, используемый для потоковой передачи корректирующих данных в приемник GNSS (GPS) для повышения точности. - person JonWillis; 19.08.2011
comment
httprequest не удалось, так как ответ сервера не является HTTP-ответом, поэтому я получаю исключение procotol. - person JonWillis; 20.08.2011
comment
Думаю, тогда вам придется использовать ConnectionManager. Взгляните на опубликованную мной ссылку, в которой есть образец кода C #, который использует ConnectionManager. Я выгляжу прямолинейно. - person tcarvin; 22.08.2011
comment
Я попытался выполнить эти команды с помощью PInvoke и попробовал образец кода. К сожалению, это не сработало, но спасибо за попытку. Итак, я поговорил с производителем устройства и жду ответа. Исходный ответ с использованием WWAN (мобильного телефона) отличается от 802.11 (Wi-Fi), WWAn использует TCP / IP поверх PPP. Не знаю, чем это отличается от Wi-Fi. - person JonWillis; 24.08.2011

После множества экспериментов я заставил его работать.

Использовал ConnectionManager в SDF из OpenNetCF

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

Теперь я получаю и отправляю данные, как и ожидалось.

person JonWillis    schedule 08.09.2011