STM32+ESP8266(ESP-12F)物联网温度计-腾讯云物联网

目录

    • STM32+ESP8266(ESP-12F)物联网温度计-腾讯云物联网
  • 一、硬件及软件准备
    • 1、完整工程源码
    • 2、硬件:STM32单片机、ESP8266(ESP-12F)、DS18B20
    • 3、软件:Keil5、安信可串口调试助手、wireshark网络抓包工具
  • 二、 实现效果
  • 三、 paho MQTT协议库移植
  • 四、 腾讯云物联网产品及设备创建
  • 五、ESP8266配置
    • 1、测试ESP8266模块
    • 2、配置WIFI工作模式
    • 3、重启WIFI模块
    • 4、关闭回显
    • 5、连接WIFI
    • 6、设为透传模式
    • 7、建立TCP连接
  • 六、核心代码
  • 七、腾讯云客户端ID、用户名、密码生成
  • 八、设备上线
  • 九、代码调试
  • 十、说明

一、硬件及软件准备

1、完整工程源码

下载地址:https://download.csdn.net/download/qq_44062900/19747292

2、硬件:STM32单片机、ESP8266(ESP-12F)、DS18B20

注:ESP8266刷的固件是标准的AT指令固件,不同版本AT固件的AT指令略有不同,请注意!

3、软件:Keil5、安信可串口调试助手、wireshark网络抓包工具

安信可串口调试助手下载:https://docs.ai-thinker.com/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B72
wireshark下载地址:https://www.wireshark.org/download.html

二、 实现效果

腾讯连连微信小程序显示实时温度,并且可以远程控制开发板的LED灯

三、 paho MQTT协议库移植

有关 paho MQTT协议库移植请移步:STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云

四、 腾讯云物联网产品及设备创建

如果是第一次使用腾讯云产品,需要先进行实名认证。下面直接从物联网控制台着手。
物联网控制台地址:https://console.cloud.tencent.com/iotexplorer
点击“公共实例”

点击“新建项目”

输入项目名称,点击“保存”即可

点击“项目ID”进入项目管理页面

点击“新建产品”,输入产品信息,点击“保存”


点击产品ID进入产品管理页面

点击“新建功能”

输入自定义功能,一个是温度上传,一个是LED控制


创建完功能后点击“下一步”

保存以下两个Topic,后面会用到,然后点击“下一步”。

下面开始配置腾讯连连微信小程序,使用腾讯连连可以很方便地设计一个APP管理程序。

点击“保存”,返回后点击“下一步”


点击“新建设备”,输入设备名称后点击保存


点击“设备名称”,复制“设备名称”、“设备秘钥”及“产品ID”并保存在文本文件中,后面激活设备需要用到。



点击“二维码”


在微信小程序中搜索“腾讯连连”,进入后点击“扫一扫”,扫描上方二维码添加设备

五、ESP8266配置

由于MQTT协议是基于TCP传输层协议之上的应用层协议,所以在使用MQTT进行通信之前首先要和服务器建立TCP连接,这样我们才能通过MQTT协议连接到腾讯云物联网平台。

配置总流程:测试ESP8266>>>配置WIFI工作模式为Station(终端)或AP+Station(接入点+终端)>>>重启模块>>>关闭回显>>>连接WIFI>>>设为透传模式>>>建立TCP连接>>>开启透传>>>使用MQTT协议进行通信

注:ESP-12F的固件是标准的AT指令,在给ESP8266发送指令时,要在指令最后加上"\r\n"结束符

1、测试ESP8266模块

指令:“AT+\r\n”
测试成功则返回"OK"

2、配置WIFI工作模式

指令:“AT+CWMODE=1\r\n”
配置成功则返回"OK"

3、重启WIFI模块

指令:“AT+RST\r\n”
发送指令后需等待几秒钟,等ESP8266复位完成

4、关闭回显

指令:“ATE0\r\n”
配置成功返回"OK"

5、连接WIFI

指令:“AT+CWJAP=“ssid”,“pass”\r\n”
其中ssid为WIFI名称,pass为WIFI密码
配置成功返回"OK"

6、设为透传模式

指令:“AT+CIPMODE=1\r\n”
配置成功返回"OK"

7、建立TCP连接

指令:“AT+CIPSTART=“TCP”,“ip”,port\r\n”
其中ip为服务器ip,这里为"71248IVBSR.iotcloud.tencentdevices.com"
port为固定的1883

