最近我们给大家介绍了很多Telnet服务器的知识,在您尽情享受Telnet所带给您的便捷的同时相信您已经对Telnet了解不少了,您有什么意见和学习心得吗?大家一起讨论吧。今天我将继续为大家献上我的一点学习心得,给出一些基于IAR编译器的代码例子,希望对您有用。
4执行代码
这个部分将复习加载在W5200E01-M3远程服务器的示例代码。更多有关基于用TCP实现远程信息交换的细节,请查阅“How to implement TCP for W7100”文档。这个部分将进一步解释在main()功能中的TELNETS的功能;但对与MCU初始化和网络初始化的代码不做解释。
4.1 TELNETS()功能
TELNETS()功能是执行远程服务器的基本功能,并且它是基于TCP来建立的SOCKET和等待客户机的连接。在于客户机建立连接之后,调用init_telopt()来选择远程登录方式。为了进入命令模式,需要调用tel_input()。下一小节将进一步说明init_telopt()和tel_input()的作用。远程服务使用socket可以从0到7。但端口号必须设置为23,因为根据远程服务标准,远程服务的专用端口号为23。
4.2 Init_telopt()和sendlAC()功能
Init_telop()是用来决定远程服务器与客户机之间的选择方式。由于在测试程序中是有ECHO选项,所以用户只能用WILL命令来设置ECHO选项。正如在第二部分中所解释到的那样,当发送一个控制字符时,IAC(0xFF)也必须要一起发送。SendlAC()是用于发送IAC和控制字符的。
4.3 Tel_input()的功能
Tel_input()是用来处理在远程终端命令的功能。对于每一条指令和处理方式,请参考Table 3.1。
4.4 Logic()功能
当用户登录远程服务器时,Logic()是用来检查用户ID信息和密码。如果所输入的信息和已有的登录信息相比配的话,用户将成功连接到远程服务器。但是,如果与登录信息不相同,则会要求用户重新输入ID和密码。
uint8 telnet_ID[] = {
"wiznet"
};
uint8 telnet_PW[] = {
"0000"
};
void login(SOCKET s)
{
if(user_state == USERNAME) { /* input the client ID and Password */
strcpy((char *)user_name, data_buf);
sprintf(buf, "Password : ");
send(s, (uint8 const *)buf, strlen(buf), FALSE);
user_state = PASSWORD;
return;
} else if(user_state == PASSWORD) {
strcpy((char *)user_password, data_buf);
/*Check the client ID and Password*/
if(!(strcmp((char const *)user_name, (char const *)telnet_ID)) && !(strcmp((char const
*)user_password, (char const *)telnet_PW))) {
sprintf(buf, "\r\n=======================");
send(s, (uint8 const *)buf, strlen(buf), FALSE);
sprintf(buf, "\r\nSuccessfully connected!\
\r\nImplemented Commands : HELP, GET LED, LED3 ON/OFF, LED4 ON/OFF, EXIT\r\n"); send(s, (uint8 const *)buf, strlen(buf), FALSE);
sprintf(buf, "=======================\r\n"); send(s, (uint8 const *)buf, strlen(buf), FALSE); user_state = LOGIN;
return;
} else {
/* If the ID or Password incorrect, print error msg */
sprintf(buf, "\r\nID or Password incorrect!\r\n"); send(s, (uint8 const *)buf, strlen(buf), FALSE); sprintf(buf, "ID : ");
send(s, (uint8 const *)buf, strlen(buf), FALSE); user_state = USERNAME;
return;
}
}
} /* End login function */
4.5 Proc_command()功能
Proc_command()是用来处理在tel_input()程序中的输入的命令。它详细说明了有关“HELP,GET LED,LED0 ON/OFF,LED1 ON/OFF,LED2 ON/OFF”的命令。对于没有定义的命令,则会出现“BAD COMMAND”字样的信息。
void proc_command(SOCKET s)
{
char **cmdp;
char *cp;
char *help = {"HELP: Show all available commands\ \r\nGET LED: Show all LED status\
\r\nLED3 ON/OFF: Turn ON/OFF the LED3\
\r\nLED4 ON/OFF: Turn ON/OFF the LED4\
\r\nEXIT: Exit from W5200 TELNET server\r\n"}; /* command HELP : Message */
for(cp = data_buf; *cp != '\0'; cp++){
*cp = tolower(*cp); /* Translate big letter to small letter */
}
if(*data_buf != '\0') {
/* Find the input command in table; if it isn't there, return Syntax Error */
for(cmdp = commands; *cmdp != NULL; cmdp++) {
if(strncmp(*cmdp, data_buf, strlen(*cmdp)) == 0) break;
}
if(*cmdp == NULL) {
printf("NULL command\r\n");
sprintf(buf, "%s : BAD command\r\n", data_buf);
send(s, (uint8 const *)buf, strlen(buf), FALSE);
return;
}
switch(cmdp - commands) {
case HELP_CMD : /* Process HELP command */
printf("HELP_CMD\r\n");
sprintf(buf, help);
send(s, (uint8 const *)buf, strlen(buf), FALSE); break;
case GET_LED_CMD : /* Process GET LED command */
printf("GET_LED_CMD\r\n");
sprintf(buf, "LED%d is %s\r\n", 3, GPIO_ReadOutputDataBit(GPIOA, LED3) ? "OFF" : "ON"); send(s, (uint8 const *)buf, strlen(buf), FALSE);
sprintf(buf, "LED%d is %s\r\n", 4, GPIO_ReadOutputDataBit(GPIOA, LED4) ? "OFF" : "ON"); send(s, (uint8 const *)buf, strlen(buf), FALSE);
break;
case LED3_ON_CMD : /* Process LED3 ON command */
printf("LED3_ON_CMD\r\n");
sprintf(buf, "Turn ON the LED3\r\n");
send(s, (uint8 const *)buf, strlen(buf), FALSE);
GPIO_ResetBits(GPIOA, LED3); // led3 on
break;
case LED4_ON_CMD : /* Process LED4 ON command */
printf("LED4_ON_CMD\r\n");
sprintf(buf, "Turn ON the LED4\r\n");
send(s, (uint8 const *)buf, strlen(buf), FALSE);
GPIO_ResetBits(GPIOA, LED4); // led4 on
break;
case LED3_OFF_CMD : /* Process LED3 OFF command */
printf("LED3_OFF_CMD\r\n");
sprintf(buf, "Turn OFF the LED3\r\n");
send(s, (uint8 const *)buf, strlen(buf), FALSE);
GPIO_SetBits(GPIOA, LED3); // led3 off
break;
case LED4_OFF_CMD : /* Process LED4 OFF command */
printf("LED4_OFF_CMD\r\n");
sprintf(buf, "Turn OFF the LED4\r\n");
send(s, (uint8 const *)buf, strlen(buf), FALSE);
GPIO_SetBits(GPIOA, LED4); // led4 off
break;
case EXIT_CMD : /* Process EXIT command */
printf("EXIT command\r\n");
sprintf(buf, "EXIT command\r\nGood bye!\r\nLogout from W5200 TELNET\r\n"); send(s, (uint8 const *)buf, strlen(buf), FALSE);
close(s);
user_state = LOGOUT;
break;
default :
break;
}
}
} /* End proc_command function */
4.6 Willopt(),wontopt(),doopt()和dontopt()功能
Willopt(),wontopt(),doopt()还有dontopt()是用于远程服务选项协议的命令。它需要sockets和相应选项作为输入参数。更多信息可以参考Table2.1和Table2.2。
void willopt(SOCKET s, uint16 opt)
{
int ack;
printf("recv: will");
if(opt <= NOPTIONS) {
printf("%s\r\n", tel_options[opt]);
} else {
printf("%u\r\n", opt);
}
switch(opt) {
case TN_TRANSMIT_BINARY :
case TN_ECHO :
case TN_SUPPRESS_GA :
ack = DO; /* If receive 'WILL' and it has TN_SUPPRESS_GA option, transmit 'DO' */
break;
default :
ack = DONT; /* Refuse other commands which not defined */
}
sendIAC(s, ack, opt);
} /* End willopt function */
void wontopt(SOCKET s, uint16 opt)
{
printf("recv: wont");
if(opt <= NOPTIONS) {
printf("%s\r\n", tel_options[opt]);
} else {
printf("%u\r\n", opt);
}
switch(opt) {
case TN_TRANSMIT_BINARY :
case TN_ECHO :
case TN_SUPPRESS_GA :
if(remote[opt] == 0) {
remote[opt] = 1;
sendIAC(s, DONT, opt);
}
break;
}
/* If receive WONT command with TN_SUPPRESS_GA option */
/* Set the TN_SUPPRESS_GA option */
/* Send DONT command with TN_SUPPRESS_GA */
} /* End wontopt function */
void doopt(SOCKET s, uint16 opt)
{
printf("recv: do ");
if(opt <= NOPTIONS) {
printf("%s\r\n", tel_options[opt]);
} else {
printf("%u\r\n", opt);
}
switch(opt) {
case TN_SUPPRESS_GA : /* If receive DO command with TN_SUPPRESS_GA option */
sendIAC(s, WILL, opt); /* Send WILL command with TN_SUPPRESS_GA */
break;
case TN_ECHO : /* If receive DO command with TN_ECHO option */
sprintf(buf, "WELCOME!\r\nID : ");
send(s, (uint8 const *)buf, strlen(buf), FALSE);
break;
default :
sendIAC(s, WONT, opt);
}
} /* End doopt function */
void dontopt(uint16 opt)
{
printf("recv: dont ");
if(opt <= NOPTIONS) {
printf("%s\r\n", tel_options[opt]);
} else {
printf("%u\r\n", opt);
}
switch(opt) {
case TN_TRANSMIT_BINARY :
case TN_ECHO :
case TN_SUPPRESS_GA :
if(remote[opt] == 0) {
remote[opt] = 1;
}
break;
}
} /* End dontopt function */
/* If receive DONT command with TN_SUPPRESS_GA option */
相关博文信息请参阅:http://blog.csdn.net/wiznet2012/article/details/7192604
如果您有什么疑问请留言或者来信:wiznetbj@wiznettechnology.com,
Tel: 86-10-84539974(转166),希望本篇文章可以给您带来帮助,谢谢。
分享到:
相关推荐
CH392 是以太网协议栈管理芯片,用于单片机系统进行以太网通讯。... CH392 支持两种通讯接口: SPI 接口或者异步串口,单片机/DSP/MCU/MPU 等控制器可以通 过上述任何一种通讯接口控制 CH392 芯片进行以太网通讯。
1. **SPI接口**: MCP2517集成了高速SPI接口,可以与主控制器轻松连接,SPI工作速度最高可达50MHz,支持4线SPI模式。 2. **FDCAN兼容性**: 该芯片遵循ISO 11898-2标准,支持FDCAN协议,可实现高达5Mbit/s的数据传输...
使用PS端的SPI控制器(PS端有两个SPI控制器) 在PL端使用配置成标准SPI通信的AXI Quad SPI (QSPI) IP模块 我们可以根据应用的要求来选择使用哪种方法实现SPI控制器。两种SPI的实现方式都支持四种SPI模式,并且都...
供电电压为3.2-3.45V,部分型号可能需要额外1.8V电源供核心使用。 - **系统参数**: - 集成以太网和完整网络系统的芯片模块,确保在高波特率下双向全速不间断传输数据; - 支持RS-232/485/422接口,内置高效智能的...
常见的以太网控制芯片包括W5100、W5500等,这些芯片具备高性能的硬件TCP/IP协议栈,支持同时处理多个TCP连接,非常适合于小型网络应用场合。 - **W5100:**该芯片采用LQFP64封装,内置硬件TCP/IP协议栈,支持多达8...
3. 示例代码或测试程序:帮助开发者理解如何使用库来控制ICM20948。 4. 头文件:定义了库的函数原型和结构体,供用户在自己的项目中包含并调用。 5. 文档:可能包括API参考手册、用户指南等,解释库的使用方法和注意...
### spi 转 UART芯片知识点解析 #### 一、概述 **spi 转 UART芯片**,即SPI-to-UART转换芯片,这类芯片主要用于将SPI(Serial Peripheral Interface,串行外设接口)通信协议转换为UART(Universal Asynchronous ...
### Conextop-en-串口转以太网SOC单芯片CXT32SI1X NeChip 关键特性及应用 #### 一、概述 Conextop-en-串口转以太网SOC单芯片CXT32SI1X NeChip是一款高度集成的嵌入式处理器,专为实现串行通信与以太网连接而设计。...
标题中的“28335-AD2S1210-28335自带SPI”表明我们将探讨如何使用TI公司的TMS320F28335微控制器通过其内置的SPI(串行外设接口)与Analog Devices的AD2S1210数字信号转换器进行通信。这个主题涉及嵌入式系统、数字...
综上所述,W5100硬件以太网协议芯片凭借其高效的性能、全面的协议支持、灵活的接口选项以及广泛的应用范围,已经成为嵌入式系统领域不可或缺的重要组成部分。无论是对于硬件开发者还是最终用户而言,W5100都能够提供...
标题"MCP23S17_spi扩展io_spi接口IO扩展_spi扩展io芯片_MCP23S17STM32_mcp23_"提到了几个关键概念,包括MCP23S17,SPI扩展IO,SPI接口,以及与STM32微控制器的关联。MCP23S17是一款由Microchip Technology制造的16位...
该函数使用 bit-banging 方式来模拟 SPI 读取操作,通过控制 CSB、SK、SI 和 SO 信号来实现数据的读取。 五、AK8975 数据读取函数 AK8975 数据读取函数用于读取 AK8975 磁力计芯片的寄存器数据。该函数首先将 CSB ...
### 基于ENC28J60以太网控制器的SPI接口设计 #### 一、引言 随着信息技术的迅速发展,网络通信已经成为现代工业自动化、智能家居等领域的核心技术之一。其中,以太网作为最广泛应用的局域网技术,其在数据传输方面...
SPI(Serial Peripheral Interface)是一种广泛应用于微控制器和其他设备之间的串行通信接口,它允许设备以全双工模式进行数据传输。在"spi.rar_board_linux spi_linux-spi_spi_spi 2440"这个主题中,我们可以看到...
在本项目中,STM32F107通过TCP/IP协议栈实现了服务器端的Telnet服务,用户可以通过任意支持Telnet的客户端工具,如Windows命令行的telnet.exe或各种第三方软件,实现远程登录和控制设备。 5. 神舟IV号设备: ...
ESP8266模块经常与其他支持SPI的硬件配合使用,如EEPROM、LCD显示屏、传感器或闪存芯片。例如,可以使用SPI接口与SD卡模块通信,实现文件系统的扩展。 6. 注意事项 - 为避免信号冲突,确保所有SPI设备的SS线都是...
W5200芯片作为一款高性能的网络控制器,不仅集成了丰富的网络通信协议和物理层功能,还提供了灵活的SPI接口和低功耗模式,使其成为构建各类网络化嵌入式系统的理想选择。无论是家庭自动化、工业控制还是医疗设备,W...
以太网交换芯片是网络设备的核心部件之一,它负责在局域网中高效地转发数据包,而Broadcom 56504和56300交换芯片是其中的代表性产品。在深入了解这些交换芯片的工作原理前,我们需要先了解以太网交换芯片的基本架构...
AXI-Quad SPI 示例工程是基于AXI接口的四线SPI(Serial Peripheral Interface)控制器设计的一个实例,通常用于嵌入式系统中与各种外设进行通信。在本示例工程中,我们将深入探讨AXI-Quad SPI的工作原理、设计结构...
### SPI接口以太网控制器SR9640关键知识点解析 #### 一、产品特性概述 SR9640是一款高度集成化的以太网控制器,它具有以下显著特点: 1. **集成10/100Mbps MAC和PHY**:这款芯片内部集成了物理层(PHY)与媒体接入...