基于W5500和ATMEGA8的TELNET服务器的开发

最近,Arduino软件和硬件复合体变得非常流行,其目的是开发各种有趣的电子设计。 通过将Arduino底板与所需的其他模块连接来进行设计。 在Arduino底板上有一个微控制器,其固件是在Arduino的特殊开发环境中编写的,通常使用一个或另一个模块的现成库。

其中一个模块-W5500-用于制造将连接到Internet的电子结构。 在这种情况下,大多数情况下,它意味着对其结构进行远程控制。 例如,它可以是“智能家居”,机器人等。 最琐碎的项目(Hello world除外)是通过Web浏览器远程包含LED(图1)。 如果连接了晶体管开关和继电器而不是LED,则可以切换功率更大的负载。 因此,从本质上讲,该设计的程序(固件)是处理来自远程用户的http请求的Web服务器。

1.通过浏览器管理LED。

W5500模块基于W5500芯片本身及其主体套件,以及通过SPI用于MK的BLS连接器,用于连接至计算机网络的RJ-45连接器以及3.3 V的线性稳压器(图2)。



2. W5500模块。

W5500芯片是一款成熟的控制器,可集成处理从以太网到TCP的整个网络协议堆栈(图3)。 实现基于该芯片的设计,程序员无需编写TCP / IP协议处理代码,仅实现将嵌入在TCP中的应用层协议就足够了。 在上面的示例(在Arduino上)中,http被用作应用程序协议。

3. W5500芯片的结构。

在不使用Arduino的情况下,我决定详细研究W5500芯片的文档,并基于Atmega8微控制器独立实现该程序。 该程序将不包含http处理程序。 需要使用远程终端通过TCP协议实现最简单的(RAW)数据交换。 正如本文标题所说,谈论Telnet协议并不完全准确。 它基于有关终端参数的附加信息的交换具有自己的特定功能。 但是,大多数telnet客户端都支持RAW,并且不需要以上内容。 因此,Atmega8 MK程序将不包含应用程序级协议处理程序。 她将仅处理W5500的初始化,套接字管理,数据接收和传输。

该设计的主要应用是通过远程终端进行设备管理。 在这种情况下,设计通过UART接口(三线GND,TxD,RxD)连接到受管设备。 在没有图形界面的情况下,通过终端进行管理是特定区域中的经典专业方法。 例如,Windows或Linux命令行,或使用Telnet协议通过终端配置路由器的方法。 最后一个示例实际上等效于本文中讨论的想法。

开发该设备或该设备时,如有必要,我设想通过一个通过UART接口连接的终端用文本命令控制它。 这可以通过MAX232适配器芯片连接到常规PC到RS-232 COM端口,也可以通过PL2303芯片连接到USB(虚拟COM端口)。 您可以使用标准的超级终端程序作为终端。 随着Android智能手机的普及,通过蓝牙进行连接变得很方便:将蓝牙模块(例如HC-06)连接到设备的UART接口,并且将智能手机无线连接到该模块。 互联网上有许多通过蓝牙实现终端的应用程序。 因此,您可以在短距离内通过手机从终端通过蓝牙控制设备。 本文讨论的设计使您可以使用Internet通过终端实现控制。 终端可以是Windows XP附带的标准超级终端,也可以从Windows命令行运行telnet实用程序并在其中运行。 如果我们正在谈论智能手机,那么您可以选择Android上的一种应用程序(也有很多)(图4)。



4. Google Play上“ TCP终端”的应用程序。

W5500芯片具有8个独立的插槽,每个插槽都有一个内存,用于接收和传输2 KB以上的信息。 总计,用于接收的总内存为16 KB,用于传输信息的总内存为16 KB。 这些参数是默认使用的,但是如果需要,在芯片初始化阶段,可以通过套接字重新分配内存。 此处描述的应用程序将使用默认的内存设置,并且涉及所有8个插槽。 每个套接字在其初始化阶段都分配了很多参数,其中主要是其操作模式和TCP端口。 我们需要的所有八个套接字的操作模式是TCP服务器模式。 您必须为每个套接字分配不同的端口。 我使用了八个连续的端口,例如从4000开始。在W5500模块的初始化阶段,为它分配了连接到Atmega8 MK程序的网络参数:IP地址,子网掩码,网关的IP地址,甚至是物理MAC地址。 W5500的网络设置必须与它所连接的家庭网络的设置匹配。 当远程连接到我们描述的设备时,终端设置将指示主机地址(IP地址或域名)和端口。 主机地址是指W5500设备,端口是指设备中的插槽。 一个插槽只能使用一个连接。 因此,可以进行八个独立的同时连接。 图5显示了标准HyperTerminal程序中与IP地址192.168.0.111到W5500(端口4000)的W5500的连接参数。 要连接到全球Internet(从外部),您需要正确配置家用路由器。

