首页 > 其他分享 >STM32之使用MQTT连接阿里云物联网平台

STM32之使用MQTT连接阿里云物联网平台

时间:2023-10-06 17:45:01浏览次数:43  
标签:char wifi 报文 09 STM32 MQTT 65 云物

MQTT阿里云

学习资料:

MQTT介绍

MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。

MQTT报文功能解释(部分)

连接物联网云平台的某个具体设备

报文功能:连接云的某个具体设备
CONNECT:
	固定报头:
			1b:0x10
			2b:??
	可变报头:
			1b:0x00
			2b:0x04
			3b:'M' 0x4D
			4b:'Q' 0x51
			5b:'T' 0x54
			6b:'T' 0x54
			7b:0x04
			8b:0xC2
			9b:0x00
			10:0x3C
	有效负载:
		ClienID_Len(2byte)+CilenID+
		UserName_Len(2byte)+UserName+
		PassWord_Len(2byte)+PassWord
连接报文总览:
10 74 00 04 4D 51 54 54 04 C2 00 3C 00 29 6C 69 5F 74 65 73 74 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C 00 13 6C 69 5F 74 65 73 74 26 61 31 35 4A 32 77 48 75 57 66 75 00 28 39 35 65 32 38 32 32 31 35 30 34 63 37 62 63 35 33 33 35 65 62 65 39 36 31 33 62 34 61 32 65 62 32 61 39 63 66 36 66 37 

向物联网云平台发送消息

报文功能:给云发送消息
报文名:PUBLISH
报文原型:
	固定报头:
			1b:0x30
			2b:0xE4 0x01
	可变报头:
			Topic_Len(2byte)+Topic
	00 32 2F 73 79 73 2F 61 31 35 4A 32 77 48 75 57 66 75 2F 6C 69 5F 74 65 73 74 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74 	
	有效负载:
            纯数据、纯消息(JSON格式数据)
连接报文总览:                
	09 7B 0D 0A 09 09 22 69 64 22 3A 22 32 33 30 37 38 38 30 22 2C 0D 0A 09 09 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 70 61 72 61 6D 73 22 3A 7B 20 20 0D 0A 09 09 09 09 22 43 75 72 72 65 6E 74 48 75 6D 69 64 69 74 79 22 3A 38 30 2C 0D 0A 09 09 09 09 22 43 75 72 72 65 6E 74 54 65 6D 70 65 72 61 74 75 72 65 22 3A 32 36 2C 0D 0A 09 09 09 09 22 52 65 6C 61 79 22 3A 31 0D 0A 09 09 09 7D 2C 0D 0A 09 09 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 22 0D 0A 09 7D 		

订阅主题才能接收到物联网云平台的消息

报文功能:订阅主题 才能接收到云的消息
报文名字:SUBSCRBIE
报文原型:
	固定报头:
            1b:0x82
            2b:??
	可变报头:
            1b:00
            2b:0x0A
	有效负载:
            主题长度(2字节)+主题本身+0

STM32实战演习

