使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266)

文章目录

  • 引言
  • 一、MQTT理论部分
  • 二、使用MQTT.fx接入物联网设备
  • 三、使用ESP8266连接阿里云
  • 四、参考例程

引言

阿里云物联网平台的接入方式有很多种,从阿里云提供的开发文档可以看到,支持的接入协议有MQTT、HTTPS、CoAP、JT/808、GB/32960协议等等,并支持多种类型的设备接入。
在这里插入图片描述
在这里插入图片描述
对于阿里云物联网平台的接入,网上有许许多多的教程,有亲测有效的,表示感谢;也些教程留了有一些bug,让人找好几天都找不出来的。总之,各有千秋。
其实,网上许许多多的教程都是参考官方的连接文档,包括我写的这一篇文章,CSDN这个平台给了我一个总结知识,分享技术的一个地方,我不过是一个小小的搬运工。
在阿里云操作过程中遇到问题,还可以提交工单,有阿里云的工程师一对一进行技术答疑。当然,官方得文档讲解了比较多的理论知识点,阅读起来需要一些互联网基础和编程功底,有官方文档阅读起来困难的同学,说明这方面到知识是存在断层的,建议去自行补充一下相关基础,学会阅读官方得文档也是物联网学习很重要的一门课程。
我们今天连接的是阿里云的平台,如果掌握这种方法后,以后连接腾讯云、点灯科技那也是手到擒来。
我提供一下:
阿里云物联网平台产品手册
在这里插入图片描述

为了让更多的人掌握阿里云的技术,官方还专门录制的相关的教程,在阿里云还可以申请一些认证,如果求职就业中遇到使用阿里云平台的企业来说,在众多求职者中,拥有官方认证的技术认证很容易脱颖而出,没有的话也是学习能力的一种体现。
我把教程的网站提供一下:
阿里云物联网培训
在这里插入图片描述
我之前写过一篇文章是使用AliyunIoTSDK库,有一个弊端:AliyunIoTSDK库只支持设备连接阿里云平台,连接平台比较单一,而市场上物联网平台以比比皆是,我们要连接阿里云平台中找到一个方法,方便我们以后连接其它的平台。
算是搞技术的一种深究的精神吧,如果单单只会一种平台的连接,并不能说明掌握这项技术,把连接的各个参数彻底搞明白,那才叫这么技术学透了,学到家了。
附上AliyunIoTSDK的连接:
Arduino ESP8266&ESP32使用AliyunIoTSDK.h连接阿里云物联网平台

一、MQTT理论部分

MQTT(消息队列遥测传输)是一种与HTTP相似的应用层协议,是一种轻量级、以数据为中心,机器对机器的通信。它的设计目的是在低带宽和不稳定的网络环境下实现设备的相互通信,研发最初是为了解决石油天然气行业的传感器,通过卫星与远程服务器连接的问题。相比HTTP,它并不是为物联网设备而设计的,它是一种重量级的协议,需要较高带宽的网络环境下才能正常工作,而物联网设备一般都是低功耗设备,它们的带宽和网络连接质量都比较有限,因此MQTT不仅能满足这些设备的需求,还是一种非常经济的通信方式。

详细的MQTT可以查阅官方文档:
MQTT协议中文版

二、使用MQTT.fx接入物联网设备

MQTT.fx是一个多平台的MQTT协议客户端,可以把它想象成一个虚拟的设备,在进行设备连接之前,可以使用MQTT.fx来测试连接是否正常。阿里云文档有相关的教程说明:阿里云物联网平台文档-使用MQTT.fx接入物联网平台

MQTT.fx会不定期更新,我最近使用最新版本的需要License,可以申请免费使用三个月,我目前使用的是1.7.1版本的做测试,总的来说,照着阿里云的教程一步步做都能完成连接。

三、使用ESP8266连接阿里云

编写代码之前需要安装3个库:<ArduinoMqttClient.h>、<ESP8266WiFi.h>、<ArduinoJson.h>
我这里编写了一个发送数据和通过阿里云平台控制LED灯的例程供大家参考,大家注意一下WiFi账号密码、发布和订阅的topoic、接入域名、客户端id、连接用户名密码的设置。

接入域名设置:

