服务器端
设备搜索进程作为设备连接的先决条件,作用是搜索在这个局域网内符合要求的的设备IP。如果是自己定义的设备会在接收广播后回复当前设备的ip,这样服务器端知道设备ip。此时设备可以创建自己的tcp服务器期待与服务器建立长连接,服务器收到建立连接的请求后,选择是否建立长连接。之后设备与服务器之间就可以进行通信。
设备客户端运行后首先下发此请求包,确认设备端是否已经有了点表配置文件。如果没有,那么下一步就是给设备下发点表文件;如果设备已经有了(下发过),那么需要获取设备的某些配置信息,以便QT后续运行使用。本代码只是可以建立长连接,其他的操作需要自己定义。
.h文件
#ifndef LINKWIG_H
#define LINKWIG_H
#include <QWidget>
#include<QTcpSocket>
#include <QUdpSocket>
#include <QHostAddress>
#include<QTcpServer>
namespace Ui {
class LinkWig;
}
class LinkWig : public QWidget
{
Q_OBJECT
public:
explicit LinkWig(QWidget *parent = 0);
~LinkWig();
private slots:
void on_pushButton_search_clicked();
void readyReadSlot();
void on_pushButton_link_clicked();
void ConnectSlot();
private:
Ui::LinkWig *ui;
QTcpSocket *socket=NULL;//创建客户端套接字对象
QUdpSocket *broadsocket=NULL;//创建udp套接字对象
};
#endif // LINKWIG_H
.c文件
#include "linkwig.h"
#include "ui_linkwig.h"
LinkWig::LinkWig(QWidget *parent) :
QWidget(parent),
ui(new Ui::LinkWig)
{
ui->setupUi(this);
broadsocket = new QUdpSocket(this);//创建广播套接字
broadsocket->bind(QHostAddress::AnyIPv4, 8880, QUdpSocket::ShareAddress);
}
LinkWig::~LinkWig()
{
delete ui;
}
//进行ip广播搜索
void LinkWig::on_pushButton_search_clicked()
{
broadsocket->writeDatagram("this is broadcast message !", QHostAddress::Broadcast, 8880);
connect(broadsocket, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));
}
void LinkWig::ConnectSlot()
{
qDebug()<<"tcp连接槽函数";
}
void LinkWig::readyReadSlot()
{
while(broadsocket->hasPendingDatagrams())
{
QByteArray data;
data.resize(broadsocket->pendingDatagramSize());
QHostAddress host;
quint16 port;
broadsocket->readDatagram(data.data(), data.size(), &host, &port);
ui->plainTextEdit_add->appendPlainText(host.toString());
ui->plainTextEdit_add->appendPlainText(QString::number(port));
qDebug() << "Received message from" << host.toString() << ":" << data;
// Send response back to the sender
// QByteArray response = "Hello from device!";
// broadsocket->writeDatagram(response, host, port);
}
}
void LinkWig::on_pushButton_link_clicked()
{
//拿到服务端的Ip和端口号
socket=new QTcpSocket(this);
QString severip=ui->ip->text();
int port=ui->port->text().toInt();
//TODO检测有效性
socket->connectToHost(severip,port);
qDebug()<<"tcp connect";
}
设备端
.h文件
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QWidget>
#include<QTcpSocket>
#include <QUdpSocket>
#include <QHostAddress>
#include<QTcpServer>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
QTcpServer *sever;//设备创建TCP服务器
QUdpSocket *socket;
private slots:
readyReadSlot();
newConnectSlot();
signals:
void deviceFound(const QString &ipAddress, const QByteArray &response);
};
#endif // DIALOG_H
.c文件
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
socket = new QUdpSocket(this);
if(!socket->bind(8880, QUdpSocket::ShareAddress))
{
ui->textBrowser->append("bind failed !");
}
connect(socket,SIGNAL(readyRead()),this,SLOT(readyReadSlot()));
}
Dialog::~Dialog()
{
delete ui;
}
Dialog::readyReadSlot()
{
while(socket->hasPendingDatagrams())
{
QByteArray data;
data.resize(socket->pendingDatagramSize());
QHostAddress host;
quint16 port;
socket->readDatagram(data.data(), data.size(), &host, &port);
QString text = QString("[%1:%2]:%3").arg(host.toString()).arg(port).arg(QString(data));
ui->textBrowser->append(text);
QByteArray response = "Hello from device!";
socket->writeDatagram(response, host, port);
}
//创建TCP服务器
sever=new QTcpServer(this);//构造函数创建服务器对象
bool result=sever->listen(QHostAddress::Any,8880);
if(!result)
{
ui->textBrowser->append("listen failure");
return 0;
}
ui->textBrowser->append("listen success,");
connect(sever,SIGNAL(newConnection()),this,SLOT(newConnectSlot()));
}
Dialog::newConnectSlot()
{
// socket=sever->nextPendingConnection();//获得当前连接过来的客户端信息
//获取ip,port
QString ip=socket->peerAddress().toString();
quint16 port=socket->peerPort();
ip.prepend("ip:").append("port:").append(QString::number(port));
ui->textBrowser->append(ip);
ui->textBrowser->append("Start Connect");
}