zoukankan      html  css  js  c++  java
  • 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
    ");   //重启ESP8266 
    	delay_ms(500);
    	if(checkESP8266()==0)              //使用AT指令检查ESP8266是否存在
    	{
    			return 0;
    	}
    	memset(RXBuffer,0,RXBUFFER_LEN);   //清空接收缓冲
    	sendString(USART2,"ATE0
    ");     //关闭回显  
    	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
    ");     //发送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?
    ");                       //查询此时WIFI工作模式
        if(findStr(RXBuffer,"CWMODE:1",200)==0)                    //如果此时不是MODE1模式,即不是STATION模式
        {
            memset(RXBuffer,0,RXBUFFER_LEN);     
            sendString(USART2,"AT+CWMODE=1
    ");              //设置为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"
    ",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"
    ",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
    ");                  //设置建立一个TCP服务器
        if(findStr(RXBuffer,"OK",200)!=0)                //如果此时不是MODE1模式,即不是STATION模式
        {
            memset(RXBuffer,0,RXBUFFER_LEN);     
            sendString(USART2,"AT+CIPSERVER=1,8080
    ");//开启TCP Server ,端口设置为8080
            if(findStr(RXBuffer,"OK",200)!=0)
                return 1;     
    				else
    					return 0;
        }
    		else
    			return 0;
    }
    
    
    /**
     * 功能:处理从手机端接收的控制数据
     * 参数:24C02中的验证码
     * 返回值:None
     * 说明:
     */
    void ProServerDate()
    {	
    	}
    
    
  • 相关阅读:
    【并查集】连接格点C++
    【拓扑排序】威虎山上的分配C++
    CF39D Cubical PlanetC++
    【拓扑排序】排队C++
    [USACO09OCT]Invasion of the Milkweed】乳草的侵占C++
    免杀常用手段
    DELPHI 线程类
    动态注册OCX
    DELPHI 常用文件路径
    套接字(TCP)
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018445.html
Copyright © 2011-2022 走看看