当前位置:首页 > 公众号精选 > 嵌入式云IOT技术圈
[导读]     点击上方嵌入式开发圈 记得关注我们哦!     这是我之前学习ESP8266想的思路,后续用STM32来实现其中一个或两个功能。 一、ESP8266配网(使用手机APP来给模组配置) 假设已经开发了一个手机APP,这个APP完成的功能如下: 1、连接设备接的模块ESP8266生成的

    

点击上方嵌入式开发圈 记得关注我们哦!

    这是我之前学习ESP8266想的思路,后续用STM32来实现其中一个或两个功能。

一、ESP8266配网(使用手机APP来给模组配置)


假设已经开发了一个手机APP,这个APP完成的功能如下:

1、连接设备接的模块ESP8266生成的热点

2、给设备热点发送要连接的路由器的名字和密码

配网流程

1、设备让ESP8266进入AP模式设备MCU通过串口给ESP8266发送AT+CWMODE=2,让ESP8266进入AP模式。如果进入AP模式成功,用手机可以搜索到ESP8266模块的热点信息。


2、用手机APP去连接这个热点发送路由器ssid和password,假设格式为: ssid:“xxx”,password:“xxxx”


3、解析APP发过来的字符串格式ESP8266串口收到格式:

ssid:“xxx”,password:"xxxx"这个字符串设备MCU处理收到的这个字符串,将ssid和password提取出来。分别保存到缓存区SSID、PASSWORD。


4、设备让ESP8266进入STA模式设备MCU通过串口给ESP8266发送AT+CWMODE=1,让ESP8266进入STA模式。


5、设备连接路由器拿保存在缓存区的SSID和PASSWORD,设备通过串口给ESP8266发送连接指令AT+CWJAP=“SSID”,“PASSWORD”


6、连接公网服务器

===>120.78.136.134:8888AT+CIPSTART=“TCP”,“120.78.136.134”,9002

    配网成功!如果以后不在初始化设置模式下,不会执行该流程,默认开机直接连接对应的热点和服务器。

 


二、ESP8266配网(使用上位机串口来给模组配置)


假设已经开发了一个上位机,这个上位机完成的功能如下:

1、上位机通过串口连接设备

2、具有设置wifi帐号和密码的功能(其实就是发送一条串口指令,带有wifi帐号和密码)

3、具有设置服务器ip和端口号的功能(其实就是发送一条串口指令,带有服务器ip和端口号)

配网流程

1、直接让设备进入STA模式    上位机通过串口给接有ESP8266的设备发送AT+CWMODE=1,让ESP8266进入STA模式。

2、设备接收到上位机发送过来的进入STA模式的指令,透传给ESP8266,    这时ESP8266如果设置成功,则处于STA模式。

3、特定模式下(初始化设置),线程等待上位机下发的指令指令格式:(1)设置wifi连接路由器SSID:“xxxx”,“PASSWORD”:“xxxxx”(2)设置wifi连接服务器SERVER_IP:“xxx.xxx.xxx.xxx”,PORT:“xxxx”

4、设备接收到上位机下发的指令,进行解析后分别保存在缓存区中。

5、设备连接路由器    拿保存在缓存区的SSID和PASSWORD,设备通过串口给ESP8266发送连接指令AT+CWJAP=“SSID”,“PASSWORD”

6、连接公网服务器

===>xxx.xx.xxx.xxx:xxxx例如:AT+CIPSTART=“TCP”,“120.78.136.134”,9002

    配网成功!如果以后不在初始化设置模式下,不会执行该流程,默认开机直接连接对应的热点和服务器。


三、ESP8266配网(使用上位机网络TCP来给模组配置)


假设以及开发了一个上位机,这个上位机完成的功能如下:

1、上位机可以用TCP/IP连接wifi热点(ESP8266)===>需要知道esp8266的ip和端口号,通过window网络状态可以查到。

