Nincs leírás

lwk 162c3a4336 ccosproc初版提交 2 hete
build 162c3a4336 ccosproc初版提交 2 hete
gateway 162c3a4336 ccosproc初版提交 2 hete
insecure 162c3a4336 ccosproc初版提交 2 hete
middleware 162c3a4336 ccosproc初版提交 2 hete
proto 162c3a4336 ccosproc初版提交 2 hete
scripts 162c3a4336 ccosproc初版提交 2 hete
server 162c3a4336 ccosproc初版提交 2 hete
third_party 162c3a4336 ccosproc初版提交 2 hete
LICENSE 162c3a4336 ccosproc初版提交 2 hete
README.md 162c3a4336 ccosproc初版提交 2 hete
buf.gen.yaml 162c3a4336 ccosproc初版提交 2 hete
buf.work.yaml 162c3a4336 ccosproc初版提交 2 hete
build.sh 162c3a4336 ccosproc初版提交 2 hete
go.mod 162c3a4336 ccosproc初版提交 2 hete
go.sum 162c3a4336 ccosproc初版提交 2 hete
main.go 162c3a4336 ccosproc初版提交 2 hete
srvconf.json 162c3a4336 ccosproc初版提交 2 hete
tools.go 162c3a4336 ccosproc初版提交 2 hete

README.md

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:<httpPort>                     │
└────────────────────┬────────────────────────────────┘
                     │
         ┌───────────▼───────────┐
         │    gRPC-Gateway       │
         │  (JSON <-> Protobuf)  │
         └───────────┬───────────┘
                     │
         ┌───────────▼───────────┐
         │    gRPC Server        │
         │  localhost:<rpcPort>  │
         │      (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 环境

# 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 (可选)

# 安装 protoc
sudo apt update
sudo apt install -y protobuf-compiler

# 安装 buf
go install github.com/bufbuild/buf/cmd/buf@latest

快速开始

1. 安装 Go 依赖

# 修复脚本换行符 (从 Windows 复制过来时需要)
sed -i 's/\r$//' build.sh

# 安装 Go 依赖
go mod download

# 或使用构建脚本
./build.sh deps

2. 生成 Proto 代码

./build.sh proto

3. 编译项目

# Release 编译
./build.sh build

# Debug 编译 (带 AddressSanitizer)
./build.sh debug

4. 运行服务

# 设置库路径
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH

# 运行服务 (需指定驱动配置文件)
./build/CcosProcGo driver_config.json

配置说明

srvconf.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

请求示例

打开设备:

curl -X POST https://localhost:9011/api/v1/Device/Open \
  -H "Content-Type: application/json" \
  -d '{"deviceUri": "detector_001", "deviceGroup": "group1"}' \
  -k

获取属性:

curl -X GET "https://localhost:9011/api/v1/Device/Get/temperature?deviceUri=detector_001" \
  -k

设置属性:

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 调用

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",
})

构建脚本

./build.sh [命令]

命令:
    build       编译项目 (Release 模式)
    debug       编译项目 (Debug 模式)
    proto       生成 Protocol Buffers 代码
    clean       清理构建产物
    run <cfg>   编译并运行
    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 无法执行

# 错误: cannot execute: required file not found
# 原因: Windows 换行符 (CRLF) 问题
# 解决:
sed -i 's/\r$//' build.sh

2. go: command not found

# Go 环境未安装或未配置 PATH
# 解决: 参考上方"安装 Go 环境"章节
source ~/.bashrc
go version

3. 编译时找不到 C++ 库

# 错误: cannot find -lCcosProc
# 解决: 设置正确的库路径
export LIB_PATH=/your/lib/path
./build.sh build

4. 运行时找不到动态库

# 错误: error while loading shared libraries
# 解决: 设置运行时库路径
export LD_LIBRARY_PATH=/root/codebuild/Deliver/lib:$LD_LIBRARY_PATH
./build/CcosProcGo driver_config.json

5. SSL 连接超时 (下载 Go)

# 使用国内镜像
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 下载慢

# 配置国内代理
export GOPROXY=https://goproxy.cn,direct
go mod download

许可证

MIT License