OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 123950|回复: 171

ALIENTEK 战舰ENC28J60 LWIP和UIP补充例程(LWIP WEB有惊喜)

  [复制链接]

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-12-9 13:06:03 | 显示全部楼层 |阅读模式
前面的话:自从接触网络模块,到现在有一阵子时间了,未来必定是网络的世界。学一些网络方面的知识是有必要的。我们ALINTEK 推出的ENC28J60网络模块块作为入门还是不错的。详细见此贴:
http://www.openedv.com/posts/list/9355.htm。时间对于一个开发人员是很宝贵的,如何快速应用是我们做技术的,都想要的。废话不多说了。因为主要集中在怎么应用所以有些细节可能不是正确的,
这个需要大家去质疑,去验证。

一、LWIP的应用
1.什么是LWIP?
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。

2.哪里可以下载源码?
在这里可以下载到最新的应用:http://savannah.nongnu.org/projects/lwip/

3.更多详细介绍?
在这里有详细的:http://lwip.wikia.com/wiki/LwIP_Wiki

4.如何移植?
LWIP 有三种应用模式 RAW API,Netconn API,Socket API.这里我们主要简单讲解如何移植RAW API。移植LWIP的过程也是一个了解LWIP大概结构的过程。
当你把所有的错误,和警告干掉的后就差不多了,呵呵。 
①首先到官网上下载好源码和应用例程。


lwip-1.4.1中src文件夹下的源码文件结构:

②按以下这个目录结构将源码加入到工程


前面三个就不用解释了,看看上面的源码文档结构就知道了,LWIP_ARCH文件夹是什么东东呢?它是一个操作系统与处理器平台配置有关的代码,你要问我这个东西哪里来的,
嘿嘿,从ST的官方固件库中偷来滴。里面包含了大小端的配置,类型定义,和操作系统有关的部分,不过这里没有用到操作系统,所以这个sys_arch.c文件需要改装下。
LWIP_APP顾名思义就是LWIP的应用程序了,这里面编写了,TCP服务器,TCP客户端,UDP服务器,UDP客户端,Webserver(应用程序和服务器的接口技术(CGI),动态网页技术(SSI),和ajax技术,做异步提交,获取数据)。的方法和例程。接下来请看我如何修改移植。


③底层驱动的移植。
在LWIP-NETIF文件加下,我们需要对ethernetif.c文件修改。该文件是一个底层网络接口框架。LWIP的作者已经为我们搭好了框架,其中有些代码是伪代码,我们只需要去实现就好了。

A.修改底层硬件初始化函数low_level_init(struct netif *netif)函数,在函数中设置好,网络的MAC地址,最大传输单元,然后再初始化ENC28J60,如果初始化失败则返回错误给上层调用的函数。



B.修改底层发送包的函数low_level_output(struct netif *netif, struct pbuf *p),在这个函数中将LWIP数据包中的缓冲区pbuf 复制到待发送的缓冲区lwip_buf中来,
然后利用ENC28J60的发包函数发出去。


C.修改底层接收包的函数low_level_input(struct netif *netif),这个过程就是把接收缓冲区lwip_buf中的数据复制到LWIP的pbuf中,如果收到了包, 我们就可以在lwip_buf中读取数据了。注:lwip_buf作为接收和发送数据的缓冲。


移植完这三个函数就差不多啦,简单吧,嘿嘿。

④在主函数main.c初始化LWIP。
lwip_init()是用来LWIP初始化的,但是其中的netif_init()初始化的是回环网络接口,我们想把数据发出去必须初始化ENC28J60。所以我们先调用lwip_init()来初始化LWIP的各个模块。
再利用netif_add函数添加网络接口就可以。这个函数会调用底层的 low_level_init函数,如果返回值为空,则说明ENC28J60初始化失败了。然后再注册,建立一下这个网络接口就OK了。

注意到上面的有一个函数 init_lwip_timer();  这个是什么呢,这个是用来初始化LWIP的定时器,用来计时用的,相当于LWIP的心脏。

⑤在主函数main.c中编写轮训协议栈函数
LWIP需要周期性的处理一些函数,这些函数是是根据你使能的协议和功能模块来调用的。比如你要用到TCP协议,你就必须周期性的调用tcp_tmr()。
注意到有个timer_expired函数,这个函数就在sys_arch.c文件中,这个文件本来与操作系统有关,现在改装了。用来初始化LWIP的时钟,提供超时检测的功能,相当于定时器了。


