ESP8266简单几步建立服务器
Don’t Talk,Show me code
AT+RESTORE //恢复出厂设置(简单粗暴)
AT+RST //重启一哈
AT+CWMODE=3 //设置WiFi为state和AP模式
AT+CWJAP="qq","qwertyuiop789000" //连接WiFi,“热点名”,“热点密码”
AT+CIPMUX=1 //建立TCP Server
AT+CIPSERVER=1,8080 //开启TCP Server ,端口设置为8080(到这里已经建立成功了)
/*这俩要不要都行*/
AT+CIPMODE=1 //发送模式设置为透传模式
AT+CIFSR //查询本地地址,用于别人找你的IP地址,我当初是写个简单的APP来连接这个服务器,给他发送随机数字进行对比的
具体设置:
/*.h*/
/*连接AP宏定义*/
#define SSID "qq"
#define PWD "qwertyuiop789000"
#define defaltIP "192.168.137.111"
/*发送接收缓冲区长度宏定义*/
#define TXBUFFER_LEN 50
#define RXBUFFER_LEN 30
/*.c*/
u8 TXBuffer[TXBUFFER_LEN] = {0}; //网络通信数据发送缓冲
u8 RXBuffer[RXBUFFER_LEN] = {0}; //网络通信数据接收缓冲
char empty_buffer[5]="0000";//用于清空盒子,下次使用
/**
* 功能:外设串口初始化
* 参数:
* 无
*/
void initUART2(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/*配置USART2和GPIO时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/*GPIO配置*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* UART2配置 */
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//定义NVIC初始化结构体
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //指定配置的中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //设置子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使/失能中断
NVIC_Init(&NVIC_InitStructure);
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
}
/**
* 功能:指定某个UART发送一个字节
* 参数:USARTx:使用的目标串口x为1-3
* byte:待发送字节
* 返回值:None
*/
static void sendByte(USART_TypeDef *USARTx, u16 byte)
{
USART_ClearFlag(USARTx, USART_FLAG_TC); //软件清除发送完成标志位
USART_SendData(USARTx, byte); //发送一个字节
while (!USART_GetFlagStatus(USARTx, USART_FLAG_TC));//等待发送完成
USART_ClearFlag(USARTx, USART_FLAG_TC); //软件清除发送完成标志位
}
/**
* 功能:指定某个串口发送字符串
* 参数:USARTx:使用的目标串口x为1-3
* str:字符串指针
* 返回值:None
*/
void sendString(USART_TypeDef *USARTx, char *str)
{
while (*str)
{
sendByte(USARTx,*str++);
}
}
/**
* 功能:串口2中断服务函数
* 参数:None
* 返回值:None
*/
void USART2_IRQHandler(void)
{
static u8 i = 0;
if(USART_GetITStatus(USART2, USART_IT_RXNE)) //判断接收数据寄存器是否有数据
{
RXBuffer[i++] = USART_ReceiveData(USART2);
if(i==RXBUFFER_LEN) //超出接收缓冲范围,可能的情形是ESP8266复位,为防止溢出必须设置索引
{
i = RXBUFFER_LEN-1;
}
}
if(USART_GetITStatus(USART2, USART_IT_IDLE))
{
USART_ReceiveData(USART2); //读一次UART可以清除空闲标志位
i = 0;
}
}
/**
* 功能:查找字符串中是否包含另一个字符串
* 参数:
* dest:待查找目标字符串
* src:待查找内容
* retry_cn:查询超时时间
* 返回值:查找结果,非0为查找成功,0为失败
* 说明:
* 当发出一个AT指令后,需要一段时间等待ESP8266回复,因此就需要等待一段时间,
* 这个时间通常是几百ms(除了连接服务器和AP指令),本程序一般指令通常等待
* 2S,耗时的连接AP和服务器的设置等待为8S,其实花不了那么多时间,但如果发生超时
* 就一定可以判断是通信问题
*/
u8 findStr(u8* dest,u8* src,u16 retry_cn)
{
u16 retry = retry_cn; //超时时间
u8 result_flag = 0; //查找结果
while(strstr((char*)dest,(char*)src)==0 && --retry!=0)//等待串口接收完毕或超时退出
{
delay_ms(10);
}
if(retry==0) //如果超时则有问题,此时返回0
{
return 0;
}
result_flag = 1; //执行到这里说明一切正常, 表示查找成功
if(result_flag)
{
return 1;
}else
{
return 0;
}
}
/**
* 功能:初始化ESP8266
* 参数:None
* 返回值:初始化结果,非0为初始化成功,0为失败
*/
u8 initESP8266(void)
{
sendString(USART2,"+++"); //退出透传
delay_ms(500);
sendString(USART2,"AT+RST\r\n"); //重启ESP8266
delay_ms(500);
if(checkESP8266()==0) //使用AT指令检查ESP8266是否存在
{
return 0;
}
memset(RXBuffer,0,RXBUFFER_LEN); //清空接收缓冲
sendString(USART2,"ATE0\r\n"); //关闭回显
if(findStr(RXBuffer,"OK",200)==0) //设置不成功
{
return 0;
}
return 1; //设置成功
}
/**
* 功能:检查ESP8266是否正常
* 参数:None
* 返回值:ESP8266返回状态
* 非0 ESP8266正常
* 0 ESP8266有问题
*/
u8 checkESP8266(void)
{
memset(RXBuffer,0,RXBUFFER_LEN); //清空接收缓冲
sendString(USART2,"AT\r\n"); //发送AT握手指令
if(findStr(RXBuffer,"OK",200)!=0)//ESP8266正常
{
return 1;
}else //ESP8266不正常
{
return 0;
}
}
/**
* 功能:连接热点
* 参数:
* ssid:热点名
* pwd:热点密码
* 返回值:
* 连接结果,非0连接成功,0连接失败
*/
u8 connectAP(u8* ssid,u8* pwd,u8* defaltip)
{
memset(RXBuffer,0,RXBUFFER_LEN);
sendString(USART2,"AT+CWMODE?\r\n"); //查询此时WIFI工作模式
if(findStr(RXBuffer,"CWMODE:1",200)==0) //如果此时不是MODE1模式,即不是STATION模式
{
memset(RXBuffer,0,RXBUFFER_LEN);
sendString(USART2,"AT+CWMODE=1\r\n"); //设置为STATION模式
if(findStr(RXBuffer,"OK",200)==0)
{
return 0;
}
}
memset(TXBuffer,0,RXBUFFER_LEN); //清空发送缓冲
memset(RXBuffer,0,RXBUFFER_LEN); //清空接收缓冲
sprintf((char*)TXBuffer,"AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pwd);//连接目标AP
sendString(USART2,(char*)TXBuffer);
if(findStr(RXBuffer,"OK",800)!=0) //连接成功且分配到IP
{
memset(TXBuffer,0,RXBUFFER_LEN); //清空发送缓冲
memset(RXBuffer,0,RXBUFFER_LEN); //清空接收缓冲
sprintf((char*)TXBuffer,"AT+CIPSTA=\"%s\"\r\n",defaltIP);//设置默认IP,防止换网络,IP地址随着更换,APP端就好写了。。。
sendString(USART2,(char*)TXBuffer);
if(findStr(RXBuffer,"OK",800)!=0)
return 1;
else
return 0;
}
return 0;
}
/**
* 功能:连接热点
* 参数:
* ssid:热点名
* pwd:热点密码
* 返回值:
* 连接结果,非0连接成功,0连接失败
* 说明:
* 失败的原因有以下几种(UART通信和ESP8266正常情况下)
* 1. WIFI名和密码不正确
* 2. 路由器连接设备太多,未能给ESP8266分配IP
*/
u8 CreatServer(void)
{
memset(RXBuffer,0,RXBUFFER_LEN);
sendString(USART2,"AT+CIPMUX=1\r\n"); //设置建立一个TCP服务器
if(findStr(RXBuffer,"OK",200)!=0) //如果此时不是MODE1模式,即不是STATION模式
{
memset(RXBuffer,0,RXBUFFER_LEN);
sendString(USART2,"AT+CIPSERVER=1,8080\r\n");//开启TCP Server ,端口设置为8080
if(findStr(RXBuffer,"OK",200)!=0)
return 1;
else
return 0;
}
else
return 0;
}
/**
* 功能:处理从手机端接收的控制数据
* 参数:24C02中的验证码
* 返回值:None
* 说明:
*/
void ProServerDate()
{
}