5.通过超级终端中的TCP / IP连接。

我尝试了许多不同的TCP终端应用程序,每种应用程序都有其优点和缺点。 首先,通过打包TCP数据包的方法,可以区分两种情况。 在第一种情况下,当在终端中输入字符时,将立即生成TCP数据包并将其发送到服务器。 因此,每个数据包的数据字段占用1个字节,并包含用户输入的字符。 超级终端程序仅在此模式下工作。 在第二种情况下,字符集(命令)被输入到单独的文本字段中,并且当您单击“发送”按钮时,仅形成一个带有数据字段的数据包,其内容是用户输入的字符集。 此类数据包的数据字段大小(以字节为单位)与输入的字符数一致。 第二种情况是最优选和方便的,并且在交通方面是经济的。 我们的设计适用于两种情况,将远程用户从任何套接字输入的所有字符传输到UART MK Atmega8的输出(TxD)。

至于从服务器到客户端的信息传输的组织,这里也有自己的特点。 一旦在RxD UART MK分支上收到一个字节(字符),就可以使MK程序也直接生成一个单字节TCP数据包。 您可以通过存在一个特殊的附加信号来创建从一组传入字节到MK的TCP数据包,该信号仅在从所连接的设备传输序列时才存在(打包信号)。 顺便说一句,在将RS-232转换为半双工RS-485接口的情况下,该信号用于将MAX485切换为传输。 但是,正如我深信的那样,使用计时器最方便,即 一个小的延迟,在此期间将执行字符接收和TCP数据包的形成。 这是我在所述构造中实现的方法。 它的工作原理如下。 计时器(时间设置约为0.3秒)在第一个字符到达时启动,并在每个下一个字符到达UART MK时复位。 如果在指定的时间内没有字符到达,则形成一个带有接收到的字符的数据包,并将其发送给客户端,然后计时器停止。 在我的特定情况下,客户端连接到的所有套接字上都有大量邮件。

现在将涉及隐私。 所描述的远程终端不受使用流量分析器的窃听保护。 甚至Telnet协议本身也不提供密码验证和加密。 为此,还有其他现代的远程终端协议。 对于Telnet和RAW(没有应用程序协议),您可以实现一种间接的密码验证方法,这种方法仅在有意干预的情况下无效。 但是,这种授权方法将防止不受控制的“左”流量。 它可能来自间谍软件,通过对已知提供商的IP地址范围和端口范围进行分类,它们可以突然连接到我们的设备(如果它“侦听”来自Internet的连接)。 在固件中,我实现了一个客户端欢迎页面(如果该页面已连接到服务器),即 基于W5500模块的设计。

欢迎页面包含有关客户端的IP地址,套接字号(用于监视)和输入密码请求的信息(图6)。

6. W5500服务器的欢迎页面。

在MK程序内部连接后,将启动一个计时器(约18秒钟),在此期间,用户必须有时间输入特定的密码(在所有套接字上都相同)。 如果密码输入错误,则在设置的时间过后,用户会通知相应的消息,并且服务器将断开连接(图7)。

7.报告错误的密码。

在正确输入密码的情况下,还会向用户显示相应的消息(图8)。 之后,在远程终端和MK的UART接口之间建立一个“透明”桥,W5500模块通过SPI连接到该接口。 仅在用户团队级别测试了这种桥接器的操作。 如果在某些情况下客户端应用程序不是用户终端而是其他程序,则可能无法保证全面的高速数据交换。 甚至更重要的是,所描述的设计不能保证(更确切地说,不提供)全双工数据交换。