⑥配置LWIP
LWIP有一个标准配置文件在opt.h中,这个头文件又包含了lwipopts.h,通常我们配置LWIP是通过这个文件来配置的。
这个头文件可以覆盖opt.h中任何你需要的配置。这样做的好处,是源码更加健壮了,而且能够防止我们错误的配置,而改不回去了。
有几个配置是很重要的,NO_SYS  1-----无操作系统   MEM_ALIGNMENT    4 ---  分配内存是四字节对齐,这个很重要,曾经莫名其妙的出现hardfault
TCP_MSS      1460 --TCP最大段大小,这个是极限值了,我们可以传更多的数据。




⑦在main函数中加入LWIP_Polling(),基本上就移植完毕了。这时可以使用ping 命令。
比如我设置的IP地址为19.168.1.10则,通过cmd命令进入dos环境。通过 ping 192.168.1.10 -t 就可以不断查询网络是否联通了。


5.如何应用?
RAW API中文译为原始API可以说比较接近底层了,玩过socket编程的人都知道,socket编程用起来,是比较简单了,不像RAW API的模式,用起来比较麻烦,需要应用者对TCP,UDP这些协议,有一个
稍微深入的了解。这里我推荐一款抓包软件Wireshark。这个软件可以帮助你分析这些协议是怎么工作的。不过在用这个软件的,分析协议的时候最好不要连接到外网,会干扰的哦。


①TCP服务器和客户端
A.TCP通信简介
TCP是面向连接的,在进行通信前需要建立连接。下面以TCP服务器模式为例简单介绍下这个过程。
建立连接:(截图看不清见附件)建立连接.jpg发送数据:
发送数据.jpg
关闭连接:
服务器关闭连接.jpg

B.TCP服务器模式
RAW API大部分都是基于回调函数的API,我们需要按照一定的规范去实现这个回调函数。作为TCP服务器,必须要一个本地IP和端口。
处于服务器模式,是不需要设置远程主机IP和端口,因为远程主机在连接到服务器的过程当中,服务器会把它的IP地址等信息记录下来。就可以双向传输了。
tcp_bind(tcp_server_pcb,IP_ADDR_ANY,TCP_SERVER_PORT);//绑定本地所有IP地址和端口号 
tcp_listen(tcp_server_pcb); //开始监听端口

tcp_accept(tcp_server_pcb,tcp_server_accept); //指定监听状态的连接联通之后将要调用的回调函数
tcp_recv(newpcb, tcp_server_recv); //指定连接接收到新的数据之后将要调用的回调函数tcp_err(newpcb, tcp_server_error); //指定连接出错将要调用的函数tcp_poll(newpcb, tcp_server_poll, 0); //指定轮询时将要调用的回调函数对于不熟悉这种习惯的,开始可能有点迷糊糊,不过看多了就好了。上面四个函数,都是用来指定回调函数的。
他们指定的回调函数在指定事件(比如建立了连接,接收到了数据,连接空闲等等)发生的时候将会被调用。

C.TCP客户端模式
对于TCP客户端模式,我们需要指定连接的远程服务器的IP地址和端口号,其他的函数就不多说了,详细见代码
ip_addr_t ipaddr;IP4_ADDR(&ipaddr, 192, 168, 1, 101);   //设置本地ip地址tcp_connect(tcp_client_pcb,&ipaddr,TCP_CLIENT_PORT,tcp_client_connect);  //连接到远程服务器

②UDP的服务器和客户端
相对于TCP来说UDP则就简单了许多,他不需要像TCP一样需要建立连接通道才可以进行通信。没有重发机制。所以它是不可靠的通行。但是速度快,是他的一大亮点。
A:UDP服务器模式
udp_bind(udp_server_pcb,IP_ADDR_ANY,UDP_SERVER_PORT);  //帮顶本地IP地址和端口udp_recv(udp_server_pcb,udp_server_rev,NULL); //指定收到数据包时的回调函数不过需要注意在接受数据的udp_server_rev回调函数中需要将客户端的IP地址和端口记下来,方便UDP服务器发送数据给客户端。
udp_server_pcb->remote_ip = *addr; //记录远程主机的IPudp_server_pcb->remote_port = port;//记录远程主机的端口号
B:UDP客户端模式
udp_bind(udp_client_pcb,IP_ADDR_ANY,UDP_CLIENT_PORT); //这里可以绑定任意的端口,不一定是服务器的端口号,作为客户端主要关心的是要连接的端口和IPudp_connect(udp_client_pcb,&ipaddr,UDP_CLIENT_PORT);  //设置连接到远程主机
③web服务器
现在那种browse+server的模式很流行,在PC机中。这种模式,客户端只需要一个浏览器就OK了,不需要下载专门的客户端,现在的网页游戏这么流行就证明了这一点。你想想在家里,
我的手机通过WIFI连接到路由器,你的嵌入式服务器也连接到路由器,只要有手机,不需要携带笨重的电脑,装麻烦软件,就可以控制家里的电器,多爽啊,这就是物联网的应用。
如何减少嵌入式服务器的开发难度,是很多人研究的重点。感觉LWIP的CGI和SSI接口用起来还是比较爽的,结合一些流行的web前端技术,我们可以开发比较漂亮的应用。

