Ubuntu使用 HPsocket

Ubuntu使用 HPsocket

环境:基于树莓派4B +Ubuntu22.04

1.下载HPsocket linux发行版

下载地址:https://gitee.com/ldcsaa/HP-Socket/releases
在这里插入图片描述
解压后
在这里插入图片描述
include:头文件
lib:库文件,这里仅用arm64文件夹下的库文件libhpsocket.so,这是release版本的
在这里插入图片描述
把libhpsocket.so拷贝到 /usr/local/lib里。
在这里插入图片描述
在etc/ld.so.conf.d下新建任何以.conf为后缀的文件,在该文件中加入库文件所在的目录,如下:
在这里插入图片描述

再运行sudo ldconfig 以更新/etc/ld.so.cache文件.(要sudo 不然QT会报 can’t link )

QT 引用

包含头文件和库文件
在这里插入图片描述

Linux 下与Windows的区别

如下报错:
1.cannot find tchar.h
->把include <tchar.h>直接注释掉,linux下好像不需要这个头文件了
2.cannot open hpsocket_U.lib
->把#pragma comment(lib,“hpsocket_U.lib”)注释掉
3.编译通过但运行报错:error while loading shared libraries:libhpsocket.so…cannot open shared object file
->拷贝到 usr/local/lib 里,在/etc/ld.so.conf.d/目录下新建任何以.conf为后缀的文件,在该文件中加入库文件所在的目录,
->sudo ldconfig 以更新/etc/ld.so.cache文件.要+sudo 不然会报 can’t link

代码-Windows,

Linux Ubuntu下一样
clistenerimpl.h

#ifndef CLISTENERIMPL_H
#define CLISTENERIMPL_H
#pragma once
#include <QString>
#include <HPSocket.h>
#include <SocketInterface.h>
#include <QDebug>



class CListenerImpl:public QObject,public CTcpClientListener
{

