由于学校老师给的教程太过...,搜索了不少内容,尝试了很多次。自己还不太懂这方面的内容,所以记录纯操作。
用到了华为云IoT平台、Arduino IDE(没有给安装教程,这个随便搜一个就行。基本就是从官网下载安装包,双击.exe。下载完后会跳出很多让你安装,安一下)
实现的效果是在华为云平台上,time每隔一秒+1,如下图:
分为两方面:华为云IoT上的操作、Arduino IDE 的配置和操作(包括环境、代码、提交)
一、华为云IoT
1.登陆注册华为云
2.在华为云中选择:IoT互联网->设备接入IoTDA
3.在左侧产品列表中,创建产品
其中产品名称自由定义,设备类型可以在标准中选择,也可以自定义,然后确定进行产品创建(我的这里是第一次,有个“开始测试”。就是使用免费版的。点击之后出现下面的界面)
注意:协议是MQTT和所属资源空间都不动,其他随便
4.在创建的产品中创建服务
服务类型啥的不填
然后就可以看到下图框出来的服务
5.在产品中,创建属性
这个地方对应上报的数值键值,例如我创建的是temp
6.在增加完产品和服务后,进行设备的创建
创建完后会跳出来一个文件,下载一个,里面有devide_id和secret
二、Arduino
1.配置esp32环境
在这一部分参考这个教程:安装 Arduino 开发环境 | 极客侠GeeksMan
但是!!!止步于我下面框的内容
另外这个端口是会在esp32的线连接到电脑上时跳出来的
2.修改老师给的代码
我先给出老师给的代码。再说哪里要改,改的部分怎么改,数据哪里来
#include <Wire.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#include <PubSubClient.h>
/*MQTT连接配置*/
/*-----------------------------------------------------*/
// 定义WiFi连接信息
const char* ssid = "ESP32连接的WiFi名称";
const char* password = "WiFi密码";
const char* mqttServer = "华为云MQTT接入地址";
const int mqttPort = 1883;
//以下3个参数可以由HMACSHA256算法生成,为硬件通过MQTT协议接入华为云IoT平台的鉴权依据
const char* clientId = "";
const char* mqttUser = "";
const char* mqttPassword = "";
WiFiClient espClient; //ESP32WiFi模型定义
PubSubClient client(espClient);
const char* topic_properties_report = "$oc/devices/6617f5cb2ccc1a583880be12_firsttemp/sys/properties/report";
//接收到命令后上发的响应topic
char* topic_Commands_Response = "$oc/devices/6617f5cb2ccc1a583880be12_firsttemp/sys/properties/report";
#define Iot_link_Body_Format "{\"services\":[{\"service_id\":\"Dev_data\",\"properties\":{%s"
/*******************************************************/
/*
* 作用: ESP32的WiFi初始化以及与MQTT服务器的连接
* 参数: 无
* 返回值:无
*/
void MQTT_Init()
{
//WiFi网络连接部分
WiFi.begin(ssid, password); //开启ESP32的WiFi
while (WiFi.status() != WL_CONNECTED) { //ESP尝试连接到WiFi网络
delay(3000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to the WiFi network");
//MQTT服务器连接部分
client.setServer(mqttServer, mqttPort); //设置连接到MQTT服务器的参数
client.setKeepAlive (60); //设置心跳时间
while (!client.connected()) { //尝试与MQTT服务器建立连接
Serial.println("Connecting to MQTT...");
if (client.connect(clientId, mqttUser, mqttPassword )) {
Serial.println("connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(6000);
}
}
//接受平台下发内容的初始化
//client.setCallback(callback); //可以接受任何平台下发的内容
}
void setup() {
Serial.begin(115200);
MQTT_Init();
}
/*
* 作用: 垃圾桶容量上报到MQTT服务器任务
* 参数: (int)垃圾桶容量,1代表垃圾桶满了,0代表垃圾桶未满
* 返回值:无
* 命名说明:Capacity:容量
*/
void TASK_Capacity_Report(int capacity)
{
//以下部分代码调用了ArduinoJson库将属性上报消息打包为JSON格式
//此部分代码可以通过ArduinoJson库的官方网站直接生成
StaticJsonBuffer<300> JSONbuffer; //定义静态的JSON缓冲区用于存储JSON消息
JsonObject& root = JSONbuffer.createObject();
JsonArray& services = root.createNestedArray("services");
JsonObject& service_1 = services.createNestedObject();
JsonObject& properties_1_1 = service_1.createNestedObject("properties");
service_1["service_id"] = "A311";
properties_1_1["temp"] = capacity;
// root.prettyPrintTo(Serial);//调试用,将JSON打印到串口
//以下将生成好的JSON格式消息格式化输出到字符数组中,便于下面通过PubSubClient库发送到服务器
char JSONmessageBuffer[100];
root.printTo(JSONmessageBuffer, sizeof(JSONmessageBuffer));
Serial.println("Sending message to MQTT topic..");
Serial.println(JSONmessageBuffer);
//以下代码将打包好的JSON数据包通过PubSubClient库发送到服务器
if (client.publish(topic_properties_report, JSONmessageBuffer) == true) {
Serial.println("Success sending message");
} else {
Serial.println("Error sending message");
}
//由于本函数是放在loop中不断循环执行,所以添加client.loop()进行保持硬件的活跃度
//避免由于长时间未向服务器发送消息而被服务器踢下线
client.loop();
Serial.println("-------------");
}
void loop() {
for(int i = 0 ; i<256; i++)
{
delay(10000);
TASK_Capacity_Report(i);
}
}
修改
ESP32连接的WiFi名称 :把这冒号里的改成你电脑连接的wifi或者热点名称
WiFi密码:你电脑连接的wifi或者热点密码
华为云MQTT接入地址:见下图
继续改
往这三个冒号里填内容
进入网站Huaweicloud IoTDA Mqtt ClientId Generator
使用刚刚保存的设备id 和 密钥,填入,生成鉴权信息
最后改
A311:改成你自己的服务名称
temp:该成你自己的属性名称
其他地方就不用改了
3.提交
把你的esp32线连到电脑上。
点击1,编译完后,
点击2,不用一直按着BOOT键,只要点击。
然后,就有了开头我说的效果
花了一晚上总算搞完了。这学校该die的作业啊。但愿足够详细,不要让其他人再受这份折磨。