`
happmaoo
  • 浏览: 4474745 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

第三部分-使用高速SPI以太网控制芯片W5200登录Telnet服务器

 
阅读更多

最近我们给大家介绍了很多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。

1.jpg
1.1.jpg

4.2 Init_telopt()和sendlAC()功能

Init_telop()是用来决定远程服务器与客户机之间的选择方式。由于在测试程序中是有ECHO选项,所以用户只能用WILL命令来设置ECHO选项。正如在第二部分中所解释到的那样,当发送一个控制字符时,IAC(0xFF)也必须要一起发送。SendlAC()是用于发送IAC和控制字符的。

2.jpg
2.1.jpg

4.3 Tel_input()的功能

Tel_input()是用来处理在远程终端命令的功能。对于每一条指令和处理方式,请参考Table 3.1。

3.jpg

3.1.jpg

3.2.jpg
3.3.jpg

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),希望本篇文章可以给您带来帮助,谢谢。


分享到:
评论

相关推荐

    SPI转以太网协议栈芯片CH392DS1开发资料.PDF

    CH392 是以太网协议栈管理芯片,用于单片机系统进行以太网通讯。... CH392 支持两种通讯接口: SPI 接口或者异步串口,单片机/DSP/MCU/MPU 等控制器可以通 过上述任何一种通讯接口控制 CH392 芯片进行以太网通讯。

    FDCAN_高速SPI转CAN芯片

    1. **SPI接口**: MCP2517集成了高速SPI接口,可以与主控制器轻松连接,SPI工作速度最高可达50MHz,支持4线SPI模式。 2. **FDCAN兼容性**: 该芯片遵循ISO 11898-2标准,支持FDCAN协议,可实现高达5Mbit/s的数据传输...

    pg153-axi-quad-spi.pdf

    使用PS端的SPI控制器(PS端有两个SPI控制器) 在PL端使用配置成标准SPI通信的AXI Quad SPI (QSPI) IP模块 我们可以根据应用的要求来选择使用哪种方法实现SPI控制器。两种SPI的实现方式都支持四种SPI模式,并且都...

    conextop-cn-串口转以太网soc单芯片CXT32SI1X NeChip

    供电电压为3.2-3.45V,部分型号可能需要额外1.8V电源供核心使用。 - **系统参数**: - 集成以太网和完整网络系统的芯片模块,确保在高波特率下双向全速不间断传输数据; - 支持RS-232/485/422接口,内置高效智能的...

    以太网控制-基于单片机的控制

    常见的以太网控制芯片包括W5100、W5500等,这些芯片具备高性能的硬件TCP/IP协议栈,支持同时处理多个TCP连接,非常适合于小型网络应用场合。 - **W5100:**该芯片采用LQFP64封装,内置硬件TCP/IP协议栈,支持多达8...

    ICM20948-master-SPI-HAL库

    3. 示例代码或测试程序:帮助开发者理解如何使用库来控制ICM20948。 4. 头文件:定义了库的函数原型和结构体,供用户在自己的项目中包含并调用。 5. 文档:可能包括API参考手册、用户指南等,解释库的使用方法和注意...

    spi 转 UART芯片

    ### spi 转 UART芯片知识点解析 #### 一、概述 **spi 转 UART芯片**,即SPI-to-UART转换芯片,这类芯片主要用于将SPI(Serial Peripheral Interface,串行外设接口)通信协议转换为UART(Universal Asynchronous ...

    conextop-en-串口转以太网soc单芯片CXT32SI1X NeChip

    ### Conextop-en-串口转以太网SOC单芯片CXT32SI1X NeChip 关键特性及应用 #### 一、概述 Conextop-en-串口转以太网SOC单芯片CXT32SI1X NeChip是一款高度集成的嵌入式处理器,专为实现串行通信与以太网连接而设计。...

    28335-AD2S1210-28335自带SPI

    标题中的“28335-AD2S1210-28335自带SPI”表明我们将探讨如何使用TI公司的TMS320F28335微控制器通过其内置的SPI(串行外设接口)与Analog Devices的AD2S1210数字信号转换器进行通信。这个主题涉及嵌入式系统、数字...

    硬件以太网协议芯片 w5100

    综上所述,W5100硬件以太网协议芯片凭借其高效的性能、全面的协议支持、灵活的接口选项以及广泛的应用范围,已经成为嵌入式系统领域不可或缺的重要组成部分。无论是对于硬件开发者还是最终用户而言,W5100都能够提供...

    MCP23S17_spi扩展io_spi接口IO扩展_spi扩展io芯片_MCP23S17STM32_mcp23_

    标题"MCP23S17_spi扩展io_spi接口IO扩展_spi扩展io芯片_MCP23S17STM32_mcp23_"提到了几个关键概念,包括MCP23S17,SPI扩展IO,SPI接口,以及与STM32微控制器的关联。MCP23S17是一款由Microchip Technology制造的16位...

    AK8975磁力计数据采集--模拟SPI读取1

    该函数使用 bit-banging 方式来模拟 SPI 读取操作,通过控制 CSB、SK、SI 和 SO 信号来实现数据的读取。 五、AK8975 数据读取函数 AK8975 数据读取函数用于读取 AK8975 磁力计芯片的寄存器数据。该函数首先将 CSB ...

    基于ENC28J60以太网控制器的SPI接口设计.pdf

    ### 基于ENC28J60以太网控制器的SPI接口设计 #### 一、引言 随着信息技术的迅速发展,网络通信已经成为现代工业自动化、智能家居等领域的核心技术之一。其中,以太网作为最广泛应用的局域网技术,其在数据传输方面...

    spi.rar_board_linux spi_linux-spi_spi_spi 2440

    SPI(Serial Peripheral Interface)是一种广泛应用于微控制器和其他设备之间的串行通信接口,它允许设备以全双工模式进行数据传输。在"spi.rar_board_linux spi_linux-spi_spi_spi 2440"这个主题中,我们可以看到...

    电子-34以太网触摸屏STM32F107ETHLCD神舟IV号Telnet远程登录V1.1.rar

    在本项目中,STM32F107通过TCP/IP协议栈实现了服务器端的Telnet服务,用户可以通过任意支持Telnet的客户端工具,如Windows命令行的telnet.exe或各种第三方软件,实现远程登录和控制设备。 5. 神舟IV号设备: ...

    esp8266模块-SPI使用demo

    ESP8266模块经常与其他支持SPI的硬件配合使用,如EEPROM、LCD显示屏、传感器或闪存芯片。例如,可以使用SPI接口与SD卡模块通信,实现文件系统的扩展。 6. 注意事项 - 为避免信号冲突,确保所有SPI设备的SS线都是...

    5200芯片手册

    W5200芯片作为一款高性能的网络控制器,不仅集成了丰富的网络通信协议和物理层功能,还提供了灵活的SPI接口和低功耗模式,使其成为构建各类网络化嵌入式系统的理想选择。无论是家庭自动化、工业控制还是医疗设备,W...

    以太网交换芯片资料

    以太网交换芯片是网络设备的核心部件之一,它负责在局域网中高效地转发数据包,而Broadcom 56504和56300交换芯片是其中的代表性产品。在深入了解这些交换芯片的工作原理前,我们需要先了解以太网交换芯片的基本架构...

    axi-quad-spi 示例工程

    AXI-Quad SPI 示例工程是基于AXI接口的四线SPI(Serial Peripheral Interface)控制器设计的一个实例,通常用于嵌入式系统中与各种外设进行通信。在本示例工程中,我们将深入探讨AXI-Quad SPI的工作原理、设计结构...

    SPI接口以太网控制器 SR9640

    ### SPI接口以太网控制器SR9640关键知识点解析 #### 一、产品特性概述 SR9640是一款高度集成化的以太网控制器,它具有以下显著特点: 1. **集成10/100Mbps MAC和PHY**:这款芯片内部集成了物理层(PHY)与媒体接入...

Global site tag (gtag.js) - Google Analytics