2、具有设置wifi帐号和密码的功能(其实就是发送一条串口指令,带有wifi帐号和密码)

3、具有设置服务器ip和端口号的功能(其实就是发送一条串口指令,带有服务器ip和端口号)

配网流程

设备端

1、直接让设备进入AP模式上位机通过串口给接有ESP8266的设备发送AT+CWMODE=2,让ESP8266进入AP模式。

指令:

AT+CWMODE=2

2、重启设备,确保AP模式设置成功指令:

AT+RST

3、开启多路连接指令:

AT+CIPMUX=1

4、为设备端创建热点指令:

AT+CWSAP=“WIFI名称”,“WIFI密码”,1,4

5、设备端启动服务器指令:

AT+CIPSERVER=1,8080

PC端

1、事先需要让PC去连接wifi热点===>WIFI名称、WIFI密码

2、通过网络连接详情查看当前热点的IPv4服务器地址

3、PC端开发的上位机连接IPv4服务器地址,端口号就是设备端指定的端口号:8080

4、PC端开发的上位机下发指令给设备端指令格式:

(1)设置wifi连接路由器SSID:“xxxx”,“PASSWORD”:“xxxxx”

(2)设置wifi连接服务器

SERVER_IP:“xxx.xxx.xxx.xxx”,PORT:“xxxx”

设备端

1、解析字符串,如果含有

SSID:“xxxx”,“PASSWORD”:“xxxxx”,取得ssid和password,保存到设备端的FLASH中,如果为其它,则设定接收出错的条件。

2、解析字符串,如果含有如下字符串:

SERVER_IP:“xxx.xxx.xxx.xxx”,PORT:“xxxx”

这时候程序解析取得server_ip和port,保存到设备端的FLASH中,如果为其它,则设定接收出错的条件。

3、如果已经解析完两个字符串,自动重启,切换到STA模式,取出ssid和password,连接ap,连接成功后,接下来取出flash中的server_ip和port,连接服务器,如果成功,则可进入数据上传,如果不成功,则返回ap连接,依次进行,直到成功后,此时程序中连接成功的标志会置一。

4、定时查询与服务器端确认是否连接成功,如果不成功,需要重新连接服务器。

5、可上传数据

    ESP8266端,其实我已经写好了一个程序,只是还不是那么的完善,但现在已经可以用了,分享出来,大家可以去完善它。

    大致程序框架设计如下,分别是配置WIFI的过程以及正常连接WIFI的过程:

