openIgtlink 简单教程与示例 一(创建客户端和服务端进行自发自收)

**

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;
                 }
          }
          }
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值