JavaScript net.connect() - 显式设置本地端点 IP 地址

JavaScript net.connect() - explicitly set local endpoint IP address

我找不到在 net.connect() 函数中设置 local endpoint 字段的方法。我需要明确地将 local endpoint 设置为特定的 IP 地址。

我正在使用 node-ads 库将节点进程连接到 PLC 设备。

在我的例子中:

ads.tcpClient = net.connect(
    ads.options.port,
    ads.options.host,
    function () {
      ads.connected = true
      cb.apply(ads.adsClient)
    }
  )

connect() 函数不为此提供参数。返回的 socket 对象似乎也根本没有端点字段。我做错了什么?

原因是我连接到 Beckhoff PLC,如果同一台计算机上已存在另一个连接,则连接需要不同的主机 IP 地址。问题是mentend here.

我知道在 Beckhoff-ADS C# 实现中这是可能的,因为这段代码有效:

 var socket = new AmsSocket(targetip, amsport)
 {
     LocalEndPoint = new IPEndPoint(IPAddress.Parse(sourceip), 0)
 };

更新 通过执行以下操作解决了问题:

  • 更改您的 ads.js 文件以明确设置源 IP 地址
  • 最好不要在 node_modules 中执行此操作,而只是将 ads.js 文件复制到不会被覆盖的地方

位于ads.js

var connect = function (cb) {
  var ads = this
  ads.tcpClient = net.connect({
    port: ads.options.port,
    host: ads.options.host,
    localAddress: ads.options.sourceIp,   // the part you have to add
  },

在您的 options 中为 ADS 连接传递 sourceIp

 public options = {
        host: "192.168.100.1",
        amsNetIdTarget: "192.168.100.1.1.1",
        amsNetIdSource: "192.168.100.105.1.1",
        sourceIp: "192.168.100.105",
    };

连接到您的 PLC:

const client = ads.connect(this.options, () => {
            console.log("Trying to connect.");
            client.readDeviceInfo((err, result) => {
                if (err) {
                    console.log("Error: " + err);
                }
                console.log("Connection result: " + JSON.stringify(result));
                client.end();
            });
        });

足够简单,但遗憾的是在 node-ADS 中不受支持。