news 2026/10/4 9:48:36

OpenIPC 固件集成 Nabto Edge:让 IPC 的 RTSP 流穿透 NAT 实现全球直连访问

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenIPC 固件集成 Nabto Edge:让 IPC 的 RTSP 流穿透 NAT 实现全球直连访问
  • 嵌入式
  • 智能硬件
  • 物联网

【免费下载链接】firmware

Alternative IP Camera firmware from an open community

项目地址:https://gitcode.com/gh_mirrors/fir/firmware
点击查看免费下载

导读

本文以 OpenIPC 社区固件仓库中general/package/nabto包的官方集成指南为主体,讲解如何在 OpenIPC 相机上启用 Nabto Edge 嵌入式 SDK 的tcp_tunnel_device组件,实现"不依赖公网 IP、无需端口映射,从世界任意位置直接拉取相机 RTSP 流"。读完本文,你将掌握 Nabto Cloud Console 的设备注册流程、tcp_tunnel_device --demo-init的交互式配置方法、edge_tunnel_client的配对与取流操作,并理解该包在 OpenIPC 构建系统中针对嵌入式场景所做的裁剪与调优。


1. 这个包解决什么问题

Nabto Edge 平台的核心思想是设备直连(P2P):客户端与设备之间的数据不经过中转服务器间接转发,而是由平台(Basestation)协助双方完成 NAT 穿透后直接通信。这一点在 包配置文件 中描述得很清楚:

The Nabto Edge platform makes it possible to communicate directly between two entities: Instead of interacting indirectly with a device through a cloud service, the platform makes it simple to communicate directly with the actual device to invoke services or transfer data - also through firewalls.

本包(general/package/nabto)从 Nabto Edge 嵌入式 SDK 中选取了tcp_tunnel_device组件,官方 readme 给出的典型场景正是:在 OpenIPC 相机上运行隧道设备程序,让身处世界任意位置的客户端通过 Nabto 平台访问相机的 RTSP 流。

从构建脚本(general/package/nabto/nabto.mk)可以看到该包的工程定位:

  • 版本锁定为NABTO_VERSION = 5.13.0,源码来自上游 SDK 的 release 压缩包;
  • 运行时依赖仅两个 OpenIPC 自维护的库:libevent-openipc与mbedtls-openipc;
  • 以Release模式静态编译(BUILD_SHARED_LIBS=OFF),最终只向目标系统/usr/bin安装一个可执行文件tcp_tunnel_device,非常适合资源受限的 IPC 环境。

2. 前置准备:注册产品与设备