//MQTT接入域名
//以阿里云为例:a1***.iot-as-mqtt.cn-shanghai.aliyuncs.com
//a1*** 为产品的ProductKey
//cn-shanghai 为所在地域
const char broker[] = "xxxxxx.iot-as-mqtt.cn-shanghai.aliyuncs.com";

在这里插入图片描述

在这里插入图片描述

发布和订阅消息设置:

//订阅topoic
const char inTopic[]   = "/sys/k0efkfcSwlt/xxxxx/thing/service/property/set";//发布topic
const char outTopic[]  = "/sys/k0efkfcSwlt/xxxxx/thing/event/property/post";

在这里插入图片描述
在这里插入图片描述
发送数据内容如下:

//向主题发送的消息
String payload = "{\"params\": {\"temperature\": 30.5},\"version\": \"1.0\"}";

参考官方数据格式如下,在发送数据时id和version可以省略:

{"id": "123","version": "1.0","params": {"temperature": "30.5"},"method": "thing.service.property.set"
}

在这里插入图片描述
clientId 、username 、passwd 设置如下:

String clientId = "k0efkfcSwlt.xxxx|securemode=2,signmethod=hmacsha256,timestamp=1704798527190|";
String username = "xxxxx";
String passwd = "xxxxxx";

在这里插入图片描述

在这里插入图片描述

四、参考例程

#include <ArduinoMqttClient.h>
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>//WIFI设置信息------------------------------------------------------------------------
// WIFI名称
char ssid[] = "CMCC-H3qz";// WIFI密码
char pass[] = "7xf47uxf";
//-----------------------------------------------------------------------------------//mqtt设置信息-------------------------------------------------------------------------
//定义mqtt客户端对象
WiFiClient wifiClient;            //创建网络连接客户端
MqttClient mqttClient(wifiClient);//通过网络客户端连接创建mqtt连接客户端//MQTT接入域名
//以阿里云为例:a1***.iot-as-mqtt.cn-shanghai.aliyuncs.com
//a1*** 为产品的ProductKey
//cn-shanghai 为所在地域
const char broker[] = "xxxxxxx.iot-as-mqtt.cn-shanghai.aliyuncs.com";//端口号
int        port        = 1883;//订阅topoic
const char inTopic[]   = "/sys/xxxxxx/xxxxxx/thing/service/property/set";//发布topic
const char outTopic[]  = "/sys/xxxxx/xxxxx/thing/event/property/post";//向主题发送的消息
String payload = "{\"params\": {\"temperature\": 30.5},\"version\": \"1.0\"}";String clientId = "xxxxxxx.xxxxxx|securemode=2,signmethod=hmacsha256,timestamp=1704798527190|";String username = "xxxxxxx";
String passwd = "xxxxxxxx";
//----------------------------------------------------------------------------------------------
//创建一个json文档对象
StaticJsonDocument<1024> doc;
//----------------------------------------------------------------------------------------------void setup() {//串口初始化Serial.begin(9600);// initialize digital pin LED_BUILTIN as an output.pinMode(LED_BUILTIN, OUTPUT);//连接WiFiSerial.print("试图连接WiFi: ");Serial.println(ssid);while (WiFi.begin(ssid, pass) != WL_CONNECTED) {// failed, retrySerial.print(".");delay(5000);}//WiFi连接成功提示Serial.println("WiFi连接成功");Serial.println();//mqtt连接客户端idmqttClient.setId(clientId);//mqtt 连接用户名、密码mqttClient.setUsernamePassword(username, passwd);//mqtt连接提示,打印连接地址Serial.print("试图连接mqtt服务器: ");Serial.println(broker);//连接mqtt服务器if (!mqttClient.connect(broker, port)) {Serial.print("MQTT 服务器连接失败,错误代码 = ");Serial.println(mqttClient.connectError());while (1);}//连接mqtt服务器成功提示Serial.println("成功连接mqtt服务器!");Serial.println();// 设置消息接收回调mqttClient.onMessage(onMqttMessage);//打印订阅主题信息Serial.print("订阅主题为:: ");Serial.println(inTopic);Serial.println();//mqtt订阅主题mqttClient.subscribe(inTopic);
}void loop() {//轮询操作,mqtt客户端监听//定期调用poll()确保MQTT信息接收正常mqttClient.poll();Serial.print("向主题发送消息: ");Serial.println(outTopic);Serial.println(payload);Serial.println();mqttClient.beginMessage(outTopic, payload.length(), false, 1, false);//构建消息端口mqttClient.print(payload);  //发送消息mqttClient.endMessage();    //关闭端口delay(1000);delay(1000);delay(1000);
}void onMqttMessage(int messageSize) {//将接收到的json数据转存储到数组里char ch_mqtt[messageSize];for(int i=0; i<messageSize;  i++){ch_mqtt[i] = mqttClient.read();}//打印接收到的数据大小Serial.print("收到的数据大小为:messageSize=");Serial.print(messageSize);Serial.println();//打印转换后的数组内容Serial.print("接收的内容为ch[messageSize]=");Serial.print(ch_mqtt);Serial.println();//解析json数据deserializeJson(doc, ch_mqtt);//将LEDSwitch进行赋值bool led = doc["params"]["LEDSwitch"];Serial.print("led=");Serial.print(led);Serial.println();//led灯控制命令if(led == 1){//开灯Serial.println("LED_ON");Serial.println();digitalWrite(LED_BUILTIN, LOW);}else if(led == 0){//关灯Serial.println("LED_OFF");Serial.println();digitalWrite(LED_BUILTIN, HIGH);}
}

