上位机图像处理和嵌入式模块部署(qmacvisual之tcp服务器端)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

上面一篇,我们谈到了tcp客户端,另外一种连接方法就是tcp服务器端。事实上,对于第三方系统,大多数情况下,我们是不能假定它是客户端还是服务器端的。所以,对于机器视觉软件来说,一般两种方法都会提供。这里假设qmacvisual此时是服务器端,对方是客户端。

1、创建工程和创建流程

使用qmacvisual之前,先创建工程和创建流程。

2、配置qmacvisual服务器端

之前学习客户端的时候,需要配置一个ip和port,连接对方的设备。今天我们本地是tcp服务器端,直接设置即可。设置了之后,就相当于等待对方的连接。当然,为了实验的方便,一般可以多设置几个port尝试一下。

如上图所示,整体的设置和tcp client是差不多的。首先添加仪器,接着配置ip和port,唯一不同的就是协议类型选TCP Server。这些都配置好之后,就可以点击保存参数,避免下次还需要手动配置。一切都ok之后,就可以点击连接仪器了,有弹窗弹出来的话,代表ip和port都已经绑定好了。

3、模拟tcp客户端设备

同样,由于手上没有对应的设备,所以暂时先自己在windows平台编写一个tcp client来模拟代替。这部分代码不需要自己写,直接用chatgpt自动生成即可。部分内容需要自己修改一下,

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "Ws2_32.lib")

int main() {
	// 初始化Winsock库
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		std::cerr << "WSAStartup failed." << std::endl;
		return 1;
	}

	// 创建客户端socket
	SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (clientSocket == INVALID_SOCKET) {
		std::cerr << "Error creating socket: " << WSAGetLastError() << std::endl;
		WSACleanup();
		return 1;
	}

	// 设置服务器地址和端口
	sockaddr_in serverAddr;
	serverAddr.sin_family = AF_INET;
	inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr); // 设置服务器IP地址
	serverAddr.sin_port = htons(12000);  // 设置端口为12000

	// 连接到服务器
	if (connect(clientSocket, reinterpret_cast<sockaddr*>(&serverAddr), sizeof(serverAddr)) == SOCKET_ERROR) {
		std::cerr << "Connect failed with error: " << WSAGetLastError() << std::endl;
		closesocket(clientSocket);
		WSACleanup();
		return 1;
	}

	std::cout << "Connected to server." << std::endl;

#if 0
	// 发送数据
	const char* message = "Hello from client!";
	int bytesSent = send(clientSocket, message, strlen(message), 0);
	if (bytesSent == SOCKET_ERROR) {
		std::cerr << "Send failed with error: " << WSAGetLastError() << std::endl;
		closesocket(clientSocket);
		WSACleanup();
		return 1;
	}

	std::cout << "Message sent to server." << std::endl;
#endif

	// 接收响应
	char buffer[1024];
	int bytesReceived;
	while (1)
	{
		bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0);
		if (0 == bytesReceived)
		{
			Sleep(500);
			continue;
		}
		if (bytesReceived == SOCKET_ERROR) {
			std::cerr << "Recv failed with error: " << WSAGetLastError() << std::endl;
			closesocket(clientSocket);
			WSACleanup();
			return 1;
		}

		break;
	}

	buffer[bytesReceived] = '\0'; // 添加字符串结束符
	std::cout << "Received response from server: " << buffer << std::endl;

	// 关闭连接
	closesocket(clientSocket);

	// 清理Winsock库
	WSACleanup();

	return 0;
}

4、配置TCP/IP服务器

插件的位置在【通讯工具】下面,用鼠标直接将插件拖到相应的流程窗口位置即可。双击之后简单配置一下,

如图所示,配置的地方主要是通讯名称、发送内容。通讯名称,主要是可能qmacvisual绑定了若干个端口,发送内容的话就是QString,一般来自于全局变量。目前Var0对应的内容是"12345"。如果是非固定内容的话,还需要额外编写额外的脚本代码。一切都准备ok之后,就可以打开tcp client程序。tcp client程序会一直等服务器这边发送消息,当我们单击执行按钮之后,tcp client程序收到消息,就会退出。

相关推荐
EricWang1358几秒前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
羊小猪~~6 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
AI小杨7 分钟前
【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
人工智能·opencv·计算机视觉·霍夫变换·车道线检测
晨曦_子画12 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
道可云13 分钟前
道可云人工智能&元宇宙每日资讯|2024国际虚拟现实创新大会将在青岛举办
大数据·人工智能·3d·机器人·ar·vr
人工智能培训咨询叶梓23 分钟前
探索开放资源上指令微调语言模型的现状
人工智能·语言模型·自然语言处理·性能优化·调优·大模型微调·指令微调
zzZ_CMing23 分钟前
大语言模型训练的全过程:预训练、微调、RLHF
人工智能·自然语言处理·aigc
newxtc24 分钟前
【旷视科技-注册/登录安全分析报告】
人工智能·科技·安全·ddddocr
成都古河云25 分钟前
智慧场馆:安全、节能与智能化管理的未来
大数据·运维·人工智能·安全·智慧城市
算法与编程之美27 分钟前
文件的写入与读取
linux·运维·服务器