|
|
преди 2 седмици | |
|---|---|---|
| build | преди 2 седмици | |
| gateway | преди 2 седмици | |
| insecure | преди 2 седмици | |
| middleware | преди 2 седмици | |
| proto | преди 2 седмици | |
| scripts | преди 2 седмици | |
| server | преди 2 седмици | |
| third_party | преди 2 седмици | |
| LICENSE | преди 2 седмици | |
| README.md | преди 2 седмици | |
| buf.gen.yaml | преди 2 седмици | |
| buf.work.yaml | преди 2 седмици | |
| build.sh | преди 2 седмици | |
| go.mod | преди 2 седмици | |
| go.sum | преди 2 седмици | |
| main.go | преди 2 седмици | |
| srvconf.json | преди 2 седмици | |
| tools.go | преди 2 седмици |
CcosProcGo (DIOS Proc) 是一个基于 Go 语言开发的设备驱动平台处理程序,提供 gRPC 和 HTTP REST API 双协议支持,用于统一管理和控制各类设备驱动。
┌─────────────────────────────────────────────────────┐
│ 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 # 项目文档
# 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
sudo apt update
sudo apt install -y protobuf-compiler
# 安装 buf
go install github.com/bufbuild/buf/cmd/buf@latest
# 修复脚本换行符 (从 Windows 复制过来时需要)
sed -i 's/\r$//' build.sh
# 安装 Go 依赖
go mod download
# 或使用构建脚本
./build.sh deps
./build.sh proto
# Release 编译
./build.sh build
# Debug 编译 (带 AddressSanitizer)
./build.sh debug
# 设置库路径
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH
# 运行服务 (需指定驱动配置文件)
./build/CcosProcGo driver_config.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 | 设备类型端口映射 |
| 方法 | 路径 | 说明 |
|---|---|---|
| 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
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 |
proto/device/v3/device.proto./build.sh proto 生成代码server/server.go 中实现方法C.CString() 调用后需要 C.free() 释放内存runtime.LockOSThread() 确保 goroutine 绑定到 OS 线程| 组件 | 技术 |
|---|---|
| 语言 | Go 1.22 |
| RPC 框架 | gRPC |
| HTTP 网关 | grpc-gateway v2 |
| 序列化 | Protocol Buffers |
| C++ 集成 | CGO |
| TLS | crypto/tls |
# 错误: cannot execute: required file not found
# 原因: Windows 换行符 (CRLF) 问题
# 解决:
sed -i 's/\r$//' build.sh
# Go 环境未安装或未配置 PATH
# 解决: 参考上方"安装 Go 环境"章节
source ~/.bashrc
go version
# 错误: cannot find -lCcosProc
# 解决: 设置正确的库路径
export LIB_PATH=/your/lib/path
./build.sh build
# 错误: error while loading shared libraries
# 解决: 设置运行时库路径
export LD_LIBRARY_PATH=/root/codebuild/Deliver/lib:$LD_LIBRARY_PATH
./build/CcosProcGo driver_config.json
# 使用国内镜像
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
# 配置国内代理
export GOPROXY=https://goproxy.cn,direct
go mod download
MIT License