简体中文

基于P2PTunnelAPIs和TCPIP协议开发NAS(或者摄像头)-设备端

P2PTunnelAPIs Server端开发指南 | TUTK P2P SDK 开发手册

一、API调用流程图

截图.png

图 1:Server端授权验证、初始化、启动、连接管理、释放完整流程

二、核心开发步骤(Server端)

以下为 P2PTunnel Server(服务端)的核心开发流程,包含授权激活、初始化、服务配置、启动运行、状态检测、资源释放等关键步骤,适配 SDK 全版本,支持多访客连接场景。

(一)Server 初始化(必选)
1. 设置 SDK 许可证密钥

启动 Server 前需先通过 TUTK 提供的许可证密钥激活 SDK,否则后续接口调用会失败,密钥需向 TUTK 官方申请。

// 1. 配置 SDK 授权密钥(由 TUTK 官方提供) int ret = TUTK_SDK_Set_License_Key(sdk_license_key); if (ret != TUTK_ER_NoERROR) {    printf("TUTK_SDK_Set_License_Key() error[%d]!\n", ret);    return -1; }
说明:sdk_license_key 需妥善保管,避免泄露;服务启动时仅需调用一次。
2. 初始化 P2PTunnel Server 模块

根据 SDK 版本选择对应的初始化接口,新版本支持局域网直连模式(提升传输速度,需 APP 端配合开启),仅需在服务启动时调用一次。

// 定义最大允许的访客连接数(自定义,如8个连接) #define MAX_CONNECTION 8 // 2. 初始化 P2PTunnelServer(适配不同 SDK 版本) #if _USE_SDK_VERSION_BELOW_4_3_5_0_    // 旧版本:仅指定最大允许连接数    ret = P2PTunnelServerInitialize(MAX_CONNECTION);    if (ret != TUNNEL_ER_NoERROR) {        printf("P2PTunnelServerInitialize() error[%d]!\n", ret);        return -1;    } #else    // 新版本:支持局域网直连(第二个参数填1开启)    // 优势:局域网内传输速度大幅提升;注意:需客户端同步开启,且局域网内数据不加密    ret = P2PTunnelServerInitialize2(MAX_CONNECTION, 1);    if (ret != TUNNEL_ER_NoERROR) {        printf("P2PTunnelServerInitialize2() error[%d]!\n", ret);        return -1;    } #endif
说明:多次调用初始化接口可能导致资源冲突,若需重启服务,需先执行反初始化操作。
3. 注册连接状态回调函数

注册回调函数以监听访客连接状态变更(如接入、退出、异常断开),便于服务端进行连接管理和日志记录。

// 3. 注册连接状态回调(监听访客接入/退出等状态变更) P2PTunnelServer_GetStatus(TunnelStatusCB, (void *)args);
说明:TunnelStatusCB 需按 SDK 定义的函数原型实现,示例:void TunnelStatusCB(int SID, int status, void* pArg),其中 SID 为会话ID,status 为状态码。
(二)端口白名单配置(可选,提升安全性)

通过注册端口验证回调,限制仅允许指定端口的服务通过 P2PTunnel 转发,拒绝非法端口访问,降低安全风险。

1. 实现端口验证回调函数
// 定义允许放行的服务端口 #define WEB_SERVICE_PORT 80    // HTTP 服务 #define SSH_SERVICE_PORT 22    // SSH 服务 #define TELNET_SERVICE_PORT 23 // Telnet 服务 // 端口验证回调函数 int TunnelPortVerifyCB(uint16_t nServicePort, const void *pArg){    int ret = 0;    switch (nServicePort) {        case WEB_SERVICE_PORT:        case SSH_SERVICE_PORT:        case TELNET_SERVICE_PORT:            printf("[%s] 端口[%d] 允许放行\n", __func__, nServicePort);            break;        default:            printf("[%s] 端口[%d] 拒绝访问\n", __func__, nServicePort);            ret = -1;            break;    }    return ret; }
2. 注册端口验证回调
// 注册端口验证回调 int ret = P2PTunnelServer_Register_Port_Verify(TunnelPortVerifyCB, NULL); if (ret != TUNNEL_ER_NoERROR) {    printf("P2PTunnelServer_Register_Port_Verify() error[%d]!\n", ret);    return -1; }
说明:回调函数中返回 0 表示放行,返回 -1 表示拒绝,可根据业务需求扩展端口白名单列表。
(三)启动 Tunnel Server(必选)

启动服务时需传入设备唯一标识(gUid)、账密验证回调、连接状态信息回调及自定义参数,启动成功后设备即可通过公网接收访客连接。

// 启动 P2PTunnel Server // 参数说明:设备UID、账密验证回调、连接信息回调、自定义参数 ret = P2PTunnelServer_Start_Ex(gUid, TunnelServerAuthentication, TunnelSessionInfoExCB, args); if (ret != TUNNEL_ER_NoERROR) {    printf("P2PTunnelServer_Start_Ex() error[%d]!\n", ret);    return -1; } else {    printf("P2PTunnelServer 启动成功,可通过公网访问\n"); }

重要提醒

gUid 为设备唯一标识,需确保平台唯一,否则会导致连接冲突。

(四)认证与状态回调实现(必选)
1. 账密验证回调函数

用于验证访客登录账号的合法性:SDK 接收访客传入的账号后,通过该回调获取对应密码并进行比对,仅账号匹配时才允许建立连接。

