博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【STM32+W5500+HTTPClient】25,路由器DHCP租赁IP时间为2h,NetBios可以很好的解决IP变化的问题,DNS,2018年12月25日
阅读量:3890 次
发布时间:2019-05-23

本文共 4746 字,大约阅读时间需要 15 分钟。

1,在连接ONENET平台时候,当使用默认IP时候,如果默认IP与路由器的IP不在一个分段里面,则会导致连接服务器失败。

2,使用DHCP连接ONENET的时候,则不用考虑路由器的IP了,因为DHCP动态获取的IP地址和路由器的必定在同一个IP分段里面。 do_dhcp()一定要放置在while(1)中

while(1)															/*循环执行的函数*/   {			if(!dhcp_getIP)	//放在while(1)	之外的时候,不会立马获取到IP,导致失败					do_dhcp();		else 		{				do_http_client();					sprintf(temp_test,"%d",num_send);				sprintf(hum_test,"%d",2*num_send);		}  }

3,使用DNS解析的时候,需要路由器和W5500在同一个IP分段

4,NetBIOS中NETBIOS_NAME_LEN为固定值

#define NETBIOS_NAME_LEN 16         /*NetBIOS名字最大长度*/

5,关于TCP模式下面的send()和recv()函数的讨论..。

实际使用的时候,选择do_tcp_server(SOCKET s1)进行PC与单片机的通信会好很多,对recv()接收数组的解析使用

if  (  memcmp(reveive_TCPbuf,"LED1ON",6)==0   )

{
    LED1(LED_ON);
    printf("LED1ON OK \n");
 }

测试很成功

不推荐使用do_tcp_client(SOCKET s2),因为配置太多了

5-1,在w5500作为服务器端的时候,本地端口的配置不是在set_w5500_ip() 这个里面;

而是在  socket(SOCK_TCPS ,Sn_MR_TCP,local_port,Sn_MR_ND); /*打开socket*/

W5500连接路由器,使用DHCP分配IP地址测试成功

#include 
#include
#include "tcp_demo.h"#include "W5500_conf.h"#include "w5500.h"#include "socket.h"uint8 buff[2048]; /*定义一个2KB的缓存*//***@brief TCP Server回环演示函数。*@param 无*@return 无*/void do_tcp_server(SOCKET s1){ uint16 len=0; // char TCP_cmd[10]; switch(getSn_SR(s1)) /*获取socket的状态 SOCK_TCPS */ { case SOCK_CLOSED: /*socket处于关闭状态*/ socket(s1 ,Sn_MR_TCP,local_port,Sn_MR_ND); /*打开socket s1=SOCK_TCPS */ break; case SOCK_INIT: /*socket已初始化状态*/ listen(s1); /*socket建立监听*/ break; case SOCK_ESTABLISHED: /*socket处于连接建立状态*/ if(getSn_IR(s1) & Sn_IR_CON) { setSn_IR(s1, Sn_IR_CON); /*清除接收中断标志位*/ } len=getSn_RX_RSR(s1); /*定义len为已接收数据的长度*/ if(len>0) { recv(s1,reveive_TCPbuf,len); /*接收来自Client的数据*/ if(memcmp(reveive_TCPbuf,"LED1ON",6)==0) { LED1(LED_ON); printf("LED1ON OK \n"); } else if(memcmp(reveive_TCPbuf,"LED1OFF",7)==0) { LED1(LED_OFF); printf("LED1OFF OK \n"); } else if(memcmp(reveive_TCPbuf,"LED2ON",6)==0) { LED2(LED_ON); printf("LED2ON OK \n"); } else if(memcmp(reveive_TCPbuf,"LED2OFF",7)==0) { LED2(LED_OFF); printf("LED2OFF OK \n"); } else if(memcmp(reveive_TCPbuf,"LED3ON",6)==0) { LED3(LED_ON); printf("LED3ON OK \n"); } else if(memcmp(reveive_TCPbuf,"LED3OFF",7)==0) { LED3(LED_OFF); printf("LED3OFF OK \n"); } else if(memcmp(reveive_TCPbuf,"LED1TOG",7)==0) { LED1_TOGGLE; } else if(memcmp(reveive_TCPbuf,"LED2TOG",7)==0) { LED2_TOGGLE; } else if(memcmp(reveive_TCPbuf,"LED3TOG",7)==0) { LED3_TOGGLE; } reveive_TCPbuf[len]=0x00; /*添加字符串结束符*/ printf("%s\r\n",reveive_TCPbuf); send(s1,reveive_TCPbuf,len); /*向Client发送数据*/ } break; case SOCK_CLOSE_WAIT: /*socket处于等待关闭状态*/ close(s1); break; }}/***@brief TCP Client回环演示函数。*@param 无*@return 无*/void do_tcp_client(void){ uint16 len=0; switch(getSn_SR(SOCK_TCPC)) /*获取socket的状态*/ { case SOCK_CLOSED: /*socket处于关闭状态*/ socket(SOCK_TCPC,Sn_MR_TCP,local_port++,Sn_MR_ND); break; case SOCK_INIT: /*socket处于初始化状态*/ connect(SOCK_TCPC,remote_ip,remote_port); /*socket连接服务器*/ break; case SOCK_ESTABLISHED: /*socket处于连接建立状态*/ if(getSn_IR(SOCK_TCPC) & Sn_IR_CON) { setSn_IR(SOCK_TCPC, Sn_IR_CON); /*清除接收中断标志位*/ } len=getSn_RX_RSR(SOCK_TCPC); /*定义len为已接收数据的长度*/ if(len>0) { recv(SOCK_TCPC,buff,len); /*接收来自Server的数据*/ buff[len]=0x00; /*添加字符串结束符*/ printf("%s\r\n",buff); send(SOCK_TCPC,buff,len); /*向Server发送数据*/ } break; case SOCK_CLOSE_WAIT: /*socket处于等待关闭状态*/ close(SOCK_TCPC); break; }}

5-2 ,当将W5500连接到PC的时候,将本地连接设置为静态IP:192.168.0.45 。通信测试成功。

5-3 ,当将W5500连接到路由器的时候,将本地连接设置为静态IP:192.168.0.45 。通信测试成功。

5-4,同时使用TCP的server与client

5-5,其实TCP不存在什么server与client之分,因为调用的主要函数就是

TCP_client主要使用connect(s2,remote_ip,remote_port); /*socket连接服务器*/ ,连接外部服务器

HTTP只有server,

HTTP_Client也是使用 connect(ch, onenet_server_ip ,onenet_port);  /*打开socket端口*/ ,连接外部服务器。

公用函数: socket(s2,Sn_MR_TCP,local_port++,Sn_MR_ND);//此Socket功能以特定模式初始化通道

recv(s2,reveive_TCPbuf,len);                                                 /*接收来自Server的数据*/

send(s2,reveive_TCPbuf,len);                                                  /*向Server发送数据*/

 嗯,就是这样,刚刚NETBIOS,上传数据到ONENET,上位机发数据控制LED的亮灭成功。。。

目前的问题是在HTTP_Client下,服务器不能下发命令,而MQTT可以下发命令给W5500。剩下就是MQTT的调通测试了。

6,路由器的分配IP地址时间为2小时

 

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://xavhn.baihongyu.com/

你可能感兴趣的文章
linux session 浅谈
查看>>
Emacs 中文学习手册-1
查看>>
Emacs学习笔记(1):初学者的学习计划
查看>>
Emacs学习笔记(13):在Emacs中打开pdf
查看>>
Emacs学习笔记(14):在Emacs中使用git
查看>>
Emacs for vim Users---from http://www.crazyshell.org/blog/
查看>>
静态库和动态库链接那些事--http://www.crazyshell.org/blog/?p=50
查看>>
一年成为Emacs高手(像神一样使用编辑器) .--http://blog.csdn.net/redguardtoo/article/details/7222501
查看>>
GNU make 指南
查看>>
配置 vim
查看>>
centos 安装emacs24
查看>>
【转】结构体中Char a[0]用法——柔性数组
查看>>
结构体最后定义一个char p[0];这样的成员有何意义(转)
查看>>
一步一学Linux与Windows 共享文件Samba (v0.2b)
查看>>
Linux 下忘记root密码怎么办
查看>>
Linux软件下载源码编程文章资料周立发--之调试
查看>>
GIT分支管理是一门艺术
查看>>
Cscope在emacs中的配置与使用
查看>>
emacs 2.4安装问题 ecb
查看>>
ecb里使用自定义快捷键切换窗口
查看>>