«Ntrip-Version:» Заголовок в HTTP-запросе GET. Предотвращает все сообщения коррекции Ntrip, ожидающие местоположения базовой станции.

Создание программы для чтения NTRIP с сервера и передачи его через последовательный порт на GPS.

GPS время от времени распознавал передаваемые ему данные RTCM, но не мог их использовать/терял соединение. Я использовал декодер SNIP RTCM, чтобы увидеть, какие сообщения куда приходят, и обнаружил, что это только сообщение типа 1006 (местоположение базовой станции), но когда SNIP подключен к той же точке монтирования, он может найти типы 1006, 1033, 1074, 1084, 1094, 1124.

Я удалил заголовок Ntrip-version: Ntrip/2.0 из моего запроса GET, и он начал отправлять все типы сообщений, которые я ожидал (1006, 1033, 1074, 1084, 1094, 1124). когда я передаю это в GPS, он распознает данные RTCM, но все равно не хочет их использовать.

      public static NetworkStream? ConnectToMountPoint(NTripClientSettings settings, NTripMountPoint mountpoint)
        {
            try
            {
                TcpClient tcp = new ();

                // login details.
                string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{settings.Username}:{settings.Password}"));

                // build up the raw HTTP request.
                StringBuilder rawhttpreq = new ();
                rawhttpreq.AppendLine($"GET /{mountpoint.MountPointAddress} HTTP/1.1");
                rawhttpreq.AppendLine($"Host: {settings.Address}:{settings.Port}");
                rawhttpreq.AppendLine("Ntrip-Version: Ntrip/2.0");
                rawhttpreq.AppendLine("User-Agent: NtripClient/2.0");
                rawhttpreq.AppendLine("Accept: */*");
                rawhttpreq.AppendLine($"Authorization: Basic {credentials}");
                rawhttpreq.AppendLine();

                // request vars
                byte[] requestBuffer = Encoding.ASCII.GetBytes(rawhttpreq.ToString());

                // 
                // Try and Connect to the NTrip Mount point
                //
                tcp.Connect(settings.Address, settings.Port);


                // if we have connected
                if (tcp.Connected)
                {
                    SystemLog.Log("Connected to mount point");

                    // Get the stream
                    NetworkStream stream = tcp.GetStream();
                    
                    if(stream != null) 
                    {
                        // write out request
                        stream.Write(requestBuffer, 0, requestBuffer.Length);

                        return stream;
                    }
                    
                }
                return null;
            }
            catch (Exception ex)
            {
                if (ex is SocketException)
                {
                    SystemLog.Log("Error connecting to ntrip server", ex, SystemLogType.Error);
                }
                else if (ExceptionHelper.IsKnownException(ex))
                {
                    SystemLog.Log("Error reading from ntrip server", ex, SystemLogType.Error);
                }
                else
                {
                    SystemLog.Log($"Error: {ex.Message}");
                    // unknown error.
                    throw;
                }
                return null;
            }
        }

это код, отправляющий запрос GET к точке монтирования

      public static void StreamNtripDataFromMountPoint(NetworkStream? networkstream, SerialPort? ggaport, SerialPort? ntripport)
        {
            // response/receive vars.
            byte[] responseBuffer = new byte[BUFFER_SIZE];

            Task outgoingMessage;


            // If NtripStream has been attached
            if (networkstream != null)
            {

                // Read from the response stream
                while (networkstream.CanRead && networkstream.CanWrite)
                {
                    Array.Clear(responseBuffer);

                    Task<int> networkMessage;


                    int bytesread = 0;

                    

                    networkMessage = networkstream.ReadAsync(responseBuffer, 0, responseBuffer.Length);

                    networkMessage.Wait();

                    bytesread = networkMessage.Result;

                    /// if the ntrip port is ready pass ntrip data out of it 
                    if (ntripport != null && ntripport.IsOpen)
                    {
                        outgoingMessage = ntripport.BaseStream.WriteAsync(responseBuffer, 0, bytesread);

                        outgoingMessage.Wait();
                    }
                    /// if the ntrip port is closed or unattached print data to console to show that it is receiving and not sending over port
                    else
                    {
                        string responseString = Encoding.ASCII.GetString(responseBuffer);

                        SystemLog.Log($"{responseString}");
                    }


                }

                SystemLog.Log("NtripStream reset");
            }
            else
            {
                SystemLog.Log("NtripStream not found");
            }
        }

это код чтения данных из сетевого потока

сообщения, когда Ntrip-Version находится в заголовке сообщения, когда Ntrip-Version не является заголовком

почему это происходит? есть ли какой-то другой шаг, который мне следует предпринять для обработки входящих данных, если я скажу ему ожидать Ntrip-Version? и что делает сервер по умолчанию, если не указана Ntrip-версия? потому что я пробовал Ntrip/1.0 и Ntrip/2.0, оба они приводят к тому, что я получаю только один тип сообщения.

любое объяснение того, почему это происходит, будет указано.

Спасибо за ваше время.

0 ответов

Другие вопросы по тегам