配置端口
通过在 .ironflock/ 目录中创建 port-template.yml 文件来定义应用暴露哪些服务用于远程访问。
基本示例
ports:
- name: Web Interface
port: 5000
main: true
protocol: https这将使端口 5000 可用于远程访问。在生产设备上安装应用时会开启其隧道;拥有网络权限的用户可以在设备的应用设置中将其关闭并重新开启。
完整示例
ports:
- name: Web Interface
port: 1100
main: true
protocol: http
- name: Video Stream
port: 1200
protocol: http
- name: Remote Desktop
port: 5900
protocol: tcp
- name: LoRaWAN Gateway
port: 1700
protocol: udp字段参考
| 字段 | 必填 | 说明 |
|---|---|---|
name | 是 | 在设备应用设置中显示的标签 |
port | 是 | 服务监听的本地端口号 |
main | 否 | 如果为 true,该端口用于设备应用列表上的快速访问图标 |
protocol | 否 | http(默认)、https、tcp 或 udp |
remote_port_environment | 否 | 仅限 TCP 和 UDP:一个额外的变量名,设备代理会在 REMOTE_PORT_FOR_<port> 之外,同时以该名称公布隧道的远程端口。0.19.8 之前的设备代理只以该名称公布 |
注入的环境变量
对于您声明的每个端口,平台都会向应用的容器注入环境变量,使您的代码无需硬编码地址即可发现服务的实际可达位置:
| 变量 | 说明 |
|---|---|
DEVICE_LAN_IP | 设备在本地网络中的 IP 地址 |
DEVICE_PORT_FOR_<port> | 您声明的端口在本地网络上发布时所使用的设备端口 |
REMOTE_PORT_FOR_<port> | 隧道激活期间由隧道服务器分配的公共端口(TCP 和 UDP;设备代理 0.19.8 及以上)。0 表示尚未分配 |
REMOTE_PORT_FOR_<port>_CLOUD | 当设备运行在通过云端转发隧道的 IronFlock 实例上时面向互联网的端口(TCP 和 UDP) |
TUNNEL_DOMAIN | 用于组合设备隧道 URL 的域名:在云端为 app.ironflock.com,在本地一体机上为一体机的域名,在以无域名方式安装的一体机(纯模式)的边缘设备上为 localhost |
INSTANCE_KEY | 仅在属于本地一体机(实例)的设备上设置:该设备经云端转发的隧道 URL 中所携带的键 |
<port> 是您在 port-template.yml 中声明的端口号。以上面的 Remote Desktop 示例为例,应用会收到 DEVICE_PORT_FOR_5900,并且在其隧道激活期间还会收到 REMOTE_PORT_FOR_5900。IronFlock SDK 会通过 getRemoteAccessUrlForPort 根据这些变量组合出端口的远程访问 URL。平台不会设置 CLOUD_TUNNEL_DOMAIN:除非您的应用自行设置该变量,否则经云端转发的 URL 使用 app.ironflock.com。
隧道仅存在于生产安装中。开发(DEV)容器没有属于自己的隧道和远程端口——请改为在设备的本地网络上访问它(DEVICE_LAN_IP、DEVICE_PORT_FOR_<port>)。
多个应用可能在同一台设备上同时运行,因此声明的端口会自动映射到设备上的空闲端口。请始终使用注入的值来组合本地网络地址,而不要假设服务使用声明的端口:
import os
lan_ip = os.environ.get("DEVICE_LAN_IP")
lan_port = os.environ.get("DEVICE_PORT_FOR_5900")
# 服务可通过本地网络在 {lan_ip}:{lan_port} 访问这些变量在容器启动时设置。隧道端口在应用运行期间可能发生变化(例如隧道重新连接时),因此隧道端口变量(REMOTE_PORT_FOR_<port>、与之对应的 _CLOUD 变量以及自定义的 remote_port_environment 名称)还会以文件形式保存在 /data/env/<VARIABLE_NAME>.txt 下并保持最新——IronFlock SDK 会自动读取这些文件。其他变量只在容器重启时才会变化。
当云端端口消失时(云端转发被关闭),设备代理会删除对应的 _CLOUD 文件。因此,只要代理的文件存在,缺失或为空的 _CLOUD 文件就表示没有云端端口,SDK 不会回退到容器启动时的旧值。
代理将 /data/env 设为仅 root 可读。以其他用户身份运行的容器无法读取这些文件:它只能看到启动时的值——看不到此后发生变化的隧道端口——并且 SDK 会记录一次警告。
协议工作方式
HTTP / HTTPS
用于基于 Web 的服务。IronFlock 在隧道域名上创建一个 URL,将流量代理到设备的本地端口。用户在浏览器中打开该 URL。该 URL 是私有的:只有登录 IronFlock 且有权访问该设备的用户才能打开它,除非该端口被切换为公开。
TCP
用于 VNC(远程桌面)或直接套接字连接等协议。IronFlock 在隧道服务器上分配一个远程端口,并通过 REMOTE_PORT_FOR_<port> 暴露给您的应用;随后即可通过 tcp://<TUNNEL_DOMAIN>:<remote port> 访问该服务。
UDP
用于 LoRaWAN 通信或 VPN 隧道等协议。与 TCP 类似——分配远程端口并通过 REMOTE_PORT_FOR_<port> 暴露。
嵌入到看板
您可以使用 Embed Widget 将设备的远程访问隧道直接嵌入到看板中。这创造了无缝的使用体验,用户可以:
- 监控所有设备的全局数据
- 通过嵌入的 Web UI 与单个设备交互
所有操作在同一个仪表板中完成。
在生产设备上安装应用时,会开启其
port-template.yml中每个端口的隧道。HTTP 和 HTTPS 隧道保持私有——只有登录 IronFlock 且有权访问该设备的用户才能打开——除非某个端口被切换为公开。TCP 和 UDP 隧道是隧道服务器上的原始端口,前面没有任何登录保护,因此应用必须自行验证其客户端的身份。对设备拥有网络权限的用户可以关闭隧道并重新开启;参见管理隧道。