2012年7月9日星期一

如何使用W7100A實現Telnet伺服器(二)


在上篇博文(如何使用W7100A实现Telnet服务器(一))里我们简单地介绍一下Telnet,第三章将会演示Telnet函数的具体功能,第四章将涉及到代码的分析。这篇文档中所有的示例代码都是基于Keil uVision3。
下面我们介绍第二部分(包括第三章以及第四章的一部分):


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 ,谢谢!

没有评论:

发表评论