# GeeJoanServerCpp **Repository Path**: wujehy/GeeJoanServerCpp ## Basic Information - **Project Name**: GeeJoanServerCpp - **Description**: GeeJoan 系统的实现 1.6 - **Primary Language**: C++ - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 5 - **Created**: 2020-04-26 - **Last Updated**: 2022-09-18 ## Categories & Tags **Categories**: iot **Tags**: None ## README GeeJoanServerCpp ![](https://img.shields.io/badge/author-wujehy-brightgreen.svg) ![](https://img.shields.io/badge/platform-kubuntu20.04-brightgreen.svg) ![](https://img.shields.io/badge/C++-14-brightgreen.svg) #### 介绍 GeeJoan 1.6 客户端 和 服务端 update 2020.08.03: 项目重构 使用 (TODO 基本完成) *使用 更多 C++ 特征 的实现 , 使用 多种设计模式 风格 *业务模块分离 *全面取消单例模式 , 使用指针提高效率 *使用多线程服务 * 等 ... * 共识机制 测试中... *目前仅支持linux 系统 , update 2020.06.12 : ​ 项目重建 模块重新划分 方便移植扩展 ​ 增加安全模块 说明 ConsultCipther(协商解密器) 的用法  ​ 传送门: [GeeJoanCpp](https://gitee.com/wujehy/GeeJoanCpp) *新的本仓库需要拉取到本地需要将子仓库初始化:  ​ 否则 GeeJoanCpp 模块无法初始化 ```shell git clone https://gitee.com/wujehy/GeeJoanServerCpp cd GeeJoanServerCpp git submodule update --init --recursive # 然后根据提示输入信息 ``` 旧结构: *如果想要编译运行: 请移动到 "[release_v1.6](https://gitee.com/wujehy/GeeJoanServerCpp/blob/release_1.6)" 进行编译运行, master 分支 只要是新特征 , 可能存在依赖问题. 请用debug 版本编译 *测试: demoClient 已经对接服务端, api.geejoan.cn , 可以直接编译客户端进行测试 *想要体验可以下载 Linux.out/GeeJoan/bin/ 目录下的 GeeJoan_Client_Demo 进行体验 , ## 关键字: * Gateway(Id) :网关 (id) , 范围 0 ~ 2^64 * Device(Id) : 设备(id) , 范围 0 ~ 2^64 * permission : 数据权限 1. DataPermissionEnum_PRIVATE 只有所属者占可以访问 2. DataPermissionEnum_PROTECTION , 指定 列表可访问(TODO) 3. DataPermissionEnum_PUBILE , 任何人可访问 ## GeeJoan 的说明: 一种 物联网 的 系统的实现 思想. 1. 标记一个设备的手段: 在物联网世界中 ,每个设备都需要一个 确定的地址. 可以是一个Code , 也可以是一个站mac地址中等. 而在GeeJoan 里 , 通过 GatewayId 和 DeviceId 共同确定这一个具体的设备 所以整个 网络 可以标记 2^128 个 设备 2. 网络中寻找 其他 设备的信息. 网络中心只需要知道 : GatewayId 和 DeviceId 可以确定设备 系统中会通过 permission 确定是否右访问权 *当 类型是PUBILE 的时候,任何人都可以访问这个公共节点的所产生的数据. 3. 数据上报 与访问 每个传感器 所检测的类型 可以绑定 一个 key , 每个key 可以存储 一个序列化的 data . 所以 全网 中 可以通过 GatewayId.DeviceId.key 可以确定 一个站具体的传感器上报的数据. 而访问的关键字仅 8+8+4 = 20 byte 4. 设备控制 控制设备使用 同样使用 GatewayId.DeviceId 即可将控制数据传输到指定为设备, 同样会通过这permission 判断是否有权限. ![设备控制流程](docs/image/controlDevice.svg) ## 已支持的协议: Auth模块: ​ Auth 模块用于 管理其 网关 和 设备 的 信息. 1. 注册 2. 登录 3. 登出 4. 修改密码 IoT 模块: ​ IoT 模块用于 物联网 相关的 功能之和操作 1. 设备登录 2. 网关查找 3. 设备创建 4. 生成设备Token 5. 查询设备Token 6. 设备心跳包 7. 数据上报 8. 数据查询 9. 设备控制 10. 设备控制监听器 11. 设备控制确认 12. 设备控制确认监听器 相关枚举: ```c++ // 枚举 enum AUTH_MOD_TYPE{ AUTH_REGISTER = 1 , AUTH_LOGIN = 2 , AUTH_LOGOUT = 3 , AUTH_CHANGE_PASSWORD = 5 , }; enum IOT_MOD_TYPE { IOT_UPLOAD_SENSOR_DATA = 1, IOT_FIND_SENSOR_DATA = 2, IOT_CONTROL_DEVICE = 3, IOT_CONTROL_ACK = 4 , IOT_CONTROL_ACK_LISTERNER = 5 , IOT_CONTROL_LISTERNER = 6, IOT_LOGIN_DEVICE = 7, IOT_HEART_BEAT = 8, IOT_FIND_GATEWAY = 9, IOT_CREATE_DEVICE = 10, IOT_FIND_DEVICE_TOKEN = 11, IOT_GENERATE_DEVICE_TOKEN = 12, }; ``` 协议命名空间 以及 协议类型 ```c++ using namespace GeeJoan::Protocol; // 网络模块:GeeJoan::Protocol::NetWork // 请求包 NetWork::NetWorkPackageRequest netWorkPackageRequest; // 相应包 NetWork::NetWorkPackageRespose networkPackageResp; // Auth 模块: GeeJoan::Protocol::Auth Auth::RegisterAPI registerApi; Auth::LoginRequest loginRequest; Auth::LogoutAPI logoutApi; Auth::ChangePasswordRequest changePasswordRequest; // IoT 模块 : GeeJoan::Protocol::IoT IoT::LoginDeviceAPI loginDeviceApi; IoT::UploadSensorDataAPI uploadSensorDataApi; IoT::FindSensorDataRequest findSensorDataRequest; IoT::FindGatewayRequest findGatewayRequest; IoT::CreateDeviceRequest createDeviceRequest; IoT::GenerateDeviceTokenRequest generateDeviceTokenRequest; IoT::ControlDeviceRequest controlDeviceRequest; IoT::ControlDeviceAckAPI controlDeviceAckApi; ... 略 ``` ## 客户端测试: 服务端启动: *目前仅支持linux 系统 , 编译输出的可以直接运行: GeeJoan_SingleServer 启动服务端程序 端口默认 : 12345 ```c++ // Server.cpp #include "Server/SingleServer.h" int main(){ SingleServer server; // 服务端实例 server.setManPort(12345); // 端口 server.startServer(); // 启动 服务 return 0; } ``` *可以直接进入 release 下载 编译输出 进入 Linux.out/GeeJoan/bin目录 然后运行: sh ./runServer.sh 直接运行GeeJoan_SingleServer可能会没有安装在stdc++ 动态库 而战无法运行 服务端 客户端: GeeJoan_Client_CMD -- cmdClient.cpp 命令行 客户端 . ```shell # Uasge: ./GeeJoan_Client_CMD [server IP address] [port] $ ./GeeJoan_Client_CMD 127.0.0.1 12345 # 启动成功 : client Run ... input `help` open Command List ... Respose : code = 200, mod = 0 , type = 0 , taskid = 0 , body = 0A0568656C6C6F Link Server Success client>> # 可以使用help 打开支持的协议 指令 client>>help Command List: Auth Mod : Register -u [username] -p [password] -e [email] Login -u [username] -p [password] Logout ChangePassword -p [password] register --username [username] --password [password] --email [email] login --username [username] --password [password] IOT Mod : DeviceLogin -t [deviceToken] FindGateway -t [DeviceToken] CreateDevice -n [note] -g [gatewayid] -p [permission] GenerateDeviceToken -g [gatewayid] -d [deviceid] Control -t [DeviceToken] -d [data] ControlAck -t [taskCode] -m [errmsg] -c [errcode] find -g [gatewayid] -d [deviceid] -k [key] upload -g [gatewayid] -d [deviceid] -k [key] -p [permission] Other Mod : help version timenow # 使用方式 , 以登录为例 client>>login -u test -p test client>>Respose : code = 200, mod = 1 , type = 2 , taskid = 1 , body = 0A72353436463642363536453245373436353733373432453330333933343334333433383333363336343339333036313332333933333339333233333633333833323334333433353332333033313333333236343635333132453331333533383338333633373330333733303339333233323332 Login Success Your Token = 546F6B656E2E746573742E30393434343833636439306132393339323363383234343532303133326465312E31353838363730373039323232 # 其他 略` ``` ## 其他: ​ 由于一般都是晚上抽空更新 , 如果工作太累了晚上就没心力维护. ​ 为了考虑到学习成本 ,最近买了3年的服务器和域名 http://www.geejoan.cn 备案搞得头皮发麻. ​ 理想就是希望在2023 年将这个平台做成国内最大的开源物联网平台,当然目前最大的问题就是怎么对标中心化的 A T 大厂 , 现在在考虑让不同开发者的私有节点连接起来 , 在选型共识机制,如果实现了就离目标更近一步了. 没有理想的程序员不是一个好程序员 /手动狗头,希望到时候 头发依旧茂盛 , 预计9~10月份要肝出 共识机制的问题.到时候 整套demo 出来了 想入门物联网的 一站式服务 , 想要做成产品的 也一站式 服务 . ​ 目前GeeJoan 整个项目拆分成很多不同的子模块在开发,目前主要都是一个人在维护 , 客户端 服务端 ui 嵌入式 文档 ... , 精力有限 , 钱包也有限 , 子模块都是相同的开源许可证 . ​ 如果想要为爱发电 (qq群): 991356973