#include "wifi.h"
#include "stm32f10x.h"
#include "usart.h"
#include "usart2.h"
#include "delay.h"
#include "string.h"
char wifi_mode = 0; //联网模式 0:SSID和密码写在程序里
/************************************
*
功能:初始化wifi复位IO *
*
*************************************/
void WiFi_ResetIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个设置IO端口参数的结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE); //使能PA端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //准备设置PA4
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速率50Mhz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出方式
GPIO_Init(GPIOA, &GPIO_InitStructure); //设置PA4
GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET); //清除数据端口位
}
/************************************
*
功能:wifi发送指令 *
参数:cmd 要发的指令 *
waittime 等待时间 *
返回值:0 正确 ;1 错误 *
*
*************************************/
char WiFi_SendCmd(char *cmd, int waittime)
{
USART2_RX_STA=0; //接收状态标记清零
memset(USART2_RX_BUF,0,USART2_RXBUFF_SIZE); //清空串口2接收缓冲区
usart2_printf("%s\r\n", cmd); //发送指令
while(waittime--) //等待倒计时
{
delay_ms(10);
if(strstr(USART2_RX_BUF,"OK")) //找是否接收到 OK 表示指令发送成功
{
break;
}
}
if(waittime == 0) //超时返回1
{
return 1;
}
else
return 0; //未超时返回0
}
/************************************
*
功能:wifi复位 *
参数:waittime 等待时间 *
返回值:0 正确;1 错误 *
*
*************************************/
char WiFi_Reset(int waittime)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET); //复位IO
delay_ms(500); //延时500ms
GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET); //复位IO拉高电平
while(waittime--) //等待超时时间到0
{
delay_ms(100); //延时100ms
if(strstr(USART2_RX_BUF, "ready")) //如果接收到ready表示复位成功
break; //主动跳出while循环
}
printf("\r\n"); //串口1输出信息
if(waittime == 0) //超时返回1
{
return 1;
}
else
return 0; //未超时返回0
}
/************************************
*
功能:wifi连网 *
参数:waittime 等待时间 *
返回值:0 正确;1 错误 *
*
*************************************/
char WiFi_JoinAP(int waittime)
{
USART2_RX_STA=0; //接收状态标记清零
memset(USART2_RX_BUF,0,USART2_RXBUFF_SIZE); //清空串口2接收缓冲区
usart2_printf("AT+CWJAP=%s%s\r\n",WIFI,PASSWORLD);//发送指令
while(waittime--) //等待倒计时
{
delay_ms(1000);
if(strstr(USART2_RX_BUF,"OK")) //找是否接收到 OK 表示指令发送成功
{
break;
}
}
printf("\r\n%s\r\n", USART2_RX_BUF);
printf("\r\n"); //串口1输出信息
if(waittime == 0) //超时返回1
{
return 1;
}
else
return 0; //未超时返回0
}
/************************************
*
功能:连接TCP服务器,透传模式 *
参数:waittime 等待时间 *
返回值:0 正确;其他 错误 *
*
*************************************/
char WiFi_Connect_Server(int waittime)
{
USART2_RX_STA=0; //WiFi接收数据量变量清零
memset(USART2_RX_BUF,0,USART2_RXBUFF_SIZE); //清空WiFi接收缓冲区
usart2_printf("AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", "192.168.0.127", 1883);//发送连接服务器指令
while(waittime--) //等待超时与否
{
delay_ms(100); //延时100ms
if(strstr(USART2_RX_BUF, "CONNECT")) //如果接受到CONNECT表示连接成功
break; //跳出while循环
if(strstr(USART2_RX_BUF, "CLOSED")) //如果接受到CLOSED表示服务器未开启
return 1; //服务器未开启返回1
if(strstr(USART2_RX_BUF, "ALREADY CONNECTED"))//如果接受到ALREADY CONNECTED已经建立连接
return 2; //已经建立连接返回2
printf("%d ", waittime); //串口1输出现在的超时时间
}
printf("\r\n"); //串口1输出信息
if(waittime <= 0)return 3; //超时错误,返回3
else //连接成功,准备进入透传
{
printf("连接服务器成功,准备进入透传\r\n"); //串口1显示信息
USART2_RX_STA = 0; //WiFi接收数据量变量清零
memset(USART2_RX_BUF, 0, USART2_RXBUFF_SIZE); //清空WiFi接收缓冲区
usart2_printf("AT+CIPSEND\r\n"); //发送进入透传指令
while(waittime--) //等待超时与否
{
delay_ms(100); //延时100ms
if(strstr(USART2_RX_BUF, "\r\nOK\r\n\r\n>"))//如果成立表示进入透传成功
break; //跳出while循环
printf("%d ", waittime); //串口1输出现在的超时时间
}
if(waittime <= 0)return 4; //透传超时错误,返回4
}
return 0; //成功返回0
}
/*-------------------------------------------------*/
/*函数名:WiFi_Smartconfig */
/*参 数:timeout:超时时间(1s的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char WiFi_Smartconfig(int timeout)
{
USART2_RX_STA=0; //WiFi接收数据量变量清零
memset(USART2_RX_BUF,0,USART2_RXBUFF_SIZE); //清空WiFi接收缓冲区
while(timeout--) //等待超时时间到0
{
delay_ms(1000); //延时1s
if(strstr(USART2_RX_BUF, "connected")) //如果串口接受到connected表示成功
break; //跳出while循环
printf("%d ", timeout); //串口输出现在的超时时间
}
printf("\r\n"); //串口输出信息
if(timeout <= 0)return 1; //超时错误,返回1
return 0; //正确返回0
}
/*-------------------------------------------------*/
/*函数名:等待加入路由器 */
/*参 数:timeout:超时时间(1s的倍数) */
/*返回值:0:正确 其他:错误 */
/*-------------------------------------------------*/
char WiFi_WaitAP(int timeout)
{
while(timeout--){ //等待超时时间到0
delay_ms(1000); //延时1s
if(strstr(USART2_RX_BUF, "WIFI GOT IP")) //如果接收到WIFI GOT IP表示成功
break; //主动跳出while循环
printf("%d ", timeout); //串口输出现在的超时时间
}
printf("\r\n"); //串口输出信息
if(timeout <= 0)return 1; //如果timeout<=0,说明超时时间到了,也没能收到WIFI GOT IP,返回1
return 0; //正确,返回0
}
/***********************************
*
函数名:WiFi连接服务器 *
参 数:无 *
返回值:0:正确 其他:错误 *
*
************************************/
char WiFi_Connect_IoTServer(void)
{
printf("准备复位模块\r\n"); //串口提示数据
if(WiFi_Reset(50)) //复位,100ms超时单位,总计5s超时时间
{
printf("复位失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
return 1; //返回1
}else printf("复位成功\r\n"); //串口提示数据
printf("准备设置STA模式\r\n"); //串口提示数据
if(WiFi_SendCmd("AT+CWMODE=1",50))//设置STA模式,100ms超时单位,总计5s超时时间
{
printf("设置STA模式失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
return 2; //返回2
}else printf("设置STA模式成功\r\n"); //串口提示数据
if(wifi_mode==0) //如果联网模式=0:SSID和密码写在程序里
{
printf("准备取消自动连接\r\n"); //串口提示数据
if(WiFi_SendCmd("AT+CWAUTOCONN=0",50)) //取消自动连接,100ms超时单位,总计5s超时时间
{
printf("取消自动连接失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
return 3; //返回3
}else printf("取消自动连接成功\r\n"); //串口提示数据
printf("准备连接路由器\r\n"); //串口提示数据
if(WiFi_JoinAP(30))//连接路由器,1s超时单位,总计30s超时时间
{
printf("连接路由器失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
return 4; //返回4
}else printf("连接路由器成功\r\n"); //串口提示数据
}
printf("准备设置透传\r\n"); //串口提示数据
if(WiFi_SendCmd("AT+CIPMODE=1",50)) //设置透传,100ms超时单位,总计5s超时时间
{
printf("设置透传失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
return 8; //返回8
}else printf("设置透传成功\r\n"); //串口提示数据
printf("准备关闭多路连接\r\n"); //串口提示数据
if(WiFi_SendCmd("AT+CIPMUX=0",50)) //关闭多路连接,100ms超时单位,总计5s超时时间
{
printf("关闭多路连接失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
return 9; //返回9
}else printf("关闭多路连接成功\r\n"); //串口提示数据
printf("准备连接服务器\r\n"); //串口提示数据
if(WiFi_Connect_Server(100)) //连接服务器,100ms超时单位,总计10s超时时间
{
printf("连接服务器失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
return 10; //返回10
}else printf("连接服务器成功\r\n"); //串口提示数据
return 0; //正确返回0
}