NodeMcu arduino ESP8266 搭建mqtt服务(然也物联)以及使用

news2025/7/7 23:34:30

NodeMcu arduino ESP8266 搭建mqtt服务以及使用

本文章学习借鉴于太极创客团队,以表感谢。官网http://www.taichi-maker.com/
操作步骤:我们注册然也物联平台,申请社区版本,进行测试。


文章目录

  • NodeMcu arduino ESP8266 搭建mqtt服务以及使用
  • MQTT 服务搭建
  • 一、第三方MQTT服务搭建流程
    • 注册平台进行申请服务
    • 物联平台
      • 公共版MQTT服务信息
      • 社区版MQTT服务信息
  • 二、使用步骤
    • 1.引入库


MQTT 服务搭建

当用户使用社区版MQTT服务来发布和订阅信息前,需要首先正确提供用户名和密码信息。如无法正确提供用户密码信息,则服务器将拒绝为用户提供MQTT服务。
个人用户可使用社区版MQTT服务搭建私人物联网项目。


一、第三方MQTT服务搭建流程

MQTT服务可以使用第三方平台,也可以自己搭建一个服务,下面我们就用第三方平台搭建一个服务,过程比较简单,申请即可。

注册平台进行申请服务

然也物联平台入口

第一步注册该平台
在这里插入图片描述

物联平台

公共版MQTT服务信息

此公共版MQTT服务为开放式免费服务。因此本服务主要用于个人学习测试使用。服务器会进行定期进行维护。在维护过程中,本服务将出现短暂不可用情况,且服务器会断开所有设备连接。

然也物联公共版MQTT服务端地址:test.ranye-iot.net
未加密MQTT端口:1883
SSL/TLS加密MQTT端口:8883
WebSocket端口:8080 (然也物联手机应用使用此端口)

社区版MQTT服务信息

社区版MQTT服务是面向个人用户的免费MQTT服务。与公共版MQTT服务不同的是,用户需要注册后方可使用社区版MQTT服务。
社区版MQTT服务中的用户个人主题和信息传输受到用户名和密码保护。即,A用户的个人主题只有A用户可以发布和订阅,其他人不能对该主题进行订阅和发布。

社区版需要申请,进入平台申请即可

在这里插入图片描述

申请通过后,平台会提供许可访问的设备id信息如下图所示

在这里插入图片描述

到这里我们的服务即算是搭建好了。

二、使用步骤

1.引入库

代码如下(示例):

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : ranye_iot_led
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 2021-10-01
程序目的/Purpose          : 
本程序旨在演示如何使用然也物联(www.ranye-iot.net)社区版实现板上LED控制。

-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-application/
***********************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "taichi-maker";
const char* password = "12345678";
const char* mqttServer = "iot.ranye-iot.net";
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

// ****************************************************
// 注意!以下需要用户根据然也物联平台信息进行修改!否则无法工作!
// ****************************************************
const char* mqttUserName = "iotuser_2";         // 服务端连接用户名(需要修改)
const char* mqttPassword = "password";          // 服务端连接密码(需要修改)
const char* clientId = "iotuser_2_id";          // 客户端id (需要修改)
const char* subTopic = "iotuser/led_kz";        // 订阅主题(需要修改)
const char* pubTopic = "iotuser/led_zt";        // 订阅主题(需要修改)
const char* willTopic = "iotuser/led_yz";       // 遗嘱主题名称(需要修改)
// ****************************************************

//遗嘱相关信息
const char* willMsg = "esp8266 offline";        // 遗嘱主题信息
const int willQos = 0;                          // 遗嘱QoS
const int willRetain = false;                   // 遗嘱保留

const int subQoS = 1;            // 客户端订阅主题时使用的QoS级别(截止2020-10-07,仅支持QoS = 1,不支持QoS = 2)
const bool cleanSession = false; // 清除会话(如QoS>0必须要设为false)

