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()
{	
	}

发布了11 篇原创文章 · 获赞 5 · 访问量 455

猜你喜欢

转载自blog.csdn.net/weixin_43739167/article/details/104287774