找回密码
 立即注册

微信扫码登录

搜索
查看: 2299|回复: 33

[进阶教程] 【更新兼容协议】让你的esp32直接跑内网穿透,esphome nps客户端 自制组件

[复制链接]

81

主题

418

回帖

4808

积分

元老级技术达人

积分
4808
金钱
4269
HASS币
230
发表于 2026-8-20 01:45:18 | 显示全部楼层 |阅读模式
本帖最后由 gasment 于 2026-8-20 21:20 编辑


组件已开源到github:
游客,如果您要查看本帖隐藏内容请回复

ESPHome NPS-Client 组件说明

1. 组件介绍

本项目是 ESPHome 的外部组件,让 ESP32 以 npc(nps 客户端)身份直接连接 nps 服务器,通过服务器上配置的 TCP 隧道把公网流量转发到 ESP32 上的本地服务。

与在局域网网关跑 npc 不同,本组件把整个 nps 客户端协议跑在 ESP32 上,设备可以独立直连公网 nps 服务器,无需任何中间主机,

你无需再为了零星或分散的节点,专门为其部署和维护一个局域网端的npc转发服务

  • 包含两个组件:

    • nps_client​:适配djylb/nps的二开版本
    • nps_client_origin​:适配原版ehang-io/nps(0.26)协议,其他二开兼容协议自测
  • 组件配置全部实体化

    • 支持运行时修改&应用,无需重刷固件
    • 支持esphome原生触发器& action
    • 支持配置回滚防失联

2. 使用场景示例

远程访问 ESP32 上的 Web 服务

场景:ESP32 内嵌一个 Web 服务(如 ESPHome web_server 或其他 HTTP 服务),希望从公网随时访问,而不想在访问设备或访问设备所在局域网安装任何额外软件

服务器侧(nps Web 后台):

  • 新建 TCP 隧道:服务器端口 8000​,目标 127.0.0.1:80(客户端为 ESP32)

  • 效果:公网访问 http://服务器地址:8000 即直达 ESP32 上的 Web 服务。

远程 OTA 升级

场景:设备在非局域网的位置,需要从 PC 远程刷固件。

服务器侧:新建 TCP 隧道,服务器端口 3232​,目标 127.0.0.1:3232

PC 侧:esphome run xxxx.yaml --device 1.2.3.4(服务器公网ip)

远程日志调试

场景:查看 ESP32 运行日志

服务器侧:新建 TCP 隧道,服务器端口 6053​,目标 127.0.0.1:6053

PC 侧:esphome logs xxxx.yaml --device 1.2.3.4(服务器公网ip)

远程API接入

场景:在外地的epshome节点,接入家里的HA服务器

服务器侧:新建 TCP 隧道,服务器端口 6053​,目标 127.0.0.1:6053

HA侧: 添加esphome设备,主机填入服务器地址,端口填写6053

3. 兼容性

服务器版本

  • nps_client​支持djylb/nps的二次开发版本协议(0.34实测)

    • ⚠️桥接模式只支持TCP与TLS
    • ✅支持隧道加密
    • ✅支持隧道Proxy Protocol
    • ❌不支持隧道压缩
    • ⚠️服务器端开启secure_mod时esp32端需配置time组件同步SNTP 时间
  • nps_client_origin​支持 ehang-io/nps原版协议(0.26实测)

    • ⚠️桥接模式只支持TCP
    • ✅支持隧道加密
    • ❌不支持隧道压缩

芯片与框架

  • ESP32 全系(C3/S2/S3 等),框架 ESP-IDF
  • S3 等支持 PSRAM 的芯片可使用PSRAM减轻内存压力

ESPHome

  • 实测版本为2026.7.4,无版本硬性要求
  • 使用默认esp-idf toolchain编译通过,低版本platformio编译自行测试

4. 性能

代理网络吞吐量

  • 实测:download(ESP32→PC)约 200KB/s,upload(PC→ESP32)约 400KB/s,。
  • lwIP 默认 5760 字节窗口是当前主要限制(ESP-IDF 全局网络默认值,组件不擅自修改)。

内存消耗

场景 内部 RAM 增量
无会话(TCP 模式) 基础值X
无会话(TLS 模式) X + 30KB(TLS上下文消耗)
TCP不加密/每连接 X + 30KB(连接消耗)
TCP加密/每连接 X + 30KB(连接消耗) + 30KB(加密消耗)
TLS不加密/每连接 X + 30KB(TLS上下文消耗) + 30KB(连接消耗)
TLS加密/每连接 X + 30KB(TLS上下文消耗) + 30KB(连接消耗)+ 30KB(加密消耗)
使用PSRAM TLS 上下文和加密全部进 PSRAM,每会话约消耗20KB