在给相机做任何配置之前,需要先在Nabto Cloud Console(https://console.cloud.nabto.com)完成注册,获取两个关键标识:

标识格式示例作用
Product-IDpr-xxxxxxxx标识你创建的产品(产品级)
Device-IDde-xxxxxxxx标识某个具体设备(设备级)

注意:用于完成配对的fingerprint(设备指纹)只有在相机端完成配置之后才会生成,因此顺序必须是"先在云端注册拿到 pr/de 两串 ID,再回到相机上配置,最后把生成的 fingerprint 回填到云端设备设置里"。

若读者希望了解云端一侧的设备管理细节,可查阅 Nabto 官方开发者文档中的 Guides(原 readme 末尾给出的指引)。本仓库不涉及云端控制台的实现代码。


3. 相机端配置:tcp_tunnel_device --demo-init

登录 OpenIPC 相机的 shell(示例中主机名为openipc-t31,即君正 T31 平台),启动带--demo-init参数的初始化流程:

root@openipc-t31:# tcp_tunnel_device --demo-init No device configuration found. Creating configuration: /home/user/.nabto/edge/config/device.json. The device configuration requires a Product ID and a Device ID, created in the Nabto Cloud Console. Product Id: pr-ydk3xhyn Device Id: de-orruyc4n Demo initialization will make a simple IAM setup, be aware that this is not what you want in production. 'Local Open Pairing' and 'Password Open Pairing' are enabled. Newly paired users get the 'Administrator' role. Next step is to add TCP tunnel services. What type of service do you want to add? [0]: continue [1]: ssh [2]: http [3]: rtsp Enter a valid number (default: 1) [0-3]: 3 Enter the port of your RTSP server (default: 8554) [0-65535]: 554 Enter your RTSP endpoint (default: /video): /stream=0 Added rtsp service on localhost port 554 with metadata rtsp-path => /stream=0

3.1 交互步骤逐项解读

  1. 输入产品与设备 ID:把云端注册得到的pr-ydk3xhyn、de-orruyc4n依次输入。程序会在首次运行时自动创建配置目录与device.json。
  2. IAM 安全提示:--demo-init会启用Local Open Pairing和Password Open Pairing两种配对方式,新配对的用户直接获得Administrator角色——这是演示用途的简易 IAM 配置,不推荐直接用于生产环境(原 readme 对此有明确警告)。
  3. 添加隧道服务:选择3(rtsp),随后指定:
    • RTSP 服务端口:填写本地 RTSP 服务器的端口(示例为554);
    • RTSP endpoint:填写流路径,示例为/stream=0(这是 OpenIPC 常见的子码流路径)。

完成服务添加后,程序会输出Added rtsp service on localhost port 554 with metadata rtsp-path => /stream=0,表明隧道服务已在127.0.0.1:554上就位,并且把rtsp-path作为元数据与该项服务绑定。

3.2 获取并保存 fingerprint

初始化结束时,程序会打印设备的 Fingerprint(SHA256 格式的十六进制串),必须把它保存到云端对应设备的设置中,否则设备将不被允许接入 Basestation:

The configuration and state has been initialized The Fingerprint must be configured for this device in the Nabto Cloud Console before it will be allowed to attach to the Basestation. If you want to reuse an already configured fingerprint, you can copy the corresponding private key to /home/user/.nabto/edge/keys/device.key The device Fingerprint is: 3de2ec6ded2cc975bf87ed63b2303e02b8051fb7359b19a3d950ed0158bb3813

同时注意输出里给出的一个复用技巧:如果希望复用已配置过的指纹,可以把对应的私钥拷贝到~/.nabto/edge/keys/device.key。


4. 启动隧道设备并确认连接

配置完成后,直接以普通模式启动:

tcp_tunnel_device

成功连接到 Basestation 时,输出类似:

root@openipc-t31:# tcp_tunnel_device ######## Nabto TCP Tunnel Device ######## # Product ID: pr-ydk3xhyn # Device ID: de-orruyc4n # Fingerprint: 3de2ec6ded2cc975bf87ed63b2303e02b8051fb7359b19a3d950ed0158bb3813 # Version: 0.0.0-branch.heads/master.commits.1910+a49d27fc.dirty # Local UDP Port: 5592 # Friendly Name: "Tcp Tunnel" # # The device offers Local Open Pairing # # The device has Password Open Pairing enabled # Open Pairing Password: X9NphkArpzLU # Open Pairing SCT: 9jLgbUb4FWhe # Open Pairing String: p=pr-ydk3xhyn,d=de-orruyc4n,pwd=X9NphkArpzLU,sct=9jLgbUb4FWhe # ######## Configured TCP Services ######## # Id Type Host Port # rtsp rtsp 127.0.0.1 554 ######## Attached to the basestation

这段输出是后续所有操作的关键信息源,请留意其中三处:

  • Local UDP Port: 5592:Nabto 设备侧 UDP 通信端口;
  • Open Pairing String:形如p=pr-...,d=de-...,pwd=...,sct=...的一整串配对凭证,客户端远程配对时要直接复制它;
  • Attached to the basestation:一行即表明设备已成功附着到 Nabto 平台,NAT 穿透通道已就绪。

4.1 源码中的嵌入式调优

有意思的是,OpenIPC 对本包的上游代码做了嵌入式适配,两处补丁直接改变了上面的运行行为:

  • 0000-set-shared-libraries.patch 把配置目录从依赖$HOME的~/.nabto改为固定路径/etc/nabto(宏定义由.nabto改为nabto、目录环境变量由读取HOME改为硬编码/etc)。嵌入式系统没有标准的 home 目录,这一改动保证了配置落盘位置的确定性;
  • 0010-openipc-tuning.patch 针对 OpenIPC 的 RTSP 场景做了两处默认值调整:应用显示名从"Tcp Tunnel"改为"P2P Cloud",RTSP 交互式提示中的默认端口从8554改为554、默认 endpoint 从/video改为/stream=0——这正是上面--demo-init示例中"默认值"与上游 SDK 不同的原因。

5. 客户端侧:构建edge_tunnel_client并远程取流

相机端就绪后,在任意一台能上网的 Linux 机器(官方发布中另有 Windows 版本客户端)上构建 Nabto 客户端edge_tunnel_client(来自上游 nabto-client-edge-tunnel 项目的 release 产物),随后完成配对与取流。

5.1 两种配对模式

Nabto 提供两种配对方式:

  • Local Open(本地开放配对):设备与客户端处于同一局域网时使用,查找与绑定最简便;
  • Password Open(密码开放配对):设备在远端(跨公网/NAT)时的配对方式。

readme 以远程设备这一通用场景为例,采用Password Open。

5.2 通过--pair-string完成首次配对

配对凭证串可以直接从第 4 节相机端的输出中整体复制。执行:

$./edge_tunnel_client --pair-string p=pr-ydk3xhyn,d=de-orruyc4n,pwd=X9NphkArpzLU,sct=9jLgbUb4FWhe Connected to device ProductId: pr-ydk3xhyn DeviceId: de-orruyc4n Several pairing modes exists choose one of the following. [0]: Password Open [1]: Local Open Choose a pairing mode: 0 Open Password Pairing requires a username. The username is a name you choose for the new user, the username has to be unique among the registered users on the device. New Username: admin The device [0] pr-ydk3xhyn.de-orruyc4n has been set into the bookmarks as index 0

要点:

  • 选择0(Password Open);
  • 输入自定义用户名(示例admin),该用户名在设备已注册用户中必须唯一;
  • 配对成功后,设备以索引[0]存入客户端书签(bookmarks),后续命令用0引用该设备。

5.3 查看相机提供的服务

$ ./edge_tunnel_client --services Connected to the device [0] pr-ydk3xhyn.de-orruyc4n Available services ... Service: rtsp Type: rtsp Host: 127.0.0.1 Port: 554

本例中相机只暴露了一个rtsp隧道服务。

5.4 建立隧道并播放

请求打开该服务对应的隧道:

./edge_tunnel_client --service rtsp Connected to the device [0] pr-ydk3xhyn.de-orruyc4n TCP Tunnel opened for the service rtsp listening on the local port 44391

客户端在本机127.0.0.1:44391上开出一个监听端口,任何发往该端口的数据都会被隧道送到相机内网的127.0.0.1:554。随后即可用 ffplay 播放,务必指定 TCP 传输方式:

ffplay -rtsp_transport tcp rtsp://127.0.0.1:44391/stream=0

注意流路径要使用第 3 节配置时填写的 endpoint/stream=0。至此,一个"相机在 NAT 内、客户端在全球任意网络"的 RTSP 直连链路即告打通。


6. 配套机制:局域网内的 mDNS 服务广播

为了让同一局域网中的客户端能"更容易地找到设备"(对应Local Open配对模式),OpenIPC 还为主包配套了 mDNS 广播描述文件 general/package/mdnsd-openipc/files/nabto.service:

type _nabto._udp port 5592 txt productid=device txt deviceid=device txt fn=Cloud
  • 服务类型为_nabto._udp,端口5592——正好与第 4 节设备启动输出中的Local UDP Port: 5592一一对应,说明本地发现与 Nabto 实际通信端口是同一端口;
  • txt productid/txt deviceid广播产品与设备标识,客户端在局域网内可据此识别具体设备;
  • txt fn=Cloud是友好名称(friendly name),与补丁中把应用名改为P2P Cloud的意图一致。

7. 小结与生产化提示

阶段关键动作产物/凭证
云端注册Nabto Cloud Console 创建产品与设备pr-xxxxxxxx、de-xxxxxxxx
相机配置tcp_tunnel_device --demo-init录入 ID、添加 rtsp 服务fingerprint、配置目录/etc/nabto
云端回填把 fingerprint 写入设备设置设备获准接入 Basestation
相机运行tcp_tunnel_device输出Open Pairing String与端口 5592
客户端配对edge_tunnel_client --pair-string ...设备进入书签索引 0
客户端取流--services查看、--service rtsp建隧道本地端口如 44391 → 相机 127.0.0.1:554
播放验证ffplay -rtsp_transport tcp ...远端 RTSP 画面

需要特别提醒的两点:

  1. --demo-init的 IAM 是演示配置:默认让新配对用户获得Administrator角色,生产环境务必按 Nabto 官方文档配置更严格的 IAM 规则与角色权限;
  2. 构建与运行范围以本仓库为准:本包固定使用 SDK 5.13.0 版本、静态链接 OpenIPC 自维护的 libevent/mbedTLS,并把配置目录固定在/etc/nabto,这些行为由 nabto.mk 与两个补丁文件(0000-set-shared-libraries.patch、0010-openipc-tuning.patch)定义,与上游 SDK 的默认行为并不完全一致,排查问题时请以本仓库的实际输出为准。

进一步了解 Nabto 平台的完整功能与配置项,可参考官方开发者文档(原 readme 末尾链接)。本仓库内的 包说明 即本文核心操作的原始出处,配置入口则在 Config.in(菜单项BR2_PACKAGE_NABTO)。

  • 嵌入式
  • 智能硬件
  • 物联网

【免费下载链接】firmware

Alternative IP Camera firmware from an open community

项目地址:https://gitcode.com/gh_mirrors/fir/firmware
点击查看免费下载

相关推荐

上一篇:解决Kitty终端字体大小渲染异常:从配置到源码的全方位方案
下一篇:chezmoi 与 KeePassXC 集成指南:使用 keepassxc 模板函数安全管理 dotfiles 中的密钥

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/4 9:46:29

缠论程序化入门:用Python实现分型与笔的识别

缠论这套技术分析体系,这些年讨论热度一直不低,很多人一开始都是被“分型、笔、线段、中枢”这些概念给唬住了,感觉门槛很高。但真要说程序化落地,第一步其实没有想象中那么玄乎。把分型和笔的定义搞清楚,用Python写一…

作者头像 李华
网站建设 2026/10/4 9:44:49

简笔记录 - 安装“龙虾”OpenClaw 报错排查与 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/4 9:42:01

eNSP企业网实例复现指南:从拓扑拆解到NAT配置与排错

简介:这份资源是面向网络规划设计与网络安全方向学习者、网络工程师及教学人员的 eNSP 企业网模拟实例,以精品拓扑为核心,帮助读者在无真实设备的环境下完成企业网络的搭建、配置与安全策略验证。压缩包共 32 个文件,约 2.62MB&am…

作者头像 李华
网站建设 2026/10/4 9:41:50

指针和数组的关系

指针和数组的关系 C语言中,指针和数组的关系亲密得几乎"合二为一"——数组名就是一个指向首元素的指针,指针可以用下标访问,数组名也可以做指针运算。搞懂它们的关系,C语言的一半疑惑就解开了。 一、数组名就是指针 int arr[] = {10, 20, 30, 40, 50}

作者头像 李华
网站建设 2026/10/4 9:38:19

阿里Qwen3.5-Flash实测:轻量MoE大模型的API调用与TaoToken统一接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华