UavUdpSocket

该模块主要用于和无人机地面站通信单元进行数据的收发,基于udpsocket.

cpp 复制代码
#pragma once
#include <QObject>
#include "libCore.h"
#include "LkCommonStruct.h"

class LkUavUdpSocket : public LkUdpSocket
{
	Q_OBJECT
public:
	LkUavUdpSocket(QObject *parent = 0);
	~LkUavUdpSocket();	

	//向无人机发送命令
	template <class T>
	int cmdToUav(T cmd, MsgHeader type)
	{
		int len = cmd.ByteSize();
		char* buff;
		buff = new char[len];
		memset(buff, 0, len);
		cmd.SerializeToArray(buff, len);
		QByteArray sendTo;
		LittleEndianStream(out, sendTo);

		out << int(type);
		out.writeRawData(buff, len);
		delete buff;
		//qDebug() << QString("cmdToUav:Type %1: %2").arg(type).arg(QDateTime::currentDateTime().toString("hh:mm:ss:.zzz"));
		int r =  mSendSocket->writeDatagram(sendTo.data(), sendTo.size(), QHostAddress(mUavComIp), mUavSendPort);
		//qDebug() << QString("cmdToUav:End %1: %2").arg(type).arg(QDateTime::currentDateTime().toString("hh:mm:ss:.zzz"));
		return r;
	}
	void init(QString ip, int port);
private:
	void parse(QByteArray &ba);
	
public slots:
	virtual void readPendingDatagrams();
signals:

public:
	QString mUavComIp;
	int mUavSendPort;
	QSharedPointer<LkUdpSocket> mSendSocket;
private:
};


```cpp
#include "LkUavUdpSocket.h"

LkUavUdpSocket::LkUavUdpSocket(QObject *parent)
	: LkUdpSocket(parent)
{
	connect(this, &LkUavUdpSocket::readyRead, this, &LkUavUdpSocket::readPendingDatagrams);
	mSendSocket = QSharedPointer<LkUdpSocket>::create();
}

LkUavUdpSocket::~LkUavUdpSocket()
{
}

void LkUavUdpSocket::init(QString ip, int port)
{	
	bool b = bind(QHostAddress::Any, port);
	mUavComIp = ip;	
}

void LkUavUdpSocket::readPendingDatagrams()
{
	while (hasPendingDatagrams())
	{
		QByteArray datagram;
		datagram.resize(pendingDatagramSize());
		QNetworkDatagram netDgm = receiveDatagram();
		QString senderIP = netDgm.senderAddress().toString();
		datagram = netDgm.data();
		parse(datagram);
	}
}

void LkUavUdpSocket::parse(QByteArray &ba)
{
	LittleEndianStream(in, ba);
	int msgId;
	in >> msgId;
	if (msgId > 0)
	{
		LkMessageEvent me(QString::number(msgId));
		me.setData(ba.size() - sizeof(int), ba.data() + sizeof(int));
		gNetListener->dispatch(me);
	}
}
复制代码
相关推荐
发光小北4 小时前
Modbus TCP 转 Profinet 主站网关如何应用?
网络·网络协议·tcp/ip
易连EDI—EasyLink7 小时前
易连EDI–EasyLink实现OCR智能数据采集
网络·人工智能·安全·汽车·ocr·edi
@insist1237 小时前
信息安全工程师考点精讲:身份认证核心原理与分类体系(上篇)
大数据·网络·分类·信息安全工程师·软件水平考试
SmartRadio8 小时前
ESP32-S3 双模式切换实现:兼顾手机_路由器连接与WiFi长距离通信
开发语言·网络·智能手机·esp32·长距离wifi
_.Switch8 小时前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript
c++之路9 小时前
C++信号处理
开发语言·c++·信号处理
金色光环9 小时前
FreeModbus释放底层的 TCP 监听端口
服务器·网络·tcp/ip
数智化精益手记局9 小时前
拆解物料管理erp系统的核心功能,看物料管理erp系统如何解决库存积压与缺料难题
大数据·网络·人工智能·安全·信息可视化·精益工程
灰子学技术11 小时前
Envoy HTTP 过滤器处理技术文档
网络·网络协议·http
故事还在继续吗11 小时前
C++20关键特性
开发语言·c++·c++20