测试效果:
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库悲观锁 select for update的详解

一 作用 1.1 结论 在mysql中&#xff0c;select ... for update 仅适用于InnoDB&#xff0c;且必须在事务块中才能生效。Innodb引擎默认是行锁。 Select .... from where .... for update 如果在where的查询条件字段使用了【主键|索引】&#xff0c;则此命令上行锁。否…

2024,传统鞋服的“高端梦”该醒了

文 | 螳螂观察 作者 | 图霖 “一千块都不要的波司登&#xff0c;宝贝们还不冲吗&#xff1f;” 入夜&#xff0c;一位身着羽绒服的美女主播在灯火通明的直播间正声嘶力竭地反复呐喊。 一群不知是托还是真实消费者的用户在评论区敲出自己的身高体重&#xff0c;想从主播那得…

【计算机组成原理】IEEE 754 标准定义的浮点数表示格式

IEEE 754 IEEE 754是一种由美国电气和电子工程师协会&#xff08;IEEE&#xff09;制定的标准&#xff0c;用于定义浮点数的表示和运算。这个标准定义了浮点数的格式、舍入规则、特殊值的处理以及算术操作的执行方式。 IEEE 754浮点数标准主要定义了两种浮点数格式&#xff1…

基于LVGL编写的windows串口工具: LCOM

LCOM: Serial Port Tools based on LVGL (PC Software) 一直以来我都想用LVGL做一个真正意义上的PC软件&#xff0c;来验证或者表达LVGL出色的特性&#xff0c;现在我用LCOM做到了&#xff01; LCOM 是一个基于LVGL编写的串口工具&#xff0c;界面简洁&#xff0c;功能出色&a…

Javaweb之SpringBootWeb案例查询部门以及前后端联调的详细解析

2.1 查询部门 2.1.1 原型和需求 查询的部门的信息&#xff1a;部门ID、部门名称、修改时间 通过页面原型以及需求描述&#xff0c;我们可以看到&#xff0c;部门查询&#xff0c;是不需要考虑分页操作的。 2.1.2 接口文档 部门列表查询 基本信息 请求路径&#xff1a;/depts …

Github项目推荐-Insomnia

项目地址 GitHub地址&#xff1a;GitHub - Kong/insomnia 官网&#xff1a;The Collaborative API Development Platform - Insomnia 项目简述 想必大家都知道PostMan吧。Insomnia可以说是PostMan的开源平替。页面ui很不错&#xff0c;功能强大&#xff0c;使用也比较方便。…

Matlab 字符识别OCR实验

Matlab 字符识别实验 图像来源于屏幕截图&#xff0c;要求黑底白字。数据来源是任意二进制文件&#xff0c;内容以16进制打印输出&#xff0c;0-9a-f’字符被16个可打印字符替代&#xff0c;这些替代字符经过挑选&#xff0c;使其相对容易被识别。 第一步进行线分割和字符分割…

C++设计模式-- 2.代理模式

文章目录 代理模式 代理模式 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合 或不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式有以下三种角色&…

ES分词器

