本文共 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/