基于STM32+ESP8266设计的物联网产品(重点:支持微信小程序一键连接腾讯云平台)
最编程
2024-03-20 16:50:30
...
//存放ESP8266的详细信息
struct ESP8266 esp8266_info;
/*SoftAP配网*/
u8 ESP8266_SoftAP_MOde(void)
{
u8 token[]="{\"cmdType\":2,\"productId\":\"3XM7FNOG4L\",\"deviceName\":\"lock\",\"protoVersion\":\"2.0\"}\r\n";//连接状态信息
char *p=NULL;
char data[256];
char buff[100];
u8 i=0;
u32 time1=0,time2=0;
USART3_RX_CNT=0;
USART3_RX_FLAG=0;
while(1)
{
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
printf("rx=%s",USART3_RX_BUFFER);
//+IPD,97,192.168.4.2,52021:{"cmdType":1,"ssid":"wbyq_wifi","password":"12345678","token":"df4a4c90abee98c9a443ae8ffd8cc16b"
p=strstr((char *)USART3_RX_BUFFER,"+IPD");
if(p)
{
strcpy(data,p);//将接收到的数据拷贝一份保存
p+=strlen("+IPD");
p+=1;
while(*p!=',' && *p!='\0')p++;
p++;//跳过字符',',获取到IP地址起始位置
i=0;
//IP地址解析
while(*p!=',' && *p!='\0')
{
buff[i++]=*p++;
}
buff[i]='\0';
strcpy((char *)esp8266_info.esp8266_ip,buff);
//端口号解析
p++;
i=0;
while(*p!=':' && *p!='\0')
{
buff[i++]=*p++;
}
buff[i]='\0';
esp8266_info.esp8266_prot=atoi(buff);//字符串转整数
//printf("ip=%s:%d\r\n",esp8266_info.esp8266_ip,esp8266_info.esp8266_prot);
printf("ret:%d\r\n",Esp8266_UDP_SendData((u8*)esp8266_info.esp8266_ip,esp8266_info.esp8266_prot,token));//上报连接状态
}
ESP8266_GetData(data,(char *)esp8266_info.esp8266_name,"ssid");//WIFI名
ESP8266_GetData(data,(char *)esp8266_info.esp8266_key,"password");//密码
ESP8266_GetData(data,(char *)esp8266_info.token,"token");//token数据,需要返回给平台
printf("wifi_name:%s\r\n",esp8266_info.esp8266_name);
printf("wifi_key:%s\r\n",esp8266_info.esp8266_key);
printf("wifi_token:%s\r\n",esp8266_info.token);
LED1=1;
return 0;
}
delay_ms(1);
time1++;
time2++;
if(time2>=100)
{
time2=0;
LED1=!LED1;
}
if(time1>=1000*300)
{
LED1=1;
break;//超时退出
}
}
return 1;
}
/*******************************************************************************************************************
**形参: wifi_name --WIFI名
** password --密码
** remote_ip --远端IP地址(255.255.255.255为广播地址)
** remote_prot --远端端口号
** localhost ---本地端口号
**返回值:0 --成功,
** 其它值 --失败
**示例:ESP8266_UDP_STA_Mode("360WIFI_123","12345678","172.20.7.2",10500,8080);
*********************************************************************************************************************/
u8 ESP8266_UDP_STA_Mode(u8 *wifi_name,u8 *password,u8 *remote_ip,u16 remote_prot,u16 localprot)
{
char buff[100];
USARTx_StringSend(USART3,"+++"); //退出透传模式
delay_ms(1000);
printf("重启模块.......\r\n");
USARTx_StringSend(USART3,"AT+RST\r\n");
delay_ms(1000);
delay_ms(1000);
printf("关回显.......\r\n");
if(ESP8266_SendCmd("ATE0\r\n"))return 2;
printf("设置为STA模式.......\r\n");
if(ESP8266_SendCmd("AT+CWMODE=1\r\n"))return 3;
printf("连接WIFI.......\r\n");
snprintf(buff,sizeof(buff),"AT+CWJAP=\"%s\",\"%s\"\r\n",wifi_name,password);
if(ESP8266_SendCmd(buff))return 5;
printf("查询IP.......\r\n");
if(ESP8266_SendCmd("AT+CIFSR\r\n"))return 6;
printf("建立UDP连接.....\r\n");
snprintf(buff,sizeof(buff),"AT+CIPSTART=\"UDP\",\"%s\",%d,%d,0\r\n",remote_ip,remote_prot,localprot);
if(ESP8266_SendCmd(buff))return 7;
printf("设置透传.......\r\n");
if(ESP8266_SendCmd("AT+CIPMODE=1\r\n"))return 8;
printf("发送数据.......\r\n");
USARTx_StringSend(USART3,"AT+CIPSEND\r\n");
return 0;
}
/****************STA+TCPclinet初始化*************
**
**
const char *STA_TCPCLINET[]=
{
"AT\r\n",//测试指令
"ATE0\r\n",//关回显
"AT+CWMODE=1\r\n",//设置STA模式
"AT+RST\r\n",//模块复位
"ATE0\r\n",//关回显
"AT+CWJAP=\"HUAWEIshui\",\"asdfghjkl12\"\r\n",//连接wifi
"AT+CIPMUX=0\r\n",//设置单连接
"AT+CIFSR\r\n",//查询IP
"AT+CIPSTART=\"TCP\",\"192.168.43.204\",8080\r\n",//连接服务器
"AT+CIPMODE=1\r\n",//设置透传模式
"AT+CIPSEND\r\n",//开始发送数据
};
返回值: 0x7f --退出透传模式失败
** 0x80 --进入配网模式正常退出
** 0 --未进入配网模式正常退出
** 其他值 --异常退出
*****************************************************/
u8 Esp8266_STA_TCPclinet_Init(u8 *server_ip,u16 server_port)
{
char buff[100];
/*退出透传模式*/
u8 i=0;
u8 stat=0;
u32 id;
for(i=0;i<5;i++)
{
USARTx_StringSend(USART3,"+++");//退出透传模式
delay_ms(100);
if(Esp8266_SendCmdCheckStat("AT\r\n","OK\r\n")==0)
{
i=0;
break;
}
}
if(i!=0)
{
printf("退出透传模式失败\r\n");
return 0x7f;
}
printf("1.模块复位\r\n");
if(Esp8266_SendCmdCheckStat("AT+RST\r\n","OK\r\n"))return 1;
delay_ms(1000);
delay_ms(1000);
printf("2.关回显\r\n");
if(Esp8266_SendCmdCheckStat("ATE0\r\n","OK\r\n"))return 2;
if(ESP8266_GetWifi_Stat())//查询WIFI连接状态,未连接成功则进入配网模式
{
BEEP=1;
delay_ms(100);
BEEP=0;
delay_ms(100);
BEEP=1;
delay_ms(100);
BEEP=0;
stat=1;//进入配网模式标志位
//查询IP地址
printf("3.设置模式AP\r\n");
if(Esp8266_SendCmdCheckStat("AT+CWMODE=2\r\n","OK\r\n"))return 3;
printf("4.设置IP地址\r\n");
if(Esp8266_SendCmdCheckStat("AT+CIPAP=\"192.168.4.1\",\"192.168.4.1\",\"255.255.255.0\"\r\n","OK"))return 4;
printf("4.设置热点信息\r\n");
id=*(vu32*)(0x1FFFF7E8);//使用STM32的ID作为WIFI名
snprintf((char *)esp8266_info.esp8266_name,sizeof(esp8266_info.esp8266_name),"wbyq_%d",id);
snprintf(buff,sizeof(buff),"AT+CWSAP=\"%s\",\"12345678\",1,4\r\n",esp8266_info.esp8266_name);
printf("wif_name:%s\r\n",esp8266_info.esp8266_name);
if(Esp8266_SendCmdCheckStat(buff,"OK\r\n"))return 5;
printf("5.显示端口.......\r\n");
if(Esp8266_SendCmdCheckStat("AT+CIPDINFO=1\r\n","OK"))return 6;
printf("6.设置要连接的UDP\r\n");
if(Esp8266_SendCmdCheckStat("AT+CIPSTART=\"UDP\",\"192.168.4.255\",8266,8266,0\r\n","OK\r\n"))return 7;
printf("7.获取微信小程序传递过来的热点信息\r\n");
if(ESP8266_SoftAP_MOde())return 8;
printf("8.设置模式STA\r\n");
if(Esp8266_SendCmdCheckStat("AT+CWMODE=1\r\n","OK\r\n"))return 9;
printf("9.模块复位\r\n");
if(Esp8266_SendCmdCheckStat("AT+RST\r\n","OK\r\n"))return 10;
delay_ms(1000);
delay_ms(1000);
printf("10.连接WIFI\r\n");
snprintf((char *)buff,sizeof(buff),"AT+CWJAP=\"%s\",\"%s\"\r\n",esp8266_info.esp8266_name,esp8266_info.esp8266_key);//字符串拼接
if(Esp8266_SendCmdCheckStat(buff,"WIFI GOT IP"))return 11;
}
printf("11.设置单连接\r\n");
if(Esp8266_SendCmdCheckStat("AT+CIPMUX=0\r\n","OK"))return 12;
snprintf(buff,sizeof(buff),"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",server_ip,server_port);
// printf("buff:%s\r\n",buff);
printf("12.连接服务器\r\n");
if(Esp8266_SendCmdCheckStat(buff,"OK"))return 13;
printf("13.配置透传模式\r\n");
if(Esp8266_SendCmdCheckStat("AT+CIPMODE=1\r\n","OK\r\n"))return 14;
printf("14.开始发送数据\r\n");
if(Esp8266_SendCmdCheckStat("AT+CIPSEND\r\n",">"))return 15;
if(stat)return 0x80;//进入配网模式并且正常退出
else return 0;//未进入配网模式,正常退出
}
/**************************获取WIFI连接状态信息***************************/
u8 ESP8266_GetWifi_Stat(void)
{
u16 i=0;
u16 time=0;
u16 time2=0;
USART3_RX_CNT=0;
USART3_RX_FLAG=0;
USARTx_StringSend(USART3,"AT+CWJAP?\r\n");//查询WIFI连接状态
while(1)
{
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
printf("rx=%s\r\n",USART3_RX_BUFFER);
if(strstr((char *)USART3_RX_BUFFER,"+CWJAP") || strstr((char *)USART3_RX_BUFFER,"WIFI GOT IP"))
{
USART3_RX_CNT=0;
USART3_RX_FLAG=0;
LED1=1;
return 0;
}
else
{
USART3_RX_CNT=0;
USART3_RX_FLAG=0;
memset(USART3_RX_BUFFER,0,sizeof(USART3_RX_BUFFER));
}
}
delay_ms(10);
i++;
time++;
time2++;
if(time>=1000)
{
time=0;
USARTx_StringSend(USART3,"AT+CWJAP?\r\n");
}
if(time2>=300)
{
LED1=!LED1;
time2=0;
}
if(i>=100*60)
{
LED1=1;
break;
}
}
return 1;
}
上一篇: 基于 Spring Boot 的银行柜台管理系统-4 系统设计
下一篇: 五分钟入门物联网小程序