• QTcpSocket


    一、

    二、

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QTcpServer>
    #include <QTcpSocket>
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    private slots:
        void slotNewConnection();
        void slotReadyRead();
        void on_btn_listen_clicked();
    
        void on_btn_close_clicked();
    
        void on_btn_send_clicked();
    
        void on_btn_open_lock_clicked();
    
        void on_btn_clean_clicked();
    
    private:
        Ui::MainWindow *ui;
    private:
        uint8_t mac_addr[6];
        QTcpServer *tcp_server_;
        QTcpSocket *tcp_socket_;
        void init();
        void send(const QByteArray &ba);
        void showMsg(bool isSend,const QByteArray &ba);
        void showMsg(const QString &msg);
    };
    #endif // MAINWINDOW_H
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDateTime>
    #include <QDebug>
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        ui->le_port->setText("8080");
    
        init();
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::slotNewConnection()
    {
        showMsg("设备连接进来");
        tcp_socket_ = tcp_server_->nextPendingConnection(); //获取已经连接的客户端套接字
        connect(tcp_socket_,SIGNAL(readyRead()),this,SLOT(slotReadyRead()));
    }
    
    void MainWindow::slotReadyRead()
    {
    
        QByteArray data=tcp_socket_->readAll();
        //qDebug()<<data.toHex();
    
        showMsg(false,data);
    
    
        QString rec=data.toHex();
        QString mark_str="";
    
        QString data1=rec.mid(2,2);
        if(data1.toInt(nullptr,16)==0xB4)
        {
           QString mac_addr=rec.mid(4,12);
           QString mac_temp="";
           for(int i=0;i<6;i++)
           {
              mac_temp+=mac_addr.mid(i*2,2)+" ";
    
           }
            mark_str="B4设备状态上报 ";
            mark_str+=" mac addr:"+mac_temp;
            mark_str+=" 低电报警:"+rec.mid(16,2);
            mark_str+=" 开关状态(00关锁 01开锁):"+rec.mid(18,2);
            mark_str+=" 锁长时间未锁报警(00正常 01报警):"+rec.mid(20,2);
        }
        else if(data1.toInt(nullptr,16)==0xA3)
        {
    
             mark_str="A3设备刷卡数据上报";
    
        }
        showMsg(mark_str);
    
    
    }
    
    void MainWindow::init()
    {
    
        tcp_server_ = new QTcpServer(this);
        tcp_socket_ = new QTcpSocket(this);
        connect(tcp_server_,SIGNAL(newConnection()),this,SLOT(slotNewConnection()));
    
    }
    
    void MainWindow::send(const QByteArray &ba)
    {
        int ret=tcp_socket_->write(ba);
        if(ret==-1)
        {
            showMsg("发送失败!IODevice::write (QTcpSocket): device not open");
        }
        else
        {
           showMsg(true,ba);
        }
    }
    
    void MainWindow::showMsg(bool isSend, const QByteArray &ba)
    {
        QString rec=ba.toHex();
    
        int count = rec.size()/2;
        QString temp="";
        for(int i=0;i<count;i++)
        {
           temp += rec.mid(i*2,2)+" ";
    
        }
        QString now_time="["+QDateTime::currentDateTime ().toString ("hh:mm:ss zzz")+"]";
        if(isSend)
        {
            ui->te_info->append(now_time+"[发] "+temp.toUpper());
        }
        else
        {
            ui->te_info->append(now_time+"[收] "+temp.toUpper());
        }
    
    }
    
    void MainWindow::showMsg(const QString &msg)
    {
        QString now_time="["+QDateTime::currentDateTime ().toString ("hh:mm:ss zzz")+"] ";
        ui->te_info->append(now_time+msg);
    }
    
    
    void MainWindow::on_btn_listen_clicked()
    {
        ui->btn_listen->setEnabled(false);
        ui->le_port->setEnabled(false);
        if(tcp_server_->listen(QHostAddress::Any,ui->le_port->text().toUInt()))  //监听端口号
        {
            showMsg("开启服务器成功!");
        }
        else
        {
            showMsg("开启服务器失败!");
            ui->btn_listen->setEnabled(true);
            ui->le_port->setEnabled(true);
        }
    }
    
    
    void MainWindow::on_btn_close_clicked()
    {
        tcp_server_->close();
        tcp_socket_->close();
        ui->btn_listen->setEnabled(true);
        ui->le_port->setEnabled(true);
    }
    
    
    void MainWindow::on_btn_send_clicked()
    {
        //qint64 write(const QByteArray &data);
        QByteArray ba;
        ba.resize(4);
        ba[0]=0x3c;
        ba[1]=0x3d;
        ba[2]=0x3e;
        ba[3]=0xff;
        send(ba);
    }
    
    
    void MainWindow::on_btn_open_lock_clicked()
    {
    
        QByteArray ba;
        ba.resize(13);
        ba[0]=0x0c;
        ba[1]=0xb3;
        ba[2]=0x01;
        ba[3]=0x02;
        ba[4]=0x03;
        ba[5]=0x04;
        ba[6]=0x05;
        ba[7]=0x06;
        ba[8]=0x07;
        ba[9]=0x11;
        ba[10]=0x22;
        ba[11]=0xa5;
        ba[12]=0x3e;
        send(ba);
    
    }
    
    
    void MainWindow::on_btn_clean_clicked()
    {
        ui->te_info->clear();
    }
  • 相关阅读:
    美国航天局的十大编码戒律(转)
    大型数据库应用解决方案总结
    IOCP模型
    SSH 连接慢的解决方案详解
    指针(详解)【转】
    有关推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入区别【转】
    USB入门开发的八个问题&USB枚举『转』
    浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)(转)
    KEIL Code RO-data RW-data ZI-data 【转】
    262K Color
  • 原文地址:https://www.cnblogs.com/ike_li/p/16731491.html
Copyright © 2020-2023  润新知