显示标签为“乙太網 shield WIZnet 微知納特 伺服器 W7100A Telnet”的博文。显示所有博文
显示标签为“乙太網 shield WIZnet 微知納特 伺服器 W7100A Telnet”的博文。显示所有博文

2012年7月25日星期三

WIZnet员工Rachel 2012培训笔记1


WIZnet核心技术和产品对比
大家好,我是来自中国地质大学研二的学生,有幸加入WIZnet公司。今天第一天上班,经过上午短暂的培训,让我对WIZnet有了全新的认识。以前没有从来没有接触过硬件协议栈,都是在用软件在做协议栈。因为网络是一个很复杂的设备,尤其是面向连接的TCP/IP协议,很多情况都得考虑。但WIZnet只用硬件就实现了协议栈的功能,以自己目前的知识还不能理解具体硬件逻辑如何实现网络各个层的报文封装,希望在后期的培训中能理解其中的原理。
今天的培训Jerry主要介绍了公司的历史,主要产品,未来前景。WIZnet是一个很有特点的公司,WIZnet的核心技术就是全硬件的TCP/IP协议栈,它能独立于MCU工作,负载所有TCP/IP协议栈的处理过程,与嵌入式操作系统相兼容更适合于无操作系统装置。常见的以太网解决方案有很多弊端:1.需要OS 或者 软件栈;2.研发OS ,更换MCU和増加内存都会导致成本增加;3.使用公开源代码时, 其稳定性和安全性都是必须考虑的。硬件方面,与传统的以太网解决方案相比,WIZnetMACPYH集成到一块芯片里并加入了各种标准的网络协议。因此,WIZnet芯片可以减少MCU的负载,给用户留出更多的可占用资源。Lookback回路测试表示,WIZnet W5300的传输速度比一般的软件协议栈多一倍多,而且当网络负载增大时也速度也很稳定,而这时单纯的软件协议栈永远达不到的。总结WIZnet硬件协议栈的好处有以下几点:易于使用,开发者无需专业的网络知识,如同控制外部存储器一样简单,真正实现网络的透明传输;高吞吐率,有效地卸载主芯片TCP/IP处理负载,释放更多的CPU资源;高稳定性,保证高速稳定的通信速率;高安全性,由于TCP/IP在主系统外独立运行,因此能有效地防止外部恶意网络攻击;开发方便,由于网络部分相对独立于主系统,无需移植繁琐的 TCP/IP协议栈。
WIZnet有两种主要产品: 全硬件TCP/IP协议芯片和模块和串口转无线模块。全硬件TCP/IP协议芯片有W7200W7100AW5200W5300W5100W3150A+。具体的各个型号的主要特点和功能将在以后的培训笔记中介绍。基于这些芯片,WIZnet也开发了很多相应的模块,通过SPI或总线接口将MCUWIZnet芯片连接,方便开发人员的使用。WIZnet还开发了很多串口转以太网的模块,如WIZ100SRWIZ105SRWIZ110SRWIZ107SRWIZ108SR。其中前三种都是内嵌MCU,用的芯片是W5100,后面两种用的是W7100芯片。具体的模块功能还有一些多接口的串口转以太网模块读者可以去http://www.wiznettechnology.cn/下载用户手册查阅。应用模块包括:WIZ200WEB,可嵌入式网页服务器模块;WIZ220IO,用于远程监察和控制;WIZ-SM10,应用于智能电表。当然,使用WIZnet模块将给你带来很多好处,这些模块都是经过长期的测试,稳定而且可靠,价格方面也很有竞争性,为用户提供demo和配置工具。WIZnet WiFi 模块也有很多具有竞争力的产品,如WIZ610wiWIZ630wi等。WIZnet还提供开发板来方便开发人员的开发、测试。
WIZnet主要应用于智能能源、消费电子、安全和工业等方面。WIZnet的客户很多都是世界知名企业,其中很多都是行业的领跑者如HoneywellSIEMENSSHARPLG等。WIZnet在智能电表、医疗设备方面有很多的成功的案例。WIZnet合作伙伴Arduino(主要的开源硬件(OSHW)平台, 有数千万工程师和爱好者跟随)的官方以太网扩展板是使用WZnet W5100芯片,硬件开源平台与Linux软件开源平台一样,为开发者提供便捷的开发平台。
如今,在物联网发展的热潮下,以太网接口无处不在,更多的电子设备必将加入网络,WIZnet是目前唯一一个发展硬件协议栈的公司,将网络真正当作一个设备来做,传输速度和稳定性等方面都是软件协议栈无法比拟的。使用硬件协议栈不仅降低了开发成本,将开发周期也大大缩短,日后的维护也更加方便。因此,我相信在以太网解决方案方面WIZnet将会有更广阔的市场前景。
往后我将会陆续写一些有关WIZnet主要产品和核心技术的培训笔记,并与大家分享我的博文,还请各位大侠给我指点一二,当然,期间的任何问题也可以与我共同交流探讨。
欢迎阅读评论~


