CPP -- 通过socket进行ntrip连接

1 构建连接ntrip的指令

主要有两个指令:

其中,红色字体用相关内容替换,base64Code另行查找。

1)s_command1形如:

"GET / HTTP/1.1\r\nUser-Agent: userAgent\r\nAuthorization: Basic base64CodeForUserPassword"

2)s_command2形如:

"GET /mountPoint HTTP/1.1\r\nUser-Agent: userAgent\r\nAuthorization: Basic base64CodeForUserPassword"

 

2 初始化windows的socket库

    WSADATA wsaData = {0};        
    int res = WSAStartup(MAKEWORD(2,2), &wsaData);

    if (res != NO_ERROR)
    {       
        return 0; // WSAStartup failed
    }// if

    return 1;

3 根据IP和端口号连接ntrip服务器

    struct sockaddr_in add   = {0};

    *g_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // g_socket后面需要

    if (INVALID_SOCKET == *g_socket)
    {
        return -1;
    }// if
   
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.
    add.sin_family       = AF_INET;
    add.sin_addr.s_addr  = inet_addr(s_ip); // const char *
    add.sin_port         = htons(i_port); // u_short
   
    // Connect to server.
    int ret = connect( *g_socket, (SOCKADDR*) &add, sizeof(add));
    if (SOCKET_ERROR == ret)
    {
        closesocket (*g_socket); 
        return -1;
    }// if
   
    // set time out, sending
    ret = setsockopt(*g_socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&time_out, sizeof(time_out));

    if (SOCKET_ERROR == ret)
    {
        closesocket(*g_socket);
        return -1;
    }// if

    // set time out, receiving
    ret = setsockopt(*g_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&time_out, sizeof(time_out));

    if (SOCKET_ERROR == ret)
    {
        closesocket(*g_socket);
        return -1;
    }// if

    return 1;

 

4 向服务器发送请求命令

    int ret = send(g_socket, s_command2, (int)strlen(s_command2), 0);

    if (SOCKET_ERROR == ret)
    {
        return -1;
    }// if

    return 1;

 

5 创建ntrip线程

为了防止网络阻塞导致程序暂停在网络处理这儿,需要把把接收网络数据单独放一个线程中:

            HANDLE ntrip_hdl = CreateThread(            
                NULL,              // default security attributes           
                0,                 // use default stack size             
                ThreadNtrip,        // thread function            
                NULL,             // argument to thread function            
                0,                 // use default creation flags            
                NULL);           // returns the thread identifier 

其中ThreadNtrip为回调函数,需要在里面处理从ntrip服务器收到的数据,同时需要处理网络中断并进行重连。

 

6 从ntrip服务器接收并处理数据,同时处理网络中断并进行重连 
    while(1)
    {
        int initCount = 0;

        do
        {
            int ret = send(g_socket, s_nmea, (int)strlen(s_nmea), 0);
            if (SOCKET_ERROR == ret)
            {
                return -1;
            }
            initCount++;
        } while (SOCKET_ERROR == ret && initCount <= 10);
        if (SOCKET_ERROR == ret)
        {
            printf("Failed in sending messages to NTRIP server! \n");
        }

        // read data from NTRIP
        char recvBuff[1024];
        int ret = recv(g_socket, recvBuff, 1024, MSG_WAITALL); // 0

        if (ret > 0)
        {
            // decode rtcm message
        }
        else if (SOCKET_ERROR == ret) // handle network problem
        {
            int ntrip_error = WSAGetLastError();
            printf("ERROR: ntrip type: %d....\n", ntrip_error);

            // network is broken, need to re-connect to server
            if (WSAENETDOWN == ntrip_error)
            {
                ret = 0;
            }
            // timeout, need to re-connect to server
            if (WSAETIMEDOUT == ntrip_error) // time out
            {
                if (closesocket(g_socket) > 0) // close successfully
                {
                    ret = 0;    
                }
            }
        } // if (ret > 0)

        // re-connecting
        if (ret <= 0)
        {
            printf("ntrip disconnected, connectting....\n");
            ///
            Sleep(50);
        }

        Sleep(50);
    } // while(1)

7 关于网络重连

略。。

 

8 关于rtcm解码

另行查找。。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值