- #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
- }
-
五、MQTT
1.MQTT协议介绍
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。