格式参考

配置成功返回"CONNECT OK "

6、开启透传
指令:“AT+CIPSEND\r\n”
当模块返回">“时,此时进入透传模式,发送的所有数据都被视为是数据,当单独发送一包数据中含有”+++"时,模块会退出透传模式

通过以上步骤后,此时可以通过MQTT协议和服务器进行通信

六、核心代码

1、tencentyun.h

#ifndef _TENCENT_MQTT_H_
#define _TENCENT_MQTT_H_#include "stm32f10x.h"#define CLIENT_ID "71248IVBSRESP8266"
#define USER_NAME   "71248IVBSRESP8266;12010126;MO8JD;1624767646"
#define PASSWORD    "9f37730219d6e3b9a121b845877cea4694ce7b74;hmacsha1"
#define KEEPALIVE_TIME 1200#define PUB_TOPIC "$thing/up/property/71248IVBSR/ESP8266"
#define SUB_TOPIC "$thing/down/property/71248IVBSR/ESP8266"#define MQTT_MAX_BUFF 512#define MQTT_DISCONNECT 0
#define MQTT_CONNECT        1extern u8 MQTT_ConnectStatus;enum REQ_QoS
{REQ_QoS_0=0,REQ_QoS_1,REQ_QoS_2
};u8 MQTT_Connect(char *client_id,char *user_name,char *password,u16 keep_alive);
void MQTT_Disconnect(void);
u8 MQTT_Subscribe_Topic(char *topic,int req_qos,int msgid);
u8 MQTT_Unsubscribe_Topic(char *topic,int msgid);
u8 MQTT_Publish(char *pub_topic, unsigned char* payload);
u8 MQTT_Heart_Send(void);
u8 MQTT_GetConnectStatus(void);
void MQTT_AutoReconnect(void);#endif

2、tencentyun.c

