历史上的今天
返回首页

历史上的今天

今天是:2025年10月14日(星期二)

正在发生

2022年10月14日 | STM32+ESP8266+MQTT协议连接腾讯物联网开发平台

2022-10-14 来源:csdn

一、环境介绍

单片机采用:STM32F103C8T6


上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。


开发软件:keil5


物联网平台: 腾讯IOT物联网物联网平台。腾讯的物联网平台比起其他厂家的物联网平台更加有优势,腾讯物联网平台可以将数据推到微信小程序上,用户可以直接使用小程序绑定设备,完成与设备之间交互,现在用户基本都会使用微信,所以使用起来非常方便。


本文章配套使用的STM32设备端完整源代码下载地址:   https://download.csdn.net/download/xiaolong1126626497/18785807


 


STM32+ESP8266使用MQTT协议连接OneNET 中国移动物联网开发平台:https://blog.csdn.net/xiaolong1126626497/article/details/107385118


STM32+ESP8266使用MQTT协议连接阿里云物联网开发平台:https://blog.csdn.net/xiaolong1126626497/article/details/107311897


 


二、功能介绍

本文章接下会介绍如何在腾讯物联网平台上创建设备、配置设备、推送到微信小程序、并编写STM32设备端代码,使用ESP8266联网登录腾讯物联网平台,完成数据交互。 


 功能:  STM32采集环境温度、湿度、光照强度实时上传至物联网平台,在微信小程序页面上,用户可以实时查看这些数据,并且可以通过界面上的按钮控制设备端的电机、LED灯的开关,完成数据上传和远程控制。  


说明:  STM32设备端所有代码均有自己全部编写,没有使用任何厂家的SDK,MQTT协议也是参考MQTT官方文档编写;ESP8266也没有使用任何专用固件,所以代码的移植性非常高。 任何能够联网的设备都可以参考本篇文章代码连接腾讯物联网平台,达到相同的效果。

                                      

三、登录腾讯物联网平台创建设备

腾讯云官网:  https://cloud.tencent.com/

 

下面是手机上的截图:操作过程

                                                                   

现在设备是离线状态,是无法查看的,接下来就使用MQTT客户端模拟设备,登录测试。


四、使用MQTT客户端模拟设备--测试

4.1  下载MQTT客户端

MQTT客户端可执行文件下载地址(.exe):  https://download.csdn.net/download/xiaolong1126626497/18784012


这个MQTT客户端采用QT开发,如果需要了解它的源码,请看这里: https://blog.csdn.net/xiaolong1126626497/article/details/116779490


4.2  查看物联网平台端口号与域名(IP地址)

官方文档:  https://cloud.tencent.com/document/product/634/32546

通过这里得到信息:   如果是广州域的设备(其实哪里都一样,只是服务器距离的远近),就填入  <产品ID>.iotcloud.tencentdevices.com  ,端口号是 1883(这是密匙认证的端口号,如果是证书认证就是另一个)。


查看产品ID的方法:

得打产品ID之后,那么要连接我的设备,域名就填:  8O76VHCU7Y.iotcloud.tencentdevices.com     端口就填: 1883


由于我的测试用的MQTT客户端不支持域名输入,只支持IP地址输入,所有我这里需要先将域名转为IP地址在进行下面的测试,ESP8266内部支持域名解析的,所有可以直接输入域名即可,不需要做这一步。


在线解析域名的网址: https://site.ip138.com/8O76VHCU7Y.iotcloud.tencentdevices.com/

得到广州腾讯云的IP地址为:  106.55.124.154


4.3  生成MQTT登录参数

就像我们登录QQ、登录微信需要账号密码一样,设备登录物联网平台也需要类似的东西。


官方文档地址: https://cloud.tencent.com/document/product/634/32546

上面需要的参数,在设备调试页面,点击具体的设备进行查看:

Python源代码:


#!/usr/bin/python

# -*- coding: UTF-8 -*-

import base64

import hashlib

import hmac

import random

import string

import time

import sys

# 生成指定长度的随机字符串

def RandomConnid(length):

    return  ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(length))

# 生成接入物联网通信平台需要的各参数