8.关于正确密码的消息。

输入密码后,用户不会将他们输入的字符返回到终端,并且“退格”也不起作用(回退时输入的字符不正确)。 密码长度为8个字符。 MK程序扫描从客户端收到的前8个字符,而不管它们在TCP数据包上的分布如何。 但是任何数据包都不得超过10个字节。 顺便说一下,超级终端中的“发送文本文件”功能非常有趣。 正如使用流量分析仪检查的那样,执行此功能时,会形成两个TCP数据包:第一个数据字节为1字节的数据包包含已传输文本文件的第一个字符,第二个数据包包含其余内容。

服务器提供两个不同的密码。 如上所述,一个密码用于建立TCP-UART网桥(正常使用),第二个密码用于控制W5500模块或其他设计参数。 如果输入此密码,将向用户显示另一个欢迎页面,然后他进入控制模式。 我故意提供了这种模式仅在其中一个空闲插槽上可行。 如果具有此模式的套接字正忙,并且尝试在另一个套接字上登录到该模式,则服务器将立即断开连接。 休息之前,将显示一条有关在控制模式下已经工作(忙)的套接字号的消息(图9)。

控制模式提供了我已定义的命令,可通过输入help命令查看其列表。 该命令应以换行符(Enter键)结尾。 此外,如果控制模式处于活动状态,则W5500服务器会将服务消息发送到终端,例如,有关将客户端连接到具有其IP地址的其他套接字或空闲套接字的服务消息。 图10演示了上述内容。 球队名单尚未完成,将随着时间的流逝进行补充。



9.输入控制模式密码时,有关套接字繁忙的消息。

10. W5500控制模式。

echo命令禁用或启用将打印的字符返回到终端(自我监视)。 以下两个命令用于读取和写入W5500芯片的地址寄存器。 地址的寄存器值在W5500芯片的文档中指出。 我介绍了这些通用命令,主要用于调试。 rl命令立即重新启动之后指示的套接字号。 同样,sr命令读取套接字的状态,并将其值作为十六进制数字给出。 “ ens”命令给出每个套接字的状态表:状态“ 0”-套接字空闲,正在等待客户端,状态“ 1”-正常使用的套接字,状态“ 2”-处于控制模式的套接字。 您可以输入更多的命令。 打开设备电源时,在初始化阶段更改适合芯片的参数(例如,网络参数),将其存储在MK的非易失性存储器中将很有用。 输入特殊的命令来控制其他可用的MK引脚也可能很有用。 例如,“ PC0 = 1”,“ PC2 = 0”等。 确保需要配置命令UART接口MK。

考虑一下MK程序工作的更多细节。 除了上述定时器外,还激活了一个定时器,因此每约半分钟激活一次,即所谓的 TCP控制数据包“保持活动”。 在没有用户数据交换的情况下验证连接是必要的。 如果由于某种原因在W5500内设置的一定时间内没有来自客户端的确认,则所谓 超时,套接字将重新启动。 例如,由于数据链路或物理层的断开,连接可能突然丢失:拔出以太网电缆,断开Internet连接或丢失Wi-Fi连接等。

根据W5500芯片的文档(数据表),以下功能在程序代码中实现。 首先,将W5500寄存器写入和读取到地址的基本功能。 顶级功能-硬件重置,芯片初始化,套接字初始化,打开套接字,监听套接字,断开和关闭套接字,发送“ keep_alive”命令,重新启动套接字。 最后一个功能是上述功能的组合:关闭,打开,收听。 大多数函数在执行后会返回套接字状态值。 最后,最基本的功能是处理接收到的信息(从RX缓冲区读取)和处理发送的信息(写入TX缓冲区)。 我从芯片制造商W5500的官方网站( 链接 )获得了有关实现这些功能的建议。 接收功能会将从RX缓冲区接收到的数据覆盖到其自己的128字节非环形缓冲区中。 这种尺寸足以满足简单应用的需求,而Atmega8微控制器所提供的空间却很小。 W5500的TX缓冲区还从中间缓冲区传输数据,该缓冲区的大小也很小。 然后,来自UART环形缓冲区的数据进入其中。 后者是在项目创建阶段使用CodeWizardAVR实用程序在CVAVR开发环境中自动实现的。