使用建议(nps_client

  • 对于没有PSRAM的设备,如c3,建议使用TCP模式,不开启加密,每条连接消耗30KB
  • 对于具有PSRAM的设备,如s3 ,可以按需使用TLS模式,不开启加密,每条连接消耗20KB
  • 不建议开启加密,TLS模式本身已存在加密功能,再开加密双重消耗,且没有收益,如不需要加密,直接TCP即可

5. 安全性与使用边界

  • 通过nps代理的端口,将直接暴露到公网,务必设置好OTA密码、API密钥、WEB登录验证!!!!

  • 本组件不做证书CA校验,nps 桥接 TLS 为自签证书设计,客户端不做 CA/指纹验证,请在可信网络使用

  • Proxy Protocol 由服务器生成、后端消费:ESP32 仅透传;后端不支持解析时不要开启,否则协议会坏(HTTP 尤其明显)

6. 配置示列

引入组件

external_components:
  - source:
      type: git
      url: https://github.com/xxxxxxxx #本仓库地址
      ref: main
    components:
      - nps_client
      - nps_client_origin
    refresh: always

配置示列

nps_client:  #组件名,djylb/nps使用nps_client,原版ehang-io/nps使用nps_client_origin

  connection_enabled:      #npc功能总开关,switch实体
    name: "NPC Enabled"
    entity_category: "config"
    restore_mode: RESTORE_DEFAULT_ON

  server_text:              #nps服务器地址,text实体
    name: "NPS Server"
    initial_value: "nps.xxxxx.cn"  #可选配置初始化地址,支持ip与域名,用于开箱即用场景
    entity_category: "config"

  tcp_port_text:            #nps服务器tcp桥接端口,text实体
    name: "NPS TCP Port"
    initial_value: "8024"     #可选配置初始化端口,用于开箱即用场景
    entity_category: "config"

  tls_port_text:           #nps服务器tls桥接端口,text实体,仅nps_client可使用,nps_client_origin不要配置
    name: "NPS TLS Port"
    initial_value: "8025"   #可选配置初始化端口,用于开箱即用场景
    entity_category: "config"

  mode_select:            #npc桥接模式,select实体,仅nps_client可使用,nps_client_origin不要配置
    name: "NPS Mode"
    initial_option: tls   #可选配置初始化模式tls/tcp,用于开箱即用场景
    entity_category: "config"

  client_vkey_text:        #npc连接密钥key,text实体
    name: "NPS Vkey"
    mode: PASSWORD
    initial_value: ${nps_client_key}  #可选配置初始化key,用于开箱即用场景
    entity_category: "config"

  legacy_version_text:       #nps服务器版本,select实体,可选配置,仅nps_client_origin可使用,不配置时组件会自动遍历匹配,建议不配置此实体
    name: "NPS Version"
    initial_value: "0.26.0"   #0.26.x 服务端为 "0.26.0"(默认值,无需配置),更老版本按对应服务端实际核心版本填写(如 0.25.x 为 "0.25.0")
    entity_category: "config"

  config_apply_button:       #npc配置应用按钮, button实体
    name: "NPC Config Apply"
    entity_category: "config"

  config_rollback:             #npc坏配置回滚,switch实体
    name: "NPC Bad Config Rollback"
    entity_category: "config"
    restore_mode: RESTORE_DEFAULT_ON

  connection_status:         #npc连接状态,binary sensor实体
    name: "NPC Status"
    device_class: connectivity
    id: nps_connection_status
    entity_category: "diagnostic"

  connection_duration:   #npc连接时长,text sensor实体
    name: "NPC Connection Duration"
    id: nps_connection_duration
    entity_category: "diagnostic"

配置补充

  • switch、text、select等实体,支持esphome官方相关的Action动作和Condition判断
  • binary sensor、text sensor支持esphome官方相关的on_xxxx触发器
  • API配置,必须配置加密密钥!如需使用esphome cli logs ,将api_port设置与代理端口一致
api:
  reboot_timeout: 0s
  encryption:
    key: ${api_ota_key}
  port: ${api_port}
  • OTA设置,必须配置密码!,如需使用 esphome cli run来ota,将ota_port设置与代理端口一致
ota:
  - platform: esphome
    password: ${ota_key}
    port: ${ota_port}
  • Web设置,必须配置登录信息!,端口可保持默认(不显式配置即可)
web_server:
  auth:
    type: basic
    username: ${web_user}
    password: ${web_passwd}
  • HA、Web实体示列

    HA与Web的实体是一致的,此处演示HA界面
    image-20260820202733-nbja1b3.png

7 连接到NPS并设置代理隧道

配置NPC参数并连接

  • 如连接正常,nps服务器-客户端面板就会显示节点状态
    image-20260820002735-urzgrk6.png

  • HA实体也会同步连接状态
    image-20260820002856-ykl8vic.png

  • 注意客户端配置,不要开启加密和压缩,如需加密,将桥接模式切换到TLS

添加TCP隧道

服务端端口按你实际来,目标 (IP:端口)一般可设置下面几个

  • api端口:127.0.0.1:6053,用于HA接入和日志调试
  • OTA端口:127.0.0.1:3232, 用于远程OTA
  • Web端口: 127.0.0.1:80,用于远程访问web,注意公有云没备案,只能用ip+端口或https域名+端口访问,不能http域名+端口访问
  • image-20260820003513-cpcng0x.png

将外网esphome设备接入HA

  1. 进入HA的esphome集成,右上添加设备
  2. 按提示填写主机地址和端口,主机地址可以是nps服务器公网ip和域名,端口是nps对应的转发端口
  3. 点击提交,会让你输入固件预设的api密钥
    image-20260820003856-fbstw8w.png



评分

参与人数 5金钱 +70 HASS币 +20 收起 理由
pengguilian + 8 感谢楼主分享!
kaka0992 + 10 高手,这是高手!
admin + 20 + 20 牛而逼之!
DDDear + 12 膜拜大神!
sorrypqa + 20 感谢楼主分享!

查看全部评分

全网同名,只发干货
回复

使用道具 举报

22

主题

844

回帖

4992

积分

论坛元老

HomeAssistant

积分
4992
金钱
4121
HASS币
30
发表于 2026-8-20 08:16:29 | 显示全部楼层
学习一下
回复

使用道具 举报

69

主题

1806

回帖

2万

积分

元老级技术达人

积分
21549
金钱
19664
HASS币
80
发表于 2026-8-20 08:17:22 | 显示全部楼层
大佬的战斗力真是惊人的,昨天刚说的,今天就搓出来了……
回复

使用道具 举报

0

主题

30

回帖

409

积分

中级会员

积分
409
金钱
379
HASS币
0
发表于 2026-8-20 09:04:29 | 显示全部楼层
新入坑esphome的小兄弟,双侧(Homeassistant 和 esp32开发板)都没有公网IP映射的,可以试试这个tailscale教程:
esphome固件安装到esp32开发板上后,直接就可以当客户端节点加入tailscale,且可以通过esphome的use_address:指定esp32开发板获得的虚拟地址,跨公网远程OTA升级。
我记得tailscale组网限制免费版最多25个设备(有点记不住了),足够用来
https://bbs.hassbian.com/thread-32958-1-4.html
回复

使用道具 举报

3

主题

20

回帖

104

积分

注册会员

积分
104
金钱
81
HASS币
0
发表于 2026-8-20 10:22:33 | 显示全部楼层
ESPHome web  弱密码 会被别人爆破吗
回复

使用道具 举报

29

主题

367

回帖

2836

积分

金牌会员

积分
2836
金钱
2440
HASS币
0
发表于 2026-8-20 10:44:53 | 显示全部楼层
学习一下
回复

使用道具 举报

69

主题

1806

回帖

2万

积分

元老级技术达人

积分
21549
金钱
19664
HASS币
80
发表于 2026-8-20 11:25:03 | 显示全部楼层
本帖最后由 sorrypqa 于 2026-8-31 10:34 编辑

刚刚试了一下,NPS用起来就是爽,设备OTA完服务端立即显示在线,服务端的WEB控制台想怎么配置就怎么配置,为所欲为,这是目前为止ESPHome上最完美的内网穿透组件,没有之一,只是djylb/nps这分叉不兼容原版NPS真是件麻烦的事,这个组件连接不了原版服务端,用新版服务端嘛!之前的客户端全部失联,想把客户端全换吧!HAOS目前又找不到这个版本的客户端,之前一直使用dscao大佬https://github.com/dscao/hassio-addons中的NPS客户端,并不能连接这个djylb/nps服务端,真是左右为难。

SNAG-2026-8-28_00000.png
回复

使用道具 举报

0

主题

259

回帖

3392

积分

论坛元老

积分
3392
金钱
3133
HASS币
0
发表于 2026-8-20 11:54:25 | 显示全部楼层
内网穿透的方法很多,核心还是看速度与安全,感谢大神分享
回复

使用道具 举报

81

主题

418

回帖

4808

积分

元老级技术达人

积分
4808
金钱
4269
HASS币
230
 楼主| 发表于 2026-8-20 13:27:50 | 显示全部楼层
sorrypqa 发表于 2026-8-20 11:25
刚刚试了一下,NPS用起来就是爽,这是目前为止ESPHome上最完美的内网穿透组件,没有之一,只是djylb/nps这 ...

正在制作原版nps协议的版本分支
全网同名,只发干货
回复

使用道具 举报

3

主题

65

回帖

1468

积分

金牌会员

积分
1468
金钱
1400
HASS币
0
发表于 2026-8-20 14:22:10 | 显示全部楼层
前来学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )|网站地图

GMT+8, 2026-9-9 17:42 , Processed in 0.025058 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表