4

我们的嵌入式系统需要一个 Telnet(串行)接口,由于硬件/遗留系统,它通过半双工链路 (RS485) 工作。是的,我知道——不,我们无法改变它,业界喜欢这样。

这样做的问题是,当我们向终端发送全屏文本时,用户可以按下按钮并将数据发送回线路。

Telnet 支持 IAC->GA (Go Ahead) 命令向用户终端发出信号,它可以开始发送数据,但是我读过的任何 RFC 中都没有关于告诉用户终端停止发送数据的信息,所以我们可以刷新屏幕。

不幸的是,1973 年以后的所有 RFC 都假定将使用 SGA(Suppress Go Ahead)模式,因此很少提及。不幸的是,似乎没有一个 RFC 或其他文档实际上涵盖了整个协议。

有没有人有任何信息/链接更完整地记录了 telnet 协议(或只是 Go Ahead 行为)?我意识到其中一些可能是写在带有绿色条纹的羊皮纸上;)

重新编辑:为什么这个编程问题的“离题”结束?Telnet 是 OSI 模型的第 7 层,你知道...

4

1 回答 1

3

啊……RS-485……我记得很清楚!:-)

GA 定义已损坏(请参阅https://www.rfc-editor.org/rfc/rfc596),但对于串行线路实现应该没问题,因为没有数据包分解。

您要求的是“反向休息”:

“反向中断”是一种方法,通过半双工路径连接到终端的计算机可以在先前放弃该路径后重新获得对该路径的控制以进行进一步的打字。

就其本质而言,“中断”(反向或其他)必须在半双工连接上处于带外,因为它需要能够随时发送。

编辑:聊天产生的新信息: 但是,如果您不希望中断实际传输(RFC393,反向中断案例“b”)并且带有继续令牌的一方不会切换硬件到“传输”模式,除非实际传输(在此模式下,即使没有发送数据,RS-485 也无法接收)并且偶尔的损坏/截断传输是可以容忍的,并且telnet 程序正确地实现了这种相当不寻常的极端情况,然后带内发送此代码可能是可以接受的。

我认为解决此问题的另一种方法是破解客户端 Telnet 程序,以定期向服务器发送“继续”数据包,即使它没有其他要发送的内容。这将允许服务器进行更新并作为回报做“继续”;它有点像“令牌环”。您甚至不必延迟——当收到“继续”时,发送所有待处理的数据(可能没有),然后返回“继续”。

可能的替代解决方案:

既然你也控制着 ser->ip 设备,为什么不在服务器和设备之间建立一个专门的协议呢?

  • 服务器发送STX data stream ETX

  • 客户端发送STX data stream ETX

  • 毫不拖延地重复

如果任何一方的数据缓冲区中没有数据,那么它只是一STX ETX对有效地告诉另一方“继续”。如果对方在 250ms 内没有任何消息,则重新发送ETX

您甚至可以通过在检测到错误的情况下STX data stream ETX CRC1 CRC2使用NAK(而不是STX ...)回复来扩展它以进行错误检测,并导致重新传输整个最后一个数据包。

于 2012-10-11T13:56:42.933 回答