阿里云物联网平台设置

  1. 创建产品(你的产品名称--会有你的产品KEY)

    • Topic类列表:

      • 基础通信Topic

      • 物模型通信Topic:我们想要让设备(STM32)中数据上传、数据回收 就要使用到里面的

        属性上报 /sys/Your产品KEY/${deviceName}/thing/event/property/post 发布 设备属性上报

        这个就是我们将STM32采集到的数据上传使用的主题

        要将里面的${deviceName} 改成 (你自己的设备名称),上面的发布意思是 我们具有发布的权限

        属性设置 /sys/Your产品KEY/${deviceName}/thing/service/property/set 订阅 设备属性设置

        这个就是我们可以使用阿里云物联网下发数据使用的主题

        要将里面的${deviceName} 改成 (你自己的设备名称),上面的订阅意思是 我们具有订阅的权限

      • 自定义Topic

    AliYun_Topic

    • 功能定义:这里放置你要上传的STM32的数据

      AliYun_Function

  2. 添加设备 (基于上方创建的产品下--设备名称)

    • 设备信息:MQTT连接信息

      {
          "clientId":"Your clientId",
          "username":"Your username",
          "mqttHostUrl":"iot-06z00f5ugqk5544.mqtt.iothub.aliyuncs.com", 
          "passwd":"Your passwd",
          "port":1883
      }
      
    • 物模型数据:产品中的功能定义上线的功能会在这里出现

      AliYun_EquipmentObjMode

  3. 完成以上两步后,可以先使用MQTT.fx软件实现MQTT连接阿里云,发送的数据格式应该如下

    • {
      	"method" : "thing.event.property.post" ,
      	"id": "162277852",
      	"params" :{
      		"Tem" : 11.0,
      		"Hum" : 22.0
      		},
      	"version" : "1.0.0"
      }
      

      MQTT_fx_Set

    使用MQTT代码连接阿里云

  4. 首先先移植MQTT的库eclipse/paho.mqtt.embedded-c: Paho MQTT C client library for embedded systems. Paho is an Eclipse IoT project (https://iot.eclipse.org/) (github.com)

    • 路径:paho.mqtt.embedded-c-master\MQTTPacket\src

    • 这个src里面的所有.c.h文件都要,然后将他们复制到我们keil的工程文件里面,新建一个MQTT文件夹

    • 文件名 解释
      MQTTConnectClient.c 包含了作为MQTT客户端的连接服务器,断开连接,发送心跳请求的函数
      MQTTConnectServer.c 包含了作为MQTT服务端处理连接请求所需要的函数
      MQTTDeserializePublish.c 包含了解析PUBLISH报文的函数,通俗说就是接收消息用的
      MQTTFormat.c 包含了报文构造函数,被其它文件中的报文构造函数调用,不直接调用里面的函数
      MQTTPacket.c 包含了供其他文件调用的一些解析报文用的函数
      MQTTSerializePublish.c 包含了构造PUBLISH,PUBACK,PUBREC,PUBREL报文的函数,通俗说就是发消息用的
      MQTTSubscribeClient.c 包含了构造SUBSCRIBE报文的函数,发送订阅主题的请求时使用的
      MQTTSubscribeServer.c 包含了解析SUBSCRIBE和构造SUBACK的函数,服务端使用的文件
      MQTTUnsubscribeClient.c 包含了构造UNSUBSCRIBE的函数,发送取消订阅主题的时使用
      MQTTUnsubscribeServer.c 包含了解析UNSUBSCRIBE和构造UNSUBACK报文的函数,服务端使用的文件
  5. 那我们如何使用这个库函数呢?可以参考 他给的库中的代码示例(示例在和src同一级里面的samples中)

  6. 使用代码实现上传到阿里云

    /*ESP8266.c中的代码*/
    
    /**
      * @brief  使用AT指令 WIFI先连接阿里云服务器
      * @param  
      * @retval 
      */
    void Wifi_ConnectAliYun(void)
    {
      if(EspSendCmdAndCheckRecvData("AT\r\n","OK",1000) == 1)
      {
        if(EspSendCmdAndCheckRecvData("AT+CWMODE=1\r\n","OK",1000) == 1)
        {
          if(EspSendCmdAndCheckRecvData("AT+CWJAP=\"Your热点名称\",\"Your 热点密码\"\r\n","OK",10000) == 1)
          {
            if(EspSendCmdAndCheckRecvData("AT+CIPSTART=\"TCP\",\"iot-06z00f5ugqk5544.mqtt.iothub.aliyuncs.com\",1883\r\n","OK",10000)==1)//连接阿里云服务器的网址和端口号都是共用的
            {
              EspSendCmdAndCheckRecvData("AT+CIPMODE=1\r\n","OK",1000);//开启透传
              EspSendCmdAndCheckRecvData("AT+CIPSEND\r\n",">",1000);//发送数据
              MqttConnect();//MQTT开始连接物联网平台 
              
              Delay_ms(100);//连接成功之后  不能立刻执行其他的功能
              //MqttSubscride();只需要订阅一次
              //清空回收的buff
              memset(wifi.rxbuff,0,1024);
              wifi.rxover = 0;     
              wifi.rxcount = 0;         
            }
          }
        }
      }
    }
    /**
      * @brief  使用MQTT连接阿里云物联网平台 -- 平台兼容MQTT协议5.0、3.11、3.1版本 --
      * @param  
      * @retval 
      */
    void MqttConnect(void)
    {
      MQTTPacket_connectData data = MQTTPacket_connectData_initializer;//使用MQTT库函数中的宏定义初始化 data
      
      data.clientID.cstring = "Your clientId";//根据上文中你的ID
      data.username.cstring = "Your username";//你的username
      data.password.cstring = "Your password";//你的密码
      /*下面这个操作就是把data中的数据 构造成可以使用的CONNECT的报文 然后将这个报文 放到wifi.txbuff缓存起来 并返回报文的长度*/
      int len = MQTTSerialize_connect(wifi.txbuff, 1024, &data);
      
      Esp8266_SendString(wifi.txbuff,len);//通过串口发送到ESP8266然后MQTT协议开始和物联网平台对接
      
    }
    
    /*使用到MQTT库函数连接到物联网平台的部分代码--MQTTConnectClient.c*/
    
    #define MQTTPacket_willOptions_initializer { {'M', 'Q', 'T', 'W'}, 0, {NULL, {0, NULL}}, {NULL, {0, NULL}}, 0, 0 }
    /*初始化用到的就是

    标签:char,wifi,报文,09,STM32,MQTT,65,云物
    From: https://www.cnblogs.com/Sakura-Ji/p/17744771.html

相关文章

  • STM32屏幕计时器
    目录一、最终效果二、实现思想三、实现过程3.1屏幕显示3.2中断处理一、最终效果显示屏显示计时时间,格式为00:00:00,依次为时:分:秒,程序运行之后自动计时,当按下按键,计时清零,按下按键采用外部中断。二、实现思想调用lcd驱动代码让屏幕显示时间信息,三、实现过程3.1屏幕显示屏幕......
  • 十九、STM32移植FreeRTOS操作系统
    1.环境安装下载FreeRTOS源码2.移植2.1在STM32项目下创建freertos文件夹,然后在文件夹下创建inc、src、port文件夹2.2将FreeRTOS源码目录下的FreeRTOS/Source/include文件夹下的.h头文件全部复制到STM32项目的freertos/inc文件夹下2.3 将FreeRTOS源码目录下的FreeRTOS/Sourc......
  • STM32之WIFI通信(ESP8266 ESP-01S)
    STM32之WIFI通信(ESP8266ESP-01S)前言本文:使用的是STM32F103C8T6+ESP-01S模块通过采用串口的通信方式来实现WIFI功能ESP8266的介绍ESP8266指的是乐鑫推出的ESP8266EX芯片,用ESP8266EX芯片和FLASH芯片等封装在PCB上、金属屏蔽罩下便得到ESP8266模块。ESP8266EX由乐鑫......
  • FPGA与STM32的区别与联系?如何互联?
    FPGA(现场可编程门阵列)和STM32(意法半导体公司的一个系列的单片机产品)都是数字电路设计中的重要工具,但它们在应用场景、可编程性和开发方式等方面存在显著的区别。首先,FPGA和STM32在应用场景中的区别在于,FPGA适用于处理并发的信号,比如多个方波信号同时输入、输出,这是STM32等单片机难......
  • stm32f103-2023-10-03
    这是当时在“某知道”上自己的一篇原创回答,由于某些原因目前个人在该平台上的所有回答或隐藏或清空了,现经删整之后收纳回本人博客。======================================================================================问题链接:https://zhidao.baidu.com/question/1604602......
  • 【STM32基础 CubeMX】ADC的基础使用
    @TOC前言在嵌入式系统开发中,STM32系列微控制器是广泛应用的一种硬件平台,而STMicroelectronics提供的CubeMX工具则是一款强大的开发工具,能够显著简化STM32微控制器的配置和初始化过程。其中,ADC(模数转换器)是STM32微控制器中一个重要的外设,用于将模拟信号转换为数字信号。本文将介绍AD......
  • 嵌入式开发环境Vscode开发STM32单片机程序
       STM32单片机非常强大,大多数教程都是使用keil编译器,keil是收费的而gcc是开源免费的。这里介绍一些使用gcc+ vscode 开发单片机程序的经验。(这里不解释gcc是什么)。第一:环境准备gccARM开发者官网 https://developer.arm.com/我有个习惯:尽量使用免安装版软件,直接解......
  • STM32之I2C通信
    I2C通信学习资料:江科大-STM32入门教程全面解析I2C通信协议-电子工程专辑爱上半导体-I2C通讯协议前言线与:连接在总线上的设备只要有一个输出低电平(0)总线就为低电平(0),只有全部设备都为高阻态时总线才是高电平(1)I2C简介I2C(InterICBus)是由Philips公司开发的一种通用数据总......
  • STM32 控制一盏灯的亮灭
    #include"stm32f10x.h"//Deviceheaderintmain(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDefGPIO_InitStructure; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//typedefenum//{GPIO_Mode_AIN=0x0,......
  • 操作STM32的GPIO的步骤
    1.使用RCC开启GPIO的时钟2.使用GPIO_Init函数初始化GPIO3.使用输入/输出控制GPIO口RCC在library组中的 stm32f10x_rcc.h中找:(第一个参数是选择哪个外设,第二个参数是EABLE或者DISABLE)voidRCC_AHBPeriphClockCmd(uint32_tRCC_AHBPeriph,FunctionalStateNewStat......