# 远程访问

> 远程访问页面：把本工作站的仪表画面开放给网络上的其他设备，可以选择走 HTTPS，谁可以使用，此刻已连接的浏览器，按自己的方式打开的已配置平板和电脑，以及每次改动都要付出的那次重启。

远程访问是一个独立的页面，是导航栏底部那组里紧跟在[代理](agent)之后的条目，只对拥有**查看远程访问**的角色显示；`/remote-access` 路由也受同一权限保护。关着的时候，工作站的 Web 宿主只在本地回环地址上答复它自己那台机器，桌面窗口本身就是这样把界面画出来的，网络上没有任何东西在监听。打开之后，工作站的每一个网络地址也都被绑上，同一局域网上的平板电脑或者另一台 PC 就能在浏览器里打开同一个界面。页面在标题下面说明它是什么：“在你网络中的电脑和平板电脑的浏览器里打开本工作站的仪表画面。它只接受连接，从不主动连接。”页面上有三张卡片：**状态**、**配置**和**客户端访问**。**查看远程访问** 能读这些卡片，**配置远程访问** 能打开和关闭远程访问并更改它的设置。每一次改动都会重启那台正在绘制你眼前这块屏幕的 Web 服务器，所以每一项都先问一句。

## 打开与关闭 {#on-and-off}

页面顶部的栏在图标旁边显示它的状态：“已关闭”、“正在端口 18760 上监听”、改动之后 Web 服务器回来期间的“正在启动…”、“没有网络地址”或者“无法启动”。远程访问关闭时它的圆点是灰色，其他设备能连到工作站时是绿色，正在启动或者没有地址可给时是琥珀色，网络被拒绝时是红色。

