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解码
另行查找。。