如果对于我们公司的产品技术感兴趣,欢迎随时联系我们。
可以直接留言或登录WIZnet官方网站:http://www.wiznettechnology.cn/
或者来电:86-10-84539974(转166),QQ:2377211388,
邮箱:wiznetbj@wiznettechnology.com 联系人:Jerry ,谢谢!
公司微博是: http://weibo.com/wiznet2012

2012年7月10日星期二

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


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


4.3 tel_input()函数
tel_input()函数用来处理Telnet终端机内的输入命令。具体每一个命令以及处理方法请参考表3.1。
void tel_input(SOCKET s)
{
uint8 xdata c;
while(1){
if((getSn_RX_RSR(s)) == 0)  break;     /*如果没有接收到的数据,断开*/
if(recv(s, &c, 1) == 0) break;     /*如果接收到的数据为0,断开*/
if(user_state == LOGOUT)  break;     /*如果用户的声明是LOGOUT, 断开*/
if(c != IAC){         /*如果接收到的数据不是控制字符*/
data_buf[buf_index++] = c;    /*保存接收到的数据到data_buf*/
putchar(c);
if(user_state == LOGOUT)  break;
if(user_state != PASSWORD){
       sprintf(buf, "%c", c);
       send(s, buf, strlen(buf));
}
if(c == '\n'){     /*如果接收到一个\n’ ASCII 代码*/
       if(buf_index > 1){
         if(data_buf[buf_index-2] == '\r')  data_buf[buf_index-2] = '\0';
         else  data_buf[buf_index-1] = '\0';
         proc_command(s);      /* 处理接收到的数据*/
         if(user_state == LOGIN) {
           sprintf(buf, "W7100>");
           send(s, buf, strlen(buf));
         }
       }
       else{
         sprintf(buf, "W7100>");
         send(s, buf, strlen(buf));
       }
       buf_index = 0;
}
continue;
}
if(recv(s, &c, 1) == 0)  break;
switch(c){            /*如果接收到一个IAC字符*/
case WILL:
if(recv(s, &c, 1) == 0)  break;
willopt(s, c);      /*调用willopt()处理WILL命令*/
break;
case WONT:
if(recv(s, &c, 1) == 0)  break;
wontopt(s, c);      /*调用wontopt()来处理WONT命令*/
break;
case DO:
if(recv(s, &c, 1) == 0)  break;
doopt(s, c);      /*调用doopt()处理DO命令*/
break;
case DONT:
if(recv(s, &c, 1) == 0)  break;
dontopt(c);      /*调用dontopt()处理DON’T命令*/
break;
case IAC:
break;
}
break;
}
return;
}
程序4.3parseMSG()函数

