> 文档中心 > STM32+ESP8266+MQTT微信小程序SoftAP一键配网接入腾讯物联网平台

STM32+ESP8266+MQTT微信小程序SoftAP一键配网接入腾讯物联网平台


STM32+ESP8266+MQTT微信小程序SoftAP一键配网接入腾讯物联网平台

  Wi-Fi 配网,指由外部向 Wi-Fi 设备提供 SSID 和密码(PSW),让 Wi-Fi 设备可以连接指定的热点或路由器,并加入后者所建立的 Wi-Fi 网络。
  对于具备丰富人机界面包括屏幕/键盘的设备,例如电脑或手机,可以直接输入 SSID/PSW 进行连接。
  对于不具备丰富人机交互界面的物联网 Wi-Fi 设备,例如智能灯、扫地机器人等,则可以借助手机等智能设备,以某种配网方式将 SSID/PSW 传递该设备。

  SoftAP模式配网

  原理介绍请参考腾讯云物联网开发文档SoftAP配网开发
  腾讯云平台接入参考:ESP8266接入腾讯云
  ESP8266_UDP通信配置UDP传输示例

  腾讯云物联网平台网页端配置

  1.登录腾讯云平台,进入交互开发,选择配网引导。
在这里插入图片描述
  2.选择配网方式为AirKiss协议配网。点保存后即可生成二维码。
在这里插入图片描述
  3.使用微信扫一扫二维码,或者通过微信小程序腾讯连连扫一扫二维码,进行配网。
在这里插入图片描述
在这里插入图片描述
  4.开始配网,配置热点信息。
在这里插入图片描述
  5.开始配网,等待配网完成。
在这里插入图片描述
  6. 配网调试信息
在这里插入图片描述
  7. 查看设备是否上线
在这里插入图片描述

  程序设计

  2.SoftAP配网函数

/*SoftAP配网*/u8 ESP8266_SoftAP_MOde(void){    u8 token[]="{\"cmdType\":2,\"productId\":\"LA57WTHWi2\",\"deviceName\":\"Smart_123\",\"protoVersion\":\"2.0\"}\r\n";//连接状态信息    char *p=NULL;    char data[256];    char buff[100];    u8 i=0;    u32 time1=0,time2=0;    usart3_cnt=0;    usart3_flag=0;    while(1)    { if(usart3_flag) {     usart3_rx_buff[usart3_cnt]='\0';     printf("rx=%s",usart3_rx_buff);     //+IPD,97,192.168.4.2,52021:{"cmdType":1,"ssid":"wbyq_wifi","password":"12345678","token":"df4a4c90abee98c9a443ae8ffd8cc16b"     p=strstr((char *)usart3_rx_buff,"+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;}

  3.微信小程序配网数据订阅与发布

//微信小程序配网数据订阅与发布#define SET_WEIXIN_TOPIC  "$thing/down/service/LA54WTHWL3/Smart_123"//订阅#define POST_WEIXIN_TOPIC "$thing/up/service/LA54WTHWL36/Smart_123"//发布 

在这里插入图片描述

  4.主函数

int main(){    int i=0,key;u8 stat=0;u32 time=0;u16 cnt=0;float temp;Beep_Init();//蜂鸣器初始化Led_Init();//LED初始化Key_Init();//按键初始化Usartx_Init(USART1,115200,72);Usartx_Init(USART3,115200,36);TIMx_Init(TIM2,72,20000);//通过定时器2辅助串口接收数据,20msTIMx_Init(TIM4,72,20000);//通过定时器2辅助串口接收数据,20msDS18B20_Init();//RTC_Init();//RTC初始化printf("初始化完成\r\n");while(1){stat=Esp8266_STA_TCPclinet_Init((u8 *)WIFI_NAME,(u8 *)WIFI_PASSWORD,(u8 *)SERVER_IP,SERVER_PORT);if(stat==0 || stat==0x80)break;printf("stat=%d\r\n",stat);  }printf("服务器连接成功\r\n");while(1){MQTT_Init();if(MQTT_Connect(ClientID,Username,Password)==0)break;Delay_Ms(500);printf("正在连接....\r\n");}printf("连接成功\r\n");    if(stat==0x80)//进入配网模式需要给微信小程序返回token值    {   //订阅微信topic  if(MQTT_SubscribeTopic(SET_WEIXIN_TOPIC,0,1))printf("订阅失败\r\n");  //返回平台数据,告知微信连连连接服务器成功 snprintf(mqtt_message,sizeof(mqtt_message),"{\"method\":\"app_bind_token\",\"clientToken\":\"client-1234\",\"params\": {\"token\":\"%s\"}}",esp8266_info.token); MQTT_PublishData(POST_WEIXIN_TOPIC,mqtt_message,0); //Smart_home{"method":"app_bind_token_reply","clientToken":"client-1234","code":0,"status":"success"} 配网成功后微信小程序返回数据    }    //订阅物联网平台数据    stat=MQTT_SubscribeTopic(SET_TOPIC,0,1);    if(stat)printf("订阅失败\r\n");   while(1){if(usart3_flag){     for(i=0;i<usart3_cnt;i++)     {  printf("%c",usart3_rx_buff[i]);     }     printf("\r\n");usart3_cnt=0;usart3_flag=0;}Delay_Ms(1);time++;cnt++;if(time>=5000){time=0;MQTT_SentHeart();//发送心跳包}if(cnt>=2000){cnt=0;temp=DS18B20_GetTemp()*0.0625;sprintf(mqtt_message,"{\"method\":\"report\",\"clientToken\":\"123\",\"params\":{\"LED1\":1,\"temp\":%.2f,\"L\":356}}",temp);//温度MQTT_PublishData(POST_TOPIC,mqtt_message,0);}}}

  示例工程:https://download.csdn.net/download/weixin_44453694/18845106