【毕设调试二】WiFi模块的AP模式与App Inventor

您所在的位置:网站首页 esp8266手机端app 【毕设调试二】WiFi模块的AP模式与App Inventor

【毕设调试二】WiFi模块的AP模式与App Inventor

2023-05-30 14:46| 来源: 网络整理| 查看: 265

提示:在上一篇中我们简单的完成了WIFI模块的STA模式,在此篇中我们将梳理WiFi的AP模式

AP模式:热点模式,是通过设置WiFi模块来产生一个热点,然后通过连接本热点,来达到在手机   上发送控制信息到单片机,可以使用于app控制单片机类的项目

前期准备:

提示:需要用到上一章所配置的串口二和串口三的代码配置和esp8266.h、esp8266.c这两个文件里面的函数变量配置,STM32F103C8T6主控,以及WiFi模块。

AP配置:

在这次的AP配置中,我们需要加入两个代码文件,先上代码。

ap.c

#include "ap.h" #include "usart.h" #include "esp8266.h" #include "delay.h" #include "stdio.h" #include "string.h" #include "stm32f10x.h" /* * 函数名:ESP8266_Inquire_ApIp * 描述 :获取 F-ESP8266 的 AP IP * 输入 :pApIp,存放 AP IP 的数组的首地址 * ucArrayLength,存放 AP IP 的数组的长度 * 返回 : 0,获取失败 * 1,获取成功 * 调用 :被外部调用 */ uint8_t ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength ) { char uc; char * pCh; ESP8266_Send_AT_Cmd ( "AT+CIFSR", "OK", 0, 500 ); pCh = strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, "APIP,\"" ); if ( pCh ) pCh += 6; else return 0; for ( uc = 0; uc < ucArrayLength; uc ++ ) { pApIp [ uc ] = * ( pCh + uc); if ( pApIp [ uc ] == '\"' ) { pApIp [ uc ] = '\0'; break; } } return 1; } /* * 函数名:ESP8266_StartOrShutServer * 描述 :WF-ESP8266模块开启或关闭服务器模式 * 输入 :enumMode,开启/关闭 * :pPortNum,服务器端口号字符串 * :pTimeOver,服务器超时时间字符串,单位:秒 * 返回 : 1,操作成功 * 0,操作失败 * 调用 :被外部调用 */ bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver ) { char cCmd1 [120], cCmd2 [120]; if ( enumMode ) { sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum ); sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver ); return ( ESP8266_Send_AT_Cmd ( cCmd1, "OK", 0, 500 ) && ESP8266_Send_AT_Cmd ( cCmd2, "OK", 0, 500 ) ); } else { sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum ); return ESP8266_Send_AT_Cmd ( cCmd1, "OK", 0, 500 ); } } /* * 函数名:ESP8266_CIPAP * 描述 :设置模块的 AP IP * 输入 :pApIp,模块的 AP IP * 返回 : 1,设置成功 * 0,设置失败 * 调用 :被外部调用 */ uint8_t ESP8266_CIPAP ( char * pApIp ) { char cCmd [ 30 ]; sprintf ( cCmd, "AT+CIPAP=\"%s\"", pApIp ); if ( ESP8266_Send_AT_Cmd ( cCmd, "OK", 0, 5000 ) ) return 1; else return 0; } /* * 函数名:ESP8266_BuildAP * 描述 :WF-ESP8266模块创建WiFi热点 * 输入 :pSSID,WiFi名称字符串 * :pPassWord,WiFi密码字符串 * :enunPsdMode,WiFi加密方式代号字符串 * 返回 : 1,创建成功 * 0,创建失败 * 调用 :被外部调用 */ bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode ) { char cCmd [120]; sprintf ( cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%d", pSSID, pPassWord, enunPsdMode ); return ESP8266_Send_AT_Cmd ( cCmd, "OK", 0, 1000 ); } char cStr [ 100 ] = { 0 }; void ESP8266_AP_TCPClient_Test(void) { ESP8266_AT_Test(); printf("正在设置 ESP8266\r\n"); ESP8266_Net_Mode_Choose(AP); while ( ! ESP8266_CIPAP ( macUser_ESP8266_TcpServer_IP ) ); ESP8266_Enable_MultipleId ( ENABLE ); while ( ! ESP8266_BuildAP ( macUser_ESP8266_BulitApSsid, macUser_ESP8266_BulitApPwd, macUser_ESP8266_BulitApEcn ) ); while ( ! ESP8266_StartOrShutServer ( ENABLE, macUser_ESP8266_TcpServer_Port, macUser_ESP8266_TcpServer_OverTime ) ); ESP8266_Inquire_ApIp ( cStr, 20 ); printf("\r\nESP8266的AP模式设置完成"); connect_flag = 2; GPIO_SetBits(GPIOB,GPIO_Pin_0); printf ( "\r\nWIFI名字是:%s,无需连接权限\r\nWIFI的IP是:%s,WIFI的端口号是:%s\r\n最多可允许5台设备连接\r\n", macUser_ESP8266_BulitApSsid, cStr, macUser_ESP8266_TcpServer_Port ); ESP8266_Fram_Record_Struct .InfBit .FramLength = 0; ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag = 0; // USART_Cmd(USART3, DISABLE);//关闭打印测试端口,避免占用资源 delay_ms(1000); GPIO_ResetBits(GPIOB,GPIO_Pin_0); }

