快速开始
本篇带你用 C++ 跑通:准备环境 → 构建 → 集成到工程 → 发出第一个请求。C++ 客户端目前仅支持 Linux。
环境要求
| 项目 | 版本 | 说明 |
|---|---|---|
| 操作系统 | Linux | 已在 Ubuntu 22.04 验证 |
| CMake | 3.16 及以上 | 已用 3.22.1 验证 |
| C++ 编译器 | 支持 C++14 | 已用 GCC 11.4 验证 |
git 与网络 | — | 配置阶段需要联网拉取固定版本依赖 |
| OpenSSL 开发文件 | — | libssl-dev |
| lz4 开发文件 | 1.9 及以上 | liblz4-dev,通过 pkg-config 查找 |
构建时由 CMake 自动拉取并锁定两个依赖,无需手动安装:
| 依赖 | 版本 | 原因 |
|---|---|---|
| protobuf | v21.12(3.21.12) | 生成代码与运行库必须同一版本 |
| paho.mqtt.c | v1.3.13 | 与设备端构建所用版本一致 |
安装系统依赖(Ubuntu):
sudo apt-get update
sudo apt-get install -y build-essential cmake git libssl-dev liblz4-dev pkg-config
构建与测试
在仓库根目录执行:
cmake -S cpp -B cpp/build
cmake --build cpp/build -j
ctest --test-dir cpp/build --output-on-failure
首次配置会从源码构建 protobuf。在验证机器(Ubuntu 22.04)上,20 路并行的全新构建约 47 秒。
注:Ubuntu 22.04 自带的 protobuf 是 3.12.4,低于本项目要求。默认选项
AUTO会自动改为构建锁定版本(3.21.12),无需你干预。
构建产物里包含 18 个示例,位于 cpp/build/examples/:
./cpp/build/examples/heartbeat --seconds 5 # 不需要 Key
./cpp/build/examples/device_info --key <由 XGRIDS 提供>
./cpp/build/examples/modeling --key <由 XGRIDS 提供> --project demo --watch 8
集成到你的工程
目前不提供 install 和 CMake 包导出,用 add_subdirectory 把 cpp/ 加入你的工程即可(protobuf 与 paho 由它自行拉取):
set(LIXEL_OPENAPI_BUILD_TESTS OFF)
set(LIXEL_OPENAPI_BUILD_EXAMPLES OFF)
add_subdirectory(path/to/Lixel_OpenAPI/cpp lixel)
target_link_libraries(my_app PRIVATE LixelOpenApi::lixel_openapi)
第一个请求
连接设备、查询设备信息:
#include "lixel/openapi/client.h"
#include "openapi/aiot_msgs.pb.h"
lixel::openapi::ClientOptions options;
options.transport.host = "192.168.55.1";
options.openapi_key = "<由 XGRIDS 提供>";
lixel::openapi::Client client(options);
if (!client.Connect().ok()) return 1;
openapi::aiot_msgs::DeviceInfoRequest request;
openapi::aiot_msgs::DeviceInfoResponse response;
lixel::openapi::Result r = client.Request(
"lixel/application/request/device_info", request,
"lixel/application/response/device_info", &response);
// r.ok():设备返回成功码。
// r.code == Errc::DeviceError:设备返回错误码(见 r.device_code、r.desc),response 已填充。
// r.code == Errc::RequestTimeout:没有收到响应。
Request 会把 header.seq、header.openapi_key、header.device_id 自动填入请求。响应按 header.seq 匹配(设备会原样带回)。