学习太极创客 — MQTT 第二章(九)本章测试

2023-10-28

程序代码如下,

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : complete_connect
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 20201024
程序目的/Purpose          : 
本程序旨在演示如何使用PubSubClient库连接MQTT服务器的全部参数选项
-----------------------------------------------------------------------
修改记录:
20201227 - 添加了用户名和密码内容(替代原来的NULL)
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "FAST_153C80";
const char* password = "123456798";
const char* mqttServer = "test.ranye-iot.net";
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/
 
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
 
const int subQoS = 1;     // 客户端订阅主题时使用的QoS级别(截止2020-10-07,仅支持QoS = 1,不支持QoS = 2)
const bool cleanSession = false; // 清除会话(如QoS>0必须要设为false)
 
const char* willTopic = "willTopic";    // 遗嘱主题名称
const char* willMsg = "willMsg";        // 遗嘱主题信息
const int willQos = 0;                  // 遗嘱QoS
const int willRetain = false;           // 遗嘱保留
const char* mqttUserName = "test-user"; // 服务端连接用户名
const char* mqttPassword = "ranye-iot"; // 服务端连接密码
 
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // 设置板上LED引脚为输出模式
  digitalWrite(LED_BUILTIN, HIGH);  // 启动后关闭板上LED
  Serial.begin(9600);               // 启动串口通讯
  
  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);
  
  // 连接WiFi
  connectWifi();
  
  // 设置MQTT服务器和端口号
  mqttClient.setServer(mqttServer, 1883);
  mqttClient.setCallback(receiveCallback);
 
  // 连接MQTT服务器
  connectMQTTserver();
}
 
void loop() {
  // 如果开发板未能成功连接服务器,则尝试连接服务器
  if (!mqttClient.connected()) {
    connectMQTTserver();
  }
 
   // 处理信息以及心跳
   mqttClient.loop();
   
}
 
// 连接MQTT服务器并订阅信息
void connectMQTTserver(){
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  String clientId = "client-" + WiFi.macAddress();
 
  /* 连接MQTT服务器
  boolean connect(const char* id, const char* user, 
                  const char* pass, const char* willTopic, 
                  uint8_t willQos, boolean willRetain, 
                  const char* willMessage, boolean cleanSession); 
  若让设备在离线时仍然能够让qos1工作,则connect时的cleanSession需要设置为false                
                  */
  if (mqttClient.connect(clientId.c_str(), mqttUserName, 
                         mqttPassword, willTopic, 
                         willQos, willRetain, willMsg, cleanSession)) { 
    Serial.print("MQTT Server Connected. ClientId: ");
    Serial.println(clientId);
    Serial.print("MQTT Server: ");
    Serial.println(mqttServer);    
    
    subscribeTopic(); // 订阅指定主题
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(5000);
  }   
}
 
// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message Received [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println("");
  Serial.print("Message Length(Bytes) ");
  Serial.println(length);
 
  if ((char)payload[0] == '1') {     // 如果收到的信息以“1”为开始
    digitalWrite(BUILTIN_LED, LOW);  // 则点亮LED。
  } else {                           
    digitalWrite(BUILTIN_LED, HIGH); // 否则熄灭LED。
  }
}
 
// 订阅指定主题
void subscribeTopic(){
  // 建立订阅主题。主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址。
  // 这么做是为确保不同设备使用同一个MQTT服务器测试消息订阅时,所订阅的主题名称不同
  String topicString = "test-user/Pub-" + WiFi.macAddress();
  char subTopic[topicString.length() + 1];  
  strcpy(subTopic, topicString.c_str());
  
  // 通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  // 请注意subscribe函数第二个参数数字为QoS级别。这里为QoS = 1
  if(mqttClient.subscribe(subTopic, subQoS)){
    Serial.print("Subscribed Topic: ");
    Serial.println(subTopic);
  } else {
    Serial.print("Subscribe Fail...");
  }  
}
 
// ESP8266连接wifi
void connectWifi(){
 
  WiFi.begin(ssid, password);
 
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");  
  Serial.println(""); 
}

上电后,程序输出如下,
在这里插入图片描述

然后,操作 MQTT.fx 这个软件。

1、由于是这里客户端(ESP8266 开发板)是订阅者,而不是向上一节一样是发布者,所以在操作 MQTT.fx 这个软件来连接 MQTT 服务器时并不需要设置用户名和密码(具体原因是在服务器端没有设置订阅用户的权限)。

在这里插入图片描述

当通过软件发布消息时, ESP8266 (订阅者)接收到以 1 开头的消息后,会点亮 LED灯,其他消息则熄灭 LED 灯。

