# 配置

> 内置 OPC UA 服务器的应用程序名称、监听端口、网络名称和客户端认证，以及把它们存下来并让它们生效的那个套用。

配置是 Connector 上 OPC UA 服务器面板的第二张卡片。它那些字段是一份草稿：服务器没有在监听时（关着，或者开着但上一次启动被拒绝）才可编辑，而且在**套用**把这份草稿存下来之前，什么都不会变。服务器关着时，草稿留到下一次打开时用（“OPC UA 服务器配置已保存。下次启用时，服务器按此配置启动。”）；服务器开着时，按钮变成**应用并重启**，带着它把服务器重新起来。卡片在按钮下面就是这么说的：“要编辑 endpoint，请先禁用服务器。更改在它下次启动时生效。”查看 Connector 可以读这张卡片；配置 Connector 可以编辑它，而关闭服务器是[命令栏](connector-opcua-server#the-commands)上的禁用。

## 那些字段 {#the-fields}

| 字段 | 它是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| 应用程序名称 | 服务器向客户端报出的名字，也是它自己那份应用程序证书的主体。 | 任意文字；默认 **GanterLab OPC UA Server**。名字留空就按默认值保存；两端的空格会被去掉。 | 客户端看到的就是服务器的应用程序名称。它不是 endpoint 地址的一部分。和改动网络名称一样，改动这个名称会换掉服务器自己的证书，所以客户端要先信任新的那一份，才能重新连上；把这台服务器当作设备来读的工作站会停止读取，并在它的[现场设备访问](driver-opc-ua#equipment-access)上显示“证书已更换：`<name>`”，直到在那里批准新的证书。 |
| 监听端口 | 服务器监听的那个 TCP 端口。 | 1 到 65535；默认 **4840**。输入过程中不是数字的文字被忽略；超出范围的数字，不论有多少位，都被拒绝，字段下方写“监听端口必须在 1 到 65535 之间。”，字段退回到正在生效的那个端口。本工作站其他服务的端口，以及别的程序占着的端口，会在按下“套用”时被拒绝（见下文）。 | 客户端访问上“连接地址”下面那两个地址都跟着变，并在那里申请一次新的防火墙放行，因为 Windows 那条规则是和端口绑在一起的。 |
| 网络名称 | endpoint 地址里带的那个名称，让客户端用一个真能找到本工作站的名称来拨号：客户端连接时用的 DNS 名称，或者一台名称在网络里解析不出来的计算机的地址。 | 默认为空，空就表示这台计算机自己的名称。否则要写一个主机名：字母、数字、连字符、下划线和点，或者一个地址，前面不加 opc.tcp://，不写端口，也不写路径。字段在失去焦点或按回车时确认；别的写法都会在字段下方被拒绝，说明它不是主机名，字段退回到正在生效的那个名称。 | 从下一次启动起，客户端访问上“连接地址”下面那个网络地址就带着这个名称，服务器自己的证书也在 `localhost` 之外为它作保。改动这个名称会换掉那份证书，所以客户端要先信任新的那一份，才能重新连上。 |
| 客户端认证 | 一份证书受信任之后，服务器接受哪一种会话。 | **匿名**（默认）：接受不带凭据的会话，拒绝带用户名的会话。**用户名和密码**：只接受配置好的那一对，拒绝匿名会话。 | 在下一次启动时生效；服务器始终公告两种令牌策略，并在一次会话激活时执行这个选择。要拒绝每一次会话，就把服务器关掉。 |
| 用户名 | 那唯一被接受的用户名。 | 1 到 64 个字符，两端去空格。只有在“用户名和密码”下才可编辑。 | 它和密码一起，是唯一一份能登录的凭据。 |
| 密码 | 要接受的那个密码。这个字段只写：不管存下来的是什么，它都空着打开，处在哪个状态由标签说出来，是**密码（已保存）**还是**密码（尚未保存）**。**显示密码**开关只显示你在这里敲进去的东西。 | 8 到 128 个字符，不能为空。留空就保留存下来的密码，一旦存过一个，字段下面那行就这么说：“留空就保留已保存的密码。”只有在“用户名和密码”下才可编辑；长度规则也写在字段下面：“用户名：1–64 个字符。密码：8–128 个字符。” | 按 Windows 用户和机器加密后存下来（见下）。 |

服务器在监听的时候（“要更改 endpoint，请先禁用 OPC UA 服务器。”）、服务器的另一条命令正在执行的时候，以及有单元在运行的时候，这些单选按钮和三个文本字段都变灰。面板打开时草稿从存下来的配置里播种，而在配置从别处被改动、单元把工作站接管过去，以及运行时停下来的时候，草稿重新播种，未保存的编辑随之丢弃。密码是例外：它每次都空着播种，因为存下来的那个从不交给浏览器。

## 套用 {#apply}

| 命令 | 作用 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| 套用 / 应用并重启 | 校验草稿并把它存下来，作为一次工程操作。服务器关着时按钮是**套用**：先是“正在保存 OPC UA 服务器配置…”，再是“OPC UA 服务器配置已保存。下次启用时，服务器按此配置启动。”服务器开着时按钮是**应用并重启**，用新的值重新启动服务器：先是“正在用新配置重启 OPC UA 服务器…”，再是“OPC UA 服务器配置已应用。正在 `<endpoint>` 上监听。”新的应用程序名称或者网络名称会改变工作站自己的证书，而 [OPC UA 驱动](driver-opc-ua)读设备用的也是这份证书，所以不管服务器开着还是关着，都会重启整个 Connector，它的设备稍后重新读取；其他任何改动只涉及服务器，Connector 全程都在读。 | 服务器在监听的时候、服务器的另一条命令正在执行的时候、有单元在运行的时候，以及存下来的配置读不出来的时候。 | 角色没有**配置 Connector**的时候。 |

校验发生在任何东西被保存之前，顺序是这样的：先是端口（“监听端口必须在 1 到 65535 之间。”）；如果端口不是正在生效的那个，接着拒绝在[远程访问](remote-access)上设定的 Web 服务器端口（“端口 N 已经是 Web 服务器的端口。请另选一个端口，或者先移动 Web 服务器。”）、在[代理](agent)页面上为代理访问设定的端口，无论代理访问是开是关（“端口 N 已经被代理访问占用。请另选一个端口，或者先移动代理访问。”）、Connector 页面上[Modbus 服务器](connector-modbus-server)的端口，无论服务器开着还是关着（“端口 N 已经是 Modbus 服务器的端口。请另选一个端口，或者先移动 Modbus 服务器。”），Connector 页面上[MQTT Broker](connector-mqtt-broker)的端口，无论 Broker 开着还是关着（“端口 N 已经是 MQTT Broker 的端口。请另选一个端口，或者先移动 MQTT Broker。”），以及这台计算机上已经被别的东西占着的端口（“端口 N 在这台计算机上已被占用。请关闭占用它的程序，或者另选一个端口。”），每一种都和超出范围的拒绝一样写在“监听端口”字段下方，字段退回到正在生效的端口；接着是网络名称，同样写在“网络名称”字段下方，字段退回到正在生效的那个名称；然后在“用户名和密码”下依次是用户名（“用户名必须为 1–64 个字符。”）、字段留空而又没有存下来的密码可以保留（“还没有保存密码，请先输入一个再应用。”）、密码长度（“密码必须为 8–128 个字符。”）和空密码（“密码不能为空。”）。被拒绝的草稿什么都不会存下来。一次让服务器停在那里的重启，多半是正在生效的端口被别的程序占着（“应用并重启”不会再检查这个端口），会报作“OPC UA 服务器启动失败。它可能无法绑定端口 N。请查看日志。”；配置已经保存了，所以把原因解决掉，再到命令栏上按重启。启动时直接出错、而不是回到停止状态的，会报作“OPC UA 服务器错误：…”。不管发生什么，这些字段事后都重新读一遍存下来的值。

## 存下来的配置读不出来的时候 {#when-the-stored-configuration-could-not-be-read}

如果启动时配置数据库没能把服务器那一行交回来，卡片一开头就是那条通知：“无法读取已保存的服务器配置。下面这些值是本次启动的默认值，保存功能已禁用，以免它们覆盖已保存的配置。请检查诊断日志并重启应用。”那一次启动服务器按默认值跑，套用变灰，而按下去时状态栏上答的是同一句话。

## 启动时服务器打不开它的端口的时候 {#when-the-server-cannot-open-its-port-at-start}

工作站启动时，如果服务器打不开它的监听端口，原因是别的程序已经占着它（工控机上 4840 常常已被占用），或者 Windows 拒绝了它（端口落在 Hyper-V、WSL 或 Docker 预留的范围里），保持停止的只有服务器：Connector 照样读设备，Logic 和记录也照常进行。一张卡片说明原因：“服务器无法启动”，接着是“端口 4840 已被这台计算机上的另一个应用占用，因此 OPC UA 服务器保持停止状态。请另选一个监听端口，然后再次启动服务器。”卡片上有两个按钮。

| 命令 | 作用 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| 使用端口 N | 把 N 存为监听端口，并在这个端口上启动服务器，作为一次工程操作。N 是被拒端口之上、监听端口字段会接受的第一个端口：此刻在这台机器上空闲，而且既不是 Web 服务器的端口，也不是智能体访问的端口，也不是 Modbus 服务器的端口。随后卡片说出服务器在哪里监听，因为从现在起 OPC UA 客户端连接的就是这个端口：“OPC UA 服务器现在在端口 4841 上监听。OPC UA 客户端连接到 `<endpoint>`。”如果服务器启动时 N 也已被占用，同一张卡片会带着下一个端口回来。 | 有单元在运行的时候、运行时停着的时候，以及存下来的配置读不出来的时候。 | 角色没有**配置 Connector**的时候。 |
| 打开 Connector | 在 OPC UA 服务器那一行上打开 Connector，它的配置卡片设定监听端口。 | 从不。 | 角色没有**查看 Connector**的时候。 |

只有有人按下“使用端口 4841”这类按钮时，端口才会改变：服务器从不自己换到别的端口。与端口无关的失败，卡片上只在启动给出的原因下面留下打开 Connector。工作站隐藏在托盘里启动时，一条 Windows 通知会重复卡片的标题和原因；它没有按钮，卡片在窗口里等着。

## 密码和它待的地方 {#the-password-and-where-it-lives}

这个密码和每一份设备凭据一样，作为按用户的 DPAPI 密文存下来。一份配置[备份](settings-backups)在另一台机器或者另一个 Windows 账户上打开时，它是不带这个密码来的：那时服务器带着“用户名和密码”起来，却没有密码可对，于是拒绝每一次登录，并把原因记进日志（“用户名和密码认证已打开，但在这个 Windows 账户上读不到任何 OPC UA 服务器密码 … 请在 Connector 上 OPC UA 服务器的配置里重新输入。”）。就在这里重新输入它。存下来的密码从不走回头路：字段空着打开，只有标签说有没有，所以远程浏览器收到的页面不带任何凭据。在一条普通 HTTP 的远程连接上，这个页面上敲进去的用户名和密码是明文过网络的；见[远程访问](remote-access)。

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

证书信任是另一道检查，在[客户端访问](connector-opcua-client-access)上决定：一个受信任的应用程序仍然要按这里选定的方式登录，而一个用户名也让不了任何证书没被信任的人进来。用户名和密码只有一份，不是一份名单，也没有按客户端的权限；地址路径 `/UA/GanterLab` 和各项安全策略不可配置；“网络名称”里装的是一个名称而不是一份清单，所以 endpoint 公告的就是那个名称，旁边加上 `localhost`，别的都没有。Logic 地址空间只读地显示服务器的那些点位，而它那个“打开 Connector”按钮落到的就是服务器那一行。