#include "tencent_mqtt.h"
#include "MQTTPacket.h"
#include "transport.h"
#include "string.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "ESP8266.h"u8 mqtt_buf[MQTT_MAX_BUFF];
u16 rx_cnt=0;
u8 MQTT_ConnectStatus=MQTT_DISCONNECT;//连接MQTT服务器
u8 MQTT_Connect(char *client_id,char *user_name,char *password,u16 keep_alive)
{MQTTPacket_connectData data = MQTTPacket_connectData_initializer;data.clientID.cstring =client_id;//客户端IDdata.keepAliveInterval = keep_alive;//保活时间,单位为秒data.cleansession = 1;//清除会话data.username.cstring = user_name;//用户名data.password.cstring = password;//密码u16 send_len=MQTTSerialize_connect(mqtt_buf,MQTT_MAX_BUFF,&data);//序列化连接数据报transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送连接数据报memset(mqtt_buf,0,MQTT_MAX_BUFF);if (MQTTPacket_read(mqtt_buf, MQTT_MAX_BUFF, transport_getdata) == CONNACK){unsigned char sessionPresent, connack_rc;if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, mqtt_buf, MQTT_MAX_BUFF) != 1 || connack_rc != 0)//反序列化CONNACK报文{return 1;//接收报文类型正确,但连接失败}}else return 1;//接收报文类型错误return 0;
}//断开连接
void MQTT_Disconnect(void)
{u16 send_len=MQTTSerialize_disconnect(mqtt_buf, MQTT_MAX_BUFF);transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送断开连接数据报memset(mqtt_buf,0,MQTT_MAX_BUFF);send_len=MQTTSerialize_disconnect(mqtt_buf, MQTT_MAX_BUFF);transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送断开连接数据报memset(mqtt_buf,0,MQTT_MAX_BUFF);
}
//订阅主题
u8 MQTT_Subscribe_Topic(char *sub_topic,int req_qos,int msgid)
{MQTTString topicString = MQTTString_initializer;topicString.cstring = sub_topic;u16 send_len = MQTTSerialize_subscribe(mqtt_buf, MQTT_MAX_BUFF, 0, msgid, 1, &topicString, &req_qos);//序列化订阅数据报transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送订阅数据报memset(mqtt_buf,0,MQTT_MAX_BUFF);if(MQTTPacket_read(mqtt_buf,MQTT_MAX_BUFF, transport_getdata) == SUBACK)//判断是否是SUBACK报文{unsigned short submsgid;int subcount;int granted_qos;u8 rc=MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, mqtt_buf, MQTT_MAX_BUFF);//反序列化SUBACK报文if(!rc || submsgid!=msgid || granted_qos==0x80)    return 1;接收报文类型正确,但订阅失败}else return 1;//接收报文类型错误return 0;
}
//取消订阅主题
u8 MQTT_Unsubscribe_Topic(char *unsub_topic,int msgid)
{MQTTString topicString = MQTTString_initializer;topicString.cstring = unsub_topic;u16 send_len = MQTTSerialize_unsubscribe(mqtt_buf,MQTT_MAX_BUFF, 0, msgid,1, &topicString);//序列化取消订阅数据报transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送取消订阅数据报memset(mqtt_buf,0,MQTT_MAX_BUFF);if(MQTTPacket_read(mqtt_buf,MQTT_MAX_BUFF, transport_getdata) == UNSUBACK)//判断是否是UNSUBACK报文{unsigned short unsubmsgid;u8 rc=MQTTDeserialize_unsuback(&unsubmsgid,mqtt_buf,MQTT_MAX_BUFF);//反序列化UNSUBACK报文if(!rc || unsubmsgid!=msgid )   return 1;接收报文类型正确,但取消订阅失败}else return 1;//接收报文类型错误return 0;
}//发布主题
u8 MQTT_Publish(char *pub_topic, unsigned char* payload)
{MQTTString topicString = MQTTString_initializer;topicString.cstring = pub_topic;u16 send_len = MQTTSerialize_publish(mqtt_buf,MQTT_MAX_BUFF,0,0,0,0,topicString, payload, strlen((const char*)payload));//序列化发布数据报transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送发布数据报memset(mqtt_buf,0,MQTT_MAX_BUFF);return 0;
}
//发送心跳包
u8 MQTT_Heart_Send(void)
{u16 send_len=MQTTSerialize_pingreq(mqtt_buf,MQTT_MAX_BUFF);transport_sendPacketBuffer(mqtt_buf,send_len);//向服务器发送PING数据报memset(mqtt_buf,0,MQTT_MAX_BUFF);if(MQTTPacket_read(mqtt_buf,MQTT_MAX_BUFF, transport_getdata) != PINGRESP)//判断是否是PINGRESP报文{return 1;//接收报文类型错误}return 0;
}
//获取MQTT服务器连接状态
u8 MQTT_GetConnectStatus(void)
{if(MQTT_Heart_Send()) return MQTT_DISCONNECT;return MQTT_CONNECT;
}
//自动重连
void MQTT_AutoReconnect(void)
{u8 con_cnt=0;ESP_Exit_Unvarnished();while(ESP_AutoReConnect_Server(WIFI_SSID,WIFI_PWD,SERVER_IP,SERVER_PORT) && con_cnt<=30){Delay_Ms(1000);printf("wifi or TCP disconnect,auto connectting...\n");con_cnt++;}if(con_cnt>30)   printf("wifi or TCP auto reconnect failure\n");else printf("TCP server connect\n");con_cnt=0;if(ESP_SendCmd("AT+CIPSEND\r\n",">",10,10)) printf("透传模式开启失败\n");//开启透传while(MQTT_Connect(CLIENT_ID,USER_NAME,PASSWORD,KEEPALIVE_TIME) && con_cnt<=30)//重新连接{Delay_Ms(1000);printf("MQTT server disconnect,auto connectting...\n");con_cnt++;}if(con_cnt>30) printf("MQTT auto reconnect failure\n");else printf("MQTT connect\n");con_cnt=0;
}