在这里插入图片描述

同时,会通过串口监视器输出信息。

在这里插入图片描述

上述测试还涉及到一个问题就是质量降级的问题(因为我发布的时候是用 QoS = 0 发布的)。

下面,将以 QoS = 1 (需要注意程序中对 QoS=1 的设置要求)进行消息发布的测试(与前面章节测试方法一致,将 ESP8266 断开电源后,通过 MQTT.fx 软件向主题发布消息,之后将 ESP8266 重新连接电源)。

在这里插入图片描述

ESP8266 开发板重新启动后,可以立刻接收到消息。

在这里插入图片描述
还有个问题就是,这个程序并没有涉及到发布或订阅遗嘱信息的内容(因为 ESP8266 开发板只是作为订阅者),这里的遗嘱相关的变量只是作为连接函数 connect 的参数使用而已。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习太极创客 — MQTT 第二章(九)本章测试 的相关文章

  • 普冉32位单片机 PY32C642,M0+内核,1.7 V ~ 5.5 V宽工作电压

    PY32C642 单片机采用高性能的 32 位 ARM Cortex M0 内核 宽电压工作范围 嵌入 24Kbytes Flash 和 3 Kbytes SRAM 存储器 最高工作频率 24 MHz 包含多种不同封装类型产品 工作温度范围
  • 龙芯+RT-Thread+LVGL实战笔记(28)——电子琴准备工作

    写在前面 临近期末 笔者工作繁忙 因此本系列教程的更新频率有所放缓 还望订阅本专栏的朋友理解 请勿催更 笔者在此也简要声明几点 有些硬件模块笔者并没有 如LED点阵 压力传感模块 RFID模块等 因此这些模块的相关任务暂时无法给出经过验证的
  • 实时获取建材网商品数据:API实现详解与代码示例

    一 引言 随着电子商务的快速发展 实时获取商品数据对于企业决策 市场分析以及数据驱动的营销策略至关重要 建材网作为国内知名的建材信息平台 提供了API接口 使得第三方开发者可以方便地获取商品数据 本文将详细介绍如何使用 建材网的API接口
  • 为什么这么多人自学黑客,但没过多久就放弃了(掌握正确的网络安全学习路线很重要)

    网络安全是一个 不断发展和演变 的领域 以下是一个 网络安全学习路线规划 旨在帮助初学者快速入门和提高自己的技能 基础知识 网络安全的 基础知识 包括 网络结构 操作系统 编程语言 等方面的知识 学习这些基础知识对理解网络安全的原理和技术至
  • 网络安全从入门到精通(超详细)学习路线

    首先看一下学网络安全有什么好处 1 可以学习计算机方面的知识 在正式学习网络安全之前是一定要学习计算机基础知识的 只要把网络安全认真的学透了 那么计算机基础知识是没有任何问题的 操作系统 网络架构 网站容器 数据库 前端后端等等 可以说不想
  • 通过一个寒假能学会黑客技术吗?看完你就知道了

    一个寒假能成为黑客吗 资深白帽子来告诉你 如果你想的是学完去美国五角大楼内网随意溜达几圈 想顺走一点机密文件的话 劝你还是趁早放弃 但是成为一名初级黑客还是绰绰有余的 你只需要掌握好渗透测试 Web安全 数据库 搞懂web安全防护 SQL注
  • 会stm32有机会进大公司吗?

    今日话题 会stm32有机会进大公司吗 我本科期间参与了飞思卡尔和电赛等比赛 使用过多种单片机 但渐渐发现单片机只是其中的一小部分 不要过分迷恋所谓的单片机基础和技巧 更值得深入研究的是C语言 如果你对此感兴趣 我愿意无偿分享一个资源包 其
  • Java 学习路线 2024 最新版!

    又对上次分享的 Java 学习路线进行了简单修改完善 并增加了免登录下载和黑夜模式 这里重发一下 花了一个月零碎的时间 我根据当下 Java 后端求职和招聘的最新要求 对之前写的 Java 后端学习路线进行了全面的优化和改进 添加图片注释
  • 深入浅出《Delta-Sigma Data Converters》(可下载)

    在数字信号处理领域 数据转换器是实现模拟与数字世界之间无缝转换的关键组件 而在这个子领域中 Delta Sigma Data Converter s 一书以其全面和深入的内容 为工程师 学者甚至爱好者们提供了一个极其宝贵的资源 今天将为大家
  • 太阳诱电 | 陶瓷电容器的静电容量相关

    陶瓷电容器的静电容量会因温度而变化吗 电容器的静电容量的温度特性是什么 陶瓷电容器的静电容量随周围的温度而变化 静电容量因温度而变化的现象 称为静电容量的温度特性 这是由于陶瓷电容器使用的材料造成的 也是所有陶瓷电容的常有现象 以下是本公司
  • 小白也能学会的创建Git仓库实操

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 2k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • SRC漏洞挖掘经验+技巧篇

    一 漏洞挖掘的前期 信息收集 虽然是前期 但是却是我认为最重要的一部分 很多人挖洞的时候说不知道如何入手 其实挖洞就是信息收集 常规owasp top 10 逻辑漏洞 重要的可能就是思路猥琐一点 这些漏洞的测试方法本身不是特别复杂 一般混迹
  • python基础语法看一篇就够了,全网最全python语法笔记汇总

    前言 Python 是一种代表简单思想的语言 其语法相对简单 很容易上手 不过 如果就此小视 Python 语法的精妙和深邃 那就大错特错了 如能在实战中融会贯通 灵活使用 必将使代码更为精炼 高效 同时也会极大提升代码B格 使之看上去更老
  • 白帽子如何快速挖到人生的第一个漏洞 | 购物站点挖掘商城漏洞

    本文针对人群 很多朋友们接触安全都是通过书籍 网上流传的PDF 亦或是通过论坛里的文章 但可能经过了这样一段时间的学习 了解了一些常见漏洞的原理之后 对于漏洞挖掘还不是很清楚 甚至不明白如何下手 可能你通过 sql labs 初步掌握了sq
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 网络安全(黑客)自学

    1 网络安全是什么 网络安全可以基于攻击和防御视角来分类 我们经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 2 网络安全市场 一 是市场需求量高 二 则是发展相对成熟入门比较容易 3 所需要的
  • 新画图不好用?『 图层困扰?』『 剪切板拷贝失败?』旧版画图软件yyds

    樊梓慕 个人主页 个人专栏 C语言
  • 手把手教你使用HarmonyOS本地模拟器

    我们通过下面的动图来回顾下手机本地模拟器的使用效果 本期 我们将为大家介绍HarmonyOS本地模拟器的版本演进 并手把手教大家使用HarmonyOS本地模拟器 一 本地模拟器的版本演进 2021年12月31日 经过一个版本的迭代优化 随D
  • 【学习分享】全志平台TWI子系统源码分析(1)从设备树到寄存器

    全志平台TWI子系统源码分析 1 从设备树到寄存器 前言 一 名词解释 二 从设备树入手看源码 1 TWI设备树 2 TWI源码位置 3 TWI总线相关寄存器 总结 前言 这次开坑主要是想把全志平台TWI子系统在源

