这篇会介绍如何快速接入腾讯云物联网设备端 SDK,跑通登录功能。
一、开通服务
在使用 IoT 设备端 SDK 前,你需要前往控制台,创建产品并在产品下创建设备。具体步骤参见 开通服务。
开通服务后,请记录以下设备三元组信息,在后续 登录 步骤中会用到:
·ProductId(产品 ID)
·DeviceName(设备名称)
·DeviceSecret(设备密钥)
注意:设备三元组是设备登录平台的唯一身份凭证,请妥善保管 DeviceSecret,避免硬编码提交到公共代码仓库。
二、环境准备
请根据你实际对接的设备芯片平台,准备对应的编译环境。这篇以 Linux 本机环境为例演示接入流程,帮助你快速跑通登录功能;正式对接你的设备时,替换为目标芯片平台的交叉编译工具链即可,示例代码无需改动。
Linux 本机(快速体验)嵌入式设备(交叉编译)
| 环境项 | 要求 |
| 操作系统 | x86_64 Linux(Ubuntu 18.04+ / CentOS 7+ 等主流发行版)。 |
| 编译工具 | CMake 3.10 及以上、GCC / Clang(支持 C99)。 |
| 系统依赖库 | pthread、m(数学库)、dl、z(zlib)。 |
| 环境项 | 要求 |
| 交叉编译工具链 | 与目标芯片架构匹配的 GCC / Clang 交叉工具链(如 arm-linux-gnueabihf-gcc、aarch64-none-linux-gnu-gcc 等),具体工具链由芯片厂商 SDK 或 FAE 提供。 |
| 编译工具 | CMake 3.21 及以上(交叉编译需要通过 -DCMAKE_TOOLCHAIN_FILE 指定工具链配置文件)。 |
| sysroot | 部分工具链已自带默认 sysroot,无需单独指定;如需自定义,请参考芯片厂商 SDK 文档。 |
| 系统依赖库 | 与目标架构匹配的 pthread、m、dl、z 等库版本,通常随交叉工具链一并提供。 |
注意:说明:
注意:不同芯片平台的交叉编译工具链配置差异较大,具体的工具链路径、-DCMAKE_TOOLCHAIN_FILE 配置方式请参考对应芯片平台 SDK 包内的 README 说明。
三、获取 SDK
前往 SDK & Demo 页面下载 SDK 包并解压。解压后得到以下内容:
tc_iot_sdk/├── include/ # 全量 public API 头文件(tc_iot.h 等)└── lib/ └── libtc_iot_sdk.a # SDK 静态库
四、创建项目
1. 新建项目目录,并将上一步下载解压得到的 tc_iot_sdk/ 目录拷贝到项目根目录下。
mkdir -p my_iot_project && cd my_iot_projectcp -r /path/to/tc_iot_sdk .
2. 项目目录结构如下:
my_iot_project/├── CMakeLists.txt├── main.c└── tc_iot_sdk/ ├── include/ └── lib/libtc_iot_sdk.a
五、步骤 1:配置 CMakeLists.txt
在项目根目录创建 CMakeLists.txt,添加头文件搜索路径与静态库链接:
cmake_minimum_required(VERSION 3.10)project(iot_quickstart_demo C)set(CMAKE_C_STANDARD 99)set(SDK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tc_iot_sdk)add_executable(iot_quickstart_demo main.c)target_include_directories(iot_quickstart_demo PRIVATE ${SDK_DIR}/include)target_link_libraries(iot_quickstart_demo PRIVATE -Wl,–start-group ${SDK_DIR}/lib/libtc_iot_sdk.a -Wl,–end-group pthread m dl z)
六、步骤 2:引入头文件
在 main.c 中引入设备端登录相关头文件:
#include "tc_iot.h" // 初始化 / 登录 / 登出
七、接入步骤
本节介绍如何调用 SDK 完成登录。
八、步骤 1:初始化 SDK
调用 tc_iot_init 完成 SDK 全局初始化:
| 参数 | 类型 | 说明 |
| storage_path | const char * | 本地存储位置。 |
| log_level | tc_iot_log_level_e | 日志级别。 |
| on_log | void (*)(tc_iot_log_level_e level,const char *log) | 日志回调。 |
| on_device_event | void (*)(tc_iot_device_event_type_eevent_type, const void *event_data) | 事件回调(在线、离线、重连)。 |
| region | const char * | 国内站:""海外站:"us-east"/"europe"/"ap-bangkok" |
#include <string.h>#include "tc_iot.h"tc_iot_config_s config;memset(&config, 0, sizeof(config));config.storage_path = "./";config.log_level = TC_IOT_LOG_LEVEL_INFO;config.on_log = NULL;config.on_device_event = NULL;tc_iot_error_e rc = tc_iot_init(&config);if (rc != TC_IOT_ERR_SUCCESS) { printf("tc_iot_init failed: %d\\n", rc); return -1;}
九、步骤 2:登录
调用 tc_iot_login 使用设备三元组完成登录鉴权,登录结果通过回调异步返回:
| 参数 | 类型 | 说明 |
| product_id | const char * | 产品 ID。 |
| device_id | const char * | 设备名称。 |
| device_secret | const char * | 设备密钥。 |
static void on_login(tc_iot_error_e error_code, const char *error_message) { if (error_code == TC_IOT_ERR_SUCCESS) { printf("[demo] login success\\n"); } else { printf("[demo] login failed: %d, msg=%s\\n", error_code, error_message ? error_message : ""); }}tc_iot_device_info_s device_info;device_info.product_id = "YOUR_PRODUCT_ID";device_info.device_id = "YOUR_DEVICE_NAME";device_info.device_secret = "YOUR_DEVICE_SECRET";rc = tc_iot_login(&device_info, on_login);if (rc != TC_IOT_ERR_SUCCESS) { printf("tc_iot_login call failed: %d\\n", rc);}
十、完整示例代码
#include <stdio.h>#include <string.h>#include <unistd.h>#include "tc_iot.h"static volatile int s_login_done = 0;static tc_iot_error_e s_login_rc = TC_IOT_ERR_SUCCESS;static void on_login(tc_iot_error_e error_code, const char *error_message) { s_login_rc = error_code; s_login_done = 1; if (error_code != TC_IOT_ERR_SUCCESS) { printf("[demo] login failed: %d, msg=%s\\n", error_code, error_message ? error_message : ""); } else { printf("[demo] login success\\n"); }}int main(int argc, char **argv) { if (argc < 7) { printf("Usage: %s -p <product_id> -d <device_id> -s <device_secret>\\n", argv[0]); return 0; } const char *product_id = NULL; const char *device_id = NULL; const char *device_secret = NULL; for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-p") == 0 && i + 1 < argc) { product_id = argv[++i]; } else if (strcmp(argv[i], "-d") == 0 && i + 1 < argc) { device_id = argv[++i]; } else if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) { device_secret = argv[++i]; } } if (!product_id || !device_id || !device_secret) { printf("device info error\\n"); return 1; } // 1. 初始化 SDK tc_iot_config_s config; memset(&config, 0, sizeof(config)); config.storage_path = "./"; config.log_level = TC_IOT_LOG_LEVEL_INFO; tc_iot_error_e rc = tc_iot_init(&config); if (rc != TC_IOT_ERR_SUCCESS) { printf("tc_iot_init failed: %d\\n", rc); return 1; } // 2. 登录 tc_iot_device_info_s device_info; device_info.product_id = product_id; device_info.device_id = device_id; device_info.device_secret = device_secret; rc = tc_iot_login(&device_info, on_login); if (rc != TC_IOT_ERR_SUCCESS) { printf("tc_iot_login call failed: %d\\n", rc); tc_iot_deinit(); return 1; } int waited_ms = 0; while (!s_login_done && waited_ms < 5000) { usleep(100 * 1000); waited_ms += 100; } if (!s_login_done || s_login_rc != TC_IOT_ERR_SUCCESS) { printf("login timeout or failed\\n"); tc_iot_deinit(); return 1; } // 3. 释放资源 tc_iot_logout(); tc_iot_deinit(); printf("[demo] main exit\\n"); return 0;}
十一、编译并运行
1. 在项目根目录执行 CMake 编译。
cmake -B buildcmake –build build -j
2. 运行可执行文件,传入设备三元组。
./build/iot_quickstart_demo -p YOUR_PRODUCT_ID -d YOUR_DEVICE_NAME -s 'YOUR_DEVICE_SECRET'
3. 观察日志输出,出现以下内容代表登录成功。
你可以进入 物联网开发平台控制台,在实例下的设备详情页面查看设备状态。
十二、常见问题
| 现象 | 排查建议 |
| tc_iot_login 长时间无回调 / 超时 | 检查设备三元组是否正确、网络是否可达、本机系统时间是否准确。 |
| 编译报错找不到头文件 | 确认 CMakeLists.txt 中 target_include_directories 正确指向 tc_iot_sdk/include。 |
| 链接报错找不到符号 | 确认链接顺序使用了 -Wl,–start-group … -Wl,–end-group 包裹静态库,且补齐了 pthread m dl z 系统库。 |
十三、联系我们
如果你在接入或使用过程中有任何疑问或者建议,欢迎 联系我们 提交反馈。