您的位置:首页 > 理论基础 > 计算机网络

基于工厂模式的 无人机连接方式( tcp、串口)

2018-02-10 11:11 405 查看
1,当前 与无人机的通信无外乎两种:
tcp:涉及到参数为ip与端口。用于正式的数据交互。
串口:涉及到的参数为端口号与波特率,因为串口其他参数相对固定,并且端口号可以与VID绑定,所以串口可固定参数为VID与波特率。串口一般用于调试使用。
而真正的使用过程中,通用的函数大致分为四种。连接、断开、收数据、发数据。因此可将此两种方式利用工厂模式进行封装,用户设置好参数,即可随时切换两种使用方式。大致设置如下:



2,工厂模式实现
(1)定义 纯虚基类,声明 三个public函数,用于连接、断开、发送数据。并声明一个信号,用于数据的接收。
class PVCORESHARED_EXPORT AbstractLinkProduct:public QObject{
Q_OBJECT
public:
AbstractLinkProduct();
virtual ~AbstractLinkProduct();//虚 析构函数
public:
virtual bool connect()=0;
virtual void disConnect()=0;
virtual void sendData(const char*buff,qint64 size)=0;
signals:
void bytesReceived(const char*buff,qint64 size);
};

(2),声明 具体的串口 和tcp 实现类
//串口连接
class SerialLink:public AbstractLinkProduct{
Q_OBJECT
public:
SerialLink(QString _VID="",QString _baud="");
virtual ~SerialLink();
private:
SerialThread *serialThread;
public:
virtual bool connect();
virtual void disConnect();
virtual void sendData(const char*buff,qint64 size);
};
//tcp,dup连接
class SocketLink:public AbstractLinkProduct{
Q_OBJECT
public:
SocketLink(QString _ip="",QString _port="", QAbstractSocket::SocketType type=QAbstractSocket::TcpSocket);
virtual ~SocketLink();
private:
PVSocket* socket;
QAbstractSocket::SocketType socketType;
public:
virtual bool connect();
virtual void disConnect();
virtual void sendData(const char*buff,qint64 size);
};


(3),不同对象的实现
class PVCORESHARED_EXPORT AbstractLinkFactory{
public:
AbstractLinkFactory();
virtual ~AbstractLinkFactory();
public:
virtual AbstractLinkProduct* createProduct(LinkParameter link) = 0;
};
class PVCORESHARED_EXPORT LinkFactory:public AbstractLinkFactory{
public:
LinkFactory();
~LinkFactory();
public:
AbstractLinkProduct* createProduct(LinkParameter link);
};


AbstractLinkProduct* LinkFactory::createProduct(LinkParameter link){
AbstractLinkProduct* temp = NULL;
switch(link.type)
{
    case TypeSerial:
temp = new SerialLink(link.vid,link.baud);
break;
case TypeTcp:
temp = new SocketLink(link.ip,link.port,QAbstractSocket::TcpSocket);
break;
case TypeUdp:
temp = new SocketLink(link.ip,link.port,QAbstractSocket::UdpSocket);
break;
default:
break;
}
return temp;
}


(4),连接 参数 由界面设置 传入,结构体如下
struct LinkParameter
{
LinkType type;
//串口设置
QString vid;
QString baud;
//网络设置
QString ip;
QString port;
};


3,使用方式
(1),传入 连接参数,并绑定 信号与槽,进行数据的接收
factory = new LinkFactory();
product = factory->createProduct(link);
QObject::connect(product,SIGNAL(bytesReceived(const char*,qint64)),this,SLOT(sl_bytesReceived(const char*,qint64)),Qt::DirectConnection);
assert(product);


(2)连接或者断开
bool MainboardPVW4::connect()
{
heartbeat=0;
try
{
return product->connect();
}
catch(const std::exception&exp)
{
qDebug()<<"MainboardPVW4::connect()->Exception encountered"<<exp.what()<<endl;
}
}
void MainboardPVW4::disConnect()
{
product->disConnect();
}


(3)用户 只需设置一次关键参数,即可随便切换连接方式。代码中在 数据解析处 可针对收到的数据进行具体的解析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  串口 tcp 无人机