廢話沒有,上關鍵代碼
頭文件
#include <QUdpSocket> #include <qtcpsocket.h> #ifndef vrUDP #define vrUDP #define PLANE_DATA_NUM 30 struct PlanePoseStruct{ double lon; double lat; double height; double heading; double pitch; double rotate; }; class JSBSimSocket : public QObject { Q_OBJECT public: JSBSimSocket(); ~JSBSimSocket(); void initNet(); void sendPlaneControlData(char * data, int length); private slots: void recvPlanePose(); void recvTcpBack(); private: QTcpSocket *m_control_TcpSocket; QUdpSocket *m_get_UdpSocket; QHostAddress m_get_udphost; quint16 m_get_UdpPort; double m_JSBSimData[PLANE_DATA_NUM]; ······· };
源文件
#include "vrUDP.h" JSBSimSocket::JSBSimSocket() { } JSBSimSocket::~JSBSimSocket() { } void JSBSimSocket::initNet() { //用於控制端,基於QT_TCP客服端:飛機控制發送,信息反饋 QHostAddress tcp_host = QHostAddress::LocalHost;//這里請用xml數據 quint16 tcp_port = 8009;//這里請用xml數據 m_control_TcpSocket = new QTcpSocket; m_control_TcpSocket->connectToHost(tcp_host, tcp_port); m_control_TcpSocket->waitForConnected(); connect(m_control_TcpSocket, SIGNAL(readyRead()), this, SLOT(recvTcpBack())); m_control_TcpSocket->waitForReadyRead(); //用於獲取飛行姿態,基於QT_UDP的服務器。 m_get_udphost = QHostAddress::Any;//這里請用xml數據 m_get_UdpPort = 8008;//這里請用xml數據 m_get_UdpSocket = new QUdpSocket; m_get_UdpSocket->bind(m_get_udphost,m_get_UdpPort); connect(m_get_UdpSocket,SIGNAL(readyRead()),this,SLOT(recvPlanePose())); } void JSBSimSocket::sendPlaneControlData(char * data, int length) { //發送控制信息 //通信的關鍵就在於這個data的組織 //具體的通訊內容要參考JSBSim的數據結構 int re = m_control_TcpSocket->write(data); if (re == -1 ) { printf("send error"); } } void JSBSimSocket::recvTcpBack() { char buffer[4096]; qint64 size = m_control_TcpSocket->read(buffer, 4096); if (size > 0) { //這里獲取TCP的反饋,可以進行后期交互操作 buffer[size] = '\0'; printf("recvTcpBack:%s", buffer); } } void JSBSimSocket::recvPlanePose() { char buffer[4096]; qint64 size = m_get_UdpSocket->readDatagram(buffer, sizeof(PlanePoseStruct)); if (size > 0) { buffer[size] = '\0'; memcpy(&m_JSBSimData[0], buffer, size); m_PlanePose.lon = m_JSBSimData[0]; m_PlanePose.lat = m_JSBSimData[1]; m_PlanePose.height = m_JSBSimData[2] / 3.2808; m_PlanePose.rotate = m_JSBSimData[3] / 3.14 * 180; m_PlanePose.pitch = m_JSBSimData[4] / 3.14 * 180; m_PlanePose.heading = m_JSBSimData[5] / 3.14 * 180; ··············· } } ···············
簡單說一下:
我的功能是控制飛機的駕駛並用TCP告訴JSBSim。
JSBSim算當前飛機姿態,然后通過UDP告訴我飛機姿態
至於,為什么不用TCP一次性搞定,因為。。。我只是想試下TCP|UDP可以么。。。
關於JSBSim端怎么實現的,這個看看它源碼自己研究下就可以嘍!