W5500连接到MKI SPI接口(MOSI,MISO,SCK,SCLK)。 此外,RST引脚(硬件复位)连接到特定的MK输出,相应的INT引脚连接到外部中断输入INT0。 后者用于预期目的:当W5500模块中发生事件时,它将在INT引脚上产生一个脉冲,该脉冲由外部中断主体中的控制器进行处理。 MK了解事件发生在哪个套接字上,然后将每个套接字的事件代码重写为一个特定的数组。 中断的进一步处理在主程序循环内进行。 总共记录了五个事件:客户端已连接,客户端已断开连接(更确切地说,是提交了断开连接请求),已从客户端接收到数据,超时有效,数据已成功发送。 在主循环中,处理除最后一个事件以外的所有事件。 switch-case语句位于此处理中。 在第三事件的处理部分(数据接收)中找到C代码的最大部分。 在其中,在处理接收到的信息的功能之后,还放置了开关案例操作符,但是在这种情况下,此“开关”与负责上述套接字状态的变量(值0、1、2)相关联。 第一部分负责密码识别过程。 接收到的字符将在单独的密码缓冲区中被覆盖。 在某些条件下,将接收到的字符串与包含密码的常量字符串进行比较的功能起作用。如果发生巧合,则分配相应的状态。第二部分是最简单的-它自己的接收信息缓冲区的内容被重定向到微控制器的UART。这是正常使用模式。第三部分(最大的部分)负责处理命令-设备控制模式。

该程序的主循环除了继续执行中断处理程序外,还包含虚拟计时器处理程序-超时,当密码不成功时断开连接,并定期发送“保持活动状态”并将TCP计时器形成的数据包发送给客户端。从UART读取的功能也位于主循环的主体中,在该主体的主体内,控制器接收的字符被复制到其自己的(中间)传输缓冲区中,并且计时器复位,该计时器负责生成TCP数据包。

所有套接字过程都放置在一个从0到7的循环中,该循环的迭代器绑定到套接字号。因此,发生了对所有套接字的顺序处理。最初,我的意思是,如果您为八个插座中的每个插座分配相同的端口号,则可以在同一端口上最多连接八个用户。但是,此配置不起作用,并且此问题已推迟到将来。

在设计电路板设计时,我在DS1307芯片上提供了一个实时时钟(RTC)。 Atmega8 MK,用于11.0592 MHz频率的石英(为UART精度选择频率),用于W5500模块的连接器,MK端口连接器(包括用于固件的SPI,UART),带有自己的石英的RTC和CR2032电池仓位于两面印刷电路板上,5 V线性稳压器(7805),电源连接器等。 Sprint Layout程序中的印刷电路板草图如图11所示。唯一显示为红色的元素焊接在背面,但我将其焊接到正面。

11.电路板示意图。

完成的结构的照片如图12所示。该结构中的时钟将用于标记W5500插座发生各种事件期间的时间,如果用户以控制方式进行连接,则该时间将在消息旁边的终端中分配给用户。而且,时钟将在将来方便使用NTP时间协议进行实验或用于任何其他目的。

12.完成结构的照片。

总之,值得注意的是,内部设计在很大程度上证明了类似工业级设备的合理性。主要优点是价格。事实证明,与制成的类似设备相比,制造起来要便宜得多。并且不可避免地存在诸如功能受限的缺点。在这种情况下,由于设置了相应的简化目标,因此使用了简化的Atmega8控制器。

13.工业转换器TCP / IP-RS-232。

图13显示了一个基于W5100芯片的工业TCP / IP到RS-232转换器的示例,与W5500非常相似。除了灵活的管理界面外,它还具有另一优势。除了使用TCP / IP终端外,还可以使用设备随附的特殊驱动程序在客户端上安装虚拟COM端口。通过它,您可以使用没有TCP / IP连接模式的常规终端进行连接。此外,如果通过虚拟COM端口连接了任何程序而不是终端,则该设备可以支持完整的RS-232数据交换。也就是说,图13中描述的设备是通过网络基础架构的成熟的RS-232桥接器。

Source: https://habr.com/ru/post/zh-CN414211/


All Articles