3、main.c

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "esp8266.h"
#include <stdlib.h>
#include "ds18b20.h"
#include "tencent_mqtt.h"
#include <stdio.h>
#include "usart.h"
#include "beep.h"int main(void)
{u8 key=0;char Pub_buff[512];u16 cnt=0;Delay_Ms(1000);BEEP_Init();//蜂鸣器初始化LED_Init();//LED初始化KEY_Init();//按键初始化USARTx_Init(USART1,72,115200);//串口1初始化USARTx_Init(USART3,36,115200);//串口3初始化TIMERx_Init(TIM2,72,2000*10);//设置分频系数为72,定时10ms.分频系数7200-->100us,72-->1usTIMERx_Init(TIM4,72,2000*10);//设置分频系数为72,定时10ms.分频系数7200-->100us,72-->1usDS18B20_Init();//DS18B20初始化ESP_UnvarnishedMode_Init(WIFI_SSID,WIFI_PWD,SERVER_IP,SERVER_PORT);//连接TCP服务器并进入透传模式if(MQTT_Connect(CLIENT_ID,USER_NAME,PASSWORD,KEEPALIVE_TIME))//登录MQTT服务器printf("connect failure\n");else {printf("connect success\n");    if(MQTT_Subscribe_Topic(SUB_TOPIC,REQ_QoS_0,1))//订阅{printf("subscribe failure\n");}else printf("subscribe success\n");}while(1){if(USART3_RX_FLAG){for(u16 i=0;i<USART3_RX_CNT;i++){if(USART3_RX_BUFF[i]=='\0')   USART3_RX_BUFF[i]='0';}USART3_RX_BUFF[USART3_RX_CNT]='\0';printf("USART3_RX=%s\n",USART3_RX_BUFF);if(strstr(USART3_RX_BUFF,"{\"LED_swi\":1}")) LED1=0;if(strstr(USART3_RX_BUFF,"{\"LED_swi\":0}"))    LED1=1;USART3_RX_FLAG=0;USART3_RX_CNT=0;}if(USART1_RX_FLAG){USART1_RX_FLAG=0;USART1_RX_BUFF[USART1_RX_CNT]='\0';USARTx_SendString(USART3,USART1_RX_BUFF);USART1_RX_CNT=0;}Delay_Ms(10);cnt++;if(cnt%300==0)//上传温度数据{snprintf(Pub_buff,sizeof(Pub_buff),"{\"clientToken\":\"1234\",\"method\":\"report\",\"params\":{\"Temperature\": %0.2f}}",DS18B20_Read_Temp()*0.0625);MQTT_Publish(PUB_TOPIC,(unsigned char*)Pub_buff);}if(cnt==3000){cnt=0;if(MQTT_GetConnectStatus()==MQTT_DISCONNECT)//未连接MQTT服务器{printf("MQTT Disconnect\n");MQTT_AutoReconnect();//自动重连if(MQTT_Subscribe_Topic(SUB_TOPIC,REQ_QoS_0,1))//重新订阅{printf("subscribe failure\n");}else printf("subscribe success\n");}else printf("MQTT Connect\n");}key=KEY_GetVal();if(key==2)//订阅{if(MQTT_Subscribe_Topic(SUB_TOPIC,REQ_QoS_0,1)){printf("subscribe failure\n");}else printf("subscribe success\n");}else if(key==3)//取消订阅{if(MQTT_Unsubscribe_Topic(SUB_TOPIC,1)){printf("unsubscribe failure\n");}else printf("unsubscribe success\n");             }else if(key==4)//断开连接{MQTT_Disconnect();}else if(key==5)//发送心跳包{if(MQTT_Heart_Send()){printf("ping failure\n");}else printf("ping success\n"); }}
}

七、腾讯云客户端ID、用户名、密码生成

1、客户端ID
Client ID 格式:产品 ID + 设备名,如:"TXXXXDS8Gdev001 ",TXXXXDS8G 是产品 ID,dev001 是设备名称。
2、用户名及密码生成
使用官方提供的生成小工具可以很方便的获取用户名及密码
生成小工具:https://iot-exp-individual-1258344699.cos.ap-guangzhou.myqcloud.com/password%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7.zip
进入后输入设备信息即可生成用户名及密码

3、替换代码中的客户端ID、用户名、密码及订阅和发布Topic

八、设备上线

烧录代码后可以看到设备已经上线,并且腾讯连连小程序中也可以看到设备已上线

九、代码调试

有关使用wireshark抓包工具调试代码请移步:STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云

十、说明

说明:所发布工程只完成了基本的MQTT通信部分,可能会存在一些bug,如有发现可以评论或私信告诉我,其他应用功能还需要自己根据实际需要进行更改。
如教程中存在错误,欢迎在评论区指正!

