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

这篇具有很好参考价值的文章主要介绍了使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

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

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

一、MQTT理论部分

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

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

关于订阅与发布:

订阅(subscribe)与发布(publish)简称(sub/pub),是MQTT的一种消息范式。
可以把消息的发布者理解为向云端发送数据,在物联网开发中,我们可以将采集到的数据发送(发布)到阿里云服务器,这样后台管理人员就可以通过阿里云服务器查看到实时采集的数据了;
而消息的订阅者,提前对云端数据进行订阅,从而能接收云端发送过来的数据。我举一个订阅的栗子:订阅消息就像是订阅一个微信公众号,我们订阅了一个微信公众后,我们就能持续不断的收到微信公众号的推文。同理,当我们没有订阅微信公众号的时候,我们就不能收到微信公众号的推文。在物联网开发中,一个简单的使用阿里云物联网平台控制led灯的亮灭就是设备提前订阅了数据,然后阿里云下发指令后,设备收到指令进行数据的处理。我们明白了原理,明天我们就能通过阿里云平台来操作工业的设备,比如水闸开闸、设备开机等等。

二、使用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";

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

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

发布和订阅消息设置:

//订阅topoic
const char inTopic[]   = "/sys/k0efkfcSwlt/xxxxx/thing/service/property/set";

//发布topic
const char outTopic[]  = "/sys/k0efkfcSwlt/xxxxx/thing/event/property/post";

使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266),ESP8266 &amp; ESP32 &amp; Arduino,阿里云,数据库,ESP8266,Arduino
使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266),ESP8266 &amp; ESP32 &amp; Arduino,阿里云,数据库,ESP8266,Arduino
发送数据内容如下:

//向主题发送的消息
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"
}

使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266),ESP8266 &amp; ESP32 &amp; Arduino,阿里云,数据库,ESP8266,Arduino
clientId 、username 、passwd 设置如下:

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

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

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

四、参考例程

#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);

  //连接WiFi
  Serial.print("试图连接WiFi: ");
  Serial.println(ssid);
  while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
    // failed, retry
    Serial.print(".");
    delay(5000);
  }

  //WiFi连接成功提示
  Serial.println("WiFi连接成功");
  Serial.println();

  //mqtt连接客户端id
  mqttClient.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);
  }
}

测试效果:
使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266),ESP8266 &amp; ESP32 &amp; Arduino,阿里云,数据库,ESP8266,Arduino

使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266),ESP8266 &amp; ESP32 &amp; Arduino,阿里云,数据库,ESP8266,Arduino文章来源地址https://www.toymoban.com/news/detail-785378.html

到了这里,关于使用ArduinoMqttClient库连接阿里云,并实现发送接收数据(ESP8266)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • "本地连接"有发送无接收数据的解决方法

    1.禁用网卡,然后重新启用,重新启动电脑、插拔网线,看情况是否改善。(备注:用这个办法我也解决了好多这类问题,简单不费时间。) 2.卸载网卡驱动,重新安装网卡驱动,然后分配IP地址。(备注:我曾经给别的企业用这个方法后,也没有解决问题,只好重新安装系统

    2024年02月06日
    浏览(45)
  • 【QT实现TCP数据发送和接收】

    单客户端服务器实现代码: 在.pro文件添加 在头文件中添加 在源文件中添加

    2024年02月11日
    浏览(53)
  • STM32实现三个串口同时开启发送接收数据

            实现STM32开通三个串口,每个串口都可以实现接收和发送数据。          编程时,严禁在中断函数中写入发送串口数据代码,否则会出错,具体原因不清楚(有大佬知道的话帮我指出),可能原因是DR寄存器冲突导致。         RX,TX连接到A9,A10使用串口1,使

    2024年04月13日
    浏览(77)
  • 鸿蒙前后端互联实现接收发送数据+MySQL数据库(简单示例)

    Visual Studio Code mySQL+DBeaver(已连接,具体连接可参考http://t.csdnimg.cn/7U7Oj)另外不用可视化工具DBeaver,可下载vscode插件mysql连接MySQL DevEco Studio 安装(终端运行安装) 直接看代码(python后端代码) 使用flask创建了一个应用实例,包含两个路由,一个用于发送到前端,一个用于接

    2024年04月15日
    浏览(40)
  • QT三驾马车(一)——实现上位机(串口数据发送和接收)

    以后同学们做项目一定会用到QT的三驾马车,QT的三驾马车即QT的串口编程,QT的网络编程和QT的GPIO,今天我们通过一个项目来介绍第一部分,QT的串口编程。 之前看过很多相关的文章,但是按照顺序来编译总是会出错,可是我自己还找不到原因,对于我这种新手小白来说极其

    2024年02月15日
    浏览(46)
  • 实战指南:使用Spring Boot实现消息的发送和接收

    当涉及到消息发送和接收的场景时,可以使用Spring Boot和消息中间件RabbitMQ来实现。下面是一个简单的示例代码,展示了如何在Spring Boot应用程序中创建消息发送者和接收者,并发送和接收一条消息。 首先,你需要进行以下准备工作 确保你已经安装了Java和Maven,并设置好相应

    2024年02月11日
    浏览(54)
  • go内置库函数实现client与server数据的发送接收

    功能:客户端持续写入数据,直到输入exit退出,服务端读取数据并打印 注意:server和client目录在同一层级 server/main client/main go开启协程,数据写入结束向管道输入信号,主线程获取信号,退出。否则主线程运行结束会直接退出

    2024年02月19日
    浏览(38)
  • 【PHP】PHP实现与硬件串口交互,接收硬件发送的实时数据

    目的:借助虚拟串口软件(VSPD)模拟硬件串口发送数据,使用PHP语言实现接收硬件发送的数据。 我这里的需求是连接天平,把天平的称量数据实时的传送到PHP使用。 使用工具:vspd+串口调试工具 使用语言:PHP 使用到的工具有VSPD和串口调试工具,其中VSPD是模拟硬件串口,串

    2024年02月02日
    浏览(35)
  • springboot(java)使用javamail实现邮件的接收、转发、发送、清除

    最近在弄邮件相关的功能,被搞的头大,很多找的方法根本不知道该怎么往下走,就目前为止, 经过各种的碰壁和失败,就整理出来如何使用javamail实现邮件的接收、转发、发送、清除 不单单是分享,也为我后续查找更方便做一个记录 在正式发送邮件之前,我们应该对邮件

    2024年02月04日
    浏览(43)
  • 使用HTTP方式发送请求及json数据的接收和解析

    目录 需求 请求端 1,添加依赖 2,请求对象 3,请求工具类 4,请求测试(事先开启接收端的服务) 接收端 数据请求模拟 本项目需要通过向对端第三方项目发送一个http的post类型的请求,并且指定了一些请求字段,数据传输采用了json,对请求头没有其他特殊要求,所以这里写

    2024年01月17日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包