# CcosProcGo - 设备驱动平台处理程序 CcosProcGo (DIOS Proc) 是一个基于 Go 语言开发的设备驱动平台处理程序,提供 gRPC 和 HTTP REST API 双协议支持,用于统一管理和控制各类设备驱动。 ## 特性 - **双协议支持**: 同时提供 gRPC (高性能) 和 HTTP REST API (兼容性好) - **C/C++ 驱动集成**: 通过 CGO 无缝调用 C/C++ 设备驱动库 - **TLS/SSL 加密**: 支持 HTTPS 和 gRPC-TLS 安全通信 - **OpenAPI 文档**: 自动生成 API 文档,内置 Swagger UI - **CORS 支持**: 内置跨域资源共享中间件 - **动态端口分配**: 根据设备类型自动分配端口 ## 系统架构 ``` ┌─────────────────────────────────────────────────────┐ │ HTTP REST API (CORS) │ │ 0.0.0.0: │ └────────────────────┬────────────────────────────────┘ │ ┌───────────▼───────────┐ │ gRPC-Gateway │ │ (JSON <-> Protobuf) │ └───────────┬───────────┘ │ ┌───────────▼───────────┐ │ gRPC Server │ │ localhost: │ │ (TLS) │ └───────────┬───────────┘ │ ┌───────────▼───────────┐ │ Device Service │ │ (9 RPC Methods) │ └───────────┬───────────┘ │ ┌───────────▼───────────┐ │ CGO / C++ Driver │ │ (libCcosProc.so) │ └───────────────────────┘ ``` ## 目录结构 ``` ccosproc/ ├── main.go # 程序入口,服务启动,CGO驱动加载 ├── server/ │ └── server.go # gRPC 服务实现,CGO 调用C++库 ├── gateway/ │ └── gateway.go # HTTP 网关,REST API 路由 ├── middleware/ │ └── middleware.go # CORS 跨域中间件 ├── insecure/ │ └── insecure.go # TLS 自签名证书管理 ├── third_party/ │ ├── openapi.go # OpenAPI 资源嵌入 │ └── OpenAPI/ │ └── index.html # Swagger UI 页面 ├── proto/ │ ├── buf.yaml # Buf 模块配置 │ ├── device/v3/ │ │ ├── device.proto # Protobuf 服务定义 │ │ ├── device.pb.go # 生成的消息代码 │ │ ├── device_grpc.pb.go # 生成的gRPC代码 │ │ └── device.pb.gw.go # 生成的Gateway代码 │ └── google/api/ # Google API 注解 ├── build/ # 编译输出目录 ├── srvconf.json # 服务配置文件 ├── build.sh # Linux 构建脚本 ├── buf.gen.yaml # Buf 代码生成配置 ├── go.mod # Go 模块 (github.com/osguydch/ccosproc) └── README.md # 项目文档 ``` ## 依赖要求 ### 构建依赖 - Go 1.22+ - Protocol Buffers (protoc) - Buf CLI - GCC/G++ (CGO 编译) ### 运行依赖 - libCcosProc.so (C++ 设备驱动库) - libCDI.so - libLogicDevice.so - libuuid ## 环境安装 ### 安装 Go 环境 ```bash # 1. 下载 Go (使用国内镜像) wget https://golang.google.cn/dl/go1.22.5.linux-amd64.tar.gz # 如果是 32 位系统,使用: # wget https://golang.google.cn/dl/go1.22.5.linux-386.tar.gz # 备用镜像: # wget https://mirrors.nju.edu.cn/golang/go1.22.5.linux-amd64.tar.gz # wget https://mirrors.ustc.edu.cn/golang/go1.22.5.linux-amd64.tar.gz # 2. 解压安装 sudo rm -rf /usr/local/go sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz # 3. 配置环境变量 echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc echo 'export GOPATH=$HOME/go' >> ~/.bashrc echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc echo 'export GOPROXY=https://goproxy.cn,direct' >> ~/.bashrc # 4. 使配置生效 source ~/.bashrc # 5. 验证安装 go version ``` ### 安装 Protoc 和 Buf (可选) ```bash # 安装 protoc sudo apt update sudo apt install -y protobuf-compiler # 安装 buf go install github.com/bufbuild/buf/cmd/buf@latest ``` ## 快速开始 ### 1. 安装 Go 依赖 ```bash # 修复脚本换行符 (从 Windows 复制过来时需要) sed -i 's/\r$//' build.sh # 安装 Go 依赖 go mod download # 或使用构建脚本 ./build.sh deps ``` ### 2. 生成 Proto 代码 ```bash ./build.sh proto ``` ### 3. 编译项目 ```bash # Release 编译 ./build.sh build # Debug 编译 (带 AddressSanitizer) ./build.sh debug ``` ### 4. 运行服务 ```bash # 设置库路径 export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH # 运行服务 (需指定驱动配置文件) ./build/CcosProcGo driver_config.json ``` ## 配置说明 ### srvconf.json ```json { "Application": "DIOS Proc", "SupportSSL": "ON", "CertFilePath": "", "PortMap": [ { "Type": "Detector", "RPCPort": 9010, "HTTPPort": 9011 }, { "Type": "Generator", "RPCPort": 9030, "HTTPPort": 9031 }, { "Type": "SynBox", "RPCPort": 9040, "HTTPPort": 9041 }, { "Type": "Subsystem", "RPCPort": 9050, "HTTPPort": 9051 } ] } ``` | 字段 | 说明 | |------|------| | Application | 应用名称 | | SupportSSL | SSL 开关 ("ON" / "OFF") | | CertFilePath | 证书路径 (空则使用内置证书) | | PortMap | 设备类型端口映射 | ## API 接口 ### REST API 端点 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/v1/Device/Open` | 打开设备 | | POST | `/api/v1/Device/Close` | 关闭设备 | | GET | `/api/v1/Device/Get/{reqName}` | 获取属性值 | | PUT | `/api/v1/Device/Set/{reqName}` | 设置属性值 | | POST | `/api/v1/Device/Update/{reqName}` | 更新属性 | | POST | `/api/v1/Device/Add/{reqName}` | 添加属性 | | DELETE | `/api/v1/Device/Del/{reqName}` | 删除属性 | | POST | `/api/v1/Device/Action/{reqName}` | 执行动作 | | POST | `/api/v1/Device/Message` | 发送消息 | ### 静态文件服务 | 路径 | 说明 | |------|------| | `/module/*` | 驱动定义文件 (DriverDefine/) | | `/Data/*` | 数据文件 (RawData/) | | `/` | OpenAPI 文档 UI | ### 请求示例 **打开设备:** ```bash curl -X POST https://localhost:9011/api/v1/Device/Open \ -H "Content-Type: application/json" \ -d '{"deviceUri": "detector_001", "deviceGroup": "group1"}' \ -k ``` **获取属性:** ```bash curl -X GET "https://localhost:9011/api/v1/Device/Get/temperature?deviceUri=detector_001" \ -k ``` **设置属性:** ```bash curl -X PUT https://localhost:9011/api/v1/Device/Set/exposure \ -H "Content-Type: application/json" \ -d '{"deviceUri": "detector_001", "reqName": "exposure", "reqParam": "100"}' \ -k ``` ### gRPC 调用 ```go import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials" pb "github.com/osguydch/ccosproc/proto/device/v3" ) // 创建连接 conn, _ := grpc.Dial("localhost:9010", grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) // 创建客户端 client := pb.NewDeviceClient(conn) // 调用方法 reply, _ := client.Open(ctx, &pb.OpenRequest{ DeviceUri: "detector_001", DeviceGroup: "group1", }) ``` ## 构建脚本 ```bash ./build.sh [命令] 命令: build 编译项目 (Release 模式) debug 编译项目 (Debug 模式) proto 生成 Protocol Buffers 代码 clean 清理构建产物 run 编译并运行 deps 安装 Go 依赖 check 检查构建依赖 help 显示帮助 ``` ## 端口分配规则 端口号根据设备类型和厂商索引动态计算: ``` 实际端口 = 基础端口 + 厂商索引 * 2 ``` | 设备类型 | RPC 基础端口 | HTTP 基础端口 | |----------|--------------|---------------| | Detector | 9010 | 9011 | | Generator | 9030 | 9031 | | SynBox | 9040 | 9041 | | Subsystem | 9050 | 9051 | ## 开发说明 ### 添加新的 RPC 方法 1. 修改 `proto/device/v3/device.proto` 2. 运行 `./build.sh proto` 生成代码 3. 在 `server/server.go` 中实现方法 ### CGO 注意事项 - 所有 `C.CString()` 调用后需要 `C.free()` 释放内存 - C 函数调用已通过互斥锁保护线程安全 - 使用 `runtime.LockOSThread()` 确保 goroutine 绑定到 OS 线程 ## 技术栈 | 组件 | 技术 | |------|------| | 语言 | Go 1.22 | | RPC 框架 | gRPC | | HTTP 网关 | grpc-gateway v2 | | 序列化 | Protocol Buffers | | C++ 集成 | CGO | | TLS | crypto/tls | ## 常见问题 ### 1. build.sh 无法执行 ```bash # 错误: cannot execute: required file not found # 原因: Windows 换行符 (CRLF) 问题 # 解决: sed -i 's/\r$//' build.sh ``` ### 2. go: command not found ```bash # Go 环境未安装或未配置 PATH # 解决: 参考上方"安装 Go 环境"章节 source ~/.bashrc go version ``` ### 3. 编译时找不到 C++ 库 ```bash # 错误: cannot find -lCcosProc # 解决: 设置正确的库路径 export LIB_PATH=/your/lib/path ./build.sh build ``` ### 4. 运行时找不到动态库 ```bash # 错误: error while loading shared libraries # 解决: 设置运行时库路径 export LD_LIBRARY_PATH=/root/codebuild/Deliver/lib:$LD_LIBRARY_PATH ./build/CcosProcGo driver_config.json ``` ### 5. SSL 连接超时 (下载 Go) ```bash # 使用国内镜像 wget https://golang.google.cn/dl/go1.22.5.linux-amd64.tar.gz # 或 wget https://mirrors.nju.edu.cn/golang/go1.22.5.linux-amd64.tar.gz ``` ### 6. go mod 下载慢 ```bash # 配置国内代理 export GOPROXY=https://goproxy.cn,direct go mod download ``` ## 许可证 MIT License