Compare commits

...

10 Commits

Author SHA1 Message Date
zcy e10f75b7ce no message 2023-10-28 01:30:21 +08:00
zcy 15084716e8 no message 2021-09-13 00:27:40 +08:00
zcy d29d688b55 no message 2021-09-12 23:40:12 +08:00
zcy 8e0176a5c0 no message 2021-09-12 01:28:36 +08:00
zcy 62c9df87c8 no message 2021-09-11 17:23:29 +08:00
zcy d7c5d0e889 tcp server mode swtich to libevent 2021-09-10 00:22:33 +08:00
zcy c33530ce1d 新增tcps swarm模式的lua事件绑定 2021-09-08 23:55:27 +08:00
zcy 6e80dda35b no message 2021-09-08 01:06:03 +08:00
zcy ab55618406 no message 2021-09-06 20:51:53 +08:00
zcy c447084ba5 fix 2021-09-02 00:16:47 +08:00
16 changed files with 375 additions and 83 deletions

View File

@ -25,17 +25,39 @@ lua代码例子:
``` ```
require("string") require("string")
function OnDataReady(data) # 接收串口数据回调
function OnDataReady(data) # 串口收到数据
showbuffer(data) showbuffer(data)
serial_send(data) serial_send(data)
end end
function OnNetworkData(addr,data,len) # 接收网络数据回调 function OnNetworkData(addr,data,len) # tcp客户端模式接收到数据
showbuffer(addr) print(addr,data,len)
print(len)
print(data)
showbuffer("recv network data: " .. data .. "\r\n")
end
function OnUdpData(addr,data,len) # udp客户端模式接收到数据
print(addr,data,len)
showbuffer("recv data: ",data,"\r\n")
end end
function OnNewClient(addr,port,sock) # 新连接,tcp服务端模式
print(addr,port,sock)
showbuffer("tcp connected: "
..addr.."\r\n"..port.."\r\n"..sock.."\r\n")
end
function OnClientLeave(addr,port,sock) # 连接断开,tcp服务端模式
print(addr,port,sock)
showbuffer("tcp close: "
..addr.."\r\n"..port.."\r\n"..sock.."\r\n")
end
serial_send("test") # 在脚本中主动发送串口数据 serial_send("test") # 在脚本中主动发送串口数据

View File

