# gw-cpp **Repository Path**: liukuansir/gw-cpp ## Basic Information - **Project Name**: gw-cpp - **Description**: 嵌入式C++工具项目框架 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-08-04 - **Last Updated**: 2024-09-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 目录 * [项目介绍](#项目介绍) * [应用场景](#应用场景) * [组件介绍](#组件介绍) * [项目构建](#项目构建) * [用例详解](#用例详解) ## 项目介绍 国网中电 C++ 工具箱 仅在`Rk3568-arm64`硬件平台环境下使用C++框架组件 本个人项目初衷用于项目复用,方便后续开发仅仅针对公司业务需求以及应用场景,减少代码冗余提高复用性 ## 应用场景 - 嵌入式开发智能硬件 - 后台服务软件 - 边缘计算组件 ### 组件介绍 - `base` (基础组件一些常用数据结构和工具类) - `kernel` (基于EPOLL的事件循环池) - `net` (网络) - `drivers` (外设通信) - `time` (定时器) - `node` (内部通信) - `croutine` (协程) - `log` (日志) - `task` (任务) ## 项目构建 使用**CMake**构建本项目. 当您在项目的根路径时, 可以执行以下指令: ```console $ cd gw-cpp $ mkdir build && cd build $ cmake.. && make ``` ## 用例详解 ### 1. [echo_tcp_server.cpp](./examples/echo_tcp_server.cpp) echo_tcp_server 是一个tcp服务器通过用户指定端口启动一个tcp server并将连接到服务器的 客户端ip ,port 打印出来并将信息返回 ```C++ auto server = TcpServer::Create("192.168.66.45",2345); ``` 一般组件通过内部Create方法创建,再通过设置回调函数实现异步通知响应 这里看函数原型 ```C++ static Ptr Create(const char *ip,uint16_t port) { return std::make_shared(Address(ip,port)); } ``` 参数只需要制定ip和端口就可以创建组件,当然用户也可以通过以下方式创建实际效果是一样的 ```C++ auto server = std::make_shared(Address("192.168.66.45",2345)); ``` 当实例创建完之后可以设置回调函数callback,当有数据来时候,它会自动处理底层的数据 比如这里回调函数返回了一个TcpConnection 的智能指针和 ByteArray数据 系统自动组包 将数据移交给用户 ```C++ using ConnCallback = std::function; void setRecvCallback(const ConnCallback &cb); ``` --- ### 2. [task_go.cpp](./examples/task_go.cpp) Task作为框架的基本单元实现了一个简单的任务包装器,框架提供了一种简单的计算任务或者执行异步任务的方法 通过简单的任务工厂创建任务 ```C++ template static GoTask::Ptr CreateGoTask(const std::string & task_name,FUNC && fun,ARGS && ...); ``` TaskFactory负责任务的创建,TaskMananger负责管理全局任务,在内部维护一个全局的任务map,可通过TaskManager::Instance()->cancelByName() 取消任务 ```C++ void add(int a, int b , int &res) { res = a+b; } ``` 通过任务工厂我们创建一个加法任务GoTask ```C++ auto task = TaskFactory::CreateGoTask("task1",add,a,b,std::ref(res)); ``` 它同样的可以传入一个回调函数在任务执行完成以后触发,在触发的回调中我们可以进行数据的处理 ```C++ task->setCallback([&](GoTask::Ptr task) { printf("%d + %d = %d\n", a, b, res); }); ``` --- ### 3. [node_blocker.cpp](./examples/node_blocker.cpp) node 模块作为框架内部通信组件最基本通信单元的节点,可以生成reader和writer 类似观察者模式 一个reader可以接受多个writer的信息,但是一个writer只能向一个reader发送数据。通过这种方式 实现整体框架通信间的解耦,此组件多线程安全可以进行跨线程通信 ```C++ static Ptr Create(const std::string & node_name) { return std::make_shared(node_name); } auto node = Node::Create("/channel"); node->createReader("/channel1",[] (auto msg){ LOG(DEBUG) << "data:"<< msg->data << " value:" << msg->value; }); auto writer = node->createWriter("/channel1"); ``` reader可以通过设置回调或者构造参数设置回调函数 当接受到信息时执行回调 ```C++ std::vector getAllChannelInfo(); ``` 通过getAllChannelInfo可以获取所有的通道名称方便debug查询