【STM32+W5500】 21,移植说明,以太网关键函数,若要连接外部广域网,必须使用DHCP连路由器(不是PC)..

0.移植说明,w5500移植文件

Ethernet和Internet里面包含的文件就是以太网五层模型中的应用层

应用层协议:HTTP,FTP,SMTP,TFTP,Telent, MQTT    支撑协议:DNS,SNMP

HTTP使用TCP而不是UDP.

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和制动器(比如通过Twitter让房屋联网)的通信协议。

0-1,Ethernet可以认为是对W5500芯片硬件的配置,全部添加


0-2 ,Internet就是按照需求自由添加了,全部添加也可以。

比如我要通过域名www.baidu.com或者www.sina.com.cn直接访问广域网,

1,需要连接可以上网的路由器(不能是PC,PC没有DHCP功能),则应该添加DHCP.H

2,作为域名解析,需要添加DNS.H

3,如果是W5500作为服务器HTTP,需要添加httpServer.h

下面的重点就是W5500_conf.h,W5500.h和socket.h这三个头文件中的函数,其余的都是在这上面的封装

1,#include "W5500_conf.h",最基础的读写函数封装

/*W5500SPI相关函数*/
void IINCHIP_WRITE( uint32 addrbsb,  uint8 data);                        /*写入一个8位数据到W5500*/
uint8 IINCHIP_READ(uint32 addrbsb);                                                    /*从W5500读出一个8位数据*/
uint16 wiz_write_buf(uint32 addrbsb,uint8* buf,uint16 len);    /*向W5500写入len字节数据*/
uint16 wiz_read_buf(uint32 addrbsb, uint8* buf,uint16 len);    /*从W5500读出len字节数据*/

/*W5500基本配置相关函数*/
void reset_w5500(void);                                                                            /*硬复位W5500*/
void set_w5500_mac(void);                                                                        /*配置W5500的MAC地址*/
void set_w5500_ip(void);                                                                        /*配置W5500的IP地址*/

/*需要用定时的的应用函数*/
void dhcp_timer_init(void);                                                                    /*dhcp用到的定时器初始化*/
void ntp_timer_init(void);                                                                    /*npt用到的定时器初始化*/

send()->send_data_processing->IINCHIP_WRITE(),wiz_write_buf()

2,#include "W5500.h" ,各种状态的检查函数,本机IP配置函数

/*********************************************************
* iinchip access function
*********************************************************/

void iinchip_init(void);                                                // reset iinchip
void socket_buf_init(uint8 * tx_size, uint8 * rx_size); // setting tx/rx buf size
uint8 getISR(uint8 s);
void putISR(uint8 s, uint8 val);
uint16 getIINCHIP_RxMAX(uint8 s);                           //获取socket接收最大值
uint16 getIINCHIP_TxMAX(uint8 s);
void setMR(uint8 val);
void setRTR(uint16 timeout);                                   // set retry duration for data transmission, connection, closing ...
void setRCR(uint8 retry);                                        // set retry count (above the value, assert timeout interrupt)
void clearIR(uint8 mask);                                       // clear interrupt
uint8 getIR( void );

void setSn_MSS(SOCKET s, uint16 Sn_MSSR);               // set maximum segment size
uint8 getSn_IR(SOCKET s);                               // get socket interrupt status 用的非常多
uint8 getSn_SR(SOCKET s);                               // get socket status

uint16 getSn_TX_FSR(SOCKET s);                          // get socket TX free buf size
uint16 getSn_RX_RSR(SOCKET s);                          // get socket RX recv buf size
//uint8 getSn_SR(SOCKET s);
void setSn_TTL(SOCKET s, uint8 ttl);
void send_data_processing(SOCKET s, uint8 *wizdata, uint16 len);//数据的发送
void recv_data_processing(SOCKET s, uint8 *wizdata, uint16 len);

void setGAR(uint8 * addr);                              // set gateway address
void setSUBR(uint8 * addr);                             // set subnet mask address
void setSHAR(uint8 * addr);                             // set local MAC address
void setSIPR(uint8 * addr);                             // set local IP address

void getGAR(uint8 * addr);
void getSUBR(uint8 * addr);
void getSHAR(uint8 * addr);
void getSIPR(uint8 * addr);
void setSn_IR(uint8 s, uint8 val);
void Reset_W5500(void);
void PHY_check(void);                                                             //网口连接检查
extern uint8 rxsize[];

3,#include<socket.h>,连接服务器,数据的上传和接收函数

extern uint8 socket(SOCKET s, uint8 protocol, uint16 port, uint8 flag);    // Opens a socket(TCP or UDP or IP_RAW mode)
extern void close(SOCKET s);                                                                 // Close socket
extern uint8 connect(SOCKET s, uint8 * addr, uint16 port); // Establish TCP connection (Active connection)
extern void disconnect(SOCKET s);                                                            // disconnect the connection
extern uint8 listen(SOCKET s);                                                                 // Establish TCP connection (Passive connection)
extern uint16 send(SOCKET s, const uint8 * buf, uint16 len);                                 // Send data (TCP)

//send函数包含了send_data_processing()函数
extern uint16 recv(SOCKET s, uint8 * buf, uint16 len);                                         // Receive data (TCP)
extern uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port);    // Send data (UDP/IP RAW)
extern uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16  *port);      // Receive data (UDP/IP RAW)

4,#include<dhcp.h>

uint8 check_DHCP_state(SOCKET s); // Check the DHCP state
void do_dhcp(void);

5, #include "http_server.h"

void unescape_http_url(char * url);	/* convert escape character to ascii */

void parse_http_request(st_http_request *, uint8 *);/* parse request from peer */
	
void find_http_uri_type(uint8 *, char *);	/* find MIME type of a file */

void make_http_response_head(unsigned char *, char, u_long); /* make response header */

unsigned char* get_http_param_value(char* uri, char* param_name);	/* get the user-specific parameter value */

6,#include "http_client.h"

void do_http_client(void);//TCP Clinet回环演示函数

7,#include "httputil.h"

void proc_http(SOCKET s, u_char * buf);
void do_https(void);
void cgi_ipconfig(st_http_request *http_request);
//void trimp(uint8* src, uint8* dst, uint16 len);
uint16 make_msg_response(uint8* buf,int8* msg);

void make_cgi_response(uint16 a,int8* b,int8* c);
void make_pwd_response(int8 isRight,uint16 delay,int8* cgi_response_content, int8 isTimeout);

8, #include "ntp.h"

void get_seconds_from_ntp_server(uint8* buf,uint16 idx);
void ntp_client_init(void);
void do_ntp_client(void);
tstamp change_datetime_to_seconds(void);
void calc_date_time(tstamp seconds);

9,#include "dns.h"

extern uint8 dns_get_ip[4];
extern uint8 domain_name[];
int dns_makequery(uint16 op, uint8 * name, uint8 * buf, uint16 len);
int parse_name(uint8 * msg, uint8 * compressed, /*char * buf,*/ uint16 len);
uint8 * dns_question(uint8 * msg, uint8 * cp);
uint8 * dns_answer(uint8 * msg, uint8 * cp);
uint8 parseMSG(struct dhdr * pdhdr, uint8 * pbuf);

uint8 dns_query(uint8 s, uint8 * name);
void do_dns(void);

10,#include "smtp.h"

void send_mail(void);
void mail_message(void);
void base64encode(char *s, char *r);
void str_insert(char *s1,char *s2,int pos);
void do_smtp(void);

猜你喜欢

转载自blog.csdn.net/qq_40662854/article/details/85044327
今日推荐