@ -28,6 +28,7 @@ set(HEADERS # 待预编译的cpp头文件
sharedata.h sharedata.h
network_controller.h network_controller.h
mainwindow.h mainwindow.h
tcp_server_libevent.h
) )
@ -40,7 +41,7 @@ set(SOURCES # 待预编译的cpp代码
network_controller.cpp network_controller.cpp
mainwindow.cpp mainwindow.cpp
tcp_swarm_libevent.cpp tcp_swarm_libevent.cpp
tcp_server_libevent.cpp
) )
set(RESOURCES set(RESOURCES

View File

@ -179,7 +179,8 @@ Item {
} }
if(proto_combox.currentText === "tcp" && (conn_type.currentText === "server")){ if(proto_combox.currentText === "tcp" && (conn_type.currentText === "server")){
type_network = 1 type_network = 1
button_network.text = "正在连接" button_network.text = "正在监听"
button_close.visible = true
} }
if(proto_combox.currentText === "tcp" && (conn_type.currentText === "client")){ if(proto_combox.currentText === "tcp" && (conn_type.currentText === "client")){
type_network = 3 type_network = 3
@ -197,10 +198,33 @@ Item {
type_network) type_network)
}else if ((button_network.text === "关闭连接") && (proto_combox.currentText !== "udp")) }else if ((button_network.text === "关闭连接") && (proto_combox.currentText === "udp"))
{ {
console.log("dfdfads") console.log("dfdfads")
DataWrap.closeNetwork(); DataWrap.closeNetwork("");
button_network.text = "打开网络"
}
else if ((button_network.text === "关闭连接") && (proto_combox.currentText === "tcp"))
{
console.log("dfdfads")
DataWrap.closeNetwork("");
button_network.text = "打开网络"
}
}
}
Button {
id: button_close
visible: false
Layout.leftMargin: 20
Layout.topMargin: 20
width: 128
height: 52
text: qsTr("停止监听")
onClicked: {
if(button_network.text == "正在监听"){
button_close.visible = false
DataWrap.closeNetwork("tcpserver");
button_network.text = "打开网络" button_network.text = "打开网络"
} }
} }
@ -252,7 +276,7 @@ Item {
Connections { Connections {
target: DataWrap target: DataWrap
onDisConnected: { onDisConnected: {
button_network.text = "打开连接" button_network.text = "打开网络"
tip.success("网络连接失败") tip.success("网络连接失败")
} }
} }

View File

@ -5,6 +5,7 @@ import QtQuick.Controls.Material 2.12
Item { Item {
id: debug_form
objectName: "ProtoDebug" objectName: "ProtoDebug"
width: 800 width: 800
height: 600 height: 600
@ -52,7 +53,7 @@ Item {
font.pixelSize: 30 font.pixelSize: 30
font.bold: true font.bold: true
} }
Flickable { ScrollView {
id: flick id: flick
Layout.preferredHeight: parent.height - 100 Layout.preferredHeight: parent.height - 100
Layout.preferredWidth: parent.width/2 - 20 Layout.preferredWidth: parent.width/2 - 20
@ -60,7 +61,6 @@ Item {
contentWidth: lua_script.paintedWidth contentWidth: lua_script.paintedWidth
contentHeight: lua_script.paintedHeight contentHeight: lua_script.paintedHeight
clip: true
Layout.leftMargin: 10 Layout.leftMargin: 10
ColorAnimation { ColorAnimation {
@ -91,19 +91,28 @@ Item {
onCursorRectangleChanged: flick.ensureVisible(cursorRectangle) onCursorRectangleChanged: flick.ensureVisible(cursorRectangle)
} }
} }
ScrollView{
TextArea {
id: text_output
Layout.preferredHeight: parent.height - 100
text: qsTr("")
font.pixelSize: 20
Layout.columnSpan: 1 Layout.columnSpan: 1
Layout.preferredWidth: parent.width/2 - 20 Layout.preferredWidth: parent.width/2 - 35
background: Rectangle { Layout.preferredHeight: parent.height - 200
border.color: text_output.enabled ? "#21be2b" : "transparent"
}
Layout.leftMargin: 10 Layout.leftMargin: 10
height: parent.height
TextArea {
id: text_output
height: parent.height
text: qsTr("")
font.pixelSize: 20
cursorVisible: true;
focus: true;
readOnly: true
selectByMouse:true;
selectByKeyboard: true
background: Rectangle {
border.color: text_output.enabled ? "#21be2b" : "transparent"
}
}
} }
RowLayout{ RowLayout{
visible: true visible: true
@ -168,10 +177,17 @@ Item {
text: qsTr("执行命令") text: qsTr("执行命令")
Layout.bottomMargin: 10 Layout.bottomMargin: 10
onClicked: { onClicked: {
} }
} }
Button {
id: button3
text: qsTr("清空缓冲区")
Layout.bottomMargin: 10
onClicked: {
console.log("dfsd")
debug_form.clearbuff()
}
}
} }
} }
} }
@ -195,6 +211,10 @@ Item {
showbuf += str; showbuf += str;
text_output.text = showbuf; text_output.text = showbuf;
} }
function clearbuff(){
showbuf = "";
text_output.text = showbuf;
}
} }

View File