bool ledStatus = HIGH;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);          // 设置板上LED引脚为输出模式
  digitalWrite(LED_BUILTIN, ledStatus);  // 启动后关闭板上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重名)
  

  /* 连接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, 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”为开始
    ledStatus = LOW;
    digitalWrite(BUILTIN_LED, ledStatus);  // 则点亮LED。
  } else {
    ledStatus = HIGH;                           
    digitalWrite(BUILTIN_LED, ledStatus); // 否则熄灭LED。
  }

  pubMQTTmsg();
}

// 订阅指定主题
void subscribeTopic(){

  
  // 通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  // 请注意subscribe函数第二个参数数字为QoS级别。这里为QoS = 1
  if(mqttClient.subscribe(subTopic, subQoS)){
    Serial.print("Subscribed Topic: ");
    Serial.println(subTopic);
  } else {
    Serial.print("Subscribe Fail...");
  }  
}

// 发布信息
void pubMQTTmsg(){
  char* pubMessage;
  
  if (ledStatus == LOW){
    pubMessage = "LED ON";
  } else {
    pubMessage = "LED OFF";
  }

  // 实现ESP8266向主题发布信息
  if(mqttClient.publish(pubTopic, pubMessage)){
    Serial.println("Publish Topic:");Serial.println(pubTopic);
    Serial.println("Publish message:");Serial.println(pubMessage);    
  } else {
    Serial.println("Message Publish Failed."); 
  }
}

// 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(""); 
}

注意事项
需要配置下面的信息,每个设备只能设置一个id ,
可以手机端操作,需要下载然也物联手机端 点击下载手机端
即可以完成主题的订阅与发布,

const char* mqttUserName = “iotuser_2”; // 服务端连接用户名(需要修改)
const char* mqttPassword = “password”; // 服务端连接密码(需要修改)
const char* clientId = “iotuser_2_id”; // 客户端id (需要修改)
const char* subTopic = “iotuser/led_kz”; // 订阅主题(需要修改)
const char* pubTopic = “iotuser/led_zt”; // 订阅主题(需要修改)
const char* willTopic = “iotuser/led_yz”; // 遗嘱主题名称(需要修改)


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

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

相关文章

【Python基础篇021】黏包现象丨udp的socket服务

&#x1f320;前言 基于udp的socket服务有什么特点&#xff1f;黏包现象是什么&#xff1f;又是如何产生的&#xff1f;udp和tcp哪种会有黏包现象&#xff1f;看完这篇文章相信你会有所收获。 目录 &#x1f320;一、基于udp的socket服务 &#x1f320;二、TCP中的黏包现象 …

保边滤波之引导滤波与领域转换滤波

&#xff08;1&#xff09;引导滤波 局部窗口内输出图像O和引导图像G成线性关系OiakGibk, ∀i∈Ωk 假设输出图像O和输入图像I之间的关系为OiIi−ni&#xff0c;噪声最小即最小化ni&#xff0c;即 每个像素点i包含于多个窗口Ωk&#xff0c;每个窗口都会得到一个a、b值&#…

RK3399平台开发系列讲解(I/O篇)Linux最大文件数的限制机制

平台内核版本安卓版本RK3399Linux4.4Android7.1🚀返回专栏总目录 文章目录 一、Linux最大文件数的限制机制1.1、申请fd过程分析1.2、申请file内核对象过程分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在Linux上能打开多少个文件,有两种限制: 第一种:进程级…

十、组件(8)

本章概要 递归组件异步更新队列Teleport 10.11.2 递归组件 组件可以在自己的模板中递归调用自身&#xff0c;但这需要使用 name 选项为组件指定一个内部调用的名称。 当调用 Vue.createApp({}).component({})全局注册组件时&#xff0c;这个全局的 ID 会自动设置为该组件的n…

【云原生】Docker的基本使用方法与优势

&#x1f36c;Docker的基本使用方法和优势&#x1f959;一、简介&#x1f96a;二、优势&#x1f32e;三、基本使用&#x1f959;一、简介 Docker是基于Go语言实现的开源应用容器引擎&#xff0c;通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的应…

配置Mysql与注册登录模块

后端职责可以粗浅的理解为处理各种数据&#xff0c;那么处理数据就可以从下面几个方面考虑&#xff1a; 数据的来源 根据不同的数据来源&#xff0c;我们探究两个方面的内容&#xff1a; 数据的形式 数据的操作 当然&#xff0c;一通操作以后&#xff0c;各个…

操作系统:进程与线程大解析

一文就懂进程与线程一、进程/线程相关概念进程中断并发与并行并发并行线程线程分类多进程和多线程上下文进程上下文进程上下文切换的场景线程上下文扩展&#xff1a;协程线程与协程的区别&#xff1a;协程的优势&#xff1a;二、进程/线程区别与关系进程和线程的区别进程和线程…

【C/C++】你知道位段吗?段位?不,是位段!

本章重点 什么是位段&#xff1f; 位段的内存分配 位段的跨平台问题 位段的应用 上一篇文章我详细介绍了第一种自定义类型--结构体。本章节我们认识一下另外一种自定义类型-- 位段。因为讲解位段时需要用到一点结构体的知识&#xff0c;所以我直接把链接放到这里可按需直接…

Swagger

一、Swagger简介 1.1、前言 前后端分离 Vue SpringBoot 当前主流的前后端分离技术栈 后端时代 前端只用管理静态页面&#xff0c;如html&#xff0c;其余的交给后端&#xff0c;而后端通过模板引擎&#xff0c;如jsp进行管理 前后端分离时代 后端&#xff1a;后端控制层&…

jsp健身房会员管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 健身房会员管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;…

S7-200SMART PLC模拟量应用及创建库文件的具体方法

S7-200SMART PLC模拟量应用及创建库文件的具体方法 具体使用方法可参考以下内容: 模拟量计算公式: OUT = (In_chx - In_RawMin) * (In_EuMax - InEuMin) / (In_RawMax -In_RawMin) + In_EuMin 其中: OUT:转换后的实际值; In_chx:模拟量采集值; In_RawMax:原始数据的最大…

小侃设计模式(九)-组合模式

1.概述 组合模式&#xff08;Composite Pattern&#xff09;又叫部分整体模式&#xff0c;它创建了对象组的树形结构&#xff0c;将对象组合成树状结构以表示“整体-部分”的层析关系&#xff0c;使用户对单个对象和组合对象具有一致的访问性&#xff0c;是结构型设计模式的一…

Windows下一键搭建MBP系统,支持多种版本任意选择,免费永久使用,多系统使用新方案

Windows下一键搭建MBP系统,支持多种版本任意选择,免费永久使用,多系统使用新方案。 安装起来相当的简单,简单到只需要执行一行命令即可完成。使得游戏和开发可以兼顾,并且不用花费数万米的可以使用MBP。不仅如此,经过各项专业的测试,还有接近于原生的MBP系统性能。 效…

WinHex(二)

目录 1.我们打开WinHex&#xff0c;点击打开磁盘按钮 2.不同的文件在WinHex中有不同的文件显示 3.WinHex简单使用 4.删除之前所创建的虚拟磁盘 1.我们打开WinHex&#xff0c;点击打开磁盘按钮 2.不同的文件在WinHex中有不同的文件显示 3.WinHex简单使用 4.删除之前所创建的虚拟…

Java—Double类型进行加减乘除出错(精度)问题

前言&#xff1a; 我们知道&#xff0c;计算机在计算数据过程中都要先把源代码翻译成二进制的机器码&#xff0c;然后再进行相关的运算。然而在转换的过程中&#xff0c;有些十进制数无法用一个有限的二进制数来表示&#xff0c;就是说转换的时候出现了精度的丢失问题&#xff…

模型部署遇到的问题

1.不是有效的Win32应用程序 更改项目中的配置类型&#xff1a; 从网上下载的工程&#xff0c;之前人家是用来封装成库&#xff08;dll&#xff09;的&#xff0c;改成exe就好了。 vs学习问题 关于打开程序时不是有效的Win32应用程序_Lay_Nobody的博客-CSDN博客_vs不是有效的wi…

Spring Boot开发之SpringSercurity(续)

Spring Boot开发之SpringSercurity 一、授权1、打开上次项目以及数据库2、有的页面不登录也能访问&#xff0c;比如首页、登录以及注册等&#xff0c;因此对于某些请求不需要登录则放行这些接口(1)修改MySercurityConfig(2)修改TestController类(3)点击运行&#xff0c;在没登录…

数据抓取工具有哪些-数据抓取工具免费推荐的有哪些

随着社会的进步&#xff0c;科技的发展。不管是企业还是个人都清楚地明白了数据的重要性。不仅可以让我们掌握一手资源&#xff0c;同时还能通过数据更清楚竞争对手。同时也告别了手动复制粘贴的痛苦。 企业人员 通过爬取动态网页数据分析客户行为拓展新业务&#xff0c;分析…

java毕业设计健民中医药方网设计(附源码、数据库)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

NC5 二叉树根节点到叶子节点的所有路径和

描述 给定一个二叉树的根节点root&#xff0c;该树的节点值都在数字0−9 之间&#xff0c;每一条从根节点到叶子节点的路径都可以用一个数字表示。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点 2.叶子节点是指没有子节点的节点 3.路径只能从父节点到子节点…