def IotHmac(productID, devicename, devicePsk):

     # 1. 生成 connid 为一个随机字符串,方便后台定位问题

     connid   = RandomConnid(5)

     # 2. 生成过期时间,表示签名的过期时间,从纪元1970年1月1日 00:00:00 UTC 时间至今秒数的 UTF8 字符串

     expiry   = int(time.time()) + 30*24*60 * 60

     # 3. 生成 MQTT 的 clientid 部分, 格式为 ${productid}${devicename}

     clientid = "{}{}".format(productID, devicename)

     # 4. 生成 MQTT 的 username 部分, 格式为 ${clientid};${sdkappid};${connid};${expiry}

     username = "{};12010126;{};{}".format(clientid, connid, expiry)

     # 5. 对 username 进行签名,生成token

     secret_key = devicePsk.encode('utf-8')  # convert to bytes

     data_to_sign = username.encode('utf-8')  # convert to bytes

     secret_key = base64.b64decode(secret_key)  # this is still bytes

     token = hmac.new(secret_key, data_to_sign, digestmod=hashlib.sha256).hexdigest()

     # 6. 根据物联网通信平台规则生成 password 字段

     password = "{};{}".format(token, "hmacsha256")

     return {

        "clientid" : clientid,

        "username" : username,

        "password" : password

     }

if __name__ == '__main__':

    # 参数分别填入: 产品ID,设备名称,设备密匙

    print(IotHmac("8O76VHCU7Y","SmartAgriculture","OHXqYLklNBU4xLqqoZbXMQ=="))

得到的登录信息如下:


clientid: 8O76VHCU7YSmartAgriculture

username: 8O76VHCU7YSmartAgriculture;12010126;J4MCD;1623766532

password: a962b484079864239148b255281d54372aa66247aa8d6259d11aa6fef650fd5b;hmacsha256

 

4.4 了解主题上报和订阅的格式

登录之前需要先了解如何订阅设备的主题和上报的数据流格式。

如果设备端想要得到APP页面的按钮状态就需要订阅属性下发和属性上报的响应,主题格式就是这样的:


格式:

$thing/down/property/8O76VHCU7Y/设备名称

示例:

$thing/down/property/8O76VHCU7Y/SmartAgriculture

如果设备端想要像APP页面上传数据,那么就需要使用属性上报--发布主题:


格式:

$thing/up/property/8O76VHCU7Y/${deviceName}

示例:

$thing/up/property/8O76VHCU7Y/SmartAgriculture

设备端向APP页面上报属性时,需要上传具体的数据,数据流的格式如下:


官方文档:  https://cloud.tencent.com/document/product/1081/34916

比如: 我的产品里有温度、湿度、电机三个设备,我可以选择一次上传3个设备的信息,数据格式就这样写:


{"method":"report","clientToken":"123","params":{"temperature":20.23,"humidity":50,"Motor":1}}

其中:  "temperature"、"humidity"、"Motor"  是设备的标识符,根据自己的情况修改,冒号后面就是给这个设备上传的具体数据。

4.5 使用MQTT客户端登录设备测试

万事俱备,下面就使用MQTT客户端进行登录测试。

MQTT客户端操作步骤:


1. 填写相关参数


2. 点击登录


3. 订阅主题


4. 发布主题


5. 去APP页面查看信息


4.6 微信小程序效果

已经收到MQTT客户端上传的数据,点击按钮,MQTT客户端也会收到按钮下发的数据。

五、STM32设备端代码

本文章配套使用的STM32设备端完整源代码下载地址:   https://download.csdn.net/download/xiaolong1126626497/18785807


5.1 下载程序

5.2  连接状态

STM32设备上按下按键后,手机打开微信小程序可以看到实时上传的数据,速度非常快。


5.3  main.c文件

#include "stm32f10x.h"

#include "led.h"

#include "delay.h"

#include "key.h"

#include "usart.h"

#include

#include "timer.h"

#include "bluetooth.h"

#include "esp8266.h"

#include "mqtt.h"

 

//腾讯物联网服务器的设备信息

#define MQTT_ClientID "8O76VHCU7YSmartAgriculture"

#define MQTT_UserName "8O76VHCU7YSmartAgriculture;12010126;J4MCD;1623766532"

#define MQTT_PassWord "a962b484079864239148b255281d54372aa66247aa8d6259d11aa6fef650fd5b;hmacsha256"

 

//订阅与发布的主题

#define SET_TOPIC  "$thing/down/property/8O76VHCU7Y/SmartAgriculture"  //订阅

#define POST_TOPIC "$thing/up/property/8O76VHCU7Y/SmartAgriculture"  //发布

 

char mqtt_message[200];//上报数据缓存区

 

int main()

