TCP/IP 触发器监听来自客户端的以换行符分隔的 JSON 请求,并请求暴露的应用操作。它旨在用于本地自动化、受信任的局域网自动化和开发验证。默认情况下,它绑定到回环,并在接受任何命令之前需要一个令牌。

对于 ControlMyNikon,当前暴露的操作 ID 包括 CameraShoot、CameraToggleConnection 和 CameraAutoFocus。除非后续版本明确暴露其他应用操作,否则 TCP/IP 触发器无法访问其他操作。

开始之前

  • 仅在您控制的客户端上使用 TCP/IP 触发器。
  • 对于在同一计算机上运行的脚本,请保持绑定地址为 127.0.0.1。
  • 仅在受信任的私有网络上使用局域网 IPv4 地址。
  • 在测试连接性和令牌时保持操作禁用。
  • 仅在请求路径经过验证后启用操作。
  • 如果令牌已与您不再信任的客户端共享,请重新生成令牌。

TCP/IP 触发器使用明文 JSON 和承载令牌。请勿通过路由器端口转发、公共 Wi-Fi、不受信任的 VPN 或面向互联网的防火墙规则暴露它。当您希望使用带有大操作按钮的手机浏览器页面而不是脚本或自定义 TCP/IP 客户端时,请使用 HTML 触发器。UDP 触发器尚未计划。

页面控件

  • 开始在配置的回环地址和端口上监听。
  • 停止结束监听器并释放端口。
  • 绑定地址设置要监听的本地地址。
  • 对于同一计算机的脚本,请使用 127.0.0.1。
  • 对于受信任的局域网客户端,请使用分配给此计算机的 IPv4 地址。
  • 不支持通配符地址,例如 0.0.0.0。
  • 端口设置 TCP 端口。
  • 启用操作允许接受的操作请求运行暴露的操作。
  • 禁用操作让您在不运行操作的情况下测试命令。
  • 令牌显示所需的请求令牌。
  • 复制令牌将令牌放入剪贴板。
  • 重新生成令牌创建一个新令牌并使旧令牌失效。
  • 事件历史记录以当前暴露给 TCP/IP 触发器的操作 ID 开始,然后显示监听器状态、接受的命令、拒绝的命令和请求的操作。

如果在当前配置文件保存或应用关闭时 TCP/IP 触发器正在监听,则下次启动时该配置文件会再次启动监听器。如果保存的地址不再分配给此计算机或端口繁忙,则启动将继续,TCP/IP 触发器停止,事件历史记录解释失败原因。

命令格式

客户端每行发送一个 JSON 对象。监听器每行返回一个 JSON 响应。

基本操作请求格式为:

{"token":"your-token","command":"action","action":"CameraShoot"}

成功的响应看起来像:

{"ok":true,"message":"Action requested.","action":"CameraShoot","actions":null,"error":null}

拒绝的响应包含一个稳定的错误代码:

{"ok":false,"error":"InvalidToken","message":"Token is invalid.","action":null,"actions":null}

第一个命令是:

  • action 请求一个暴露的操作。
  • ping 验证监听器和令牌是否正常工作。
  • actions 返回当前暴露给 TCP/IP 触发器的操作 ID。

Python 测试客户端

此脚本仅使用 Python 标准库。首先启动 TCP/IP 触发器,然后将页面上的令牌粘贴到 TOKEN 中。在操作禁用时,将 SEND_ACTION 保持为 False。仅在 ping 和 actions 工作且操作启用时,将 SEND_ACTION 设置为 True。此脚本的副本保存在源树中的 Shared\Common\Triggers\pyscripts\tcpip_trigger_test_client.py。对于 Visual Studio,请打开 Shared\Common\Triggers\pyscripts\TcpIpTriggerPythonClient.sln

import json
import socket
HOST = "127.0.0.1"
PORT = 50505
TOKEN = "paste-token-from-page"
SEND_ACTION = False
ACTION_ID = "CameraShoot"
def send_command(command):
    line = json.dumps(command, separators=(",", ":")) + "\n"
    with socket.create_connection((HOST, PORT), timeout=5) as sock:
        sock.sendall(line.encode("utf-8"))
        response = sock.makefile("r", encoding="utf-8", newline="\n").readline()
    return json.loads(response)
print("ping:", send_command({
    "token": TOKEN,
    "command": "ping"
}))
print("actions:", send_command({
    "token": TOKEN,
    "command": "actions"
}))
if SEND_ACTION:
    print("action:", send_command({
        "token": TOKEN,
        "command": "action",
        "action": ACTION_ID
    }))

安全性

TCP/IP 触发器可以在没有本地键盘、扫描仪、语音或声音输入的情况下请求应用操作。因此,它默认禁用,绑定到回环,并且即使在回环上也需要令牌。

禁用操作阻止操作调度,但仍允许您验证 JSON、令牌处理和基本命令响应。在构建或测试客户端时使用它。

局域网绑定仅限于受信任的局域网控制。任何能够连接到监听器并知道令牌的人都可以在操作启用时请求暴露的操作。保持令牌私密,并在与临时脚本或客户端共享后重新生成它。

故障排除

如果开始被禁用:

  • 检查端口是否在 1 到 65535 之间。
  • 确认令牌不为空。
  • 在更改端口之前停止任何先前的监听器状态。

如果开始失败:

  • 另一个进程可能已经在使用该端口。
  • 选择另一个端口并重试。
  • 检查事件历史记录以获取失败消息。

如果客户端无法连接:

  • 确认 TCP/IP 触发器已启动。
  • 确认客户端连接到显示的绑定地址和端口。
  • 对于同一计算机的脚本,请使用 127.0.0.1。
  • 对于其他局域网设备,请使用计算机的局域网 IPv4 地址,并确认 Windows 防火墙或端点工具允许入站连接。
  • 确认绑定地址已分配给此计算机。

如果请求被拒绝:

  • 确认请求是一个 JSON 对象并在单行上。
  • 确认令牌与页面上的令牌完全匹配。
  • 确认命令是 action、ping 或 actions。
  • 确认请求的操作是 actions 命令显示的操作 ID 之一,例如 CameraShoot。
  • 在期望操作请求运行之前启用操作。

对于 Python 或 PowerShell 客户端开发,在测试时观察事件历史记录。它记录客户端连接和断开事件、接受的 ping 和 actions 命令、拒绝的 JSON、缺失或无效的令牌、未知命令、未知操作、禁用操作和成功的操作调度。令牌本身不会写入事件历史记录。

相关设置

当键盘输入应请求操作时,请使用热键。当条形码输入应填充字段或触发操作时,请使用扫描仪。当口语短语应请求操作时,请使用语音触发器。当音频水平阈值交叉应请求操作时,请使用声音触发器。