ap.h

#ifndef __AP_H #define __AP_H #include "stm32f10x.h" #include #include "tcp.h" /********************************** 用户需要设置的参数**********************************/ #define macUser_ESP8266_BulitApSsid "Alan" //要建立的热点的名称 #define macUser_ESP8266_BulitApEcn OPEN //要建立的热点的加密方式 #define macUser_ESP8266_BulitApPwd "wildfire" //要建立的热点的密钥 #define macUser_ESP8266_TcpServer_IP "192.168.43.77" //服务器开启的IP地址 #define macUser_ESP8266_TcpServer_Port "8888" //服务器开启的端口 #define macUser_ESP8266_TcpServer_OverTime "1800" //服务器超时时间(单位:秒) typedef enum{ OPEN = 0, WEP = 1, WPA_PSK = 2, WPA2_PSK = 3, WPA_WPA2_PSK = 4, } ENUM_AP_PsdMode_TypeDef; extern char cCh; extern char * pCh, * pCh1; extern char cStr [ 100 ]; u8 ESP8266_CIPAP ( char * pApIp ); bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode ); bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver ); u8 ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength ); /********************************** 测试函数声明 ***************************************/ void ESP8266_AP_TCPClient_Test(void); #endif

我们需要配置AP模式,在主函数进入while(1)之前调用ap.c里面的

void ESP8266_AP_TCPClient_Test(void)   函数即可。

