我们的嵌入式系统需要一个 Telnet(通过串行)接口(interface),由于硬件/遗留系统它在半双工链路 (RS485) 上工作。是的,我知道 - 不,我们不能改变它,业界喜欢这样。
问题在于,当我们向终端发送一整屏文本时,用户可以按下按钮并将数据发送回网络。
Telnet 支持 IAC->GA(Go Ahead)命令向用户终端发出信号,它可以开始发送数据,但在我读过的任何 RFC 中都没有任何信息告诉用户终端停止发送数据,以便我们刷新屏幕。
不幸的是,大约 1973 年之后的所有 RFC 都假设将使用 SGA ( Suppress Go Ahead ) 模式,因此它很少被提及。不幸的是,似乎没有一个 RFC 或其他文档真正涵盖了整个协议(protocol)。
有没有人有任何信息/链接更完整地记录 telnet 协议(protocol)(或只是 Go Ahead 行为)?我意识到其中一些可能写在带有绿色条纹的羊皮纸上 ;)
重新编辑:为什么这个编程问题“离题”了?您知道,Telnet 是 OSI 模型的第 7 层...
最佳答案
啊……RS-485……我记得很清楚! :-)
GA 定义已损坏(参见 https://www.rfc-editor.org/rfc/rfc596)但对于串行线路实现应该没问题,因为没有数据包分解。
您要求的是“反向中断”:
"Reverse break" is a means by which a computer connected to a terminal by a half-duplex path may regain control of the path for further typeout after previously having relinquished it.
就其本质而言,“中断”(反向或其他方式)必须在半双工连接的带外,因为它需要能够随时发送。
编辑:作为聊天结果的新信息:但是,如果您不希望中断实际传输(RFC393,反向中断案例“b”)和除了实际传输时,带有 go-ahead token 的一侧不会将硬件切换到“传输”模式(RS-485 在这种模式下无法接收,即使没有数据正在发送)和 偶尔损坏/截断的传输是可以容忍的并且 telnet 程序正确地实现了这个相当不寻常的极端情况,然后在带内发送此代码可能是可以接受的。
我认为处理这个问题的另一种方法是破解客户端 Telnet 程序以定期向服务器发送“继续”数据包,即使它没有其他要发送的数据包。这将允许服务器进行更新并作为返回“继续”;它有点像“ token 环”。您甚至不必延迟 - 当收到“继续”时,发送所有未决数据(可能没有)然后返回“继续”。
可能的替代解决方案:
既然您也控制 ser->ip 设备,为什么不在服务器和设备之间简单地使用专门的协议(protocol)呢?
服务器发送
STX数据流ETX
客户端发送
STX数据流ETX
立即重复
如果任何一方的数据缓冲区中都没有数据,那么它只是一个 STX ETX
对,有效地告诉另一方“继续”。如果在 250ms 内对方没有任何消息,则重新发送 ETX
您甚至可以通过使用 NAK
(而不是 STX ...
)将 STX 数据流 ETX CRC1 CRC2
扩展到错误检测>) 在检测到错误的情况下回复,并导致重新传输整个最后一个数据包。
关于c - 通过半双工通信链路的 Telnet - 协商参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12839485/