Analysis&#xff1a;文本分析是把全文本转换一系列单词的过程&#xff0c;也叫分词。Analysis是通过Analyzer(分词器)来实现的。 1.Analyzer组成 注意&#xff1a;在ES中默认使用标准分词器&#xff1a;StandardAnalyzer。特点是&#xff1a;中文是单字分词&#xff0c;英文是…

解锁加密经济领域的新篇章:Token Explorer 助您一臂之力

随着全球加密货币的普及&#xff0c;市场变化对于想要优化回报的投资者来说是一个挑战。碎片化的数据是一个问题&#xff0c;但是像 Footprint Analytics 的 Token Explorer 这样的创新解决方案&#xff0c;可以提供必要的加密经济生态聚类智能&#xff0c;帮助改善投资组合。 …

AOT-GAN-for-Inpainting项目解读|使用AOT-GAN进行图像修复

项目地址&#xff1a; https://github.com/researchmm/AOT-GAN-for-Inpainting 基于pytorch实现 论文地址&#xff1a; https://arxiv.org/abs/2104.01431 开源时间&#xff1a; 2021年 项目简介&#xff1a; AOT-GAN-for-Inpainting是一个开源的图像修复项目&#xff0c;其对 …

打铁需要自身硬,我敢和欧系谬论硬刚源自实力与信心

我揭露欧系数学荒谬的目的是驱逐纯粹数学出中国&#xff0c;以恢复中华数学体系、最终让中华数学领导世界&#xff1b;我从来不隐瞒自己的“野心”&#xff0c;我对此有着绝对的信心。民族情怀是中国数学人的短板 纯粹数学是欧洲人的文化、是欧系数学的主体&#xff0c;它的历…

小白进公司快速熟悉环境和代码的方法

1.企业开发模式 企业开发模式里&#xff0c;我们的项目模块可能非常多此时我们是不能将所有模块都拉取到本地的&#xff0c;主要原因如下&#xff1a; 我们很可能并没有全部工程代码的权限 微服务集群部署非常复杂&#xff0c;本地部署成本太高 微服务模块众多&#xff0c;本…

边缘计算AI智能分析网关V4算力分析及应用场景

一、硬件介绍 智能分析网关V4是TSINGSEE青犀视频推出的一款高性能、低功耗的软硬一体AI边缘计算硬件设备&#xff0c;硬件采用BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz。硬件内置近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、…

适用于 Windows 的 12 个最佳免费磁盘分区管理器软件

分区是与其他部分分开的硬盘驱动器部分。它使您能够将硬盘划分为不同的逻辑部分。分区软件是一种工具&#xff0c;可帮助您执行基本选项&#xff0c;例如创建、调整大小和删除物理磁盘的分区。许多此类程序允许您更改磁盘片的标签以便于识别数据。 适用于 Windows 的 12 个最佳…

Defi安全--Zunami Protocol攻击事件分析

其它相关内容可见个人主页 1 Zunami攻击事件相关信息 2023.8.13发生在Ethereum上发生的攻击&#xff0c;存在两个攻击交易&#xff0c;具体信息如下&#xff1a; 攻击合约地址&#xff1a;Contract Address 攻击合约 攻击者地址&#xff1a;Zunami Protocol Exploiter 攻击…

Archlinux下自启动rclone mount

路径&#xff1a; /etc/systemd/system/rclonemount.service [Unit] Descriptionrclonemount Requiresnetwork-online.target.wants Afteralist.service[Service] Typesimple ExecStartPre/bin/mkdir -p /media ExecStart/usr/bin/rclone mount \aliyun: /media \--config /ro…

python如何安装numpy

1. 根据python版本下载相应版本的numpy保存至D:\Program Files (x86)\Python\Python37\Scripts\ numpy下载地址 2. winR&#xff0c;输入cmd&#xff0c;打开命令行窗口&#xff0c;定位到python的安装目录 3. 输入python -m pip install numpy或定位到目录&#xff1a;D:\P…

【Linux】Linux系统编程——ls命令

【Linux】Linux 系统编程——ls 命令 1.命令概述 ls 命令是 Linux 和其他类 Unix 操作系统中最常用的命令之一。ls 命令是英文单词 list 的缩写&#xff0c;正如 list 的意思&#xff0c;ls 命令用于列出文件系统中的文件和目录。使用此命令&#xff0c;用户可以查看目录中的…

代码随想录 516. 最长回文子序列

题目 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s “bbbab” 输出&…