@ -18,6 +18,31 @@ int LuaDelegate::DoString(QString scr)
return 0; return 0;
} }
int LuaDelegate::UpdateScript(QString scr)
{
if(nullptr != mVM){
lua_close(mVM);
}
free(mVM);
mVM = luaL_newstate(); //打开lua
if(nullptr != mVM){
printf("shit is nullptr");
}
luaL_openlibs(mVM); //打开标准库
lua_register(mVM, "showbuffer", LuaShowData);
lua_register(mVM, "serial_send", LuaWriteUart);
if (mVM != nullptr){
int ret = luaL_dostring(mVM,scr.toStdString().c_str());
if (ret > 0){
printf("lua error");
PrintError(mVM);
return -1;
}
}
return 0;
}
void LuaDelegate::PrintError(lua_State *L) void LuaDelegate::PrintError(lua_State *L)
{ {
qDebug()<<"\nFATAL ERROR:%s\n\n"<< lua_tostring(L, -1); qDebug()<<"\nFATAL ERROR:%s\n\n"<< lua_tostring(L, -1);
@ -25,6 +50,8 @@ void LuaDelegate::PrintError(lua_State *L)
void LuaDelegate::OnSerialData(QString data){ void LuaDelegate::OnSerialData(QString data){
int i = lua_getglobal(mVM,"OnDataReady"); int i = lua_getglobal(mVM,"OnDataReady");
if(i == 0)
return;
lua_pushstring(mVM,data.toStdString().data()); lua_pushstring(mVM,data.toStdString().data());
lua_call(mVM,1,0); lua_call(mVM,1,0);
} }
@ -33,13 +60,42 @@ void LuaDelegate::OnNetworkData(char *addr, char *data, uint32_t port)
{ {
qDebug()<<"call lua network callback"; qDebug()<<"call lua network callback";
int ret = lua_getglobal(mVM,"OnNetworkData"); int ret = lua_getglobal(mVM,"OnNetworkData");
if(ret == 0)
return;
qDebug()<<ret;
lua_pushstring(mVM,addr); lua_pushstring(mVM,addr);
lua_pushstring(mVM,data); lua_pushstring(mVM,data);
lua_pushnumber(mVM,port); lua_pushnumber(mVM,port);
lua_call(mVM,3,0); lua_call(mVM,3,0);
} }
void LuaDelegate::OnNewTcpClient(QString ip, uint32_t port, uint32_t sockptr)
{
qDebug()<<"call lua network new client callback";
int ret = lua_getglobal(mVM,"OnNewClient");
if(ret == 0)
return;
qDebug()<<ret;
lua_pushstring(mVM,ip.toStdString().c_str());
lua_pushinteger(mVM,port);
lua_pushinteger(mVM,sockptr);
lua_call(mVM,3,0);
}
void LuaDelegate::OnClientLeave(QString ip, uint32_t port, uint32_t sockptr)
{
qDebug()<<"call lua network leave callback";
int ret = lua_getglobal(mVM,"OnClientLeave");
if(ret == 0)
return;
qDebug()<<ret;
lua_pushstring(mVM,ip.toStdString().c_str());
lua_pushnumber(mVM,port);
lua_pushnumber(mVM,sockptr);
lua_call(mVM,3,0);
}
void LuaDelegate::DumpStack() void LuaDelegate::DumpStack()
{ {
static int count = 0; static int count = 0;

View File

@ -23,6 +23,8 @@ public:
int DoFile(QString); int DoFile(QString);
void Stop(); void Stop();
int DoString(QString); int DoString(QString);
int UpdateScript(QString);
void pushstack() { void pushstack() {
// const std::type_info &t1 = std::bad_typeid(arg1); // const std::type_info &t1 = std::bad_typeid(arg1);
// std::cout << t1.name() << std::endl; // std::cout << t1.name() << std::endl;
@ -46,6 +48,10 @@ public:
/* 收到数据发送给lua层进行处理*/ /* 收到数据发送给lua层进行处理*/
void OnSerialData(QString); void OnSerialData(QString);
void OnNetworkData(char*,char*,uint32_t port); void OnNetworkData(char*,char*,uint32_t port);
void OnNewTcpClient(QString ip,uint32_t port,uint32_t sockptr);
void OnClientLeave(QString ip,uint32_t port,uint32_t sockptr);
void ClearShowBuffer();
void DumpStack(); void DumpStack();
~LuaDelegate(); ~LuaDelegate();

View File

@ -15,21 +15,50 @@
#include "lua_wraper.h" #include "lua_wraper.h"
#include "mainwindow.h" #include "mainwindow.h"
#include <windows.h> #include <windows.h>
#include "Qss.h"
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
#ifdef WIN32
WORD wdVersion = MAKEWORD(2, 2);//定义自己需要的网络库版本这里是2.2
WSADATA wdSockMsg;//这是一个结构体
int nRes = WSAStartup(wdVersion, &wdSockMsg);//打开一个套接字
if (0 != nRes) {
switch (nRes) {
case WSASYSNOTREADY:
printf("check your library");
break;
case WSAVERNOTSUPPORTED:
printf("need updated");
break;
case WSAEINPROGRESS:
printf("need reboot");
break;
case WSAEPROCLIM:
printf("sdfsdfsa");
break;
}
}
if (2 != HIBYTE(wdSockMsg.wVersion) || 2 != LOBYTE(wdSockMsg.wVersion)) {
printf("WSACleanup");
WSACleanup();
return 0;
}
#endif
AllocConsole(); AllocConsole();
freopen("CONOUT$","w",stdout); freopen("CONOUT$","w",stdout);
QApplication app(argc, argv); QApplication app(argc, argv);
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
printf("hello world"); printf("hello world");
MainWindow w; MainWindow w;
w.setWindowTitle("协议调试器"); w.setWindowTitle("协议调试器");
w.show(); w.show();
CurrentDPI(&w,0);
return app.exec(); return app.exec();
} }

View File

@ -12,9 +12,23 @@
QmlShareData gGlobal; QmlShareData gGlobal;
static void rangeObjectList(QObject*obj,int indent){
QObjectList child = obj->children();
QString tmp("");
for(int i = 0;i < indent;i++)
tmp +=" ";
for(int i = 0;i < child.size();i++){
qDebug()<<tmp + child.at(i)->objectName() + " " + child.at(i)->metaObject()->className();
if(child.at(i)->children().size() > 0){
rangeObjectList(child.at(i),indent + 1);
}
}
}
MainWindow::MainWindow(QWidget *parent) : MainWindow::MainWindow(QWidget *parent) :
QssMainWindow(parent), ui(new Ui::MainWindow),
ui(new Ui::MainWindow) QssMainWindow(parent)
{ {
ui->setupUi(this); ui->setupUi(this);
QQuickWidget *m_quickWidget=new QQuickWidget(); QQuickWidget *m_quickWidget=new QQuickWidget();
@ -30,6 +44,7 @@ MainWindow::MainWindow(QWidget *parent) :
this->setStyleSheet("margin: 0px;"); this->setStyleSheet("margin: 0px;");
gGlobal.SetQuickView(m_quickWidget); gGlobal.SetQuickView(m_quickWidget);
ui->centralwidget->layout()->addWidget(m_quickWidget); ui->centralwidget->layout()->addWidget(m_quickWidget);
rangeObjectList(this,0);
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()

View File

@ -41,6 +41,20 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </property>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QMenuBar" name="menubar"> <widget class="QMenuBar" name="menubar">
@ -49,7 +63,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1183</width> <width>1183</width>
<height>27</height> <height>20</height>
</rect> </rect>
</property> </property>
</widget> </widget>

View File

@ -17,7 +17,6 @@ NetworkController::NetworkController(NetworkController::NetworkType type,
{ {
mType = type; mType = type;
if(_checkType(type) == TYPE_UNKOWN){ if(_checkType(type) == TYPE_UNKOWN){
} }
if(type == NetworkType::TYPE_TCP_CLIENT){ if(type == NetworkType::TYPE_TCP_CLIENT){
mTcp = new QTcpSocket(); mTcp = new QTcpSocket();
@ -38,11 +37,12 @@ NetworkController::NetworkController(NetworkController::NetworkType type,
} }
if(type == NetworkType::TYPE_TCP_SERVER){ if(type == NetworkType::TYPE_TCP_SERVER){
qDebug()<<"tcp server mode";
mTcpServer = new QTcpServer(); mTcpServer = new QTcpServer();
connect(mTcpServer,SIGNAL(newConnection()), connect(mTcpServer,SIGNAL(newConnection()),
this,SLOT(on_server_accept())); this,SLOT(on_server_accept()));
connect(mTcpServer, SIGNAL(acceptError(QAbstractSocket::SocketError socketError)), connect(mTcpServer, SIGNAL(acceptError(QAbstractSocket::SocketError )),
this, SLOT( on_accept_error(QAbstractSocket::SocketError socketError))); this, SLOT( on_accept_error(QAbstractSocket::SocketError )));
if (!mTcpServer->listen(QHostAddress::Any, port)) if (!mTcpServer->listen(QHostAddress::Any, port))
{ {
@ -87,8 +87,9 @@ NetworkController::RecvResult NetworkController::ReadData(int8_t *data)
} }
} }
else{ else{
memcpy(data,mCnn->readAll().data(),mCnn->size()); auto reads = mCnn->readAll();
ret.len = mCnn->size(); memcpy(data,reads.data(),reads.size());
ret.len = reads.size();
} }
return ret; return ret;
} }
@ -100,9 +101,9 @@ int NetworkController::Close()
if(nullptr != mCnn) if(nullptr != mCnn)
mCnn->close(); mCnn->close();
delete mTcpServer; delete mTcpServer;
delete mCnn;
mTcpServer = nullptr; mTcpServer = nullptr;
mCnn = nullptr; mCnn = nullptr;
mTcp = nullptr;
} }
if(mType == TYPE_TCP_CLIENT){ if(mType == TYPE_TCP_CLIENT){
qDebug()<<(((QTcpSocket*)mTcp)->state()); qDebug()<<(((QTcpSocket*)mTcp)->state());
@ -139,7 +140,6 @@ bool NetworkController::State()
void NetworkController::on_conected() void NetworkController::on_conected()
{ {
qDebug()<<"connected";
mState = true; mState = true;
emit(on_connected()); emit(on_connected());
} }
@ -164,23 +164,24 @@ void NetworkController::on_disconect()
mCnn->close(); mCnn->close();
emit(this->on_conection_close()); emit(this->on_conection_close());
} }
if(mType == TYPE_TCP_SERVER){ // if(mType == TYPE_TCP_SERVER){
mTcpServer->resumeAccepting(); // mTcpServer->resumeAccepting();
} // }
} }
void NetworkController::on_server_accept() void NetworkController::on_server_accept()
{ {
if(mType == TYPE_TCP_SERVER){ if(mType == TYPE_TCP_SERVER){
mTcpServer->pauseAccepting();
QTcpSocket* pClientConnection = mTcpServer->nextPendingConnection(); QTcpSocket* pClientConnection = mTcpServer->nextPendingConnection();
if(nullptr != pClientConnection){ if(nullptr != pClientConnection){
QObject::connect(pClientConnection, SIGNAL(readyRead()), this, SLOT(on_ready_read())); QObject::connect(pClientConnection, SIGNAL(readyRead()), this, SLOT(on_ready_read()));
QObject::connect(pClientConnection, SIGNAL(disconnected()), this, SLOT(on_disconect())); QObject::connect(pClientConnection, SIGNAL(disconnected()), this, SLOT(on_disconect()));
} }
mTcp = pClientConnection; qDebug()<<pClientConnection->socketDescriptor();
mCnn = mTcp; // mTcp = pClientConnection;
// mCnn = mTcp;
mState = true; mState = true;
emit(on_connected());
} }
} }

View File

@ -8,6 +8,7 @@
#include <QThread> #include <QThread>
#include <QTcpServer> #include <QTcpServer>
#include <QNetworkDatagram> #include <QNetworkDatagram>
#include <QMap>
// this is not a thread-safe class,any interface invoked in multi-thread maybe will cause unkown falut // this is not a thread-safe class,any interface invoked in multi-thread maybe will cause unkown falut
class NetworkController : public QObject class NetworkController : public QObject
@ -35,7 +36,6 @@ public:
~NetworkController(); ~NetworkController();
bool State(); bool State();
public slots: public slots:
void on_ready_read(); void on_ready_read();
void on_disconect(); void on_disconect();
void on_server_accept(); void on_server_accept();
@ -52,12 +52,12 @@ signals:
void on_send_data(QByteArray); void on_send_data(QByteArray);
private: private:
NetworkType _checkType(NetworkType); NetworkType _checkType(NetworkType);
NetworkType mType; NetworkType mType;
QUdpSocket *mUDP; QUdpSocket *mUDP;
QTcpSocket *mTcp; QTcpSocket *mTcp;
QTcpServer *mTcpServer; QTcpServer *mTcpServer;
QIODevice *mCnn; QIODevice *mCnn;
QMap<qintptr,QTcpSocket *> m_clients;
QThread mThread; QThread mThread;
bool mState; bool mState;
}; };

View File

@ -10,7 +10,8 @@
QmlShareData::QmlShareData(QObject *parent) : QObject(parent), QmlShareData::QmlShareData(QObject *parent) : QObject(parent),
m_qml_view_(nullptr), m_qml_view_(nullptr),
m_luavm_status_(false), m_luavm_status_(false),
m_network_(nullptr) m_network_(nullptr),
m_tcp_server(nullptr)
{ {
m_serial_controller_ = new SerialController(nullptr); m_serial_controller_ = new SerialController(nullptr);
QFile file("Test.lua"); QFile file("Test.lua");
@ -106,17 +107,30 @@ int QmlShareData::openNetwork(QString ip, unsigned int port, bool is_ws,int type
return 0; return 0;
} }
if(type == NetworkController::TYPE_TCP_SERVER){ if(type == NetworkController::TYPE_TCP_SERVER){
m_network_ = new NetworkController(NetworkController::TYPE_TCP_SERVER,ip,port); m_tcp_server = new TcpServerLibevent(port,ip.toStdString());
connect(m_network_,SIGNAL(on_data_recv()),this,SLOT(on_network_data_recv())); m_tcp_server->StartServerAsync();
m_tcp_server->moveToThread(this->thread());
connect(m_tcp_server,SIGNAL(on_onnected(string , uint )),this,SLOT(on_network_conected(string , uint )),Qt::DirectConnection);
connect(m_tcp_server,SIGNAL(on_disconected(string , uint )),this,SLOT(on_network_disconected(string , uint )),Qt::DirectConnection);
connect(m_tcp_server,SIGNAL(on_conn_read(string )),this,SLOT(on_network_server_read(string)),Qt::DirectConnection);
return 0; return 0;
} }
return -1; return -1;
} }
int QmlShareData::closeNetwork() int QmlShareData::closeNetwork(QString type)
{ {
m_network_->Close(); if(type == "tcpserver"){
if(nullptr != m_tcp_server){
m_tcp_server->StopServer();
delete m_tcp_server;
m_tcp_server = nullptr;
}
}
else
m_network_->Close();
} }
int QmlShareData::closeSerial() int QmlShareData::closeSerial()
@ -148,7 +162,7 @@ int QmlShareData::updateLuaScript(QString str)
qDebug()<<QThread::currentThreadId(); qDebug()<<QThread::currentThreadId();
m_lua_string = str; m_lua_string = str;
qDebug()<<str; qDebug()<<str;
int ret = m_lua_.DoString(m_lua_string); int ret = m_lua_.UpdateScript(m_lua_string);
if(ret < 0){ if(ret < 0){
qDebug()<<"更新lua脚本失败"; qDebug()<<"更新lua脚本失败";
m_luavm_status_ = false; m_luavm_status_ = false;
@ -179,6 +193,11 @@ bool QmlShareData::luaStatus()
return m_luavm_status_; return m_luavm_status_;
} }
bool QmlShareData::DoLuaCmd(QString)
{
}
void QmlShareData::on_network_data_recv(){ void QmlShareData::on_network_data_recv(){
qDebug()<<"recv data"; qDebug()<<"recv data";
char dat[4096] = {0}; char dat[4096] = {0};
@ -189,6 +208,16 @@ void QmlShareData::on_network_data_recv(){
} }
} }
void QmlShareData::on_network_conected(string ip, uint port)
{
m_lua_.OnNewTcpClient(QString::fromStdString(ip),port,0);
}
void QmlShareData::on_network_disconected(string ip, uint port)
{
m_lua_.OnClientLeave(QString::fromStdString(ip),0,port);
}
void QmlShareData::on_udp_data_recv(){ void QmlShareData::on_udp_data_recv(){
char dat[4096] = {0}; char dat[4096] = {0};
auto ret = this->m_network_->ReadData((int8_t * )dat); auto ret = this->m_network_->ReadData((int8_t * )dat);
@ -198,14 +227,12 @@ void QmlShareData::on_udp_data_recv(){
} }
} }
void QmlShareData::on_network_conected() void QmlShareData::on_network_server_read(string ip)
{ {
emit(sendToQml(11)); qDebug()<<ip.c_str();
}
void QmlShareData::on_network_disconected()
{
emit(disConnected());
} }