    Q_OBJECT
public:
    CListenerImpl(QObject *parent=nullptr);
    virtual EnHandleResult OnPrepareConnect(ITcpClient* pSender, CONNID dwConnID, SOCKET socket);
    virtual EnHandleResult OnHandShake(ITcpClient* pSender, CONNID dwConnID);
    virtual EnHandleResult OnConnect(ITcpClient* pSender, CONNID dwConnID);
    virtual EnHandleResult OnSend(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
    virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
    virtual EnHandleResult OnClose(ITcpClient* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode);
    virtual EnHandleResult OnShutdown(ITcpClient* pSender);

    ITcpClient* m_pClient;
signals:
    void sendConnOK();
    void sendConnClose();
    void sendRecvData(QString );

private:



};

#endif // CLISTENERIMPL_H

clistenerimpl.cpp

#include "clistenerimpl.h"
// HP-Socket事件处理类

CListenerImpl::CListenerImpl(QObject *parent)
{
    m_pClient=nullptr;

}

EnHandleResult CListenerImpl::OnPrepareConnect(ITcpClient *pSender, CONNID dwConnID, SOCKET socket)
{
    qDebug() << "OnPrepareConnect, Connection ID: " << dwConnID;
    return HR_OK;
}

EnHandleResult CListenerImpl::OnHandShake(ITcpClient *pSender, CONNID dwConnID)
{
    qDebug() << "OnHandShake, Connection ID: " << dwConnID;
    return HR_OK;
}

EnHandleResult CListenerImpl::OnConnect(ITcpClient *pSender, CONNID dwConnID)
{
//    qDebug() << "OnConnect, Connection ID: " << dwConnID;
    emit sendConnOK();
    return HR_OK;
}

EnHandleResult CListenerImpl::OnSend(ITcpClient *pSender, CONNID dwConnID, const BYTE *pData, int iLength)
{
        return HR_OK;
}

EnHandleResult CListenerImpl::OnReceive(ITcpClient *pSender, CONNID dwConnID, const BYTE *pData, int iLength)
{
//    qDebug() << "OnReceive, Connection ID: " << dwConnID;
    QString strData = QString::fromLocal8Bit((char*)pData, iLength);
//    qDebug() << "Received Data: " << strData;
    emit sendRecvData(strData);
    return HR_OK;
}



EnHandleResult CListenerImpl::OnClose(ITcpClient *pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
{
    qDebug() << "OnClose, Connection ID: " << dwConnID << ", Operation: " << enOperation << ", Error Code: " << iErrorCode;
    emit sendConnClose();
    return HR_OK;
}

EnHandleResult CListenerImpl::OnShutdown(ITcpClient *pSender)
{
    return HR_OK;
}




mctcpclient.h

#ifndef MCTCPCLIENT_H
#define MCTCPCLIENT_H
#include "clistenerimpl.h"
#include <tchar.h>
#include <QString>
#include <HPSocket.h>
#include <SocketInterface.h>
#include <QDebug>
#include <QTimer>
#include <QObject>

class mCTcpClient: public QObject
{
    Q_OBJECT
public:
    mCTcpClient(QObject *parent=nullptr);
    ~mCTcpClient();
    bool Connect2TCP(LPCTSTR lpszAddress, USHORT usPort);
    bool Send(LPCTSTR lpszData, int iLength);
public slots:
    void receive_HP_connOK();
    void receive_HP_connClosed();
    void receive_HP_Data(QString data);
    void startConnect(LPCTSTR ipAddress, USHORT port);

private:
    CListenerImpl* m_pListener;
    ITcpClient* m_pClient;

    bool b_isConnectState=false;
    LPCTSTR m_AddIp;
    USHORT m_Port;

    QTimer *m_timerConnect;

};

#endif // MCTCPCLIENT_H

mctcpclient.cpp

#include "mctcpclient.h"

mCTcpClient::mCTcpClient(QObject *parent):QObject{parent}
{
    m_pListener = new CListenerImpl();
    m_pClient = nullptr;

    QObject::connect(m_pListener,&CListenerImpl::sendConnOK,this,&mCTcpClient::receive_HP_connOK);
    QObject::connect(m_pListener,&CListenerImpl::sendConnClose,this,&mCTcpClient::receive_HP_connClosed);
    QObject::connect(m_pListener,&CListenerImpl::sendRecvData,this,&mCTcpClient::receive_HP_Data);

    m_timerConnect = new QTimer();
    connect(m_timerConnect, &QTimer::timeout, [=](){
        qDebug()<<"m_pClient"<<m_pClient;
        if (m_pClient != nullptr)
        {
        qDebug()<<"m_pClient->GetState();"<<m_pClient->GetState();
        }

        if(b_isConnectState)
            return;

        Connect2TCP(m_AddIp,m_Port);


    });

}

mCTcpClient::~mCTcpClient()
{
    if (m_pClient != nullptr)
    {
        HP_Destroy_TcpClient(m_pClient);
        qDebug()<<"~~~~~~~~~~~~~~~~~mCTCPClient~~~~~~~~~~~~~";

        m_pClient = nullptr;
    }

    if (m_pListener != nullptr)
    {
        delete m_pListener;
        m_pListener = nullptr;
    }
}

bool mCTcpClient::Connect2TCP(LPCTSTR lpszAddress, USHORT usPort)
{

    if (!m_pClient->Start(lpszAddress,usPort))
    {
        qDebug() << "HP_Client_Start Failed!";
        return false;
    }

    return true;
}

bool mCTcpClient::Send(LPCTSTR lpszData, int iLength)
{
    if (m_pClient == nullptr)
    {
        qDebug() << "TCP Client Not Initialized!";
        return false;
    }


    if (!m_pClient->Send((const BYTE*)lpszData, iLength))
    {

        qDebug() << "TCP Client Send Failed!";
        return false;
    }
    return true;
}

void mCTcpClient::receive_HP_connOK()
{
    qDebug()<<"receive HPSocket connected";
    b_isConnectState=true;
    m_timerConnect->stop();

}

void mCTcpClient::receive_HP_connClosed()
{
    qDebug()<<"receive HPSocket Connect Closed";
    b_isConnectState=false;
    m_timerConnect->start(1000);

}

void mCTcpClient::receive_HP_Data(QString data)
{
    qDebug()<<"receive HPSocket Data:"<<data;
}

void mCTcpClient::startConnect(LPCTSTR ipAddress, USHORT port)
{
    m_AddIp = ipAddress;
    m_Port = port;

    if (m_pClient != nullptr)
    {
        HP_Destroy_TcpClient(m_pClient);
        m_pClient = nullptr;
    }

    m_pClient=HP_Create_TcpClient(m_pListener);
    if (m_pClient == nullptr)
    {
        qDebug() << "Create_HP_TcpClient Failed!";
        return ;
    }

    m_timerConnect->start(1000);
}

Mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <mctcpclient.h>
#include <tchar.h>
#include <clistenerimpl.h>
#include <QDateTime>
#include <stdio.h>

//引用QJson相关头文件
#include <QJsonObject>
#include <QJsonValue>
#include <QJsonDocument>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void initSocket();

    mCTcpClient tcpClient;

//    CHPThreadPoolListenerImpl *ThreadPoolListener;
    //全局共享变量使用extern关键字修饰
//    extern CHPThreadPoolPtr ThreadPool(&ThreadPoolListener);
//     CHPThreadPoolPtr ThreadPool;

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H

Mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#pragma comment(lib,"HPSocket_U.lib")


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
//    ThreadPool{this}
{
    ui->setupUi(this);


    tcpClient.startConnect(_T("192.168.100.25"), 5555);



}

MainWindow::~MainWindow()
{
    tcpClient.deleteLater();
    qDebug()<<"~~~~~~~~~~~~~~~~~MainWindow~~~~~~~~~~~~~";
    delete ui;


}

void MainWindow::initSocket()
{

}

void MainWindow::on_pushButton_clicked()
{

//QString格式
//    QString sendstr="";
//    QString mtime=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
//    sendstr.append(mtime);
//    sendstr.append(",222.222,33.333");

//    std::string q_str=sendstr.toStdString();

//    LPCTSTR c_str = (LPCTSTR)q_str.c_str();
//    tcpClient.Send(c_str,q_str.length());
    //QString格式



    //Json格式:{"timestamp":1704710460913,"guid":"","volume":0.0,"total_volume":0.0,"state":1}
    QJsonObject send_Json_msg;

    //1)插入时间戳(毫秒)
    QJsonValue Json_currtime=QDateTime::currentMSecsSinceEpoch();
    send_Json_msg.insert("timestamp",Json_currtime);

    //2)插入guid
    QString guid="100000007d1c944f";
    send_Json_msg.insert("guid",QJsonValue(guid));

    //3)插入volume
    double volume=0.01;
    send_Json_msg.insert("volume",QJsonValue(volume));

    //4)插入total_volume
    double total_volume=99.999;
    send_Json_msg.insert("total_volume",QJsonValue(total_volume));

    //5)插入状态
    int curr_State=1;
    send_Json_msg.insert("state",QJsonValue(curr_State));

    qDebug()<<"send_Json_msgsend_Json_msgsend_Json_msg"<<send_Json_msg;

    //QJsonObject转QByteArray再转QString
    QString sendstr=QString(QJsonDocument(send_Json_msg).toJson());

    std::string q_str=sendstr.toStdString();
    LPCTSTR c_str = (LPCTSTR)q_str.c_str();
    tcpClient.Send(c_str,q_str.length());


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值