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

废话没有,上关键代码

头文件

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

最后,请转载的朋友,把[原]字去掉,要不,我看到会笑死

时间: 2024-10-13 07:36:43

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

[原][译][osg][osgEarth]飞行模拟软件JSBSim的操作(FGFCS类)

Encapsulates the Flight Control System (FCS) functionality. This class also encapsulates the identical "system" and "autopilot" capability. FGFCS owns and contains the list of FGFCSComponents that define a system or systems for the mod

一种基于Qt的可伸缩的全异步C/S架构服务器实现(流浪小狗,六篇,附下载地址)

本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/S客户端-服务集群应用需求而搭建.连接监听.数据传输.数据处理均在独立的线程池中进行,根据特定任务不同,可安排负责监听.传输.处理的线程数目,从而在高传输负荷.高计算符合上达成取舍.数据处理采用流水线结构,以避免少量客户的密集计算请求影响其他客户端的处理.本文对应的代码符合LGPL协议,可直接从https://github.com/goldenhawking/zpserver下载. 也可从http://download.csdn.ne

一种基于Qt的可伸缩的全异步C/S架构服务器实现(一) 综述

本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/S客户端-服务集群应用需求而搭建.连接监听.数据传输.数据处理均在独立的线程池中进行,根据特定任务不同,可安排负责监听.传输.处理的线程数目,从而在高传输负荷.高计算符合上达成取舍.数据处理采用流水线结构,以避免少量客户的密集计算请求影响其他客户端的处理.本文对应的代码符合LGPL协议,可直接从https://github.com/goldenhawking/zpserver下载. 也可从http://download.csdn.ne

一种基于Qt的可伸缩的全异步C/S架构server实现(一) 综述

本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/Sclient-服务集群应用需求而搭建. 连接监听.传输数据.数据处理均在独立的线程池中进行,依据特定任务不同,可安排负责监听.传输.处理的线程数目,从而在高传输负荷.高计算符合上达成取舍.数据处理採用流水线结构.以避免少量客户的密集计算请求影响其它client的处理. 本文相应的代码符合LGPL协议,可直接从https://github.com/goldenhawking/zpserver下载. 也可从http://download

HTTP,FTP,TCP,UDP及SOCKET

一.TCP/IP协议简析TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层:网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议传输层:TCP协议与UDP协议应用层:FTP.HTTP.TELNET.SMTP.DNS等协议 HTTP是应用层协议,其传输都是被包装成TCP协议传输.可以用SOCKET实现HTTP.SOCKET是实现传输层协议的一种编程API,可以是TCP,也可以是UDP. 二.Socket连接与HTTP连接区别[Socket]由于通常情况下Socket

SOCKET, TCP/UDP, HTTP, FTP 浅析

SOCKET, TCP/UDP, HTTP, FTP (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传输层:TCP协议与UDP协议 应用层:FTP.HTTP.TELNET.SMTP.DNS等协议   HTTP是应用层协议,其传输都是被包装成TCP协议传输.可以用SOCKET实现HTTP. SOCKET是实现传输层协议的一种编程API,可以是TCP

[网络] SOCKET, TCP/UDP, HTTP, FTP

(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传输层:TCP协议与UDP协议 应用层:FTP.HTTP.TELNET.SMTP.DNS等协议 HTTP是应用层协议,其传输都是被包装成TCP协议传输.能够用SOCKET实现HTTP. SOCKET是实现传输层协议的一种编程API,能够是TCP.也能够是UDP. (二)Socket连接与HTTP连接差

涨知识-VI 基于TCP/UDP的应用层协议

基于TCP/UDP的应用层协议: 基于TCP: Telnet(Teletype over the Network, 网络电传),通过一个终端(terminal)登陆到网络 FTP(File Transfer Protocol 文件传输协议) SMTP(Simple Mail Transfer Protocol 简单邮件传输协议),用来发送电子邮件 POP3(Post Office Protocol 3)邮件读取协议,协议通常被用来接受电子邮件 HTTP HTTPS 基于UDP: NFS(net

Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理

Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理 通常我们会用Nginx的upstream做基于http/https端口的7层负载均衡,由于Nginx老版本不支持tcp协议,所以基于tcp/udp端口的四层负载均衡一般用LVS或Haproxy来做.至于4层负载均衡和7层负载均衡的区别,可以参考:http://www.cnblogs.com/kevingrace/p/6137881.html.然而Nginx从1.9.0版本开始,新增加了一个stream模块,用来实现四层协