View File

@ -8,6 +8,7 @@
#include <QDebug> #include <QDebug>
#include "lua_wraper.h" #include "lua_wraper.h"
#include <QtQuickWidgets/QQuickWidget> #include <QtQuickWidgets/QQuickWidget>
#include "tcp_server_libevent.h"
class QmlShareData; class QmlShareData;
@ -31,38 +32,37 @@ public:
int OnDataRecv(QByteArray); int OnDataRecv(QByteArray);
int ShowDataInQML(QString x); int ShowDataInQML(QString x);
int SendUartData(const char *); int SendUartData(const char *);
Q_INVOKABLE void getValFromQml(int v) { Q_INVOKABLE void getValFromQml(int v) {
emit valueFromCpp(456); emit valueFromCpp(456);
} }
Q_INVOKABLE int openUart(QString port,QString baudRate,QString dataBits,QString stopBits, Q_INVOKABLE int openUart(QString port,QString baudRate,QString dataBits,QString stopBits,
QString flow); QString flow);
Q_INVOKABLE int openNetwork(QString ip,unsigned int port,bool is_ws,int type); Q_INVOKABLE int openNetwork(QString ip,unsigned int port,bool is_ws,int type);
Q_INVOKABLE int closeNetwork(); Q_INVOKABLE int closeNetwork(QString);
Q_INVOKABLE int closeSerial(); Q_INVOKABLE int closeSerial();
Q_INVOKABLE int TestLua(); Q_INVOKABLE int TestLua();
Q_INVOKABLE int TestShowData(); Q_INVOKABLE int TestShowData();
Q_INVOKABLE int updateLuaScript(QString); Q_INVOKABLE int updateLuaScript(QString);
Q_INVOKABLE int saveLuaScript(QString); Q_INVOKABLE int saveLuaScript(QString);
Q_INVOKABLE bool luaStatus(); Q_INVOKABLE bool luaStatus();
Q_INVOKABLE bool DoLuaCmd(QString);
QString _txt = "hello world\r\n"; QString _txt = "hello world\r\n";
signals: signals:
void txtchanged(); void txtchanged();
void valueFromCpp(int val); void valueFromCpp(int val);
void sendToQml(int count); void sendToQml(int count);
void disConnected(); void disConnected();
void clearBuffer();
public slots: public slots:
void on_network_data_recv(); void on_network_data_recv();
void on_network_conected(); void on_network_conected(string,uint);
void on_network_disconected(); void on_network_disconected(string,uint);
void on_udp_data_recv(); void on_udp_data_recv();
void on_network_server_read(string);
private: private:
TcpServerLibevent *m_tcp_server;
NetworkController *m_network_; NetworkController *m_network_;
SerialController *m_serial_controller_; SerialController *m_serial_controller_;
LuaDelegate m_lua_; LuaDelegate m_lua_;

