一、前言
今天给大家带来的是ESP32系列联网教程,因为是使用Arduino开发,Arduino有很多库函数可以让我们直接使用,可谓是站在巨人的肩膀上乘凉。当然网上教程一抹多,我也只是其中之一,只是给大家提供一写思路和我实践出来的方法,给大家避避雷。
二、云平台
平台选择的话有很多哟,腾讯,阿里云,移动云甚至EMQX自己去搭建一个,这里我就选择一个我常用的平台,阿里云作为这场教程的使用。
阿里云官网https://www.aliyun.com/
1. 添加产品
首先登陆账号然后点击控制台
点击左上角目录然后下滑找到 物联网平台
关注微信公众号--星之援工作室 发送关键字(ESP32)可以获取一些基本资料
➡️➡️
点击 公共实例 进去(显示没有开通就自行开通一下就行了)
点击 产品 选项再点击 创建产品
添加自己的 产品名称 再点击 自定义品类 最后点击 确认 产品就建立好了
2. 添加设备
添加好产品后,我们需要给产品添加对应的设备,用来识别我们的硬件和使用我们的mqtt协议,点击 前往管理
再管理界面,我们点击 添加设备 会弹出一个框,我们需要按要求添加名字和备注就行(这个是自定义的)
我们点击 查看设备信息
我框中的就是我们需要使用的连接平台的数据,可以先保存下来
三、Arduino
咱们就是默认都安装好了Arduino,当然我这里也给出一个安装教程,毕竟做就要做全套嘛~~
1.安装教程
Arduino IDE 使用安装以及ESP32库的导入(离线)https://blog.csdn.net/herui_2/article/details/135296814?spm=1001.2014.3001.5501
2.代码编写
所谓前人栽树后人乘凉,现在就会体现的淋漓尽致,首先我们需要加载两个库
PubSubClient 库
PubSubClient.h库是Arduino中用于实现物联网(IoT)功能的一个库,它支持 publish 和 subscribe 操作,使得Arduino开发板能够与各种物联网平台(如MQTT、CoAP等)进行通信。这个库的主要功能是将Arduino与云平台连接,实现远程控制、数据传输和自动化处理等。 PubSubClient.h库的主要特点如下:
1. 易于使用:库提供了简洁的API,便于开发者进行 Publish/Subscribe 操作。
2. 支持多种协议:支持MQTT、CoAP等物联网协议,可根据项目需求选择合适的协议。
3. 可靠性:库中包含错误处理和重传机制,确保数据在传输过程中的可靠性。
4. 自动重连:库具有自动重连功能,当网络连接断开时,会自动尝试重新连接,确保设备始终在线。
5. 跨平台兼容性:PubSubClient.h库适用于各种Arduino开发板,如Arduino Uno、Mega、Nano等。
6. 丰富的示例:库提供了丰富的示例代码,包括接入MQTT服务器、CoAP服务器等,帮助开发者快速上手并实现实际应用。
Ticker 库
Arduino的Ticker库是一个用于在预定时间间隔内调用回调函数的库。它使得Arduino开发板能够以固定周期执行某些操作,适用于需要定期执行的任务。Ticker库不使用硬件计时器中断,而是使用Arduino的micros()和millis()函数来实现定时功能。 Ticker库的主要功能和用法如下:
1. 创建Ticker对象:通过构造函数创建一个Ticker对象,传入回调函数、时间间隔、重复次数和分辨率等参数。
2. 启动和暂停Ticker:使用start()和pause()方法控制Ticker的运行状态。 3. 停止Ticker:使用stop()方法随时停止Ticker。
4. 更新Ticker:在main loop()中调用update()方法,以检查Ticker的状态并执行回调函数。
5. 设置和获取Ticker的时间间隔:使用interval()方法设置或获取时间间隔。
6. 获取Ticker的执行次数:使用counter()方法获取已执行的回调次数。
7. 获取Ticker的状态:使用state()方法获取Ticker的状态(STOPPED、RUNNING或PAUSED)。
8. 获取上次 tick 的时间:使用elapsed()方法获取上次tick的时间。
9. 获取下次tick的时间:使用remaining()方法获取下次tick的时间。
完整代码
需要修改得到部分
想要连接上阿里云,还需要修改 PubSubClient.h 里面的配置参数,这个文件再我们安装的lib目录里面可以找到
#include <WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "NET";
const char* password = "12345678";
const char* mqttServer = "iot-06z00axdhgfk24n.mqtt.iothub.aliyuncs.com";
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
Ticker ticker;
int count; // Ticker计数用变量
// ****************************************************
// 注意!以下需要用户根据然也物联平台信息进行修改!否则无法工作!
// ****************************************************
const char* mqttUserName = "ESP_Pet_device&h9sj0dFIZzO"; // 服务端连接用户名(需要修改)
const char* mqttPassword = "9f86686e86c69f72d27515d6adb63c0223151e627bfa19284959647283210709"; // 服务端连接密码(需要修改)
const char* clientId = "h9sj0dFIZzO.ESP_Pet_device|securemode=2,signmethod=hmacsha256,timestamp=1703866991146|"; // 客户端id (需要修改)
const char* subTopic = "/broadcast/h9sj0dFIZzO/test1"; // 订阅主题(需要修改)
const char* pubTopic = "/broadcast/h9sj0dFIZzO/test2"; // 订阅主题(需要修改)
const char* willTopic = "/broadcast/h9sj0dFIZzO/test1"; // 遗嘱主题名称(需要修改)
// ****************************************************
//遗嘱相关信息
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() {
Serial.begin(9600); // 启动串口通讯
ticker.attach(1, tickerCount); // Ticker定时对象
//设置ESP8266工作模式为无线终端模式
WiFi.mode(WIFI_STA);
// 连接WiFi
connectWifi();
// 设置MQTT服务器和端口号
mqttClient.setServer(mqttServer, 1883);
mqttClient.setCallback(receiveCallback);
// 连接MQTT服务器
connectMQTTserver();
}
void loop() {
// 如果开发板未能成功连接服务器,则尝试连接服务器
if (!mqttClient.connected()) {
connectMQTTserver();
}
if (count == 3) {
pubMQTTmsg(); // 每隔3秒钟发布一次信息
count = 0;
}
// 处理信息以及心跳
mqttClient.loop();
}
// 计时器
void tickerCount() {
count++;
}
// 连接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;
} else {
ledStatus = HIGH;
}
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;
pubMessage = "{"heart":"1"}";
// 实现ESP8266向主题发布信息
if (mqttClient.publish(pubTopic, pubMessage)) {
Serial.println("Publish Topic:");
Serial.println(pubTopic);
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("");
}
上传程序
查看平台
只要修改成自己的设备信息,就可以看到设备在线了
实物效果
时间冲忙,简单的用面包板做了一个项目(PS:上面的代码只是实现了联网部分,没有oled,舵机,dht11的控制代码,等我空了会一一讲解一下)
四、参考与学习
【ESP32最全学习笔记(基础篇)——1.ESP32简介】https://blog.csdn.net/m0_46509684/article/details/129079088?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170401469316800186571625%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170401469316800186571625&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-129079088-null-null.142%5Ev99%5Epc_search_result_base7&utm_term=%20ESP32%20&spm=1018.2226.3001.4187
太极创客http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-application/esp8266-iot-basics/
当然,需要完整项目可以质询博主
联系方式 微信号:13648103287