{

   u32 time_cnt=0;

   u32 i;

   u8 key;

   LED_Init();

   BEEP_Init();

   KEY_Init();

   USART1_Init(115200);

   TIMER1_Init(72,20000); //超时时间20ms

   USART2_Init(9600);//串口-蓝牙

   TIMER2_Init(72,20000); //超时时间20ms

   USART3_Init(115200);//串口-WIFI

   TIMER3_Init(72,20000); //超时时间20ms

   USART1_Printf("正在初始化WIFI请稍等.n");

   if(ESP8266_Init())

   {

      USART1_Printf("ESP8266硬件检测错误.n");  

   }

   else

   {

      //加密端口

      //USART1_Printf("WIFI:%dn",ESP8266_STA_TCP_Client_Mode("OnePlus5T","1126626497","183.230.40.16",8883,1));

      

      //非加密端口

      USART1_Printf("WIFI:%dn",ESP8266_STA_TCP_Client_Mode("CMCC-Cqvn","99pu58cb","106.55.124.154",1883,1));

  

   }

   

    //2. MQTT协议初始化

    MQTT_Init(); 

    //3. 连接OneNet服务器        

    while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord))

    {

        USART1_Printf("服务器连接失败,正在重试...n");

        delay_ms(500);

    }

    USART1_Printf("服务器连接成功.n");

    

    //3. 订阅主题

    if(MQTT_SubscribeTopic(SET_TOPIC,0,1))

    {

        USART1_Printf("主题订阅失败.n");

    }

    else

    {

        USART1_Printf("主题订阅成功.n");

    }        

    

    while(1)

    {    

        key=KEY_Scan(0);

        if(key==2)

        {

            time_cnt=0;

            sprintf(mqtt_message,"{"method":"report","clientToken":"123","params":{"temperature":20.23,"humidity":50,"Motor":1}}");

            MQTT_PublishData(POST_TOPIC,mqtt_message,0);

            USART1_Printf("发送状态1rn");

        }

        else if(key==3)

        {

            time_cnt=0;

            sprintf(mqtt_message,"{"method":"report","clientToken":"123","params":{"temperature":10.23,"humidity":60,"Motor":0}}");

            MQTT_PublishData(POST_TOPIC,mqtt_message,0);

            USART1_Printf("发送状态0rn");

        }  

 

        if(USART3_RX_FLAG)

        {

            USART3_RX_BUFFER[USART3_RX_CNT]='';

            for(i=0;i            {

                USART1_Printf("%c",USART3_RX_BUFFER[i]);

            }

            USART3_RX_CNT=0;

            USART3_RX_FLAG=0;

        }

 

        //定时发送心跳包,保持连接

推荐阅读

史海拾趣

ELMEC Technology Of America Inc公司的发展小趣事

随着产品的不断完善,ELMEC开始考虑如何进一步拓展市场。然而,国际市场的竞争异常激烈,ELMEC的产品面临着来自各大跨国公司的挑战。为了打开市场,李明带领团队深入调研,了解客户需求,不断优化产品性能。同时,他们还积极参加各类国际展会,与潜在客户建立联系。经过几年的努力,ELMEC的产品逐渐获得了市场的认可,销售额也稳步增长。

EPC公司的发展小趣事

最后一家EPC公司深知创新是企业发展的核心动力。公司注重研发投入和人才培养,建立了专业的研发团队和完善的研发体系。公司不断跟踪行业发展趋势和技术动态,积极引进新技术、新工艺和新材料,推动产品升级和产业升级。同时,公司注重创新成果的转化和应用,将新技术、新工艺和新材料应用于实际项目中,提高了项目的竞争力和附加值。通过持续的创新和积累,公司逐渐在电子行业中形成了独特的技术优势和核心竞争力。

请注意,以上故事仅为框架性描述,并未包含具体的公司名称、项目细节和具体数字。您可以根据这些框架性描述进一步深入了解相关公司的发展情况,并结合实际案例进行具体分析和撰写。

GardTec Inc公司的发展小趣事

背景:GardTec Inc公司,成立于1987年(也有资料显示为1985年),自创立之初便确立了成为全球风扇配件产品第一供应商的目标。这一明确的定位为公司后续的发展奠定了坚实的基础。

发展:在创立初期,GardTec专注于风扇配件的研发与生产,通过技术创新和品质提升,逐渐在行业内崭露头角。公司利用现代化的制造和工程设施,不断突破设计与材料的限制,推出了一系列具有创新性的风扇配件产品。

影响:随着产品质量的提升和市场份额的扩大,GardTec逐渐在电子行业中建立了良好的口碑,为后续的快速发展奠定了基础。

Discera公司的发展小趣事

在成功进入军用市场后,Discera公司开始将目光投向更广阔的商用市场。他们积极与各大电子厂商合作,推广自己的CMOS MEMS谐振器产品。随着技术的不断普及和成本的降低,越来越多的商用电子产品开始采用Discera的谐振器产品,公司的市场份额也逐步扩大。

COTO TECHNOLOGY公司的发展小趣事

近年来,随着全球电子产业的快速发展,中国市场的重要性日益凸显。COTO TECHNOLOGY也看到了这一机遇,开始深耕中国市场,寻求与当地企业的合作。通过与成都迈极芯科技等公司的战略合作,COTO不仅将先进的技术和产品引入中国,还为中国半导体测试产业提供了更优质的产品和服务。这一系列的合作不仅促进了COTO在中国市场的发展,也推动了中国电子产业的进步。

这五个故事只是COTO TECHNOLOGY发展历程中的一部分,但它们充分展示了这家公司在电子行业中的成长与变迁。从初创时期的线圈绕组制造商,到后来的干簧继电器领导者,再到全球范围内的扩张与战略合作,COTO始终保持着对技术的追求和对市场的敏锐洞察。这些故事不仅反映了COTO的发展历程,也见证了整个电子行业的变革与进步。

AEMC Instruments公司的发展小趣事

随着产品的不断完善和升级,AEMC Instruments公司开始积极拓展市场。公司加强与国际市场的合作,通过参加国际展会、建立全球分销商网络等方式,将产品推向全球。同时,公司还积极寻求与国际知名企业的合作,共同研发新产品和技术,以进一步提升产品的竞争力。这些举措不仅扩大了公司的市场份额,也提高了公司的国际知名度。

问答坊 | AI 解惑

管理员可不可以举行一项学习AVR的活动呀

最近看到坛子中有学习51的帖子,而自己一直在为AVR苦恼,所以建议是不是可以也举行一项学习AVR的活动呢??…

查看全部问答>

WinCE 的CAB包管理

小弟,求救! 不知哪位XDJM知道,在手机上安装CAB包前,怎样使它检测磁盘空间,是用哪个打包软件? 还是编写代码? 再就是怎样让用户指定它的安装路径??? 跪求啊 !!! …

查看全部问答>

新手,请教一个pci配置空间的问题

pci的配置实现的具体位置可以是PCI配置空间,io空间或者memory当中 配置的时候有很多的配置寄存器,配置空间在我理解下来是个抽象的概念,而寄存器是一个真实存在的部件,这两者怎么联系到一起呢,这些寄存器在哪里?在控制芯片上?在pci设备上? ...…

查看全部问答>

求懂日语的汽车电子高人~~

哪位高人懂日语?有关于汽车控制的日文论文吗??…

查看全部问答>

大家进来讨论下关于51单片机的端口赋值问题。

以大家熟悉的AT89C51为例,我想在一个机器周期内给P0和P1都赋值。这能达成吗?假设给P0赋值0xff ,给P1赋值0x00。用C语言该怎么编写。昨天和朋友讨论了好久也没结果,去CSDN那边,大家都觉得在一个机器周期内不可能。 我对数组什么的理解都很浅, ...…

查看全部问答>

protues元件库中英文对照表2

初学者整理的东西,可能对新手入门有用…

查看全部问答>

闭环控制

这三天研究了一下PID闭环控制。想法的来源是上次找兼职被秒,所以觉得是得加强一下这方面的训练了。然后就想怎样能用尽可能的器件搭建出一个闭环系统来。后来想到一直在玩的LaunchPad,想用TA定时器产生的PWM来模拟DAC产生一个电压,经过RC滤波, ...…

查看全部问答>

关于传感器选型时频率范围的问题

大家好,求助个问题: 我要选一款用于低频小g值振动测试的加速度传感器,信号频率一般在0.1--5Hz之间,所以我需要关注传感器能正常测试信号的最低频率。 在做市场调研时发现,传统的压电传感器的产品说明会标出“频率范围”。比如FBA-31力平衡式 ...…

查看全部问答>

LPC1114--音乐频谱

本帖最后由 季夏木槿 于 2014-7-28 23:37 编辑 参考资料: [ 本帖最后由 季夏木槿 于 2013-11-9 12:45 编辑 ] …

查看全部问答>