View File

@ -113,7 +113,8 @@ void read_cb(struct bufferevent *bev, void *arg)
char buf[1024] = {0}; char buf[1024] = {0};
ConnectionLibevent* conn = (ConnectionLibevent*)arg; ConnectionLibevent* conn = (ConnectionLibevent*)arg;
bufferevent_read(bev, buf, sizeof(buf)); bufferevent_read(bev, buf, sizeof(buf));
auto server = conn->Server();
emit(server->on_conn_read("12345"));
cout << "client " << conn->IpAddress() << " say:" << buf << endl; cout << "client " << conn->IpAddress() << " say:" << buf << endl;
conn->OnRecv(buf,sizeof(buf)); conn->OnRecv(buf,sizeof(buf));
} }
@ -135,7 +136,7 @@ void event_cb(struct bufferevent *bev, short events, void *arg)
if (events & BEV_EVENT_EOF) if (events & BEV_EVENT_EOF)
{ {
cout << "connection closed: " << conn->IpAddress() << " " << conn->SocketFd() << endl; cout << "connection closed: " << conn->IpAddress() << " " << conn->SocketFd() << endl;
conn->OnClose(); conn->OnClose();
bufferevent_free(bev); bufferevent_free(bev);
server->RemoveConnection(conn->SocketFd()); server->RemoveConnection(conn->SocketFd());
} }
@ -144,6 +145,7 @@ void event_cb(struct bufferevent *bev, short events, void *arg)
conn->OnClose(); conn->OnClose();
bufferevent_free(bev); bufferevent_free(bev);
server->RemoveConnection(conn->SocketFd()); server->RemoveConnection(conn->SocketFd());
cout << "some other error !" << endl; cout << "some other error !" << endl;
} }
delete conn; delete conn;
@ -166,6 +168,7 @@ void cb_listener(struct evconnlistener *listener, evutil_socket_t fd, struct soc
server->AddConnection(ntohs(client->sin_port),conn); server->AddConnection(ntohs(client->sin_port),conn);
bufferevent_setcb(bev, read_cb, write_cb, event_cb, conn); bufferevent_setcb(bev, read_cb, write_cb, event_cb, conn);
bufferevent_enable(bev, EV_READ); bufferevent_enable(bev, EV_READ);
} }
} }
@ -176,11 +179,12 @@ void cb_listener(struct evconnlistener *listener, evutil_socket_t fd, struct soc
*/ */
void server_run(TcpServerLibevent *p){ void server_run(TcpServerLibevent *p){
if(nullptr != p){ if(nullptr != p){
if(p->m_status == TcpServerLibevent::STOP){ while(p->m_status == TcpServerLibevent::RUNNING){
p->m_status = TcpServerLibevent::RUNNING; int ret =event_base_loop(p->m_event_base,EVLOOP_NONBLOCK);
event_base_dispatch(p->m_event_base); if(ret < 0){
evconnlistener_free(p->m_event_listener); p->m_status = TcpServerLibevent::FAIL;
event_base_free(p->m_event_base); break;
}
} }
} }
} }
@ -204,6 +208,7 @@ int TcpServerLibevent::AddConnection(uint32_t fd,ConnectionLibevent *p){
else else
return -1; return -1;
} }
emit(this->on_onnected(p->IpAddress(),p->SocketFd()));
return 0; return 0;
} }
/** /**
@ -213,6 +218,8 @@ int TcpServerLibevent::AddConnection(uint32_t fd,ConnectionLibevent *p){
*/ */
int TcpServerLibevent::RemoveConnection(uint32_t fd){ int TcpServerLibevent::RemoveConnection(uint32_t fd){
if( m_map_client.find(fd) != m_map_client.end()){ if( m_map_client.find(fd) != m_map_client.end()){
emit(on_disconected(m_map_client.at(fd)->IpAddress(),
m_map_client.at(fd)->SocketFd()));
m_map_client.erase(fd); m_map_client.erase(fd);
return 0; return 0;
}else{ }else{
@ -258,7 +265,7 @@ TcpServerLibevent::TcpServerLibevent(int port,string bindip) :
m_event_listener = evconnlistener_new_bind(m_event_base, m_event_listener = evconnlistener_new_bind(m_event_base,
cb_listener, cb_listener,
this, this,
LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE|LEV_OPT_THREADSAFE,
m_backlog, m_backlog,
(struct sockaddr*)&m_server_addr, (struct sockaddr*)&m_server_addr,
sizeof(m_server_addr)); sizeof(m_server_addr));
@ -276,8 +283,9 @@ TcpServerLibevent::TcpServerLibevent(int port,string bindip) :
int TcpServerLibevent::StartServerSync(){ int TcpServerLibevent::StartServerSync(){
if(m_status == STOP){ if(m_status == STOP){
m_status = RUNNING; m_status = RUNNING;
event_base_dispatch(m_event_base); if(-1 == event_base_dispatch(m_event_base)){
evconnlistener_free(m_event_listener); qDebug()<<"error ";
}
event_base_free(m_event_base); event_base_free(m_event_base);
return 0; return 0;
} }
@ -296,11 +304,37 @@ int TcpServerLibevent::StartServerAsync(){
#ifdef linux #ifdef linux
evthread_use_pthreads(); evthread_use_pthreads();
#endif #endif
m_thread = new thread(server_run,this); m_status = RUNNING;
m_thread = new std::thread(server_run,this);
m_thread->detach(); m_thread->detach();
return 0; return 0;
} }
return -1; return -1;
}
int TcpServerLibevent::StopServer()
{
struct timeval v;
v.tv_usec = 1000;
v.tv_sec = 0;
if(m_status == RUNNING){
int ret = event_base_loopexit(m_event_base,&v);
if (ret < 0){
// todo write log
}
evconnlistener_free(this->m_event_listener);
if(ret < 0){
// todo write log
qDebug()<<"evconnlistener_disable"<<ret;
}
m_status = STOP;
return ret;
}
return -1;
} }
/** /**
* @description: start server asynchronous * @description: start server asynchronous
@ -310,7 +344,20 @@ int TcpServerLibevent::StartServerAsync(){
TcpServerLibevent::~TcpServerLibevent(){ TcpServerLibevent::~TcpServerLibevent(){
if(this->m_status == RUNNING){ if(this->m_status == RUNNING){
m_thread->detach(); m_thread->detach();
event_base_loopbreak(m_event_base); struct timeval v;
this->m_status = STOP; v.tv_usec = 1000;
v.tv_sec = 1;
int ret = event_base_loopexit(m_event_base,&v);
this->m_status = STOP;
} }
if(nullptr != m_event_base){
event_base_free(m_event_base);
delete m_event_base;
m_event_base = nullptr;
}
if(nullptr != m_event_listener){
delete m_event_listener;
m_event_listener = nullptr;
}
} }

View File

@ -36,11 +36,26 @@ extern "C"{
#include <thread> #include <thread>
#include <map> #include <map>
#define Qt_Support
#ifdef Qt_Support
#include <QObject>
#include <QDebug>
#endif
using namespace std; using namespace std;
class TcpServerLibevent; class TcpServerLibevent;
// tcp 连接 // tcp 连接
#ifdef Qt_Support
class ConnectionLibevent : public QObject {
Q_OBJECT
#else
class ConnectionLibevent{ class ConnectionLibevent{
#endif
public: public:
ConnectionLibevent(TcpServerLibevent *p, ConnectionLibevent(TcpServerLibevent *p,
struct bufferevent*v, struct bufferevent*v,
@ -64,10 +79,17 @@ private:
struct bufferevent *m_event; struct bufferevent *m_event;
struct sockaddr_in *m_addr; struct sockaddr_in *m_addr;
uint32_t m_fd; uint32_t m_fd;
}; };
// 管理服务端 // 管理服务端
class TcpServerLibevent{ #ifdef Qt_Support
class TcpServerLibevent : public QObject{
Q_OBJECT
#else
class TcpServerLibevent {
#endif
typedef enum{ typedef enum{
RUNNING, RUNNING,
STOP, STOP,
@ -80,6 +102,7 @@ public:
~TcpServerLibevent(); ~TcpServerLibevent();
int StartServerSync(); // 同步启动服务器 int StartServerSync(); // 同步启动服务器
int StartServerAsync(); // 异步启动服务 int StartServerAsync(); // 异步启动服务
int StopServer();
int RemoveConnection(uint32_t ); int RemoveConnection(uint32_t );
int SetNewConnectionHandle(OnAccept ); int SetNewConnectionHandle(OnAccept );
friend void cb_listener(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *addr, int len, void *ptr); friend void cb_listener(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *addr, int len, void *ptr);
@ -87,7 +110,14 @@ public:
friend void event_cb(struct bufferevent *bev, short events, void *arg); friend void event_cb(struct bufferevent *bev, short events, void *arg);
friend void write_cb(struct bufferevent *bev, void *arg); friend void write_cb(struct bufferevent *bev, void *arg);
friend void server_run(TcpServerLibevent *p); friend void server_run(TcpServerLibevent *p);
#ifdef Qt_Support
signals:
int on_onnected(string ip,uint sock);
int on_disconected(string ip,uint sock);
int on_conn_read(string ip);
#endif
private: private:
uint32_t m_port; // 监听端口号 uint32_t m_port; // 监听端口号
string m_bind_ip; // 绑定端口号 string m_bind_ip; // 绑定端口号
@ -97,11 +127,12 @@ private:
struct event_base * m_event_base; struct event_base * m_event_base;
struct evconnlistener* m_event_listener; struct evconnlistener* m_event_listener;
SERVER_STATUS m_status; SERVER_STATUS m_status;
thread *m_thread; std::thread *m_thread;
map<uint32_t,ConnectionLibevent*> m_map_client; map<uint32_t,ConnectionLibevent*> m_map_client;
OnAccept m_handle_accept; OnAccept m_handle_accept;
int AddConnection(uint32_t fd,ConnectionLibevent *p); int AddConnection(uint32_t fd,ConnectionLibevent *p);
}; };
#endif #endif

View File

@ -73,7 +73,6 @@ int TcpSwarmClientLibevent::addConection(evutil_socket_t fd,struct bufferevent*
return 0; return 0;
} }
int TcpSwarmClientLibevent::removeConection(evutil_socket_t fd){ int TcpSwarmClientLibevent::removeConection(evutil_socket_t fd){
m_clients.erase(fd); m_clients.erase(fd);
return 0; return 0;