您的位置:首页 > 编程语言 > Qt开发

[原][osg][osgEarth]基于qt代码实现:TCP|UDP与飞行模拟软件JSBSim的通信,现实模型飞行!

2017-03-14 16:27 1061 查看
废话没有,上关键代码

头文件

#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端怎么实现的,这个看看它源码自己研究下就可以喽!

最后,请转载的朋友,把[原]字去掉,要不,我看到会笑死
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: