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

订阅(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";

在这里插入图片描述

在这里插入图片描述

发布和订阅消息设置:

//订阅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);

  //连接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();    //关闭端口
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/26bae7ee38b1c47a7c506319eca05f2c.png)

![img](https://img-blog.csdnimg.cn/img_convert/c24bc0da20308435ecc6851c2ddb025e.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/fe32716b005d70cd998f617a5b47aad4.png)

 **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

![img](https://img-blog.csdnimg.cn/img_convert/16d81fd7fc1e345a0549f94720a80e35.png)

![img](https://img-blog.csdnimg.cn/img_convert/d8bec291e45ba14af34d567c470291ba.png)

 

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)**

<img src="https://img-community.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt="img" style="zoom: 67%;" />



# 最后

**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**

**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**

容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)**

<img src="https://img-community.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt="img" style="zoom: 67%;" />



# 最后

**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**

**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**

**[更多资料点击此处获qu!!](https://bbs.csdn.net/topics/618376385)**
  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值