4.4 proc_command()函数
proc_command()函数处理在tel_input()函数中输入的命令。它定义了HELP、GET LED、LED0 ON/OFF和LED2 ON/OFF命令。对于未定义的命令它显示“BAD COMMAND”。
void proc_command(SOCKET s)
{
uint8 i;
char **cmdp, *cp;
char *help = {"HELP: Show all available commands\r\n\GET LED: Show all LED status\                  \r\nLED0 ON/OFF: Turn ON/OFF the LED0\r\nLED1 ON/OFF: Turn ON/OFF the LED1\
         \r\nLED2 ON/OFF: Turn ON/OFF the LED2\r\nEXIT: Exit from W7100 Telnet server\r\n"};
       /*Translate the first word to lower case*/
for(cp = data_buf; *cp !='\0'; cp++){
*cp = tolower(*cp);     /* 将大写字母翻译成小写字母*/
}
if(user_state == USERNAME){
strcpy(user_name, data_buf);
sprintf(buf, "Please insert your PW: ");
send(s, buf, strlen(buf));
user_state = PASSWORD;
return;
}
else if(user_state == PASSWORD){
strcpy(user_password, data_buf);
sprintf(buf, "\r\nSuccessfully connected!!\r\nImplemented Command: \
HELP, GET LED, LED0 ON/OFF, LED1 ON/OFF, LED2 ON/OFF, EXIT\r\n");
send(s, buf, strlen(buf));
user_state = LOGIN;
return;
}     /*查找表中的输入命令; 如果不表内,返回语法错误*/
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, "BAD command\r\n");
send(s, buf, strlen(buf));
return;
}
switch(cmdp - commands){
case HELP_CMD:         /* 处理HELP命令*/
printf("HELP_CMD\r\n");
sprintf(buf, help);
send(s, buf, strlen(buf));
break;
case GET_LED_CMD:        /*处理GET LED 命令*/
printf("GET_LED_CMD\r\n");
for(i = 0 ; i < 3 ; i++){
       sprintf(buf, "LED%bd is %s\r\n", i, ((P0 >> (i+3)) & 0x01) ? "OFF" : "ON");
       send(s, buf, strlen(buf));
}
break;
case LED0_ON_CMD:        /*处理LED0 ON命令*/
printf("LED0_ON_CMD\r\n");
sprintf(buf, "Turn ON the LED0\r\n");
send(s, buf, strlen(buf));
P0_3 = 0;       /* 将GPIO 0_3设置为0, 与低有效LED连接*/
break;
case LED1_ON_CMD:/*处理LED1 ON命令*/
printf("LED1_ON_CMD\r\n");
sprintf(buf, "Turn ON the LED1\r\n");
send(s, buf, strlen(buf));
P0_4 = 0;       /*将GPIO 0_4设置为0, 与低有效LED连接*/
break;
case LED2_ON_CMD:        /*处理LED2 ON命令*/
printf("LED2_ON_CMD\r\n");
sprintf(buf, "Turn ON the LED2\r\n");
send(s, buf, strlen(buf));
P0_5 = 0;        /* 将GPIO 0_5设置为0,与低有效LED连接*/
break;
case LED0_OFF_CMD:        /* 处理LED0 OFF命令*/
printf("LED0_OFF_CMD\r\n");
sprintf(buf, "Turn OFF the LED0\r\n");
send(s, buf, strlen(buf));
P0_3 = 1;        /*将GPIO 0_3设置为1,与低有效LED连接*/
break;
case LED1_OFF_CMD:        /* 处理LED1 OFF命令*/
printf("LED1_OFF_CMD\r\n");
sprintf(buf, "Turn OFF the LED1\r\n");
send(s, buf, strlen(buf));
P0_4 = 1;        /* 将GPIO 0_4设置为1,与低有效LED连接*/
break;
case LED2_OFF_CMD:        /* 处理LED2 OFF命令*/
printf("LED2_OFF_CMD\r\n");
sprintf(buf, "Turn OFF the LED2\r\n");
send(s, buf, strlen(buf));
P0_5 = 1;        /* 将GPIO 0_5设置为,与低有效LED连接*/
break;
case EXIT_CMD:        /*处理EXIT 命令*/
printf("EXIT command\r\n");
sprintf(buf, "EXIT command\r\n Good Bye~~\r\n Logout from W7100 TELNET");
send(s, buf, strlen(buf));
close(s);
user_state = LOGOUT;
break;
default:
break;
}
}
程序4.4proc_command()函数

4.5 willopt(), wontopt(), doopt()和dontopt()函数
willopt(), wontopt(), doopt()和dontopt()函数是用于协商Telnet选项的命令。它们需要socket s和选项作为输入参数。更多关于每个命令和选项的详细信息,请参阅表2.1和2.2。
void willopt(SOCKET s, int 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;     /*如果接收到‘WILL’并且它包含TN_SUPPRESS_GA选项,发送‘DO’ */
break;
default:
ack = DONT;  /* 拒绝其它未定义的命令*/
}
sendIAC(s, ack, opt);
}

void wontopt(SOCKET s, int 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:    /*如果接收到WONT带有TN_SUPPRESS_GA选项的命令*/
if (remote[opt] == 0){
remote[opt] = 1;     /*设置TN_SUPPRESS_GA选项*/
sendIAC(s, DONT, opt);  /* 发送带有TN_SUPPRESS_GA 选项的DONT命令*/
}
break;
}
}

void doopt(SOCKET s, int 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:      /*如果接收到带有TN_SUPPRESS_GA 选项的DO命令*/
sendIAC(s, WILL, opt);     /* 发送带有TN_SUPPRESS_GA选项的WILL命令*/
break;
case TN_ECHO:    /* 如果接收带有TN_ECHO选项的DO命令*/
sprintf(buf, "WELCOME TO THE W7100 TELNET SERVER!!\r\nPlease insert your ID: ");
send(s, buf, strlen(buf));
break;
default:
sendIAC(s, WONT, opt);
}
}

void dontopt(int 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:    /*如果接收带有TN_SUPPRESS_GA 选项的DON’T命令*/
if (remote[opt] == 0) remote[opt] = 1;  /*设置TN_SUPPRESS_GA选型*/
break;
}
}
程序4.5willopt(), wontopt(), doopt() and dontopt()函数


版权2011  WIZnet, Inc. 保留所有权利。

欲要更多详情,请查阅我们的网站http://www.wiznettechnology.cn


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