// 账密验证回调函数 void TunnelServerAuthentication(const char *cszAccount, char *cszPassword, uint32_t nPasswordMaxLength, const void *pArg) {    printf("[%s] 访问账号:%s,密码缓冲区长度:%d\n", __func__, cszAccount, nPasswordMaxLength);        // 校验账号合法性(实际场景建议从配置文件或数据库读取账号密码)    if (strcmp(cszAccount, TUNNEL_USERNAME) == 0) {        // 账号匹配:将预设密码拷贝至 SDK 缓冲区进行比对        strcpy(cszPassword, TUNNEL_PASSWORD);    } else {        // 账号不匹配:拒绝连接(不写入密码即可)        printf("未知账号,拒绝连接\n");    } }
关键说明:实际项目中不建议硬编码账号密码,应从配置文件、数据库或安全存储中读取,提升安全性。
2. 连接状态信息回调函数

实时获取访客连接的详细信息,包括连接模式、NAT 类型、P2PTunnel 版本、访客 IP/端口、会话 ID 等,便于问题排查和状态监控。

// 连接状态信息回调函数 void TunnelSessionInfoExCB(sP2PTunnelSessionInfoEx *sSessionInfo, const void *pArg) {    printf("[%s] 连接信息更新\n", __func__);    printf("  连接模式 = %d,NAT 类型 = %d\n", sSessionInfo->nMode, sSessionInfo->nNatType);    printf("  P2PTunnel 版本 = %X,会话 ID = %d\n", (unsigned int)sSessionInfo->nVersion, sSessionInfo->nSID);    printf("  访客 IP:端口 = %s:%d\n", sSessionInfo->szRemoteIP, sSessionInfo->nRemotePort); }
(五)数据传输(自动转发,无需额外开发)

Tunnel Server 启动后,即可正常部署 HTTP、FTP、RTSP、SSH 等标准服务。P2PTunnel 模块会自动转发对应端口的数据流,无需额外修改服务代码(服务端按本地常规方式部署即可)。

说明:若已配置端口白名单,仅白名单中指定的端口会被转发,未配置则允许所有端口转发(不推荐)。
(六)设备登录状态检测(推荐)

设备成功登录 P2P 服务器后,会通过心跳机制维持连接。为应对异常掉线场景,可通过 IOTC_Get_Login_Info 接口持续检测登录状态,确保服务可用性。

unsigned int login_state; int login_fail_count = 0; // 循环检测登录状态(gProcessRun 为程序运行状态标志) while (gProcessRun) {    int ret = IOTC_Get_Login_Info(&login_state);    printf("IOTC_Get_Login_Info() 重试失败次数 = %d,登录状态 = %u\n", ret, login_state);        // 接口调用异常,退出检测    if (ret < IOTC_ER_NoERROR) {        break;    }        // 重试失败次数超过4次:设备已与 P2P 服务器失联    if (ret > 4) {        // 无用户访问且网络畅通时,执行反初始化        if (is_no_user_connected() && is_network_available()) {            printf("设备已从 P2P 服务器掉线,执行反初始化\n");            P2PTunnelServer_Stop();            P2PTunnelServerDeInitialize();            break;        }    }        // 5秒检测一次    for (int sleep_count = 0; sleep_count < 5 && gProcessRun; sleep_count++) {        sleep(1);    } }
说明:is_no_user_connected() 需自行实现(判断当前是否有访客连接),is_network_available() 可通过 ping 网关或公网地址实现网络连通性检测;login_state = 7 表示设备正常登录并收到 P2P 服务器响应。
(七)Server 反初始化(必选)

用于停止 Tunnel 服务并释放资源,通常在程序退出时调用一次;若中途需重启服务,也需先执行反初始化操作。

// 停止 Tunnel Server 服务 P2PTunnelServer_Stop(); // 释放 Tunnel Server 资源 P2PTunnelServerDeInitialize(); printf("P2PTunnel Server 反初始化完成\n");

注意

反初始化前需确保所有访客连接已断开,否则可能导致资源释放不彻底,建议在反初始化前调用连接检测接口,等待所有连接断开后再执行。

三、常见问题

问:P2PTunnelAPIs 可以使用 IOTCAPIs 的 API 吗?

答:可以,需传入会话 ID(SID)作为参数,即可复用 IOTCAPIs 的相关接口功能,数据会通过 P2P 隧道传输。


问:P2PTunnelAPIs 可以与其他模块(AV、RDT)一起使用吗?

答:技术上支持,但集成复杂度较高,可能存在资源竞争或兼容性问题,通常不建议混合使用。若需同时实现音视频传输和隧道功能,建议优先使用 P2PTunnel 承载音视频 TCP 流。


问:局域网直连模式开启后,数据传输是否安全?

答:局域网直连模式下,数据传输不加密,仅适用于信任的局域网环境;若需加密传输,需关闭该模式,数据会通过 TUTK 私有加密协议传输。


问:如何限制最大访客连接数?

答:在初始化接口(P2PTunnelServerInitializeP2PTunnelServerInitialize2)中指定最大连接数参数,超过该数量的连接会被拒绝。

即刻开启您的物联网之旅

联系解决方案专家
Kalay App
资讯安全白皮书
全球专利布局
解决方案
新闻动态
公司动态
行业资讯
媒体报道
永续发展
经营者的话
社会参与
环境永续
公司治理

+86 755 27702549

7×24小时服务热线

法律声明 隐私权条款

关注“TUTK”

TUTK服务尽在掌握

© 2022 物联智慧科技(深圳)有限公司版权所有粤ICP备14023641号
在线咨询
扫一扫

TUTK服务尽在掌握

全国免费服务热线
+86 755 27702549

返回顶部