STM32+ESP8266(ESP-12F)物联网温度计-腾讯云物联网相关推荐

  1. STM32节点移植lorawan协议连接腾讯云物联网开发平台(IoT Explorer)

    STM32移植lorawan协议栈连接腾讯云物联网开发平台(IoT Explorer) 前言 开发环境的准备 正文 初始化 入网 发送与接收 前言 在移植协议之前,先给大家科普一下Lora 和 lor ...

  2. 【STM32+ESP8266连接腾讯云物联网开发平台 2】STM32+ESP8266-01S连接腾讯云

    文章目录 前言 一.硬件准备 1.ESP8266-01S 2. STM32F103C8T6核心板或者小开发板及其程序下载器 二.软件准备 1.STM32CubeMX 2. MDK (Keil v5) ...

  3. 【STM32+ESP-12S连接腾讯云物联网开发平台 1】云平台的创建和AT固件烧录

    腾讯云物联网开发平台创建和ESP-12S的固件烧录 前言 一.腾讯云物联网开发平台的创建 1. 创建产品 2. 配置产品和创建设备 3. 设备三元组说明 二.ESP-12S固件烧录 1.固件获取 2. ...

  4. 智慧农业: STM32F103ZE+ESP8266+腾讯云物联网平台+微信小程序设计

    一.环境介绍 单片机采用:STM32F103ZET6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可.比如:GSM模块.有线网卡等. 与物联网云平台的通信协议:  标准M ...

  5. ESP8266连接腾讯云物联网平台

    ESP8266连接腾讯云物联网平台   MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscrib ...

  6. ESP32接入腾讯云物联网开发平台

    文章目录 前言 1 资料参考 2 对接总体思路 3 代码移植 3.1 component qcloud_iot 3.2 项目顶层处理 3.3 component main 4 移植问题备忘 CMake ...

  7. 腾讯云-物联网开发平台IoT Explorer

    应用场景 腾讯云的物联网开发平台能做什么?举一个简单的例子,作者就经常有这样的场景:三十度高温的广州,每当你刚踏进家门便急不可耐的寻找空调遥控器把温度调到最低,然后站在空调前迎面吹着冷风:但也可以是这 ...

  8. 图文手把手教程--ESP32 MQTT连接腾讯云物联网平台及OTA固件升级

    本文内容 1)在腾讯云物联网开发平台,新建项目,并在项目下新建设备"light_001". 2)下载腾讯云SDK-esp-qcloud,使用例程led_light,通过" ...

  9. 腾讯云物联网平台产品全面升级,全新生态运营策略构建消费电子智能生态

    9月10日,在腾讯全球数字生态大会消费电子专场上,腾讯云对物联网平台产品全面升级,并发布了全新的生态运营策略,与合作伙伴携手共建物联网生态,共享产业商机,为客户提供更大的价值. 中国的消费电子产业通过 ...

最新文章

  1. apache与tomcat连接
  2. uglifyjs压缩js文件
  3. 关于ionic的跨域问题
  4. [Linux学习]Linux键盘布局设置
  5. 网络游戏:为什么失败
  6. VideoLan 0.8.6b test 1
  7. 随手练——打印折痕方向
  8. STC单片机 命名规则,最小系统 图示
  9. 《赢道——成功创业者的28条戒律》2009年1月出版
  10. mysql的安装与卸载
  11. 深度学习15-Google涂鸦识别挑战项目(下)
  12. PLC编程之ST语言
  13. Apple MDM 开发
  14. Python美女图片爬虫实战
  15. 剑指offer刷题总结
  16. 关于XDC工具的文章
  17. [乐意黎原创]JS函数声明、 函数表达式与立即执行函数的理解与执行顺序
  18. BZOJ2339[HNOI2011]卡农——递推+组合数
  19. Java编程学习-Math类
  20. win7您无权关闭计算机,win7不能关机的解决方法

热门文章

  1. 4|无线传感器网络与应用|无线传感器网络原理及方法-许毅版|第3章:无线传感器网络通信-3.1协议结构 3.2物理层|青岛科技大学|课堂笔记
  2. 现在新能源汽车可以取代传统燃油车吗?
  3. 数据埋点|六个步骤实现数据埋点方案设计
  4. 自学网的计算机基础视频,我要自学网-为零基础初学者提供计算机知识课程视频教学的自学平台...
  5. CSS - 护眼模式
  6. 【设计模式】Unity3D 简单工厂、工厂(方法)、抽象工厂模式
  7. 苹果iOS系统刷机 for Mac
  8. php 导出 并下载word 文档
  9. IEC61850变电站基本通信结构-原理和模型_7建模规则中的类定义以及MMS映射模型
  10. T-SQL:表的创建和管理