(提示一下:在上一篇中我们要想配置STA模式,直接调用tcp.c里面

void ESP8266_STA_TCPClient_Test(void) 函数即可,上一篇忘记说了。

函数配置说明:

1. ESP8266_AT_Test(); 与上一篇说讲,同样的功能,初始化成wifi的出厂模式

2. ESP8266_Net_Mode_Choose(AP);该函数用于选择模式,这里我们选择STA模式。

    AT+CWMODE=2,WiFi模块的回复是“OK”。(1:STA,2:AP,3:STA+AP)

 3.while ( ! ESP8266_CIPAP ( macUser_ESP8266_TcpServer_IP ) );这个函数是把WiFi模块设置成ap模式后,需要把我们的wifi配置成一个类似于主服务器的东西,用于app这种从服务器的东西连接的,这里就要开始配置一个IP地址,这个IP地址是由我们创建的,可以任意更改,在ap.h文件里面。

发送:AT+CIPAP=\"%s\",%s 存放我们设置的IP地址,WiFi模块的回复是“OK”。

4. ESP8266_Enable_MultipleId ( ENABLE );这一步是设置多人连接,这一次我们配置多人可以连接,但WiFi模块自身会有限制,最多只能5人。

发送指令 AT+CIPMUX= (1或者0),WiFi模块的回复是“OK”。

5.  while ( ! ESP8266_BuildAP ( macUser_ESP8266_BulitApSsid, macUser_ESP8266_BulitApPwd, macUser_ESP8266_BulitApEcn ) );

这一步呢,分别对应是配置我们热点的名字、密钥(密码)、加密方式。

虽然我设置了密码,但是我选择的加密方式是0(加密方式只有0和1),所以默认就是开放,不需要密码可以直接连接热点

发送的形式:AT+CWSAP=\"%s\",\"%s\",1,%d   

第一个%s:热点名字;

第二个%s:热点密码;

1    :信道号(必须要有,具体解释可在安信可官网查看手册);

%d :加密方式;

 6. while ( !    ESP8266_StartOrShutServer ( ENABLE, macUser_ESP8266_TcpServer_Port, macUser_ESP8266_TcpServer_OverTime ) );

这一步是配置端口号和响应时间的,端口号也是可以更改的。

ENABLE :  只是单单作为一个判断分支

配置端口号:AT+CIPSERVER=%d,%s,%d:1,%s:端口号

这条指令是配置一个服务器,服务器的配置除了有IP地址外,也要有端口号,两者缺一不可!!

配置响应时间:AT+CIPSTO=%s  %s:响应时间

完成到上面这一步,热点已经配置出来了!!

然后接下来的函数:ESP8266_Inquire_ApIp ( cStr, 20 );,用来查询一下IP地址和物理地址

(这里已经不需要配置了,就是执行下查询功能)

那么最后我们把我们需要的信息打印出来:

在手机上也可以看到这一个热点的存在,我们也是可以连接的(下面第一张图),但是这个热点是不可以连接互联网了,接下来就是使用一个app连接对应的IP地址和端口号(我们必须要连接上这个热点后,我们的app才可以连接上单片机(下面第二张图)),然后串口助手会打印出当前连接用户,如果我们不自行断开,wifi模组会一直默认记录我们连接的(下面第三张图),因为我是直接退出APP,没有断开,然后等我第二次登陆时,就会显示有第二个用户登陆了!!

看下图(我现在是第三个用户了,因为我也是没有断开连接),如果我断开了会显示"CLOSE",等我再次登录时,我依旧是第三个用户,就不会变成第四个用户了。

 

 由于我的app已经是配置好的,所有我们只需要连上就可以向单片机发送数据,然后单片机也可以接收到这些数据,然后进行解码,我们再在单片机里面去处理对应的解码!!

解码说明:大家可以看串口二的中断处理,有两步的处理。

一步是用来存储接收到的数据,放在一个数组:

if(ESP8266_Fram_Record_Struct .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) )         {             //留最后一位做结束位             ESP8266_Fram_Record_Struct .Data_RX_BUF[ ESP8266_Fram_Record_Struct .InfBit .FramLength ++ ]  = ucCh;            }

 一步是用来引出一个标志位,告诉单片机我接收完了:

ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag = 1;

 那么我们接下来就可以做处理了,这段处理我是自己写的,我梳理一下大概步骤,就是使用strstr函数做对比,查看数组里面是否有我们要处理函数,每一次处理完都重置一下,当然如果要提取数据的话,我们也可以用指针从数组里面提取出来,再做处理。(到这里为止,单片机部分的思路就基本疏通完了,接下来就是app的简易制作)

if ( ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag == 1 ) { ESP8266_Fram_Record_Struct .Data_RX_BUF [ ESP8266_Fram_Record_Struct .InfBit.FramLength] = '\0'; if(strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, "soil_1" )) printf("定时\r\n"); ESP8266_Fram_Record_Struct .InfBit .FramLength = 0; ESP8266_Fram_Record_Struct .InfBit .FramFinishFlag = 0; USART_ITConfig (USART2, USART_IT_RXNE, ENABLE ); //使能串口接收中断 }

 

【App制作】

App Inventor网站:http://ai2.17coding.net/?locale=zh_CN

**因为我不是计算机专业的,对于使用java来制作app也只是自学到界面设计的部分,所以为了能实现的通信功能,我便使用这个可视化网站来制作,有能力的同学,也可以尝试自己制作app**

先看一下,这是我已经设计好的界面,在界面的设计部分,大家可以去观看哔哩哔哩老巫婆的App Inventor趣味编程,我在这里主要讲一下,我调试与单片通信的步骤:

 ①我们需要用到一个插件:ClientSocketAI2Ext,它提供给我们一个是连接服务器的功能。

这就是基本的设置,这个地方的话主要就是这四行:

我们只需要在这个插件里面调用四个函数,然后配置完成就可以连接了。

这是这个插件所带的函数:

 对于这个app这些配置,大家可能需要具体上手去操作,才能自己理解的通,我也是尝试了好久。

今天的分享也就到这里了,下一章,我开始尝试梳理我MQTT的调试,我是用的云服务器的ONENET的。本文属于小白创作,如有错误,请各位大神指出,如有需要同学需要到插件或者不明白的,可以留言我。

 

 

 

 

 

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3