? ??北醒光子推出一款激光雷达体积检测系统,内部集成了北醒TF系列不同量程的激光雷达,可用于三维重建、料位、煤堆、粮仓等目标体积检测,具体细节可参考官网。
????????体积检测系统作为下位机,采用TCP通信,为client端,IP默认为192.168.0.7,端口为23;与体积测量系统连接的主控系统为上位机,为server端,IP默认要求为192.168.0.201,端口为23。本例中使用笔记本电脑电脑作为上位机与体积测量单元相连接。
????????以下为windows环境下采用C++编写的体积测量单元使用例程,供使用者参考。
#include <iostream>
#include <Winsock2.h>
#include <WS2tcpip.h>
#pragma comment (lib, "ws2_32")
class TCP_Server {
public:
SOCKET sock_Server, sock_Client;
SOCKADDR_IN serv_Addr_Local, serv_Addr_remote;
TCP_Server()
{
//========================================================================================
//load socket
//========================================================================================
WORD w = MAKEWORD(2, 2);
WSADATA wsa;
if (WSAStartup(w, &wsa) != 0)
{
std::cout << "1:winsock load error\n";
}
else
{
std::cout << "winsock load OK\n";
}
//========================================================================================
//create socket
//========================================================================================
serv_Addr_Local.sin_family = AF_INET;
serv_Addr_Local.sin_port = htons(23);
serv_Addr_Local.sin_addr.S_un.S_un_b.s_b1 = 192;
serv_Addr_Local.sin_addr.S_un.S_un_b.s_b2 = 168;
serv_Addr_Local.sin_addr.S_un.S_un_b.s_b3 = 0;
serv_Addr_Local.sin_addr.S_un.S_un_b.s_b4 = 201;
sock_Server = socket(AF_INET, SOCK_STREAM, 0);
if (sock_Server == SOCKET_ERROR)
{
std::cout << "2:failed to create socket\n";
}
else
{
std::cout << "create socket OK\n";
}
}
//========================================================================================
//Bind
//========================================================================================
void Bind(void)
{
if (bind(sock_Server, (LPSOCKADDR)&serv_Addr_Local, sizeof(serv_Addr_Local)) == SOCKET_ERROR)
{
std::cout << "3:failed to bind\n";
}
else
{
std::cout << "bind OK\n";
}
}
//========================================================================================
//Listen
//========================================================================================
void Listen(SOCKET sock_Server, int backlog)
{
if (listen(sock_Server, 10) == SOCKET_ERROR)
{
std::cout << "4:failed to listen\n";
}
else
{
std::cout << "listen OK\n";
}
}
//========================================================================================
//receive
//========================================================================================
int Recv(SOCKET sock_Server, char* data)
{
int end = recv(sock_Server, data, 1024, 0);
data[end] = '\0';
return end;
}
//========================================================================================
//send
//========================================================================================
void Send(SOCKET sock_Server, char* data)
{
send(sock_Server, data, strlen(data), 0);
}
};
int main()
{
char recData[1024];
TCP_Server tcp_server = TCP_Server();
char version[4] = { 0x5A, 0x04, 0x01, 0x5F };
char startMeasure[4] = { 0x5A, 0x04, 0x13, 0x71 };
tcp_server.Bind(); //bind
tcp_server.Listen(tcp_server.sock_Server, 10); //listen
//accept
int serv_Addr_Addr_remote_len = sizeof(tcp_server.serv_Addr_remote);
tcp_server.sock_Client = accept(tcp_server.sock_Server, (SOCKADDR *)(&tcp_server.serv_Addr_remote), &serv_Addr_Addr_remote_len);
if (tcp_server.sock_Client == INVALID_SOCKET)
{ printf("accept error!\n"); }
else
{
printf("acception is OK \n");
printf("The client address is :");
//show the address of the client
printf("%d.", tcp_server.serv_Addr_remote.sin_addr.S_un.S_un_b.s_b1);
printf("%d.", tcp_server.serv_Addr_remote.sin_addr.S_un.S_un_b.s_b2);
printf("%d.", tcp_server.serv_Addr_remote.sin_addr.S_un.S_un_b.s_b3);
printf("%d ", tcp_server.serv_Addr_remote.sin_addr.S_un.S_un_b.s_b4);
printf("\n");
}
//========================================================================================
//get version
//========================================================================================
tcp_server.Send(tcp_server.sock_Client, version);
int num = tcp_server.Recv(tcp_server.sock_Client, recData);
if ( num == 0 )
{ printf("get version failed \n"); }
else
{
printf("version is: ");
printf("%d.", *(recData + 5));
printf("%d.", *(recData + 4));
printf("%d ", *(recData + 3));
printf("\n");
}
//========================================================================================
//start measure
//========================================================================================
tcp_server.Send(tcp_server.sock_Client, startMeasure);
while (true)
{
int num = tcp_server.Recv(tcp_server.sock_Client, recData);
if (num == 0)
{ printf("No data \n"); break; }
for (int i = 0; i < num; i++)
{
printf("%-4d ", *(recData + i));
}
printf("\n");
}
closesocket(tcp_server.sock_Client);
closesocket(tcp_server.sock_Server);
WSACleanup();
}
? ? 执行结果如下:
?
? ??图中显示TCP连接正常;获取体积检测单元IP地址为192.168.0.7,体积检测单元版本为1.0.38;体积单元开始进行扫描且回传扫描结果,扫描结果包含扫描范围点云数据及体积计算结果(图中只包含部分点云数据,没有显示体积计算结果)。
|