- #include "esp8266.h"
-
- struct ESP8266_WIFI esp8266_wifi;
-
-
- /*
- 函数功能: 配置ESP8266WIFI为AP模式+TCP服务器模式
- 函数参数:
- char *ssid :将要创建的WIFI热点名称(英文字母)
- char *password :将要创建的WIFI热点密码(最短长度8位)
- u16 port :TCP服务器的端口号(0~65535)
- 返 回 值:0表示成功,其他值表示失败
- */
- u8 ESP8266_AP_TCP_ServerMode(const char *ssid,const char *password,u16 port)
- {
- u8 i;
- char *find_str=NULL;
- char cmd_buffer[100];
- /*1. 发送测试指令,检测WIFI是否正常*/
- printf("发送测试指令,检测WIFI是否正常...\n");
- if(ESP8266_SendCmd("AT\r\n"))return 1;
- /*2. 关闭回显*/
- printf("关闭回显...\n");
- if(ESP8266_SendCmd("ATE0\r\n"))return 2;
- /*3. 设置当前WIFI的模式为AP模式*/
- printf("设置当前WIFI的模式为AP模式...\n");
- if(ESP8266_SendCmd("AT+CWMODE=2\r\n"))return 3;
- /*4. 复位模块,设置的模式必须复位之后才会生效*/
- printf("复位模块...\n");
- if(ESP8266_SendCmd("AT+RST\r\n"))return 4;
- DelayMs_72M(1000);
- DelayMs_72M(1000);
- DelayMs_72M(1000);
- DelayMs_72M(1000);
- /*5. 关闭回显*/
- printf("关闭回显...\n");
- if(ESP8266_SendCmd("ATE0\r\n"))return 5;
- /*6. 设置创建的热点信息*/
- printf("设置创建的热点信息...\n");
- snprintf(cmd_buffer,100,"AT+CWSAP="%s","%s",1,4\r\n",ssid,password);
- if(ESP8266_SendCmd(cmd_buffer))return 6;
- /*7. 开启多连接,在服务器模式下才可开启*/
- printf("开启多连接...\n");
- if(ESP8266_SendCmd("AT+CIPMUX=1\r\n"))return 7;
- /*8. 设置端口号(0~65535)*/
- printf("设置端口号...\n");
- snprintf(cmd_buffer,100,"AT+CIPSERVER=1,%d\r\n",port);
- if(ESP8266_SendCmd(cmd_buffer))return 8;
- /*9.查询本地IP地址*/
- printf("查询本地IP地址...\n");
- if(ESP8266_SendCmd("AT+CIFSR\r\n"))return 9;
-
- /*10. 保存WIFI的信息*/
- esp8266_wifi.port=port;
- strcpy(esp8266_wifi.mode,"AP");
-
- //提取IP地址
- /*
- IP地址=+CIFSR:APIP,"192.168.4.1"
- +CIFSR:APMAC,"86:f3:eb:17:e6:86"
- */
- find_str=strstr((char*)USART3_RX_BUFF,"APIP");
- if(find_str) //判断是否查找成功
- {
- find_str+=6;
- for(i=0;*find_str!='"';i++)
- {
- esp8266_wifi.ip[i]=*find_str;
- find_str++;
- }
- esp8266_wifi.ip[i]='\0';
- }
- USART3_RX_FLAG=0;
- USART3_RX_CNT=0;
-
- printf("当前WIFI模式:%s\n",esp8266_wifi.mode);
- printf("当前网络协议类型:%s\n","TCP");
- printf("当前网络通信模式:%s\n","server");
- printf("当前网络端口号:%d\n",esp8266_wifi.port);
- printf("本地网络IP地址:%s\n",esp8266_wifi.ip);
- return 0;
- }
-
- /*
- 函数功能:向ESP8266wifi发送指令
- 说明:该函数只是适用于成功后返回OK的指令
- 返回值: 0表示成功 1表示失败
- */
- u8 ESP8266_SendCmd(char *cmd)
- {
- u8 i,j;
- for(i=0;i<5;i++) //测试的总次数
- {
- USART3_RX_FLAG=0;
- USART3_RX_CNT=0;
- USART_X_SendString(USART3,cmd);
- for(j=0;j<200;j++) //等待的时间(ms单位)
- {
- if(USART3_RX_FLAG)
- {
- USART3_RX_BUFF[USART3_RX_CNT]='\0';
- printf("USART3_RX_BUFF=%s\r\n",USART3_RX_BUFF);
- if(strstr((char*)USART3_RX_BUFF,"OK\r\n"))
- {
- return 0;
- }
- else break;
- }
- DelayMs_72M(2); //一次的时间
- }
- }
- return 1;
- }
-
- /*
- 函数功能:ESP8266wifi处于TCP服务器模式下的数据发送函数
- 函数参数:
- u8 id :已经连接服务器的客户端ID号
- char *data :将要发送数据(字符串)
- 返回值: 0表示成功 1表示失败
- 说明:只有在TCP服务器模式下才可使用该函数
- OK
- >
- Recv 12 bytes
- SEND OK
- */
- u8 ESP8266_ServerSendData(u8 id,char *data)
- {
- u32 i,j,n;
- char cmd[100];
- snprintf(cmd,1024,"AT+CIPSEND=%d,%d\r\n",id,strlen(data));
- for(i=0;i<5;i++) //测试的总次数
- {
- USART3_RX_FLAG=0;
- USART3_RX_CNT=0;
- USART_X_SendString(USART3,cmd);
- for(j=0;j<200;j++) //等待的时间(ms单位)
- {
- if(USART3_RX_FLAG)
- {
- USART3_RX_BUFF[USART3_RX_CNT]='\0';
- if(strstr((char*)USART3_RX_BUFF,">")) //开始发送数据
- {
- USART3_RX_FLAG=0;
- USART3_RX_CNT=0;
- USART_X_SendString(USART3,data); //发送数据
- for(n=0;n<10000;n++)
- {
- if(USART3_RX_FLAG)
- {
- USART3_RX_BUFF[USART3_RX_CNT]='\0';
- if(strstr((char*)USART3_RX_BUFF,"SEND OK")) //开始发送数据
- {
- USART3_RX_FLAG=0;
- USART3_RX_CNT=0;
- return 0;
- }
- else return 1;
- }
- DelayMs_72M(1); //一次的时间
- }
- }
- else break;
- }
- DelayMs_72M(5); //一次的时间
- }
- }
- return 1;
- }
-
- /*
- 函数功能: 设置STA模式下连接的热点信息
- 返 回 值: 0表示成功,1表示失败
- 连接成功的提示符:
- WIFI DISCONNECT
- WIFI CONNECTED
- WIFI GOT IP
- OK
- */
- u8 ESP8266_STA_ModeConnectWIFI(char *cmd)
- {
- u32 i,j;
- for(i=0;i<3;i++) //测试的总次数
- {
- USART3_RX_FLAG=0;
- USART3_RX_CNT=0;
- USART_X_SendString(USART3,cmd);
- for(j=0;j<30000;j++) //等待的时间(ms单位)
- {
- if(USART3_RX_FLAG)
- {
- USART3_RX_BUFF[USART3_RX_CNT]='\0';
- if(strstr((char*)USART3_RX_BUFF,"OK"))
- {
- return 0;
- }
- else
- {
- memset(USART3_RX_BUFF,0,sizeof(USART3_RX_BUFF));
- USART3_RX_FLAG=0;
- USART3_RX_CNT=0;
- }
- }
- DelayMs_72M(1); //一次的时间
- }
- }
- return 1;
- }
-
-
- /*
- 函数功能: 用于在客户端模式下,连接服务器
- 返 回 值: 0表示成功,1表示失败
- 连接成功的提示符:CONNECT
- */
- u8 ESP8266_ConnectServer(char *cmd)
- {
- u32 i,j;
- for(i=0;i<5;i++) //测试的总次数
- {
- USART3_RX_FLAG=0;
- USART3_RX_CNT=0;
- USART_X_SendString(USART3,cmd);
- for(j=0;j<10000;j++) //等待的时间(ms单位)
- {
- if(USART3_RX_FLAG)
- {
- USART3_RX_BUFF[USART3_RX_CNT]='\0';
- if(strstr((char*)USART3_RX_BUFF,"CONNECT"))
- {
- return 0;
- }
- else
- {
- memset(USART3_RX_BUFF,0,sizeof(USART3_RX_BUFF));
- USART3_RX_FLAG=0;
- USART3_RX_CNT=0;
- }
- }
- DelayMs_72M(1); //一次的时间
- }
- }
- return 1;
- }
-
-
- /*
- 函数功能: 配置ESP8266WIFI为STA模式+TCP客户端模式
- 函数参数:
- char *ssid :将要连接的WIFI热点名称(英文字母)
- char *password :将要连接的WIFI热点密码(最短长度8位)
- u16 port :TCP服务器的端口号(0~65535)
- 返 回 值:0表示成功,其他值表示失败
- */
- u8 ESP8266_STA_TCP_ClientMode(const char *ssid,const char *password,char *server_ip,u16 port)
- {
- u8 i;
- char *find_str=NULL;
- char cmd_buffer[100];
- /*1. 发送测试指令,检测WIFI是否正常*/
- printf("发送测试指令,检测WIFI是否正常...\n");
- for(i=0;i<10;i++)
- {
- if(ESP8266_SendCmd("AT\r\n")) //可能WIFI正处于透传模式,无法接收指令
- {
- USART_X_SendString(USART3,"+++"); //退出透传模式
- DelayMs_72M(80); //等待退出透传模式
- }
- else break;
- }
- if(i==10)return 1; //检测失败
-
- /*2. 关闭回显*/
- printf("关闭回显...\n");
- if(ESP8266_SendCmd("ATE0\r\n"))return 2;
- /*3. 设置当前WIFI的模式为STA模式*/
- printf("设置当前WIFI的模式为STA模式...\n");
- if(ESP8266_SendCmd("AT+CWMODE=1\r\n"))return 3;
- /*4. 复位模块,设置的模式必须复位之后才会生效*/
- printf("复位模块...\n");
- if(ESP8266_SendCmd("AT+RST\r\n"))return 4;
- DelayMs_72M(1000);
- DelayMs_72M(1000);
- DelayMs_72M(1000);
- DelayMs_72M(1000);
- /*5. 关闭回显*/
- printf("关闭回显...\n");
- if(ESP8266_SendCmd("ATE0\r\n"))return 5;
- /*6. 设置连接的热点信息*/
- printf("设置连接的热点信息...\r\n");
-
- snprintf(cmd_buffer,100,"AT+CWJAP="%s","%s"\r\n",ssid,password);
- printf("cmd_buffer=%s",cmd_buffer);
- if(ESP8266_STA_ModeConnectWIFI(cmd_buffer))return 6;
-
- /*7. 开启单连接,在客户端模式下才可开启*/
- printf("开启单连接...\n");
- if(ESP8266_SendCmd("AT+CIPMUX=0\r\n"))return 8;
-
- /*8.查询本地IP地址*/
- printf("查询本地IP地址...\n");
- if(ESP8266_SendCmd("AT+CIFSR\r\n"))return 7;
-
- /*9. 保存WIFI的信息*/
- esp8266_wifi.port=port;
- strcpy(esp8266_wifi.mode,"STA");
-
- //提取IP地址
- /*
- +CIFSR:STAIP,"192.168.1.115"
- +CIFSR:STAMAC,"84:f3:eb:17:e6:86"
- */
- find_str=strstr((char*)USART3_RX_BUFF,"STAIP");
- if(find_str) //判断是否查找成功
- {
- find_str+=7;
- for(i=0;*find_str!='"';i++)
- {
- esp8266_wifi.ip[i]=*find_str;
- find_str++;
- }
- esp8266_wifi.ip[i]='\0';
- }
-
- /*10. 连接服务器*/
- printf("开始连接服务器...\n");
- snprintf(cmd_buffer,100,"AT+CIPSTART="TCP","%s",%d\r\n",server_ip,port);
- if(ESP8266_ConnectServer(cmd_buffer))return 9;
-
- /*11. 开启透传模式*/
- printf("开启透传模式...\n");
- if(ESP8266_SendCmd("AT+CIPMODE=1\r\n"))return 10;
-
- /*12. 开始透传*/
- printf("开始透传...\n");
- if(ESP8266_SendCmd("AT+CIPSEND\r\n"))return 11;
-
- printf("当前WIFI模式:%s\r\n",esp8266_wifi.mode);
- printf("当前网络协议类型:%s\r\n","TCP");
- printf("当前网络通信模式:%s\r\n","Client");
- printf("连接的服务器端口号:%d\r\n",esp8266_wifi.port);
- printf("连接的服务器IP地址:%s\r\n",server_ip);
- printf("本地的IP地址:%s\r\n",esp8266_wifi.ip);
- return 0;
- }