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()
    {	
    	}
    
    
  • 相关阅读:
    easy ui 表单ajax和from两种提交数据方法
    easy ui 下拉级联效果 ,下拉框绑定数据select控件
    easy ui 下拉框绑定数据select控件
    easy ui 异步上传文件,跨域
    easy ui 菜单和按钮(Menu and Button)
    HTTP 错误 404.3
    EXTJS4.2 后台管理菜单栏
    HTML 背景图片自适应
    easy ui 表单元素input控件后面加说明(红色)
    EXTJS 4.2 添加滚动条
  • 原文地址:https://www.cnblogs.com/hhsxy/p/14018445.html
Copyright © 2011-2022 走看看