Telnet over half-duplex comms link - negotiation parameters

时间:2012-10-11 12:25:40

标签: c embedded telnet legacy obsolete

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

问题在于,当我们向终端发送一连串文本时,用户可以按下按钮并将数据发送回来。

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

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

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

重新编辑:为什么“编程问题的”偏离主题“关闭? Telnet是OSI模型的第7层,你知道......

1 个答案:

答案 0 :(得分:3)

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

GA定义被破坏(参见http://tools.ietf.org/html/rfc596)但是对于串行实现应该没问题,因为没有分解数据包。

你所要求的是“反向休息”:

  

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

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

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

我能想到的另一种解决方法是破解客户端的Telnet程序,即使没有其他任何东西可以发送,也会定期向服务器发送“正常”数据包。这将允许服务器进行更新并作为回报“先行”;它有点像“令牌戒指”。你甚至不必拖延 - 当收到“反应”时,发送所有未决数据(可能是无)然后返回“反复”。

可能的替代解决方案:

由于您也控制了ser-> ip设备,为什么不在服务器和设备之间简单地使用专用协议?

  • 服务器发送STX data stream ETX

  • 客户端发送STX data stream ETX

  • 毫不拖延地重复

如果任何一方的数据缓冲区中没有数据,那么它只是一个STX ETX对,有效地告诉对方“继续”。如果在250毫秒内没有任何东西来自另一方,请重新发送ETX

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