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

提示:在上一篇中我们简单的完成了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 ); //使能串口接收中断
}

 


【App制作】

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

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

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

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

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

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

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

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

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

 

 

 

 

 

 

 

 

  • 10
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值