如何在 C# 程序中打开 Telnet 会话并以编程方式发送命令和接收响应?

问题描述 投票:0回答:2

我有一台 optoma 投影仪,我想从 C# 程序内部使用 Telnet 会话与其进行通信。使用各种包装器和 Nuget 包,我能够启动 telnet 会话,但我无法在 C# 程序中传达命令或接收响应。

在普通的 Windows cmd 中,如果我编写 Telnet 192.168.222.127,telnet 会话就会开始。投影机以 ASCII 格式响应命令(https://www.optoma.de/uploads/RS232/DS309-RS232-en.pdf),并根据命令失败或通过返回“F”或“P” 。要将亮度更改为 10,我会执行以下操作:

  1. 打开 Telnet 连接:
    telnet 192.168.222.127
  2. 发送命令将亮度更改为 10 : ~0021 10
  3. 当命令传递改变亮度时,会话将响应“P”。 Telnet 终端命令

我想对 C# 程序做同样的事情,但我被困住了。大多数答案都指向过时的软件包和链接。我对 Telnet 和通信协议不熟悉,需要这方面的帮助。谢谢。

c# telnet projector
2个回答
2
投票

如果您只是想连接到设备,发送命令并读取响应,简单的 C# TcpClient 就足够了。它为 TCP 网络服务提供客户端连接,这正好适合我的情况。

用于建立连接:

using system.net.sockets;

    public void EstablishConnection(string ip_address, int port_number=23){
        try
        {
            client = new TcpClient(ip_address, port_number);
            if (DEBUG) Console.WriteLine("[Communication] : [EstablishConnection] : Success connecting to : {0}, port: {1}", ip_address, port_number);
            stream = client.GetStream();
        }
        catch
        {
            Console.WriteLine("[Communication] : [EstablishConnection] : Failed while connecting to : {0}, port: {1}", ip_address, port_number);
            System.Environment.Exit(1);
        }
    }

用于发送和接收响应:

    public string SendMessage(string command)
    {
        // Send command
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(command);
        stream.Write(data, 0, data.Length);
        if (DEBUG) Console.Write("Sent : {0}", command);

        WaitShort();

        // Receive response
        string response = ReadMessage();
        if (DEBUG) Console.WriteLine("Received : {0}", response);

        return response;
    }

    public string ReadMessage()
    {
        // Receive response
        Byte[] responseData = new byte[256];
        Int32 numberOfBytesRead = stream.Read(responseData, 0, responseData.Length);
        string response = System.Text.Encoding.ASCII.GetString(responseData, 0, numberOfBytesRead);
        response = ParseData(response);
        if (response == "SEND_COMMAND_AGAIN")
        {
            if (DEBUG) Console.WriteLine("[ReadMessage] : Error Retreiving data. Send command again.");
        }
        return response;
    }

您可以根据您的需求解析服务器的响应。


0
投票

我找到了一个解决方案here这是一个Windows应用程序,工作起来就像一个魅力

这是 TentacleSoftware.Telnet 包的 github 存储库

© www.soinside.com 2019 - 2024. All rights reserved.