命令栏上的**启用**和**禁用**把它打开和关闭。新工作站上它是关着的。打开：Web 宿主在本地回环地址之外，把工作站的每一个局域网地址也绑上，应用添加一条名叫“Ganter Lab Dashboard”的 Windows 防火墙规则（端口上的入站 TCP，专用和域配置文件，只限本地子网），并装上一份放行名单，拒绝私有地址段以外的任何来源。关闭：只绑本地回环，规则被删除。没有“配置远程访问”的角色看不到这两个命令，只能读卡片而不能更改。远程访问已经处于某个命令对应的状态时，那个命令仍然画着，变灰并说明原因。单元运行期间或者运行时停止期间，两个命令和各项设置也都同样变灰，这和整个 [Connector](connector#engineering-boundaries) 一样；在已发布的演示上也是如此，它的地址在启动时就已确定：“这个演示的地址在启动时就已确定，因此不能在这里更改远程访问。”

## 四项设置 {#the-settings}

| 字段 | 它是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| 通过 HTTPS 提供服务（自签名证书） | 只在远程访问打开时画出来。用工作站给自己做的一份证书加密局域网上的流量。 | 开或关。默认关闭。 | 开：局域网地址提供 HTTPS；本地回环地址仍然是普通 HTTP，所以桌面窗口从不受影响。每台设备第一次都会要求你接受本工作站的证书。 |
| 端口 | “本工作站监听的网络端口。更改它会重启 Web 服务器：此画面会自行重新加载，而在别处打开的仪表画面必须用新地址重新打开。” | 1 到 65535。默认 18760。 | 本地回环和局域网共用的那个端口。这个字段在你离开它或者按下回车时提交，从不逐键提交。不是整数的文字，以及本来就在用的那个端口，都会不声不响地退回到正在生效的值。工作站搬不过去的端口，会在保存任何东西之前被拒绝：原因写在字段下方，字段退回到正在生效的端口，什么也不会重启。被拒绝的有六种，按这个顺序检查：超出范围的数字，不论有多少位（“监听端口必须在 1 到 65535 之间。”）；在[代理](agent)页面上为代理访问设定的端口，无论代理访问是开是关（“端口 N 已经被代理访问占用。请另选一个端口，或者先移动代理访问。”）；[配置](connector-opcua-configuration)上 OPC UA 服务器的端口，无论服务器正在运行还是已经停止（“端口 N 已经是 OPC UA 服务器的端口。请另选一个端口，或者先移动服务器。”）；Connector 页面上[Modbus 服务器](connector-modbus-server)的端口，无论服务器开着还是关着（“端口 N 已经是 Modbus 服务器的端口。请另选一个端口，或者先移动 Modbus 服务器。”）；Connector 页面上[MQTT Broker](connector-mqtt-broker)的端口，无论 Broker 开着还是关着（“端口 N 已经是 MQTT Broker 的端口。请另选一个端口，或者先移动 MQTT Broker。”）；以及这台计算机上已经被别的东西占着的端口（“端口 N 在这台计算机上已被占用。请关闭占用它的程序，或者另选一个端口。”）。在字段不拒绝的下一次输入到来之前，原因一直留在字段下方。 |
| 本工作站应答的名称 | “除非本工作站是用它自己的名称打开的，例如一个 DNS 别名，或者它前面那台反向代理的名称，否则请留空：以其他任何名称到达的请求都会被拒绝。名称之间用逗号分隔，并且只写名称，前面不加 http://，不写端口，也不写路径。” | 用逗号分隔的一串主机名。默认为空。 | 每个名称都会加入工作站应答的那一套里，与它绑定的地址和它自己的机器名并列，无论远程访问是开是关。这个字段在你离开它或者按下回车时提交；不是主机名的条目会在字段下方被拒绝，什么也不会保存。 |

**状态**卡片显示工作站在哪里能被连到。远程访问关闭时，它显示“远程访问已关闭：只有这台电脑能打开本工作站的仪表画面，网络上没有任何端口在监听。”在有网络地址的工作站上，下面接着以灰色显示它将给出的二维码和地址，标题是**打开远程访问后，在另一台设备上打开**：“远程访问打开之前，这个二维码和这个地址打不开任何东西。打开之后，同一网络中的浏览器扫描二维码或输入这个地址即可打开工作站：”。这个地址是这台电脑的第一个网络地址，读取方式与远程访问打开时宿主读取的方式相同，所以它就是宿主最先绑定的地址；在没有网络地址的工作站上，卡片只显示那句话。打开时，它显示三样东西之一。

- **在另一台设备上打开**：一个二维码和要输入的地址，`http://<address>:<port>/`（或者 `https://`），其中的地址是宿主启动时绑上的第一个局域网地址。在同一网络的浏览器里扫码或者输入它。
- “本工作站还没有接入网络。把它接入厂区网络，才能得到一个可以分享的地址。”：远程访问是开着的，但宿主启动时工作站没有局域网地址，所以只绑了本地回环，也没有创建防火墙规则。这项设置保持打开，出现地址时宿主会重新绑定。
- **远程访问不可用**，一条警示提示条：请求了 HTTPS，而证书没能加载也没能创建。提示条带着原因：“远程访问没有启动，因为它的 HTTPS 证书没能加载也没能创建。loopback 访问仍然可用；请查看事件，然后改动远程访问设置以重试。”工作站绝不会自己退回到普通 HTTP，宿主启动时那条“远程仪表画面不可用”的通知说的也是同一件事。

只要卡片显示二维码，无论远程访问关闭还是打开，下面都有一行给出在工作站自己的电脑上打开工作站的地址，即工作站监听端口上的 `http://localhost:<端口>`。不管远程访问处于什么状态，这个地址都会应答，因为它就是工作站窗口本身所用的本地回环地址；从那里用浏览器进入的人使用“未登录”角色。

| 阅读页面的地方 | 这一行 |
|---|---|
| 工作站自己的窗口 | “在这台电脑的浏览器里打开 `http://localhost:<端口>`：无需打开任何开关，工作站在这里已经可以打开。”，地址是一个链接，会在 Windows 默认浏览器中打开 |
| 浏览器，无论在这台电脑还是另一台 | “在工作站所在的计算机上，用浏览器打开 `http://localhost:<端口>`：在那里，无需打开任何开关，工作站已经可以打开。”，地址只是文字，因为在平板上 localhost 就是平板自己 |

在已发布的演示上，它显示“这是已发布的演示：访客通过打开它时所用的地址访问它。”

**客户端访问**卡片说明谁可以进来：其他设备上的浏览器用它自己的登录进来，而且只有在它的角色拥有**远程访问（局域网）**时才行（见[谁可以打开仪表画面](#who-may-open-a-dashboard)）。远程访问打开时，它还在 **Windows 防火墙** 下显示“Ganter Lab Dashboard”规则的状态，这条规则还没建起来时提供**放行本地网络**；只有工作站自己的窗口能按它（见[防火墙规则与地址监视](#the-firewall-rule-and-the-address-watch)）。

## 应用一次改动：那次重启 {#applying-a-change-the-restart}

**启用**、**禁用**、HTTPS 开关、一个新端口或者一份新的名称清单，都会打开**要重启 Web 服务器吗？**这个窗口。它那一段说明代价，末尾是“此画面就是由那个服务器绘制的，因此它会停顿几秒钟，然后自行恢复。”：

- **启用**：“在其他设备上打开仪表画面会重启 Web 服务器。”；
- **禁用**：“关闭在其他设备上打开仪表画面会重启 Web 服务器，通过网络读取本工作站的设备也将无法再连上它。”；
- 打开 HTTPS：“改用 HTTPS 提供服务会重启 Web 服务器，而且每台设备第一次都会要求你接受本工作站自己的证书。”；关掉 HTTPS：“重新改用普通 HTTP 提供服务会重启 Web 服务器。”；
- 换一个端口：“把本工作站移到端口 N 会重启 Web 服务器。”；
- 声明了名称：“按这些名称应答会重启 Web 服务器。”；清空字段：“改回只按本工作站自己的地址应答会重启 Web 服务器。”

**取消**什么也不保存：远程访问和 HTTPS 开关和提问期间一样，停在工作站实际在听的那一套上；端口字段和名称字段则放回工作站实际在听、实际在应答的那一套。**应用并重新加载**保存设置；应用随后删掉旧的防火墙规则、停下宿主、用新选项启动它，再把规则重新建起来。这期间，一张标题为**正在重启 Web 服务器**的罩子盖在应用上面：桌面窗口上写“工作站一恢复响应，画面就会自行回来。”，浏览器里写“新地址一响应，画面就会自行回来。”，后面还跟着“浏览器的会话随重启一起结束，画面回来后要重新登录。”，两边都写“采集、记录和 OPC UA 服务器全程继续运行。”浏览器每半秒探一次新地址，最多探三十秒，一有响应就过去；超时还没有响应，罩子就让开，由那块寻常的重连画面接手，上面有重试和重新加载。桌面窗口把它自己那个视图重新指过去。提出改动的那一位就是等着的那一位；其余每一台设备只是断开连接然后重连。一个把远程访问关掉的浏览器，按它自己的选择，已经没有什么可以回来的了。

## HTTPS 和它的证书 {#https-and-its-certificate}

这份证书是自签名的，签发给“Ganter Lab Dashboard”，有效期五年，里面列着 `localhost`、`127.0.0.1` 以及制作它时工作站拥有的每一个局域网地址。它作为 `dashboard-cert.pfx` 存在工作站的数据根目录下，在它丢失、读不出来、离到期不足一天，或者已经不覆盖工作站的某个地址时重新制作。浏览器不会自己信任它：每台设备各自显示一次自己的警告，你在那里接受工作站的证书。不走 HTTPS 的话，登录 PIN 是明文过网络的，工作站通过网络显示的其他任何内容也一样，包括[配置](connector-opcua-configuration)上的 OPC UA 服务器用户名；在那里敲进去的密码进来时一样是明文，不过存下来的那个从不发给浏览器。

## 防火墙规则和地址守望 {#the-firewall-rule-and-the-address-watch}

“Ganter Lab Dashboard”这条规则，是应用在落实这项设置时用 `netsh` 创建和删除的。创建规则需要提权，而应用并不假定自己有：失败会记进诊断日志并被咽下去，因为绑定和私有地址段的放行名单本来就把宿主圈住了，Windows 那时会改为显示它自己的“允许访问”提示。规则在每一次改动时都被丢掉再重建，所以不会留下一条指着旧端口的过时规则。把数据文件夹换到自己专用文件夹的演示或测试启动，既不创建也不删除这条规则：规则的名字属于整台机器，删除它会让已安装的程序失去远程访问。未安装的程序副本（例如开发版本）出于同样的原因，也不会动这条规则。

工作站的地址可能在宿主运行期间挪动（换了一份 DHCP 租约、从 Wi-Fi 换到网线、插上扩展坞）。应用守着它们，并在远程访问开着的时候，按当前地址重新绑定宿主，证书不再覆盖它们时也一并续签；地址卡片跟着走。

## 用你自己的名称打开工作站 {#opening-the-station-by-a-name-of-your-own}

工作站自己知道两类名称：它绑定的地址，以及 Windows 为这台机器登记的名称。有两种部署会给它第三类名称，而这一类它无从知道。一种是 DNS 别名，厂区自己的 DNS 把一个好记的名称指向工作站的地址。另一种是反向代理，工作站前面的一台服务器接下连接再转发过来。两种情形里，浏览器都会把那个名称写进请求，工作站拿它和自己公布的那一套比对，没有人声明过的名称在任何画面被画出来之前就以 `403` 挡下。**本工作站应答的名称**就是写下它的地方：名称要和浏览器发出的一模一样，一个名称接一个名称、中间用逗号隔开，此外别写任何东西，因为字段里的协议、端口或路径都是任何请求都不可能带上的名称。

这份名单在 Web 服务器每次启动时读取，所以一次改动是通过与这里其他设置相同的那次重启生效的。它不跟随远程访问的状态。跑在工作站本机上的代理转发到本地回环地址，而本地回环地址无论远程访问开着还是关着，工作站都一直留着；网络上别处的代理则要远程访问打开才够得着工作站。只声明真正通到这里的名称：每多加一个名称，浏览器里的页面就多了一个可以用来指向本工作站的名称。

## 谁可以打开一幅仪表画面 {#who-may-open-a-dashboard}

第一个问题不是谁在问，而是这条请求写的是什么地址。工作站在自己的机器上以 `127.0.0.1` 应答，也在**本工作站应答的名称**里声明的每一个名称上应答；远程访问打开时，还在它绑定的每一个局域网地址和这台机器的网络名上应答。写着别的主机名的请求，或者以别的站点的页面作为来源的请求，在任何画面、文件或连接被送出之前，就以 `403` 和一行“本工作站只在自己公布的地址上响应。”被拒绝。这就是让你恰好访问到的某个网站没法借你的浏览器操纵这台工作站的东西：那样的页面可以把自己的域名指向这台机器，却决定不了浏览器替它写进请求里的地址，而且这次尝试会记进 Events。代理访问的接入点用的是同一条规则，来拒绝它自己的调用方。

Web 宿主提供的是整个界面，不只是仪表画面，而每一个浏览器都是它自己的一条连接，带着它自己登录的用户。一个身份到底能不能从网络上进来，看的是[用户](users)页面上它那个角色的**远程访问（局域网）**权限：身份没有这一项的浏览器看不到任何页面，只看到那块登录面板，直到有持有这一位的人在上面登录。**未登录**角色默认是关着这一项的，所以打开远程访问并不会共享任何东西，直到有用户登录，除非你为一台自助终端或者平板有意把这一位给了那个角色。工作站自己机器上的浏览器从不受它把关。从那里往后，其余的一切都由登录的角色决定，和在工作站窗口上完全一样；见[登录](users-signing-in)。

## 已连接的浏览器和已配置的设备 {#connected-browsers-and-configured-devices}

机器旁边的平板或车间里的电脑每天都会打开工作站的地址。**客户端访问**卡片在**当前已连接**下列出每一个从网络上打开着工作站的浏览器，并能把其中任意一个变成已配置的设备：工作站从此认得它，并按它所在行的设置打开它，打开在它自己的画面上，愿意的话锁定在那里，自己登录，无人操作一段时间后回到起始，或者仅可查看。设备照旧打开工作站的地址：没有为它准备的二维码或配对链接。

### 当前已连接 {#connected-now}

“此刻从另一台电脑或平板打开本工作站的每个浏览器，无论已登录还是仍停在登录画面。这台电脑自己的窗口不在其中。”工作站本机上的浏览器同样不在其中。每一行按浏览器自己报出的样子写出浏览器和它的系统（“Windows 上的 Chrome”、“iPad 上的 Safari”），已配置的设备则写出它的名称，下面一行是它的地址、它打开着的页面（还没有登录时是**停在登录画面**）、谁在上面登录（没有人时是**未登录**）以及从何时起。没有人时，这一组显示“此刻没有来自另一台电脑或平板的浏览器连接。”

对拥有配置远程访问 的角色，每一行带两个操作：

| 操作 | 它做什么 |
| --- | --- |
| **识别** | “在这个浏览器的屏幕上显示一个大号代码 30 秒，并在这一行显示同一个代码，让你分辨这一行是哪台设备。”设备的屏幕在代码旁边显示**工作站正在识别这台设备**和“请确认这个代码出现在工作站屏幕上正确的那一行旁边。”，并带**关闭**。什么都不保存。 |
| **配置这台设备** | 画在工作站还不认识的浏览器上。“给这个浏览器一把密钥，让工作站从此认得它，并把它列在已配置的设备中。它的画面会重新加载一次。”之后设备以它的浏览器命名，列在**已配置的设备**下，若另一台设备已经用了这个名称，名称后面会加一个编号，它的那一行随即打开供编辑。 |

### 设备的密钥 {#the-devices-key}

配置设备从不在任何地方显示密钥。工作站通过那个浏览器自己的连接，把它送到一个只能用一次的地址，这个地址把密钥写进该浏览器的一个任何页面都读不到的 Cookie，画面重新加载一次。工作站只保存密钥的哈希；浏览器若在重新加载之前离开，什么都不保存；设备每加载一个页面都会续期这个 Cookie，所以正在使用的设备会一直保有它的密钥。密钥属于那个浏览器，也属于打开工作站时用的那个地址：被清除或重置的浏览器、同一台平板上的另一个浏览器，或者用工作站的另一个地址打开的，都重新成为未知浏览器，回到当前已连接中，需要重新配置。走普通 HTTP 时，密钥像登录 PIN 一样穿过网络；[HTTPS](#https-and-its-certificate) 两者都保护。

### 已配置的设备 {#configured-devices}

“每台设备都保存着本工作站交给其浏览器的密钥，并按其所在行的设置打开。被清除或更换的浏览器会丢失密钥，作为未知浏览器回到当前已连接中。”每一行有一个圆点（设备连接期间为绿色）、它的名称，以及说明它如何打开的一行：**此刻已连接**或**未连接**；然后是“在 炉子总览 上打开”、“锁定在 炉子总览”或**像任何浏览器一样打开**；然后是“以 Vera 登录”或**要求登录**；是仅查看时有**仅查看**；会返回时有“5 分钟无人操作后返回起始”。当它指向的东西变了，行下面的一条说明会告诉你设备改为怎样做：

- “它的固定用户已被删除，因此要求登录。”
- “Vera 的角色不再拥有远程访问（局域网），因此要求登录。”
- “它的起始画面已被删除，因此在 View 上打开，周围是完整的程序，不再锁定。”

按下一行会在它下面打开它的设置。每一项在你离开字段或拨动开关时立即保存，并马上送达设备上打开着的画面。

| 字段 | 它是什么 | 取值 / 默认值 | 效果 |
| --- | --- | --- | --- |
| **名称** | “工作站列出这台设备时用的名称，也是诊断日志在从它做的每件事旁边记下的名称。” | 任意文本；起初是浏览器的名称。 | 在列出设备的每个地方改名。 |
| **起始画面** | “这台设备打开时和返回时显示的画面。没有设置时，它像任何浏览器一样打开。” | **无起始画面**（默认）或工作站的某个画面。 | 设备在它上面打开。之后若这个画面被删除，设备改为在 View 上打开，并带上面那条说明。 |
| **锁定在起始画面** | 设备停留在它的画面上（见[在设备上](#on-the-device)）。 | 默认关闭。 | 选好起始画面之前变灰，并注明“请先选择起始画面：设备会锁定在它上面。”；清除起始画面会解除锁定。 |
| **这台设备上的登录** | 没有人在上面登录时，设备是谁。 | **要求登录**（默认）或一位角色拥有远程访问（局域网）的本地用户；不提供其他用户。 | 设备不经登录就以这位用户进入。对没有管理本地用户的角色变灰：“选择设备以谁的身份登录，除了配置远程访问 还需要管理本地用户。” |
| **返回前的时间（无人操作的分钟数）** | “无人操作达到这个分钟数后，设备返回起始画面和固定用户。留空：从不返回。” | 1 到 1440，或留空。默认留空。 | 一次触摸、一次按键或指针移动都会让计时重新开始。 |
| **仅查看** | “任何人都不能从这台设备发出任何命令，即使在其上登录的管理员也不行：命令仍然显示，变灰并注明原因。” | 默认关闭。 | 设备上的每个命令都显示“这台设备仅可查看。” |

行上的**忘记**在显示“忘记“3 号线平板”？”和“它的浏览器仍保留密钥，但本工作站不再认得它：在重新配置之前，它像任何浏览器一样要求登录。此操作无法撤消。”，并带**忘记**和**保留**之后删除设备。那台设备上打开着的画面立刻变成未知浏览器。

### 在设备上 {#on-the-device}

有起始画面的设备在它上面打开。锁定时，它像 View 的展开模式那样绘制：没有导航栏，没有标题栏，也没有别的页面；只有画面在全屏时也保留状态栏，才显示状态栏；在它上面输入任何别的地址都会把它带回起始画面。设为**打开另一张仪表画面**的按钮是通往另一个画面的唯一途径，当前角色看不到的画面始终够不到。状态栏仍然报告健康状况、报警和录制，但不通往任何地方。右上角一个不显眼的**登录**键打开平常的登录窗口；有人在设备用户之上登录期间，它显示那个人的名字，它的窗口会让那人再次退出登录。设备上没有任何东西能解除锁定：设备在这里修改。

固定用户、在其上登录、无人操作若干分钟后返回以及仅查看对谁在登录有什么作用，写在[登录](users-signing-in#configured-devices)里。诊断日志为从已配置设备做的事保留的每一条记录都带着它的名称，在[控制台](events-console)的记录详情中读作**远程设备**，导出时有单独的一列。

浏览器不能自己进入全屏，页面也不能让它一直保持全屏：那是设备自己的展台模式。在 iPad 上是引导式访问（在设置的辅助功能中打开，然后在 Safari 打开时连按三次侧边按钮或主屏幕按钮）；在 Android 上是安全设置里的屏幕固定，或者一个展台浏览器；在 Windows 电脑上，是用 `--kiosk` 加工作站地址启动的 Chrome 或 Edge，或者 Windows 的分配的访问权限。

### 谁可以修改它们 {#who-may-change-them}

查看远程访问 读取这两个列表。配置远程访问 识别、配置、修改和忘记设备，而选择固定用户还需要管理本地用户，这样只配置远程访问的角色就不能把一位管理员放到平板上。正在运行的单元或停止的运行时会把这些操作和字段变灰并注明原因，和 [Connector](connector#engineering-boundaries) 上一样。代理用 `remote_access_devices` 读取这两个列表，用 `remote_access_device_update` 修改设备的设置，但从不修改它的固定用户。公开的演示版两个都不列出：“演示版不列出连接到它的浏览器，也不列出任何设备：它的访客是其他人。”

## 远程浏览器做不了什么 {#what-a-remote-browser-cannot-do}

有几个动作只存在于工作站自己的桌面上，在浏览器里保持变灰，写着“仅在工作站本机的桌面应用中可用。”：打开备份文件夹、重启以接受更新，以及从警告计数打开拆出去的事件窗口。桌面缩放那一行根本不画出来。[客户端访问](connector-opcua-client-access)和[现场设备访问](driver-opc-ua#equipment-access)上的信任、阻止、撤销和导入证书，以及 OPC UA 的防火墙按钮，在浏览器里被拒绝：“客户端访问只能在工作站本机的桌面应用中更改。”其余的一切，包括这些远程访问设置本身，都听登录的那个角色。

## 这一节不做什么 {#what-this-section-does-not-do}

工作站从不暴露到互联网上，也不建立任何隧道：绑定是局域网绑定，防火墙规则限定在本地子网，而放行名单即使这两样都配错了也仍然拒绝公网地址。没有允许进入或拒绝的设备名单（任何以拥有远程访问（局域网）的用户登录的浏览器照样进入），没有从这里断开某个浏览器的办法，没有单独一道用于查看的口令（身份就是本地用户），也没有按设备的语言或主题：语言是工作站的，主题是每个浏览器自己的。代理 endpoint 的端口是在[代理](agent)页面上设的，不在这里。
