**
1.openIgtlink介绍 (自用博客)
**
OpenIGTLink是Slicer社区开发的一种网络协议,用于在3D Slicer和其他医疗设备或软件应用之间进行通信。“OpenIGTLink"的全称是"Image Guided Therapy Link”(图像引导治疗链接)。这种协议允许实时传输图像和数据,广泛应用于医学成像、手术导航和远程医疗等领域
使用OpenIGTLink,通常需要一个支持该协议的客户端或者服务器端实现。你可以在3D Slicer中找到相关的模块来发送或接收数据,也可以在其他应用中集成OpenIGTLink库来实现与3D Slicer的交互。
下面是一些资料库,可用于学习
git学习资料
2.必要的的流程介绍
1.服务端 (最简单的实现方式,下面是自发自收的教程)
1.创建服务端
2.等待连接
3.连接成功后,判断数据类型(具体的数据类型),数据类型可见此处,很多示例有错误!
4.进行数据写入,并发送给客户端
下面是一个简单的示例
igtl::ServerSocket::Pointer serverSocket;
serverSocket = igtl::ServerSocket::New();
int r = serverSocket->CreateServer(port); // port 为自定义
if (r < 0)
{
std::cerr << "Cannot create a server socket." << std::endl;
exit(0);
}
igtl::Socket::Pointer socket;
while (1)
{
socket = serverSocket->WaitForConnection(1000);
std::cout << "#####################: new connet :##########################" << std::endl;
}
if (socket.IsNotNull())
{
igtl::MessageHeader::Pointer headerMsg;
headerMsg = igtl::MessageHeader::New();
}
while (socket.IsNotNull())
{
headerMsg->InitPack();
bool timeout(false);
igtlUint64 r = socket->Receive(headerMsg->GetPackPointer(), headerMsg->GetPackSize(), timeout);
f (r == 0)
{
socket->CloseSocket();
break;
}
if (r != headerMsg->GetPackSize())
{
continue;
}
headerMsg->Unpack();
std::cout << "revice type :" << headerMsg->GetDeviceType() <<std::endl;
if (strcmp(headerMsg->GetDeviceType(), "STRING") == 0)
{
std::cout << "i am connect " << std::endl;
igtl::StringMessage::Pointer stringMsg;
stringMsg= igtl::StringMessage::New();
stringMsg->AllocatePack();
bool timeout(true);
socket->Receive(stringMsg->GetPackBodyPointer(), stringMsg->GetPackBodySize(), timeout);
stringMsg->SetDeviceName("StringMessage");
stringMsg->SetString(testString[i%N_STRINGS]);
stringMsg->Pack();
socket->Send(stringMsg->GetPackPointer(), stringMsg->GetPackSize());
igtl::Sleep(30);
}else if (strcmp(headerMsg->GetDeviceType(), "其他类型") == 0)
{
}else{
std::cerr << "Receiving : " << headerMsg->GetDeviceType() << std::endl;
std::cerr << "Size : " << headerMsg->GetBodySizeToRead() << std::endl;
socket->Skip(headerMsg->GetBodySizeToRea
}
socket->CloseSocket();
}
2.客户端 (自发自收)
1.连接服务端 ,需要IP地址和端口号
2.给服务端发送数据类型(用于服务端识别类型,然后进行写入)
3.收数据,判断数据类型,然后进行解析
m_socketIGTL = igtl::ClientSocket::New();
m_headerMsg = igtl::MessageHeader::New();
int error = m_socketIGTL->ConnectToServer(url.data(), 10000);
if (error != 0) {
SPDLOG_DEBUG(" igtl connect failed");
}
// 发送送了一个String 类型的,服务端识别收,会给StringMessage写入数据
igtl::StringMessage::Pointer stringMsg;
stringMsg= igtl::StringMessage::New();
strayMsg->Pack();
m_socketIGTL->Send(stringMsg->GetPackPointer(), stringMsg->GetPackSize());
int c = strayMsg->Unpack(1);
if (c & igtl::MessageHeader::UNPACK_HEADER) {
m_headerMsg->InitPack();
bool timeout(false);
int r = m_socketIGTL->Receive(m_headerMsg->GetPackPointer(), m_headerMsg->GetPackSize(), timeout);
if (r == 0)
{
m_socketIGTL->CloseSocket();
exit(0);
}
if (r != m_headerMsg->GetPackSize())
{
}
m_headerMsg->Unpack();
std::cout << m_headerMsg->GetDeviceType() << "," << m_headerMsg->GetPackSize() << std::endl;
if (strcmp(m_headerMsg->GetDeviceType(), "STRING") == 0) {
igtl::StringMessage::Pointer stringMessageBase;
stringMessageBase= igtl::StringMessage::New();
stringMessageBase->SetMessageHeader(m_headerMsg);
bool timeout(false);
m_socketIGTL->Receive(stringMessageBase->GetPackBodyPointer(), stringMessageBase->GetPackBodySize(), timeout);
int c = bindMessageBase->Unpack(1);
if (c & igtl::MessageHeader::UNPACK_BODY) {
std::cout << stringMessageBase->GetString() << std::endl;
}
}
}