//配置wifi网络int Cofig_Wifi_NetWork(void){ int ret = -1 ; char *buf = NULL;
while(1) { switch(ESP8266_INFO.config_network_status) { case CHECK_WIFI_EXIST: ret = Wifi_Test_Exist();
if(0 != ret) { printf("wifi初始化失败,请检查硬件是否连接!\r\n"); ESP8266_INFO.config_network_status = CHECK_WIFI_EXIST ; LED1(ON); return -1 ; } else { ESP8266_INFO.config_network_status = WIFI_SET_MODE ; LED1(OFF); } break ;
case WIFI_SET_MODE: ret = Wifi_Set_Mode(3);
if(0 != ret) { printf("wifi设置模式失败\r\n"); ESP8266_INFO.config_network_status = CHECK_WIFI_EXIST ; LED1(ON); } else { ESP8266_INFO.config_network_status = WIFI_BUILD_AP ; LED1(OFF); } break ;
case WIFI_BUILD_AP: printf("准备ap....\n"); ret = ESP8266_BuildAP("ESP8266", "123456", WPA2_PSK);
if(1 != ret) { printf("wifi创建AP失败...\r\n"); ESP8266_INFO.config_network_status = CHECK_WIFI_EXIST ; LED1(ON); } else { ESP8266_INFO.config_network_status = WIFI_CONFIG_MULTI ; LED1(OFF); printf("创建ap成功\n"); } break ;
case WIFI_CONFIG_MULTI: printf("配置多连接模式!\r\n"); ret = ESP8266_Enable_MultipleId(ENABLE);
if(1 != ret) { printf("配置多连接失败\n"); ESP8266_INFO.config_network_status = WIFI_BUILD_AP ; LED1(ON); } else { ESP8266_INFO.config_network_status = WIFI_START_SERVER ; LED1(OFF); } break ;
case WIFI_START_SERVER: ret = ESP8266_StartOrShutServer(ENABLE, "8080", "10") ;
if(1 != ret) { printf("创建端口号:%d失败\r\n", 8080); ESP8266_INFO.config_network_status = WIFI_CONFIG_MULTI ; LED1(ON); } else { printf("创建端口号:%d成功\r\n", 8080); ESP8266_INFO.config_network_status = WIFI_GET_AP_IP ; LED1(OFF); } break ;
case WIFI_GET_AP_IP: buf = malloc(20); if(buf == NULL) return -1;
if(1 != ESP8266_Inquire_ApIp(buf, 20)) { if(1 == ESP8266_StartOrShutServer(DISABLE, "8080", "5000")) { printf("关闭服务器成功!\r\n"); ESP8266_INFO.config_network_status = WIFI_START_SERVER ; //回到开启服务器的流程 LED1(OFF); } free(buf); } printf("获取ap ip:%s成功\r\n", buf); free(buf); ESP8266_INFO.config_network_status = WAIT_CLIENT_CONNECT; break ;
case WAIT_CLIENT_CONNECT: while(1) { //接收上位机连接 ret = ESP8266_Get_IdLinkStatus(); if(0 != ret) { printf("设备已和上位机建立连接....\r\n"); ESP8266_INFO.config_network_status = BACK_TO_CONFIG_PROCESS ; LED1(ON); break ; } LED2(ON); Delay_ms (10); LED2(OFF); Delay_ms(10); } break ;
default: break ; }
if(ESP8266_INFO.config_network_status == BACK_TO_CONFIG_PROCESS) { LED1(OFF); LED2(OFF); LED3(OFF); break ; } }
return 0 ;}
//wifi正常连接流程void Wifi_NetWork_Process(void){ int ret = -1 ;
while(1) { switch(ESP8266_INFO.wifi_status) { case WIFI_EXIST_CHECK: ret = Wifi_Test_Exist();
if(0 != ret) { printf("wifi硬件故障!\n"); return ; }
ESP8266_INFO.wifi_status = WIFI_SET_MODE ; break ;
case WIFI_SET_MODE: ret = Wifi_Set_Mode(STA);
if(0 != ret) { printf("wifi设置模式失败\r\n"); ESP8266_INFO.wifi_status = WIFI_EXIST_CHECK ; } else ESP8266_INFO.wifi_status = WIFI_CONNECT_ROUTER;
break ;
case WIFI_CONNECT_ROUTER: ret = Wifi_Connect_Router((const char *)ESP8266_INFO.wifi_ssid, (const char *)ESP8266_INFO.wifi_password);
if(ret != 0) { printf("连接wifi热点失败\n"); ESP8266_INFO.wifi_status = WIFI_SET_MODE ; return ; } else { printf("连接wifi热点:%s成功\n", ESP8266_INFO.wifi_ssid); ESP8266_INFO.wifi_status = WIFI_CLOSE_MULTI ; }
case WIFI_CLOSE_MULTI:
//关闭多连接 if(1 != ESP8266_Enable_MultipleId(DISABLE)) { printf("关闭多连接失败!\n"); ESP8266_INFO.wifi_status = WIFI_CONNECT_ROUTER ; } else { printf("关闭多连接成功!\n"); ESP8266_INFO.wifi_status = WIFI_CONNECT_SERVER ; }
break ;
case WIFI_CONNECT_SERVER: ret = Wifi_Connect_Server("TCP", (const char *)ESP8266_INFO.server_ip, atoi((char *)ESP8266_INFO.server_port));
if(ret != 0) { printf("连接服务器失败\n"); ESP8266_INFO.wifi_status = WIFI_CONNECT_ROUTER ; } else { printf("连接服务器:%s成功\n", ESP8266_INFO.server_ip); ESP8266_INFO.wifi_status = WIFI_CONFIG_OK ; }
break ;
default: break ; }
//wifi连接成功 if(WIFI_CONFIG_OK == ESP8266_INFO.wifi_status) { LED3(ON); break ; } }
return ;}

//返回当前子串在原字符串中的索引int Sub_String_Index(char *str, char *sub_str){ char *p1 = NULL ; char *__str = str ; char *__sub_str = sub_str ; p1 = strstr(__str, __sub_str); return p1 - __str ;}

/////////////////////////////////////ESP8266解析参数int Esp8266_Process_Para(void){ char *str = NULL ; char *p1 = NULL ; char *p2 = NULL ; int index1 = 0, index2 = 0 ;
//开始wifi配置 while(1) { //如果该标志为0,则代表上位机已经连上设备了 if(BACK_TO_CONFIG_PROCESS == ESP8266_INFO.config_network_status) { if(0 == ESP8266_Get_IdLinkStatus()) { printf("客户端已掉线,需重新连接....\n"); LED2(ON); Delay_ms(300); LED2(OFF); Delay_ms(300); } //此时客户端没有掉线 else { printf("客户端已连接,可下发数据....\n"); //准备配置wifi_ssid str = ESP8266_ReceiveString(DISABLE); p1 = str + 12 ;
if(NULL != strstr(p1, "SSID")) { //拷贝wifi ssid index1 = Sub_String_Index(p1, "="); index2 = Sub_String_Index(p1, ";"); memcpy(ESP8266_INFO.wifi_ssid, p1 + index1 + 1, index2 - index1 - 1); //拷贝wifi密码 p2 = p1 + index2 + 1 ; index1 = Sub_String_Index(p2, "=") ; index2 = Sub_String_Index(p2, ";") ; memcpy(ESP8266_INFO.wifi_password, p2 + index1 + 1, index2 - index1 - 1); printf("wifi_ssid:%s wifi_password:%s\r\n", ESP8266_INFO.wifi_ssid, ESP8266_INFO.wifi_password); macESP8266_Usart ("setting ssid_password success"); ESP8266_INFO.wifi_config_ap_flag = 1 ; } else if(NULL != strstr(p1, "SERVER_IP")) { //拷贝服务器相关参数===>server_ip index1 = Sub_String_Index(p1, "="); index2 = Sub_String_Index(p1, ";"); memcpy(ESP8266_INFO.server_ip, p1 + index1 + 1, index2 - index1 - 1); //拷贝服务器相关参数===>server_port p2 = p1 + index2 + 1 ; index1 = Sub_String_Index(p2, "=") ; index2 = Sub_String_Index(p2, ";") ; memcpy(ESP8266_INFO.server_port, p2 + index1 + 1, index2 - index1 - 1); printf("server_ip:%s server_port:%s\r\n", ESP8266_INFO.server_ip, ESP8266_INFO.server_port); macESP8266_Usart ("setting server_ip port success"); ESP8266_INFO.wifi_cofnig_server_flag = 1 ; }
//如果都配置了,则进入正常启动流程 if((1 == ESP8266_INFO.wifi_config_ap_flag) && (1 == ESP8266_INFO.wifi_cofnig_server_flag)) { ESP8266_INFO.config_network_status = 1 ; return ESP8266_INFO.config_network_status ; } } } else if(1 == ESP8266_INFO.config_network_status) { return ESP8266_INFO.config_network_status ; } }}

手机APP设计得比较简陋

以下使用QT设计的一个简单的配置工具界面

韦东山精品嵌入式课程(包含裸机、驱动、应用、系统)






商务合作

深圳市云之手科技有限公司

支持我请给我在看,让更多人知道!



免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