随机推荐

  • 基于ensp的中大型企业网络安全解决方案的设计与实施

    一 需求背景 公司部门具体背景 公司共设有人事部 财务部 销售部 市场部四个部门以及一个员工宿舍楼 公司有对外互联网业务需要提供 公司内存在重要部门需要保护数据安全以及访问控制 1 根据客户需求 部门 拓扑 划分vlan及子网 2 使用合理
  • 刷脸支付成了不少商家抗衡疫情冲击的利器

    凭借高科技支付方式出圈的刷脸支付 高效便捷只是它诸多优势之一 在众多优势中 有一个优势无法被其他事物所替代 这也是刷脸支付备受青睐的主要原因助力线下行业实现智慧经营 存在物就像是奔腾不息的河流 事物处于不断变化之中 面对每一刻的崭新 无人可
  • Ubuntu14.04 更换内核重启出现:Missing Modules

    1 前言 最近由于实验的需要 需要更换Linux系统的内核 我的系统是Ubuntu14 04 内核版本时3 19 由于实验的平台需要内核版本3 14 0 只好将Ubuntu14 04的内核从3 19降级到3 14 0 在编译安装之后 运行命
  • Vue中数组赋值问题

    出现的问题 昨天工作内遇到的问题 用输入arrList渲染了一个表格 修改了arrList 然而列表没有改变 Vue 不是双向绑定吗 怎么回事 what s fuck 值变了 列表没有变 测试代码 Vue中列表渲染的数据是这样的 单价和数量
  • 详解 Windows 10 安装 CUDA 和 CUDNN

    目录 查看本机 Window 10 系统已经安装 NIVIDIA 的驱动版本 说在前面 查看驱动版本 CUDA 下载 直接下载最新的 CUDA 下载历史版本的 CUDA 安装 测试 CUDNN 下载 下载最新版本的 cuDNN 下载历史版本
  • linux 多线程 pthread_cond_wait(&cond,&mutex)理解

    pthread cond wait 用于阻塞一个线程 知道有信号唤醒它 下面是一个简单的例子 我们可以从程序的运行来了解条件变量的作用 pthread cond wait c include
  • js逆向之有道词js加密解析

    js逆向之有道词js加密解析 文章目录 js逆向之有道词js加密解析 需要用到的工具 下面就介绍一下3种看js加密的代码方法 第一种方法 第二种 第三种 下面我们来了解我们要用什么解密md5 下面做一个js加密解析十分适合上手的 有道词典的
  • Unity 抠图 shader

    Created by Oliver Davies Enjoy oliver psyfer io Shader Unlit ChromaKey Properties MainTex Texture 2D white KeyColor KeyC
  • 基于阿里云ECS服务器搭建k8s集群

    此处仅有两台服务器 一台master节点 一台node节点 后期可按照步骤继续增加node节点 1 搭建环境 Master节点 CPU 2核 内存 2GiB 操作系统 Centos7 6 64位 带宽 1Mbps 服务器公网IP 私有IP
  • JDBC在IDEA中配置mysql过程及编程详解

    目录 jdbc编程简介 1 导入jar包 2 建立数据库连接 2 1 创建数据源 描述数据库服务器在哪 2 2 实现一个mysql客户端 通过网络和服务器进行通信 3 使用代码操作数据库 3 1 增删改操作 增加操作 更新操作 删除操作 3
  • 【论文阅读】Contiual learning with hypernetwork

    文章目录 论文阅读 2019 Contiual learning with hypernetwork 1 超网络简介 2 论文的总体介绍 3 相关的介绍 3 1 一些数学符号 3 2 继续学习从模型角度的理解 4 论文将超网络继续学习模型分
  • 0-1背包问题--动态规划解法

    问题描述 给定n种物品和一背包 物品i的重量是wi 其价值为vi 背包的容量为C 问应如何选择装入背包的物品 物品不能分割 使得装入背包中物品的总价值最大 抽象描述如下 x n 表示物品的选择 x i 1表示选择放进物品i到背包中 问题分析
  • CSS学习--css的由来(1)

    一 什么是css 1 css Cascading Style Sheets 层叠样式表 级联样式表 2 css 是控制HTML文档内容的排版 二 css解决了什么问题 以前网页的元素的样式 全部是依靠标签属性来控制 比如 h1 align
  • 基于C++与CUDA的N卡GPU并行程序——OpenGL图形互操作性

    图形互操作性的极简框架示例 GPU的成功要归功于它能实时计算复杂的渲染任务 同时系统的其他部分还可以执行其他的任务 这就带来了一个显而易见的问题 能否在同一个应用程序中GPU既执行渲染计算 又执行通用计算 如果要渲染的图像依赖通用计算的结果
  • KVM重定向PCI

    应用场景 将服务器上的USB控制器 重定向到KVM中 一 修改KVM的配置文件 1 查看KVM的xml配置文件 KVM的配置文件存放在 etc libvirt qemu目录下 使用vi进行编辑 下面的这个KVM是重定向了一个PIC控制器 添
  • Windows平台Java开发环境的搭建

    下载安装JDK 首先到oracle的jdk下载页面 下载jdk jdk建议使用最新的jdk8 根据系统版本选择32位或者64位的 下载完成之后点击安装 安装位置随意 但是必须记住 一会配置环境变量的时候会用到 配置环境变量 安装完成之后就可
  • ubuntu 16.04 安装ssh失败,原因竟然是自带的openssh-client版本造成的

    ubuntu 16 04默认安装上了最新的openssh client 可以连接其他计算机上的ssh服务 而没有安装openssh server服务端 允许其他计算机通过ssh访问和操作计算机 如 xshell等工具 openssh ser
  • 题海战 C++ STL set应用

    目录 题目描述 思路分析 代码 题目描述 某信息学奥赛教练经验丰富 他的内部题库有 m 道题 他有 n 个学生 第 i 个学生已经做过p i 道题 由于马上要进行noip考试 该教练准备举行 k 场比赛和训练 每场比赛或训练都会有一些他的学
  • STM32堆和栈及变量的存储理解

    STM32堆和栈及变量的存储理解 转至 https blog csdn net shaynerain article details 71952754 关于堆和栈已经是程序员的一个月经话题 大部分有是基于os层来聊的 那么 在赤裸裸的单片机
  • 学习太极创客 — MQTT 第二章(九)本章测试

    程序代码如下 项目名称 Project 零基础入门学用物联网 程序名称 Program name complete connect 团队 Team 太极创客团队 Taichi Maker www taichi maker com 作者 Au