我有一台 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,我会执行以下操作:
telnet 192.168.222.127
我想对 C# 程序做同样的事情,但我被困住了。大多数答案都指向过时的软件包和链接。我对 Telnet 和通信协议不熟悉,需要这方面的帮助。谢谢。
如果您只是想连接到设备,发送命令并读取响应,简单的 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;
}
您可以根据您的需求解析服务器的响应。
我找到了一个解决方案here这是一个Windows应用程序,工作起来就像一个魅力
这是 TentacleSoftware.Telnet 包的 github 存储库