显示标签为“wiznet w7100a telnet 微知納特”的博文。显示所有博文
显示标签为“wiznet w7100a telnet 微知納特”的博文。显示所有博文

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

2012年7月6日星期五

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


这篇文档将会介绍Telnet以及使用iMCU7100EVB来实现Telnet服务器。除了连接到iMCU。用户可以用Telnet来控制LEDs。在第二章我们简单地介绍一下Telnet,第三章将会演示Telnet函数的具体功能,第四章将涉及到代码的分析。这篇文档中所有的示例代码都是基于Keil uVision3。


1.这里我们先分享前面部分,希望对大家有所帮助。


2. Telnet
Telnet是用于因特网或者局域网的网络协议,它可以为设备间提供一个双向的交互式通信。Telnet起源于RFC15,于1969年发展起来,随后开始标准化。带有TCP/IP协议栈的网络设备基本都支持Telnet服务。Telnet是一个广泛用于客户端/服务器的应用程序。
由于越来越多具有便捷功能浏览器的出现,Telnet的重要性逐渐降低。但是telnet对于众多用于远程连接的多用户电脑来说,仍然是一个很重要的工具;用户可以从住处、工作地点或者任何地方通过因特网连接到telent服务器。


图 2.1Telnet系统

2.1 NVT (网络虚拟终端)
对于用户来说,远程连接Telnet服务器的过程比较复杂。由于电脑将接收的特殊字符组合作为一个标记;同时根据OS的不同,这个特殊字符的组合也会不同,因此Telnet定义了一个NVT来解决这个问题。通过使用NVT,Telnet客户端将本地终端输入的字符组合转换成NVT格式,然后发送到网络。Telnet服务器将接收到的NVT格式字符转换成远程电脑可以接收和读取的格式。这个过程如下图2.2所示。


图2.2Telnet系统的NVT

NVT使用了两类字符组合;一个是用于数据,另外一个是用于远程控制。
用于数据的NVT通常使用NVT ASCII。NVT ASCII是一个8位的字符组合;较低7位与美国的ASCII相同,最高位为0。当最高位是1时,必须提前定义并在Telnet客户端和服务器之间的进行协商。
用于远程控制的NVT利用一个最高位置为1的8位控制字符。当发送用于进入特殊键的远程控制字符,设置连接和改变状态之前,先发送使用TCP的IAC(中断命令,值为0xFF)。因此,在IAC字符后接收到的字节会被看作远程控制字符。

表2.1NVT控制字符



控制字符
释义
EOF
236
文档结束
EOR
239
记录结束
SE
240
次选项结束
NOP
241
无操作
Data Mark
242
同步信道的数据流部分。这个应该带有一个TCP紧急通知。
Break
243
NVT 字符BRK
Interrupt Process
244
暂停,中断,终止或者结束与NVT连接的进程。同时,用于TELNET的其它协议的的部分外频信号都可能发生中断进程。
Abort output
245
允许当前的进程(出现)运行完成,但是不发送给用户它的输出。同时,向用户发送同步信道。
Are You There
246
回送给NVT一些可见的(例如:可打印的) 证据证明AYT接收到
Erase character
247
接收端应该从数据流中删除上一个之前未删除字符或者“打印位置”。
Erase Line
248
接收端一个删除数据流回送来的字符,但是不包括,上一个通过TELNET连接发送来的“CR LF”序列。
Go ahead
249
GA信号
SB
250表示接下来的是指示选项的次协商。
WILL
251表示开始执行的目的,或者确认你正在执行,指示选项。
WONT
252表示拒绝执行,或者继续执行,指示选项。
DO
253表示其它部分执行的请求或者确认你希望其它部分执行,指示选项。
DON’T
254表示要求其它部分停止执行,或者确认你不再希望其它部分执行,指示选项。
IAC
255中断命令。

2.2 用于Telnet终端的选项
正如之前提到的,客户端和服务器之间的选项能够在使用Telnet服务时进行协商。下表中显示了一些通用选项。
表2.2telent选项
选项ID
名称
备注
1
回显(Echo)
RFC857
3
抑制前进(Suppress go ahead)
RFC858
5
状态(Status)
RFC859
6
时序标记(Timing mark)
RFC860
24
终端类型(Terminal type)
RFC1091
31
窗口大小(Window size)
RFC1073
32
终端速度(Terminal speed)
RFC1079
33
远程流控制(Remote flow control)
RFC1372
34
行模式(Line mode))
RFC1184
36
环境变量(Environment variables)
RFC1408

在使用Telnet选项时必须用到客户端和服务器之间的协商选项。如表2.1所示,4个控制字符(WILL、WONT、DO以及DONT)用于选项协商。
为了能够激活选项,发送端发送WILL命令,询问“可以激活该选项吗?”然后,接收端将会发送DO命令,表示接受,或者DONT命令,表示拒绝。另外一种激活选项的方法是发送DO命令,表示“激活该选项”,并且接收端回送WILL命令或者WONT命令。
使选项无效的过程如下。发送端发送WONT命令,表示“不再使用该选项”。然后,接收端将会回送DO命令接受或者DONT命令拒绝。

图2.3telnet选项协商

2.3 Telnet操作模式
大多数Telnet的操作执行有三种模式:普通模式(General mode)、字符模式(Character mode),以及行模式(Line mode)。
-普通模式(General mode):这是选项协商在不选择字符或者行模式时最基本的模式。在这种模式下,回送所有的输入字符,直到一行完成才发送。
在向服务器发送完所有的行后,客户端等待GA命令直到一个新的行被接受。如果TCP连接是全双工的, 那么这种模式就是无效的,因为一般的Telnet工作于半双工模式。
-字符模式(Character mode): 当客户端输入字符时,每一个字符都被发送给服务器。服务器允许回送字符显示在客户端的屏幕上。在这种模式下,当回送字符的传输太慢时,可能会发生一些延时;此时,将会增加网络的负荷。
-行模式(Line mode): 一般情况下,建议使用行模式(Line mode),它可以覆盖普通模式(General mode)和字符模式(Character mode)的缺点。在这种模式下,用户的行编辑(回送,删除字符,删除行等等)都是可以的。在行被编辑完成后,发送给服务器。行模式以全双工模式执行,并且所有行可以不需要GA命令即被发送。

好了,这就是我们今天的内容,后续部分我们将尽快发布,谢谢关注。



如果您有任何疑问,请直接留言或登录WIZ net官方网站:http://www.wiznettechnology.cn/
或者来电:86-10-84539974(转166),QQ:2377211388,
邮箱:wiznetbj@wiznettechnology.com 联系人:Jerry ,谢谢!