A.什么是CGI?
CGI是Common Gateway Interface通用网关接口的简称。百度一下解释多多。其实,他的作用是用来让服务器和应用程序打交道的。当我们从浏览器获取参数和对应的值后,然后与应用程序
进行交互的这个函数,就是CGI函数了。对应的URLl路径就写一个对应的CGI函数。这样不同的请求,就有不同的处理,这个函数将会返回,你想发送给浏览器的文件的文件名路径。

B.CGI函数介绍
typedef  char *(*tCGIHandler)(int iIndex, int iNumParams, char *pcParam[],                             char *pcValue[]);参数说明:
iIndex :表示在ppcURLs数组中的索引号码, ppcURLs 是个什么玩意呢?
ppcURLs  的类型是这个东东。
typedef struct{    const char *pcCGIName;      //浏览器请求的URL    tCGIHandler pfnCGIHandler;  //定义的CGI函数指针} tCGI;那么这个东东有什么作用呢?,他是用来注册URL路径和对应的函数,void http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers),这个函数会对它进行设置。当浏览器发出一个请求URL时,这个URL路径对应的CGI函数就会执行。
lwip已经帮我们做好了,我只修需要注册URL路径和对应的CGI函数就可以了,爽吧。
iNumParams :表示URL中你请求参数和其参数对应值的个数,比如http://192.168.1.16/login.cgi?name=onetree&password=12345,参数是name和password,值是onetree和12345,个数就是2.pcParam :参数的数组,包含所有的参数
pcValue:  对应参数的值的数组
C.CGI应用举例
比如。浏览器,采用get的方式,发了一个请求。http://192.168.1.16/login.cgi?/name=onetree&password=12345
我们的应用程序怎么接收我们的用户名name和密码password呢?

1.注册URL路径和对应的函数
static const tCGI ppcURLs[] ={    { "/login.cgi",      Login_CGIHandler },  };

2.设置请求的URL的路径和CGI函数
#define NUM_CONFIG_CGI_URIS     (sizeof(ppcURLs ) / sizeof(tCGI))
 http_set_cgi_handlers(ppcURLs , NUM_CONFIG_CGI_URIS);

3.编写CGI函数
static char * Login_CGIHandler  ( int iIndex, int iNumParams, char *pcParam[], char *pcValue[] ){
  int index;
  index = FindCGIParameter ( "name", pcParam, iNumParams );
  if(index!=-1){
      name对应的参数值=  pcValue[index];      
  }
   index = FindCGIParameter ( " password", pcParam, iNumParams ); 
  if(index!=-1){
    password对应的参数值 =pcValue[index];  }
 return  "/index.html";  //这里返回你要发给浏览器的文件名路径

}
注意到有个 FindCGIParameter  的函数,这个函数是用来查找你想要的参数。
static int FindCGIParameter(const char *pcToFind, char *pcParam[], int iNumParams){    int iLoop;
    for(iLoop = 0; iLoop < iNumParams; iLoop++)    {        if(strcmp(pcToFind, pcParam[iLoop]) == 0)        {            return(iLoop);        }    }    return(-1);}到此为止,我们就完成了,浏览器和应用程序的交互了。

D.什么是SSI?
SSI是Server Side Include服务器嵌入端的简称。是一种类似于ASP的基于服务器的网页制作技术。
工作原理:LWIP对于.shtml,.ssi,.shtm后缀的文件,会检测文件中<!--#name-->格式的TAG标志。
然后再这个标记后面添加你想要的字符串。并不是替换,不过这个方法在脚本中不行, <!--#name-->
是html文件的注释,但是在 <script>...</script>中就不是注释了,所以在添加js代码的时候必须把整个
JS脚本添加进来。

E.SSI函数简介
typedef int (*tSSIHandler)(int iIndex, char *pcInsert, int iInsertLen)这个函数除了这三个参数外,还有其他三个可选的参数,这里没写出来,具体怎么用交给大家研究啦。
参数说明:
iIndex:在ppcTags数组中的索引号,ppcTags是一个字符串数组,用来标记tag名字的,比如<!--#name-->,“name”就是一个tag名
pcInsert:在tag后面插入的字符串
iInsertLen:在tag后面插入字符串的长度

F.SSI应用举例
1.新建一个index.shtml的文件,在文件中输入一下代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>welcom</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><meta   http-equiv= "Cache-Control"   content= "no-cache" /> </head><body><form id="login" name="login" method="get" action="login.cgi"><table width="200" border="1" align="center"><tr><td colspan="2" align="center">请按F5进行刷新</td></tr>
<tr><td width="50">内容:</td><td width="134"><label><!--#alientek--></label></td></tr></table></form></body></html>注意到上面有一个 <!--#alientek--> 的TAG,,利用LWIP的SSI的功能可以将我们想插入的字符串插入到后面。

2.编写SSI处理函数
static const char *ppcTags[] =  //TAG数组{    " alientek ",                 };enum ssi_index_s        //索引号{    SSI_INDEX_ALIENTEK_GET = 0, //该表对应ppcTags[]的排序} ;
static int SSIHandler ( int iIndex, char *pcInsert, int iInsertLen ){       switch(iIndex)    {        case  SSI_INDEX_ALIENTEK_GET:
           pcInsert = "alentek";
           iInsertLen = strlen(pcInsert );            break;               default:            strcpy( pcInsert , "" );                }    return  iInsertLen ;  //返回字符串的长度}

3.再编写一个返回URL为/index.shtml的文件的CGI函数就可以了。在页面中就可以看到alientek内容了。


最后重点介绍下ajax做异步提交,更新数据:
一、如何将静态页面转换为16进制的c语言数组?
前面说了这么多都没提这个重要的问题,希望大家别见怪,嘿嘿。
这里我谢谢 zhangpisces网友提供的资料。他的资料给了我很大的参考价值,喝水不忘,挖井人。 
步骤:
1.首先将网页源文件编写好,如工程中atk文件夹下的文件。2.将makefsfile工具和atk放在一个文件夹内.3.运行cmd,进入到makefsfile工具的目录。4.使用makefsfile -i  atk  -o fsdata.h -r -h 命令生成一个 fsdata.h文件
注意:在fs.c文件中需要注释掉//#include "fsdata.c"这个,我们不用。

二,添加/response.ssi文件
#define RESPONSE_BUF_SIZE 512   //http响应缓存大小
unsigned char data_response_ssi[RESPONSE_BUF_SIZE+14] ={ /* /response.ssi */ 0x2F, 0x72, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73,  0x65, 0x2E, 0x73, 0x73, 0x69, 0x00, };struct fsdata_file file_response_ssi[] ={ { NULL, data_response_ssi, data_response_ssi + 14, sizeof(data_response_ssi) - 14 }};makefsfile 生成的都是ROM文件,如果我们想要改变返回给浏览器的响应内容必须定义一个可以变化的文件。
在CGI函数中我们就可以把想发送的数据写入到这个文件当中,return "/response.ssi"就OK了。
三、编写基于ajax的JS代码
我把战舰原来uip的web例程(不过这个例程并没有用到SSI,是综合例程)改成了ajax异步获取数据,参考JS源码如下:
<script type="text/javascript">var xmlhttp;function loadXMLDoc(url,cfunc){  if (window.XMLHttpRequest)  {     xmlhttp=new XMLHttpRequest();  }  else  {     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  }  xmlhttp.onreadystatechange=cfunc;  xmlhttp.open("GET",url,true);  xmlhttp.send();}
function led0(){  loadXMLDoc("/led_red.cgi?red=1&t="+ Math.random(),function()  {    if (xmlhttp.readyState==4 && xmlhttp.status==200)    {  document.getElementById("red").src=xmlhttp.responseText;    }  });}
function led1(){  loadXMLDoc("/led_green.cgi?green=1&t="+ Math.random(),function()  {    if (xmlhttp.readyState==4 && xmlhttp.status==200)    {  document.getElementById("green").src=xmlhttp.responseText;    }  });}var text;
function update(){   loadXMLDoc("/orther.cgi?t="+ Math.random(),function()  {    if (xmlhttp.readyState==4 && xmlhttp.status==200)    {  text = xmlhttp.responseText;  text = text.split(";");  document.getElementById("temperature").innerHTML=text[0]+"℃";  document.getElementById("time").innerHTML=text[1];
    }  });
}function init(){ setInterval(update,1000);  }
</script>

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
到现在为止基本上讲完了,第一次发这么长的帖子,各位看官慢慢看。有错误请多多包容哦^_^
附件中还有战舰的UIP补充例程,添加了UDP的服务器和客户端模式,web没怎么搞。
还有LWIP例程。包括了TCP服务器,TCP客户端,UDP服务器,UDP客户端,WEBSEVER。这些功能,配合我们的ALIENTEK的ENC28J60模块就可以
直接在战舰开发板上运行了。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LWIP例程说明:
KEY_UP:选择实验(TCP服务器,TCP客户端,UDP服务器,UDP客户端,WEBSEVER)KEY_DOWN:发送数据
建议大家先学习UIP,然后再学LWIP可能效果要好些,毕竟UIP还是要简单得多。


建立连接 .jpg
发送数据包.jpg
服务器关闭连接.jpg

makefsfile.rar

20.68 KB, 下载次数: 5195

atk.rar

53.25 KB, 下载次数: 4942

ALIENTEK ENC28J60 UIP.rar

494.66 KB, 下载次数: 7581

ALIENTEK ENC28J60 LWIP.rar

1.21 MB, 下载次数: 13631

站在巨人的肩膀上不断的前进。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2014-11-13
在线时间
28 小时
发表于 2015-5-29 10:52:34 | 显示全部楼层
回复【112楼】fanghuiopenedv:
---------------------------------
函数返回类型 httpd_cgifunction* 去掉*就可以编译通过了。
回复 支持 1 反对 0

使用道具 举报

头像被屏蔽

88

主题

232

帖子

2

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-11
在线时间
40 小时
发表于 2013-12-9 14:07:25 | 显示全部楼层
占楼,求出租
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2013-12-9
在线时间
0 小时
发表于 2013-12-9 14:28:51 | 显示全部楼层
楼主,你好。我想实现 电脑的  web 和 stm32 通信。 stm32 方面 使用lwip协议栈。那么电脑方面 那个web 涅。stm32 是作为服务器端么,web端作为

客户端? 应该学习哪些东邪捏?能简单的说下嘛··
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2013-12-9 14:38:37 | 显示全部楼层
回复【3楼】Kalo425:
---------------------------------
嗯,这是典型的b/s browse+server的模式,要学的东西很多哦。需要学ENC28J60的操作,TCP/IP协议栈的应用(如LWIP),需要了解TCP/IP协议族(这个里面水很深)。做为WEB前端需要学CSS,HTML,JS,AJAX等等。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2013-12-9
在线时间
0 小时
发表于 2013-12-9 15:10:03 | 显示全部楼层
楼主是  那个 柯南大侠么··
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2013-12-9 15:40:32 | 显示全部楼层
回复【5楼】Kalo425:
---------------------------------
不是。-_-
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164817
金钱
164817
注册时间
2010-12-1
在线时间
2098 小时
发表于 2013-12-9 19:08:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-7-29
在线时间
0 小时
发表于 2013-12-9 19:46:53 | 显示全部楼层
楼主,我们的是1000个数据采集卡,每个数据采集卡上面都有一个DM9000,数据采集大约有1M左右的数据,存到了存储器里面,我们想把这100个采集卡存储器的数据发送到指定的电脑上,然后统一进行数据分析。要求每一个数据采集卡都能独立设置IP、网关和子网掩码,可以挂接在局域网的任何端口上面。
就是这样一个过程,我需要用到以太网的哪方面的知识
我现在比较迷茫
然后发送的数据在电脑上面用什么接收啊?
需要客户端,还是服务器啊,跪求楼主点播一二!
回复 支持 反对

使用道具 举报

5

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2012-8-10
在线时间
40 小时
发表于 2013-12-9 20:59:41 | 显示全部楼层
必须定呀,刚买了原子哥的网络模块正在学uIP,弄明白了跟楼主学lwip。
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2013-12-9 21:45:57 | 显示全部楼层
回复【8楼】xiaotaoqi637:
---------------------------------
采用LWIP协议栈,有两种办法。
1.通过TCP协议,首先配置1000个数据采集卡,为TCP客户端模式并使能DHCP功能从路由器自动获取IP地址,因为服务器的地址和端口,是预先知道的,利用自动分配的IP地址就可以和服务器通信。上位机作为服务器可以记录他们的IP地址,上位机最好用多线程做。就可以和他们通信了。可以通信了就可以配置他们的IP地址了(注意不能和已分配的IP地址起冲突)。这样做的缺点是数据传输速度可能比较慢,但是很安全。
2.通过UDP协议,首先配置1000个数据采集卡为UDP服务器模式并使能DHCP功能从路由器自动获取IP地址,上位机为客户端模式,进行广播,服务器端接收到广播后,将自己的IP地址和端口发给上位机。上位机记录这些IP地址和端口就可以进行通信了。UDP传输很快,但不安全。

可以看到两个方法都需要使能DHCP功能,当然你也可以直接使用静态IP,不要起冲突就行。注意MAC地址也不能相同。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2013-12-9 21:47:25 | 显示全部楼层
回复【9楼】hwl1023:
---------------------------------
谢谢,一起进步。网络其实很有意思的,尤其和我们的嵌入式设备结合在一起,呵呵。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-7-29
在线时间
0 小时
发表于 2013-12-10 12:57:30 | 显示全部楼层
回复【8楼】xiaotaoqi637:
---------------------------------
恩恩,楼主说的非常明白,谢谢楼主!
    我这里用的是uip,不是LWip,不知道可不可以,因为刚接触tcp ip,想用简单的uip,这个没有DHCP,我自己设置静态ip,网关等。上面的是100,笔误,打成了1000.
      用uip的话,采集卡是不是需要配置成客户端的模式?这里不需要电脑对采集卡进行控制,只需要接收采集卡发送来的数据就可以,什么时候发采集卡来决定。过程就是采集卡发送数据到指定的电脑,刚接触一周tcp/ip,套路不太明白,没有感性认识。不过这个发送过程应该很简单吧,对于会用uip的人来说,可是我就是不知道,呜呜....。求楼主给出配置过程可以吗?小弟跪拜!
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2013-12-10 15:12:51 | 显示全部楼层
回复【12楼】xiaotaoqi637:
---------------------------------
我们战舰现有的UIP例程就可以。你参考下吧,有疑问的地方可以拿出来一起讨论。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-7-29
在线时间
0 小时
发表于 2013-12-10 17:13:28 | 显示全部楼层
回复【13楼】xiaoyan:
---------------------------------
恩恩,我的就是战舰开发板,要是稍微的点拨一下思路就更好了,哈哈!
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164817
金钱
164817
注册时间
2010-12-1
在线时间
2098 小时
发表于 2013-12-10 22:56:23 | 显示全部楼层
好贴。
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-4-19
在线时间
0 小时
发表于 2013-12-11 10:32:44 | 显示全部楼层
怒顶,当年我花了不少时间搞这个
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164817
金钱
164817
注册时间
2010-12-1
在线时间
2098 小时
发表于 2013-12-18 21:25:37 | 显示全部楼层
顶顶
回复 支持 反对

使用道具 举报

15

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2012-12-29
在线时间
28 小时
发表于 2013-12-19 21:33:43 | 显示全部楼层
顶、、、、
回复 支持 反对

使用道具 举报

头像被屏蔽

263

主题

456

帖子

1

精华

禁止访问

积分
1212
金钱
1212
注册时间
2011-9-25
在线时间
12 小时
发表于 2013-12-20 08:34:33 | 显示全部楼层
uip是有DHCP功能的,uip软件包中就有DHCP的例子啦
回复 支持 反对

使用道具 举报

27

主题

309

帖子

1

精华

高级会员

Rank: 4

积分
774
金钱
774
注册时间
2012-6-19
在线时间
19 小时
发表于 2013-12-20 09:03:39 | 显示全部楼层
顶!
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2013-12-21 01:03:54 | 显示全部楼层
回复【19楼】syhx8262516:
---------------------------------
嗯。确实有,没搞,呵呵。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-4-12
在线时间
0 小时
发表于 2013-12-26 17:16:17 | 显示全部楼层
回复【21楼】xiaoyan:
---------------------------------
xiaoyan 大侠,怎么移植没有操作系统的ppp协议呀,有好的资料传授给我点好吗,现在一头雾水
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2013-12-26 18:08:32 | 显示全部楼层
回复【22楼】叛逆的承诺:
---------------------------------
点对点的还没玩过呢,呵呵。最好的资料在官网,多花点时间就好。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

11

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2012-8-1
在线时间
68 小时
发表于 2013-12-27 14:56:48 | 显示全部楼层
好资料,谢谢分享
回复 支持 反对

使用道具 举报

头像被屏蔽

254

主题

304

帖子

0

精华

禁止发言

积分
1006
金钱
1006
注册时间
2012-4-13
在线时间
32 小时
发表于 2013-12-28 12:04:45 | 显示全部楼层
回复【4楼】xiaoyan:
---------------------------------
为什么主函数一调用LWIP_Init()这个函数,RAM就增大到40多K,没调用单纯添加文件编译就4K以内,RAM40多K,在别的芯片上用不了呢
回复 支持 反对

使用道具 举报

9

主题

23

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2013-1-5
在线时间
4 小时
发表于 2013-12-28 16:45:28 | 显示全部楼层
回复【楼主位】xiaoyan:
---------------------------------
webserver(UIP移植的)刷新几次,就会提示 找不到服务器!但是机器没有死,都可以ping! 不知道 你遇到没有?(好像都有这个毛病)
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2014-1-14 21:01:47 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

57

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2013-5-23
在线时间
46 小时
发表于 2014-2-17 14:07:36 | 显示全部楼层
我了个去 找了半天资料都在这里。。。
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-3-10 16:30:49 | 显示全部楼层
大神,我用的是原子的uip,加入dht11温湿度显示功能之后,为什么网页上更新不了数据呢?
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2014-3-6
在线时间
31 小时
发表于 2014-3-19 11:34:38 | 显示全部楼层
LZ你好,我用了你的LWIP程序可以实现TCP_client和TCP_server功能,我现在还想加一个TCP的DHCP自动IP功能需要怎么配置呢?
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2014-3-19 14:09:34 | 显示全部楼层
回复【30楼】xiaosi204:
---------------------------------
在lwipopts.h中
#define LWIP_DHCP                       0  
改为:
#define LWIP_DHCP                     1
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

13

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-2-21
在线时间
7 小时
发表于 2014-3-19 14:52:07 | 显示全部楼层
楼主,附件6怎么没有工程文件?
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2014-3-6
在线时间
31 小时
发表于 2014-3-19 15:28:44 | 显示全部楼层
这个DHCP是不是只针对UDP的呢?我按照你的配置之后发现只有在UDP的模式下液晶屏才显示"UDP Server Connected ","UDP Client Connected   ",TCP模式下都是Disconnected
在液晶屏显示 “TCP Client Disconnected   ” 用抓包软件抓到这个





回复 支持 反对

使用道具 举报

13

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-2-21
在线时间
7 小时
发表于 2014-3-19 16:00:38 | 显示全部楼层
楼主,请教您一下:头文件名为"init.h",但在main函数中调用时却是#include "lwip/init.h",怎么会这样?
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2014-3-19 17:03:05 | 显示全部楼层
回复【33楼】xiaosi204:
---------------------------------
可以的,我刚刚又测试了一下。
需要注意的是:

电脑端做客户端的时候,需要知道开发板端,服务器的端口号,和IP,然后电脑端先发数据,才能建立连接。
端口号:1200 代码里写死的
IP:可以通过一下注释的代码获知
/*
    Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at
    the predefined regular intervals after starting the client.
    You can peek in the netif->dhcp struct for the actual DHCP status.
    ip_addr_t offered_ip_addr;
    ip_addr_t offered_sn_mask;
    ip_addr_t offered_gw_addr;
dhcp_ip = enc28j60_netif.dhcp->offered_ip_addr.addr;
printf("IP%ld,%ld,%ld,%ld\t\n",(dhcp_ip&0x000000ff),(dhcp_ip&0x0000ff00)>>8,(dhcp_ip&0x00ff0000)>>16,(dhcp_ip&0xff000000)>>24);
*/

电脑端做服务器,需要在代码里设置好和电脑匹配的IP,开发板这边先发数据
端口号:1300 代码里写死的
IP:你电脑的IP
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2014-3-6
在线时间
31 小时
发表于 2014-3-20 10:21:58 | 显示全部楼层
我是初学网络这块的,我用电脑做服务器(要是电脑做客户端的话不知道要怎么才能让电脑先往开发板发送数据),电脑IP设置为:192:168:1:103, 开发板客户端的端口号改成1400 
========代码里的配置========================
#define TCP_CLIENT_PORT  1400
//初始化TCP客户端
void Init_TCP_Client(void){
struct tcp_client_state* ts;
ip_addr_t ipaddr;
IP4_ADDR(&ipaddr, 192, 168, 1, 103);   //设置本地ip地址
===========================================
按KEY_DOWN可以直接发送数据,用网络抓包工具能够抓到开发板给电脑发送数据,但是开发板上的IP一直都是空的,用网络调试助手发送数据也是发送不了。我是不是哪里设置或者调试的方式不对?求LZ指导。网络抓包如下图:


不知道LZ能不能共享一下调试步骤的文档给我们学习一下
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2014-3-6
在线时间
31 小时
发表于 2014-3-21 10:08:41 | 显示全部楼层
回复【35楼】xiaoyan:
---------------------------------
我用电脑端做服务器,电脑的IP设定和代码里的client一致,按了按键发送数据,就是得不到IP地址
我调用这个函数
dhcp_ip = enc28j60_netif.dhcp->offered_ip_addr.addr; 
发现dhcp_ip的值一直是0;
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-3-21
在线时间
0 小时
发表于 2014-3-21 12:07:17 | 显示全部楼层
记号,收藏
回复 支持 反对

使用道具 举报

13

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-2-21
在线时间
7 小时
发表于 2014-3-21 14:45:15 | 显示全部楼层
楼主,我想把LWIP移植到UCOSS_II上,该怎么办呢?
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2014-3-6
在线时间
31 小时
发表于 2014-3-25 09:24:15 | 显示全部楼层
不知道LZ有没有做DNS这块的实验分享一下
回复 支持 反对

使用道具 举报

11

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2013-6-19
在线时间
42 小时
发表于 2014-3-29 16:05:18 | 显示全部楼层

非常受益,一直在找,非常感谢!

回复 支持 反对

使用道具 举报

11

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2013-6-19
在线时间
42 小时
发表于 2014-3-29 16:22:53 | 显示全部楼层
附件6可否给出原子惯用的"下载验证"方法?否则不知怎么用!
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2014-3-6
在线时间
31 小时
发表于 2014-3-31 11:41:47 | 显示全部楼层
我用LWIP的开发板作为客户端,用网络调试助手连接之后,电脑发送“ALIENEK WARSHIP”,但是液晶屏显示“ALIENEK WARSHIPefghi”用串口监控可以看到这串字符“LWIP RX:ALIENEK WARSHIPefghi”,后面多出几个字符不知道从哪里来的。
例如发送“www.baidu.com”,液晶显示:“www.baidu.comcdefghi”;发送“www.163.com”,收到的是“www.163.comabcdefghi”
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2014-3-31 13:01:24 | 显示全部楼层
回复【43楼】xiaosi204:
---------------------------------
那些多出的字符,前面你有没有发送过?还是复位之后执行发送就会多出这几个字符?
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

10

主题

61

帖子

4

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-3-3
在线时间
50 小时
发表于 2014-3-31 22:09:18 | 显示全部楼层
小弟费了一天时间,将楼主的库函数版的例子程序改写成了寄存器版的。敬请大家拍砖。

注意:楼主的程序可以采集CPU温度,小弟改写成了18B20的温度了。其他功能完全一致。

STM32F103ZET6+28ENJ60+LWIP(寄存器版).rar

647.88 KB, 下载次数: 3122

回复 支持 反对

使用道具 举报

10

主题

61

帖子

4

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-3-3
在线时间
50 小时
发表于 2014-3-31 22:10:48 | 显示全部楼层
小弟我用了一天时间将楼主的库函数版的程序改写成寄存器版的程序了,敬请大家拍砖

STM32F103ZET6+28ENJ60+LWIP(寄存器版).rar

647.88 KB, 下载次数: 3059

回复 支持 反对

使用道具 举报

10

主题

61

帖子

4

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-3-3
在线时间
50 小时
发表于 2014-3-31 22:11:39 | 显示全部楼层
楼主写的程序可以采集CPU温度,小弟稍稍改了一下,采集的是18B20的温度,请大家注意。
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2014-3-6
在线时间
31 小时
发表于 2014-4-1 08:42:20 | 显示全部楼层
回复【44楼】xiaoyan:
---------------------------------
没有发送过这些字符, 我数了一下这些字符总共20个,貌似字符不够20个自动添加上去的。需要发送20个字符以上才不会多出字符来。这是什么原因呢?
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2014-4-1 09:54:44 | 显示全部楼层
回复【48楼】xiaosi204:
---------------------------------
你再仔细分析一下你的代码吧,我这一时也不好判断。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2014-4-1 09:55:08 | 显示全部楼层
回复【46楼】bodysuit:
---------------------------------
谢谢分享。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-3-29 09:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表