提示:在上一篇中我们简单的完成了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 <stdbool.h>
#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 ); //使能串口接收中断
}
文章来源地址https://www.toymoban.com/news/detail-675451.html
【App制作】
App Inventor网站:http://ai2.17coding.net/?locale=zh_CN
**因为我不是计算机专业的,对于使用java来制作app也只是自学到界面设计的部分,所以为了能实现的通信功能,我便使用这个可视化网站来制作,有能力的同学,也可以尝试自己制作app**
先看一下,这是我已经设计好的界面,在界面的设计部分,大家可以去观看哔哩哔哩老巫婆的App Inventor趣味编程,我在这里主要讲一下,我调试与单片通信的步骤:
①我们需要用到一个插件:ClientSocketAI2Ext,它提供给我们一个是连接服务器的功能。
这就是基本的设置,这个地方的话主要就是这四行:
我们只需要在这个插件里面调用四个函数,然后配置完成就可以连接了。
这是这个插件所带的函数:
对于这个app这些配置,大家可能需要具体上手去操作,才能自己理解的通,我也是尝试了好久。
今天的分享也就到这里了,下一章,我开始尝试梳理我MQTT的调试,我是用的云服务器的ONENET的。本文属于小白创作,如有错误,请各位大神指出,如有需要同学需要到插件或者不明白的,可以留言我。
文章来源:https://www.toymoban.com/news/detail-675451.html
到了这里,关于【毕设调试二】WiFi模块的AP模式与App Inventor的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!