如何使用W7100A实现Telnet服务器(二)
0赞在上篇博文(如何使用W7100A实现Telnet服务器(一))里我们简单地介绍一下Telnet,第三章将会演示Telnet函数的具体功能,第四章将涉及到代码的分析。这篇文档中所有的示例代码都是基于Keil uVision3。
第一部分在这里:http://blog.chinaaet.com/detail/28678.html
下面我们介绍第二部分(包括第三章以及第四章的一部分):
3. Telnet演示
本章将演示前面所介绍的Telnet。下载用来演示Telnet的telnets.hex到EVB,以此来控制与GPIO端口连接的LED0、LED1和LED2。iMCU7100A-EVB将会作为Telnet服务器,用户PC机将会作为Telnet客户端。该示例的调试信息将会通过串口输出,因此可以打开一个串口终端程序来查看调试信息。在该演示中,我们将使用Windows自带的超级终端机。
连接iMCU7100A-EVB的电源线、网线以及Telnet演示需要的串口线。更多iMCU7100A-EVB开发板的信息,请参考文档‘iMCU7100A-EVB用户指南’。利用W7100 Debugger或者WizISP程序将‘Telnet服务器HEX文件’烧录到iMCU7100A-EVB中。若使用WizISP程序,用串行线连接PC机和开发板。若使用W7100A Debugger程序时,则选择用调试器线连接PC机和开发板。更多关于iMCU7100调试器程序和WizISP程序的信息,请参阅‘W7100A调试器指南’和‘W7100A的WizISP程序用户指南’。这些程序都包含在EVB附带的CD中,也可以从WIZnet主页上下载。
(a) W7100调试器 (b) WizISP
图3.1 W7100ADebugger和WizISP程序界面
将telnets.hex烧录到iMCU7100EVB开发板之后,打开超级终端机(Hyper terminal)程序。如果使用WizISP程序,关闭EVB开发板上的BOOTSEL引脚并且复位EVB开发板。如果要使用Debugger程序,点击‘运行’或者结束Debugger并且复位EVB开发板。COM2端口的设置如图3.2,该端口是测试PC机正在使用的串行端口号。该端口号应该根据用户PC机的设置来设定,波特率等的设置也应该根据代码进行修改。如果超级终端机(Hyper terminal)设置正确,将会显示如图3.3的信息。
图3.2超级终端机(Hyper terminal)设置
图3.3超级终端机(Hyper terminal)信息
使用超级终端机(Hyper terminal)检查输出Telnet服务器的IP地址,并且打开命令窗口输入“telnet 192.168.1.2”。Telnet服务器IP应该根据用户网络进行设置。先使用一个虚拟的IP:192.168.1.2来测试代码。在连接Telnet服务器成功之后,输入ID和PW。用户可以使用任意一个ID和PW登录。测试代码中的很多命令都能够在登录后使用。这些命令列在表3.1中,执行命令的过程如图3.4所示。用户可以使用Telnet终端机和超级终端机(Hyper terminal)来查看这些命令执行的结果。
表3.1 用于Telnet的命令
命令 |
描述 |
HELP |
显示所有有效命令 |
GET LED |
显示所有LED的状态 |
LED0 ON |
打开LED0 |
LED1 ON |
打开LED1 |
LED2 ON |
打开LED2 |
LED0 OFF |
关闭LED0 |
LED1 OFF |
关闭LED1 |
LED2 OFF |
关闭LED2 |
EXIT |
退出telnet服务器 |
图3.4 Telnet终端机运行信息
用户可以用‘LEDx ON/OFF’命令来打开/关闭LED,并且利用‘GET LED’命令远程确认LED的状态。在图3.4中,LED0、LED1和LED2都是打开的。如图3.5,LED的状态可以只通过查看iMCU7100A-EVB上的灯来检查。
图3.5 iMCU7100EVB与Telnet服务器运行
4 程序代码
这一章将介绍烧录到iMCU7100A-EVB上的Telnet服务器的示例代码。更多关于通过交换Telnet信息用到的TCP的内容,请参考文档‘如何使用W7100A实现TCP通信’。这一章将会更进一步解释说明main()函数内的TELNET()函数;将不再涉及到MCU初始化或者网络初始化的代码。
4.1 TELNETS()函数
TELNETS()是用来运行Telnet服务器的基本函数,它基于TCP来创建一个socket并且等待来自客户端的连接。在与客户端连接之后,调用init_telopt()函数来协商Telnet选项。为了进入命令模式,调用tel_input()函数。下一节将会进一步介绍init_telopt()函数和tel_input()函数的作用。Telnet使用的Socket s可以从0到7。根据Telnet标准,Telnet默认的端口号是23。
void TELNETS(SOCKET s, uint16 port) { uint8 first; switch(getSn_SR(s)) /*获取socket s的声明*/ { case SOCK_ESTABLISHED: /* 如果建立socket*/ if(first == 1) /* 如果首先与客户端连接*/ { printf("W7100 TELENT server started via SOCKET%bu\r\n", s); init_telopt(s); /*初始化并且协商选项*/ first = 0; } if((getSn_RX_RSR(s)) > 0) tel_input(s); /*如果有任何接收数据,处理它*/ break; case SOCK_CLOSE_WAIT: disconnect(s); /*断开socket s连接*/ break; case SOCK_CLOSED: printf("Close SOCKET:%bu\r\n", s); close(s); /*关闭socket s */ socket(s, Sn_MR_TCP, port, 0); /* 打开用于TCP的socket s*/ break; case SOCK_INIT: listen(s); /* 监听socket s */ printf("Listen SOCKET:%bu for Telnet server\r\n", s); user_state = USERNAME; first = 1; break; } /* 终止switch */ } /* 终止TELNETS函数*/ |
程序4.1TELNETS()函数
4.2 init_telopt()和sendIAC()函数
Init_telopt() 函数用来协商Telnet服务器和客户端之间的选项。由于只有ECHO选项用来测试代码,用户可以只使用WILL命令进行协商。如第二章所提到的,当发送控制字符时必须一起发送IAC(0xFF)字符。SendIAC()函数用来发送IAC字符和控制字符。
void init_telopt(SOCKET s) { sendIAC(s, WILL, TN_ECHO); /* 协商ECHO选项*/ } void sendIAC(SOCKET s, char r1, char r2) { switch(r1) { case WILL: /* WILL命令*/ printf("sent: will"); break; case WONT: /* WONT命令*/ printf("sent: wont"); break; case DO: /*DO命令*/ printf("sent: do"); break; case DONT: /* DON’T命令*/ printf("sent: dont"); break; } if(r2 <= NOPTIONS) printf("%s\r\n", tel_options[r2]); else printf("%u\r\n", r2); sprintf(buf, "%c%c%c", IAC, r1, r2); send(s, buf, strlen(buf)); /*向客户端发送IAC,命令和选项*/ } |
程序4.2init_telopt()和sendIAC函数
如果您有任何疑问,请直接留言或登录WIZ net官方网站:http://www.wiznettechnology.cn/
或者来电:86-10-84539974(转166),QQ:2377211388,
邮箱:wiznetbj@wiznettechnology.com 联系人:Jerry ,谢谢!