基于工厂模式的 无人机连接方式( tcp、串口)
2018-02-10 11:11
405 查看
1,当前 与无人机的通信无外乎两种:
tcp:涉及到参数为ip与端口。用于正式的数据交互。
串口:涉及到的参数为端口号与波特率,因为串口其他参数相对固定,并且端口号可以与VID绑定,所以串口可固定参数为VID与波特率。串口一般用于调试使用。
而真正的使用过程中,通用的函数大致分为四种。连接、断开、收数据、发数据。因此可将此两种方式利用工厂模式进行封装,用户设置好参数,即可随时切换两种使用方式。大致设置如下:
2,工厂模式实现
(1)定义 纯虚基类,声明 三个public函数,用于连接、断开、发送数据。并声明一个信号,用于数据的接收。
class PVCORESHARED_EXPORT AbstractLinkProduct:public QObject{
(2),声明 具体的串口 和tcp 实现类
//串口连接
(3),不同对象的实现
class PVCORESHARED_EXPORT AbstractLinkFactory{
AbstractLinkProduct* LinkFactory::createProduct(LinkParameter link){
3,使用方式
(1),传入 连接参数,并绑定 信号与槽,进行数据的接收
factory = new LinkFactory();
(2)连接或者断开
bool MainboardPVW4::connect()
(3)用户 只需设置一次关键参数,即可随便切换连接方式。代码中在 数据解析处 可针对收到的数据进行具体的解析。
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)用户 只需设置一次关键参数,即可随便切换连接方式。代码中在 数据解析处 可针对收到的数据进行具体的解析。
相关文章推荐
- 基于事件的异步Socket(TCP连接方式)
- 基于事件的异步Socket(TCP连接方式)
- [转] 基于事件的异步Socket(TCP连接方式)
- 基于.Net3.5编写,全异步操作。支持TCP、UDP两种方式,全事件模式通知。
- 基于TCP连接的C S模式的最简单模型代码
- 基于事件的异步Socket(TCP连接方式)
- 工厂模式实现方式、使用场景(包括基于反射的简单工厂模式)
- 阿里云 物联网套件 MQTT Swift 搭建-基于Tcp连接-域名连接模式
- Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作模式。
- 【Python】如何基于Python写一个TCP反向连接后门
- 基于接口的工厂模式的三层架构
- TCP/IP 应用程序的通信连接模式
- 用TCP连接分析TUXEDO的WS模式
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
- 设计模式-----基于反射工厂模式
- 深入理解Oracle表(5):三大表连接方式详解之Hash Join的定义,原理,算法,成本,模式和位图
- 【读书笔记】设计模式(五)——工厂方式模式
- TCP连接的状态与关闭方式及其对Server与Client的影响
- 为什么不使用工厂模式,以new Class的方式实例化对象并调用方法不利于项目升级的维护
- java工厂模式的三种方式