3.2 ControllerInfo 信息类
概述
ControllerInfo 负责控制器基础状态查询和少量基础控制,包括版本、控制器状态、机器人状态、伺服状态、软模式、用户操作模式,以及上位机保活动作。
使用前提
ControllerInfo 所有接口都依赖 Arm::Connect() 先成功。如果接口模块未绑定:
- 查询接口返回空字符串或
UNKNOWN,状态码为OTHER_ERR - 控制接口通常返回
OTHER_ERR AcquireAccess()/ReleaseAccess()没有状态码;未连接时直接返回
3.2.1 查询接口
3.2.1.1 获取机器人控制器版本
cpp
GetControllerVersion() -> std::pair<std::string, STATUS_CODE>| 项 | 说明 |
|---|---|
| 描述 | 获取捷勃特机器人控制器当前版本 |
| 请求参数 | 无参数 |
| 返回值 | std::string: 控制器版本 STATUS_CODE: 函数执行结果 |
| 备注 | Arm::Connect() 内部也会读取该版本,并回填到 arm.version 。 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.1.2 获取当前控制器运行状态
cpp
GetCtrlStatus() -> std::pair<CtrlStatusEnum, STATUS_CODE>| 项 | 说明 |
|---|---|
| 描述 | 获取捷勃特机器人控制器当前运行状态 |
| 请求参数 | 无参数 |
| 返回值 | CtrlStatusEnum: 控制器运行状态 STATUS_CODE: 函数执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.1.3 获取机器人运行状态
cpp
GetRobotStatus() -> std::pair<RobotStatusEnum, STATUS_CODE>| 项 | 说明 |
|---|---|
| 描述 | 获取捷勃特机器人运行状态 |
| 请求参数 | 无参数 |
| 返回值 | RobotStatusEnum: 机器人运行状态 STATUS_CODE: 函数执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.1.4 获取当前伺服控制器状态
cpp
GetServoStatus() -> std::pair<ServoStatusEnum, STATUS_CODE>| 项 | 说明 |
|---|---|
| 描述 | 获取捷勃特机器人伺服控制器当前状态 |
| 请求参数 | 无参数 |
| 返回值 | ServoStatusEnum: 伺服控制器状态 STATUS_CODE: 函数执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.1.5 获取当前机器人型号
cpp
GetArmModelInfo() -> std::pair<std::string, STATUS_CODE>| 项 | 说明 |
|---|---|
| 描述 | 获取当前机器人型号信息 |
| 请求参数 | 无参数 |
| 返回值 | std::string: 机器人型号如 "GBT-C5A" STATUS_CODE: 函数执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.1.6 获取机器人当前的软状态
cpp
GetSoftMode() -> std::pair<SoftModeEnum, STATUS_CODE>| 项 | 说明 |
|---|---|
| 描述 | 获取捷勃特机器人当前的软状态(PC 模式下的手 / 自动状态) |
| 请求参数 | 无参数 |
| 返回值 | SoftModeEnum: 软状态 STATUS_CODE: 函数执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.1.7 获取机器人操作模式
cpp
GetOpMode() -> std::pair<OpModeEnum, STATUS_CODE>| 项 | 说明 |
|---|---|
| 描述 | 获取当前机器人操作模式(如机器人 / 虚拟控制器的手动、自动等操作权限状态)。 |
| 请求参数 | 无参数 |
| 返回值 | OpModeEnum: 操作模式 STATUS_CODE: 函数执行结果 |
| 备注 | 当控制器未返回有效模式时将回退为 OpModeEnum::UNKNOWN 。 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.2 控制接口
3.2.2.1 机器人伺服上电
cpp
ServoOn() -> STATUS_CODE| 项 | 说明 |
|---|---|
| 描述 | 使捷勃特机器人伺服上电 |
| 请求参数 | 无参数 |
| 返回值 | STATUS_CODE: 函数执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.2.2 机器人伺服下电
cpp
ServoOff() -> STATUS_CODE| 项 | 说明 |
|---|---|
| 描述 | 使捷勃特机器人伺服下电 |
| 请求参数 | 无参数 |
| 返回值 | STATUS_CODE: 函数执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.2.3 机器人伺服重置
cpp
ServoReset() -> STATUS_CODE| 项 | 说明 |
|---|---|
| 描述 | 使捷勃特机器人伺服重置 |
| 请求参数 | 无参数 |
| 返回值 | STATUS_CODE: 函数执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.2.4 设置机器人当前的软状态
cpp
SetSoftMode(SoftModeEnum mode) -> STATUS_CODE| 项 | 说明 |
|---|---|
| 描述 | 设置机器人当前的软状态(PC 模式下的手 / 自动状态) |
| 请求参数 | mode : SoftModeEnum 软状态值 |
| 返回值 | STATUS_CODE: 函数执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.2.5 设置机器人操作模式
cpp
SetOpMode(OpModeEnum mode) -> STATUS_CODE| 项 | 说明 |
|---|---|
| 描述 | 设置机器人操作模式,仅支持虚拟机器人 / 仿真控制器。 |
| 请求参数 | mode : OpModeEnum 目标操作模式 (不能为 UNKNOWN )。 |
| 返回值 | STATUS_CODE: 函数执行结果 |
| 备注 | 如果传入 OpModeEnum::UNKNOWN ,接口将返回 UNSUPPORTED_PARAMETER 。 |
| 兼容的机器人软件版本 | 协作 (Copper): 仅仿真;工业 (Bronze): 仅仿真 |
3.2.2.6 设置机器人 LED 指示灯
cpp
SwitchLedLight(bool mode) -> STATUS_CODE| 项 | 说明 |
|---|---|
| 描述 | 控制捷勃特机器人的 LED 指示灯开关 |
| 请求参数 | mode : bool 指示灯状态 (true 打开,false 关闭) |
| 返回值 | STATUS_CODE: 函数执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.1.3+ 工业 (Bronze): 不支持 |
3.2.2.7 机器人紧急停止
cpp
Estop() -> STATUS_CODE| 项 | 说明 |
|---|---|
| 描述 | 使捷勃特机器人紧急停止 |
| 请求参数 | 无参数 |
| 返回值 | STATUS_CODE: 函数执行结果 |
| 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ |
3.2.3 控制权限接口
3.2.3.1 上位机获取操作权限
cpp
AcquireAccess()| 项 | 说明 |
|---|---|
| 描述 | 上位机获取操作权限,使机器人进入 PC 模式。SDK 会定时向控制器发送保活。 |
| 请求参数 | 无参数 |
| 返回值 | 无返回 |
| 行为 | - 未连接时直接返回 - 每次调用前会先执行一次 ReleaseAccess() ,避免重复注册- SDK 会在 Arm 专用网络线程上注册一个 2000ms 的保活定时任务 |
| 备注 | 仅工业机器人需要调用此接口保持 PC 模式,协作机器人及 P7A 无需使用。 |
| 兼容的机器人软件版本 | 协作 (Copper): 不支持 工业 (Bronze): v7.5.0.0+ |
3.2.3.2 上位机返还操作权限
cpp
ReleaseAccess()| 项 | 说明 |
|---|---|
| 描述 | 上位机返还操作权限,使机器人退出 PC 模式,并停止 AcquireAccess() 注册的保活定时任务。 |
| 请求参数 | 无参数 |
| 返回值 | 无返回 |
| 行为 | - 取消当前会话上的保活定时任务 - Arm::Disconnect() 、 ControllerInfo::Reset() 和析构流程也会主动调用它 |
| 备注 | 仅工业机器人需要调用此接口。 |
| 兼容的机器人软件版本 | 协作 (Copper): 不支持 工业 (Bronze): v7.5.0.0+ |
常见返回值解释
| 场景 | 返回 |
|---|---|
| 未连接时调用查询接口 | OTHER_ERR ,同时数据位回落到空字符串或 UNKNOWN |
| 未连接时调用控制接口 | OTHER_ERR |
AcquireAccess / ReleaseAccess 在未连接时调用 | 直接返回,无额外错误码 |
调用建议
- 连接后先用
GetControllerVersion()、GetArmModelInfo()做设备识别。 - 写模式前先读模式,避免盲写。
AcquireAccess()常见于 PUMA / 工业机器人 PC 模式保活场景;协作机器人通常不需要。
最小调用示例
cpp
#include <iostream> // 引入标准输出流,用于打印查询结果
#include "arm_api.h" // 引入 Arm 主入口,连接后通过 arm.controllerInfo 访问信息接口
#include "status_code.h" // 引入 STATUS_CODE,用于检查 SDK 调用结果
int main() // 示例程序入口
{ // 进入示例主函数
Arm arm; // 创建机器人会话对象
STATUS_CODE connectRet = arm.Connect("192.168.110.2", ""); // 连接控制器,示教器地址留空表示使用默认规则
if (connectRet != STATUS_CODE::OK) { // 判断连接是否失败
return 1; // 连接失败时直接退出
} // 结束连接结果判断
auto [version, versionRet] = arm.controllerInfo.GetControllerVersion(); // 查询控制器版本字符串
auto [servoStatus, servoRet] = arm.controllerInfo.GetServoStatus(); // 查询当前伺服状态
auto [softMode, softModeRet] = arm.controllerInfo.GetSoftMode(); // 查询当前软模式
auto [opMode, opModeRet] = arm.controllerInfo.GetOpMode(); // 查询当前操作模式
if (versionRet != STATUS_CODE::OK || // 判断控制器版本查询是否失败
servoRet != STATUS_CODE::OK || // 判断伺服状态查询是否失败
softModeRet != STATUS_CODE::OK || // 判断软模式查询是否失败
opModeRet != STATUS_CODE::OK) { // 判断操作模式查询是否失败
return 1; // 任一查询失败时返回错误码
} // 结束查询结果判断
std::cout << "version=" << version << "\n"; // 打印控制器版本
std::cout << "servo_status=" << static_cast<int>(servoStatus) << "\n"; // 打印伺服状态枚举值
std::cout << "soft_mode=" << static_cast<int>(softMode) << "\n"; // 打印软模式枚举值
std::cout << "op_mode=" << static_cast<int>(opMode) << "\n"; // 打印操作模式枚举值
arm.controllerInfo.AcquireAccess(); // 工业机器人 PC 模式场景下获取操作权限并启动保活
arm.controllerInfo.ReleaseAccess(); // 示例结束前释放操作权限并停止保活
return 0; // 示例正常结束
} // 结束示例主函数场景化示例
下面几组片段按 “只读状态、模式设置、动作控制、PC 权限” 交叉覆盖本页 API。片段默认承接最小调用示例里已经连接成功的 arm 对象;会改变机器人状态的调用保持注释,确认现场后再执行。
读取版本、型号和状态
cpp
auto [version, versionRet] = arm.controllerInfo.GetControllerVersion(); // 读取控制器版本
auto [model, modelRet] = arm.controllerInfo.GetArmModelInfo(); // 读取机器人型号
auto [ctrlStatus, ctrlRet] = arm.controllerInfo.GetCtrlStatus(); // 读取控制器运行状态
auto [robotStatus, robotRet] = arm.controllerInfo.GetRobotStatus(); // 读取机器人运行状态
auto [servoStatus, servoRet] = arm.controllerInfo.GetServoStatus(); // 读取伺服状态
if (versionRet == STATUS_CODE::OK && modelRet == STATUS_CODE::OK && ctrlRet == STATUS_CODE::OK && robotRet == STATUS_CODE::OK && servoRet == STATUS_CODE::OK) { // 判断基础状态查询是否成功
std::cout << "version=" << version << " model=" << model << "\n"; // 打印版本和型号
std::cout << "ctrl=" << static_cast<int>(ctrlStatus) << " robot=" << static_cast<int>(robotStatus) << " servo=" << static_cast<int>(servoStatus) << "\n"; // 打印三类运行状态
} // 结束基础状态查询判断读取和设置模式
cpp
auto [softMode, softRet] = arm.controllerInfo.GetSoftMode(); // 读取当前软模式
auto [opMode, opRet] = arm.controllerInfo.GetOpMode(); // 读取当前操作模式
if (softRet == STATUS_CODE::OK && opRet == STATUS_CODE::OK) { // 判断模式读取是否成功
std::cout << "soft=" << static_cast<int>(softMode) << " op=" << static_cast<int>(opMode) << "\n"; // 打印模式状态
} // 结束模式读取判断
// STATUS_CODE setSoftRet = arm.controllerInfo.SetSoftMode(softMode); // 设置软模式会改变控制器模式,确认后再执行
// STATUS_CODE setOpRet = arm.controllerInfo.SetOpMode(opMode); // 设置操作模式会改变控制器模式,确认后再执行伺服、LED 和急停动作
cpp
// STATUS_CODE servoOnRet = arm.controllerInfo.ServoOn(); // 请求伺服上电会改变机器人状态,确认安全后再执行
// STATUS_CODE servoOffRet = arm.controllerInfo.ServoOff(); // 请求伺服下电会改变机器人状态,确认现场后再执行
// STATUS_CODE resetRet = arm.controllerInfo.ServoReset(); // 请求伺服复位会改变机器人状态,确认现场后再执行
// STATUS_CODE ledRet = arm.controllerInfo.SwitchLedLight(true); // 切换 LED 状态会改变控制器输出,确认后再执行
// STATUS_CODE estopRet = arm.controllerInfo.Estop(); // 触发急停会立即改变安全状态,仅在明确需要时执行工业机器人 PC 权限
cpp
// arm.controllerInfo.AcquireAccess(); // 工业机器人 PC 模式下获取操作权限并启动保活
// arm.controllerInfo.ReleaseAccess(); // 工业机器人 PC 模式下释放操作权限并停止保活示例代码
cpp
#include <iostream>
#include "arm_api.h"
#include "status_code.h"
#include "query_version_and_model/run.h"
/**
* 查询版本与型号门面。
* @return 0 表示成功,否则返回 1。
*/
int RunInfoGetControllerVersionQueryVersionAndModel(void)
{
// [ZH] 连接机器人,请直接修改下面的魔鬼字符串。
// [EN] Connect to the robot and edit the hard-coded magic strings below directly.
Arm arm;
STATUS_CODE connectRet = arm.Connect("10.27.1.2", "10.27.1.102");
if (connectRet != STATUS_CODE::OK) {
std::cerr << "[cpp17_info_basic] 连接机器人失败 / Connect to the robot failed, 状态码 / Status code: "
<< static_cast<int>(connectRet) << "\n";
return 1;
}
std::cout << "[cpp17_info_basic] 机器人连接成功 / Robot connected successfully\n";
// [ZH] 获取控制器版本和机械臂型号。
// [EN] Get the controller version and robot model.
std::pair<std::string, STATUS_CODE> versionPair = arm.controllerInfo.GetControllerVersion();
std::pair<std::string, STATUS_CODE> modelPair = arm.controllerInfo.GetArmModelInfo();
std::cout << "[cpp17_info_basic] GetControllerVersion 状态码 / GetControllerVersion status code: "
<< static_cast<int>(versionPair.second)
<< ", 版本 / Version: " << versionPair.first << "\n";
std::cout << "[cpp17_info_basic] GetArmModelInfo 状态码 / GetArmModelInfo status code: "
<< static_cast<int>(modelPair.second)
<< ", 型号 / Model: " << modelPair.first << "\n";
// [ZH] 断开连接,结束示例。
// [EN] Disconnect and finish the example.
arm.Disconnect();
std::cout << "[cpp17_info_basic] 示例结束 / Example finished\n";
return 0;
}cpp
#include <iostream>
#include "arm_api.h"
#include "status_code.h"
#include "query_state_modes/run.h"
/**
* 查询状态与模式门面。
* @return 0 表示成功,否则返回 1。
*/
int RunInfoStateModesQueryStateModes(void)
{
// [ZH] 连接机器人,请直接修改下面的魔鬼字符串。
// [EN] Connect to the robot and edit the hard-coded magic strings below directly.
Arm arm;
STATUS_CODE connectRet = arm.Connect("10.27.1.2", "10.27.1.102");
if (connectRet != STATUS_CODE::OK) {
std::cerr << "[cpp17_arm_state] 连接机器人失败 / Connect to the robot failed, 状态码 / Status code: "
<< static_cast<int>(connectRet) << "\n";
return 1;
}
std::cout << "[cpp17_arm_state] 机器人连接成功 / Robot connected successfully\n";
// [ZH] 获取伺服状态、软模式和操作模式。
// [EN] Get the servo status, soft mode, and operation mode.
std::pair<ServoStatusEnum, STATUS_CODE> servoPair = arm.controllerInfo.GetServoStatus();
std::pair<SoftModeEnum, STATUS_CODE> softPair = arm.controllerInfo.GetSoftMode();
std::pair<OpModeEnum, STATUS_CODE> opPair = arm.controllerInfo.GetOpMode();
std::cout << "[cpp17_arm_state] GetServoStatus 状态码 / GetServoStatus status code: "
<< static_cast<int>(servoPair.second)
<< ", 伺服状态 / Servo status: " << static_cast<int>(servoPair.first) << "\n";
std::cout << "[cpp17_arm_state] GetSoftMode 状态码 / GetSoftMode status code: "
<< static_cast<int>(softPair.second)
<< ", 软模式 / Soft mode: " << static_cast<int>(softPair.first) << "\n";
std::cout << "[cpp17_arm_state] GetOpMode 状态码 / GetOpMode status code: "
<< static_cast<int>(opPair.second)
<< ", 操作模式 / Operation mode: " << static_cast<int>(opPair.first) << "\n";
// [ZH] 断开连接,结束示例。
// [EN] Disconnect and finish the example.
arm.Disconnect();
std::cout << "[cpp17_arm_state] 示例结束 / Example finished\n";
return 0;
}cpp
#include <iostream>
#include "arm_api.h"
#include "status_code.h"
#include "write_back_modes/run.h"
/**
* 写回软模式与操作模式门面。
* @return 0 表示成功,否则返回 1。
*/
int RunInfoStateModesWriteBackModes(void)
{
// [ZH] 连接机器人,请直接修改下面的魔鬼字符串。
// [EN] Connect to the robot and edit the hard-coded magic strings below directly.
Arm arm;
STATUS_CODE connectRet = arm.Connect("10.27.1.2", "10.27.1.102");
if (connectRet != STATUS_CODE::OK) {
std::cerr << "[cpp17_arm_state] 连接机器人失败 / Connect to the robot failed, 状态码 / Status code: "
<< static_cast<int>(connectRet) << "\n";
return 1;
}
std::cout << "[cpp17_arm_state] 机器人连接成功 / Robot connected successfully\n";
// [ZH] 读取并写回软模式与操作模式。
// [EN] Read and write back the soft mode and operation mode.
std::pair<SoftModeEnum, STATUS_CODE> softPair = arm.controllerInfo.GetSoftMode();
std::pair<OpModeEnum, STATUS_CODE> opPair = arm.controllerInfo.GetOpMode();
STATUS_CODE setSoftRet = arm.controllerInfo.SetSoftMode(softPair.first);
STATUS_CODE setOpRet = arm.controllerInfo.SetOpMode(opPair.first);
std::cout << "[cpp17_arm_state] SetSoftMode 状态码 / SetSoftMode status code: "
<< static_cast<int>(setSoftRet) << "\n";
std::cout << "[cpp17_arm_state] SetOpMode 状态码 / SetOpMode status code: "
<< static_cast<int>(setOpRet) << "\n";
// [ZH] 断开连接,结束示例。
// [EN] Disconnect and finish the example.
arm.Disconnect();
std::cout << "[cpp17_arm_state] 示例结束 / Example finished\n";
return 0;
}cpp
#include <iostream>
#include "arm_api.h"
#include "status_code.h"
#include "access_control/run.h"
/**
* 获取和归还控制权门面。
* @return 0 表示成功,否则返回 1。
*/
int RunInfoStateModesAccessControl(void)
{
// [ZH] 连接机器人,请直接修改下面的魔鬼字符串。
// [EN] Connect to the robot and edit the hard-coded magic strings below directly.
Arm arm;
STATUS_CODE connectRet = arm.Connect("10.27.1.2", "10.27.1.102");
if (connectRet != STATUS_CODE::OK) {
std::cerr << "[cpp17_arm_state] 连接机器人失败 / Connect to the robot failed, 状态码 / Status code: "
<< static_cast<int>(connectRet) << "\n";
return 1;
}
std::cout << "[cpp17_arm_state] 机器人连接成功 / Robot connected successfully\n";
// [ZH] 获取并归还 SDK 控制权。
// [EN] Acquire and release the SDK access token.
arm.controllerInfo.AcquireAccess();
std::cout << "[cpp17_arm_state] 已获取控制权 / SDK access acquired\n";
arm.controllerInfo.ReleaseAccess();
std::cout << "[cpp17_arm_state] 已归还控制权 / SDK access released\n";
// [ZH] 断开连接,结束示例。
// [EN] Disconnect and finish the example.
arm.Disconnect();
std::cout << "[cpp17_arm_state] 示例结束 / Example finished\n";
return 0;
}cpp
#include <iostream>
#include "arm_api.h"
#include "status_code.h"
#include "action_apis/run.h"
/**
* 动作接口门面。
* @return 0 表示成功,否则返回 1。
*/
int RunInfoStateModesActionApis(void)
{
// [ZH] 连接机器人,请直接修改下面的魔鬼字符串。
// [EN] Connect to the robot and edit the hard-coded magic strings below directly.
Arm arm;
STATUS_CODE connectRet = arm.Connect("10.27.1.2", "10.27.1.102");
if (connectRet != STATUS_CODE::OK) {
std::cerr << "[cpp17_arm_state] 连接机器人失败 / Connect to the robot failed, 状态码 / Status code: "
<< static_cast<int>(connectRet) << "\n";
return 1;
}
std::cout << "[cpp17_arm_state] 机器人连接成功 / Robot connected successfully\n";
// [ZH] 顺序执行全部动作接口。
// [EN] Execute all action APIs in sequence.
STATUS_CODE servoOnRet = arm.controllerInfo.ServoOn();
STATUS_CODE servoOffRet = arm.controllerInfo.ServoOff();
STATUS_CODE ledRet = arm.controllerInfo.SwitchLedLight(true);
STATUS_CODE resetRet = arm.controllerInfo.ServoReset();
STATUS_CODE estopRet = arm.controllerInfo.Estop();
std::cout << "[cpp17_arm_state] ServoOn 状态码 / ServoOn status code: "
<< static_cast<int>(servoOnRet) << "\n";
std::cout << "[cpp17_arm_state] ServoOff 状态码 / ServoOff status code: "
<< static_cast<int>(servoOffRet) << "\n";
std::cout << "[cpp17_arm_state] SwitchLedLight 状态码 / SwitchLedLight status code: "
<< static_cast<int>(ledRet) << "\n";
std::cout << "[cpp17_arm_state] ServoReset 状态码 / ServoReset status code: "
<< static_cast<int>(resetRet) << "\n";
std::cout << "[cpp17_arm_state] Estop 状态码 / Estop status code: "
<< static_cast<int>(estopRet) << "\n";
// [ZH] 断开连接,结束示例。
// [EN] Disconnect and finish the example.
arm.Disconnect();
std::cout << "[cpp17_arm_state] 示例结束 / Example finished\n";
return 0;
}