华为云操作
流程
esp8266和esp32的实现流程和原理一致,注意是代码头文件不同。如果需要使用esp32进行上云,可以去找找其他案例修改头文件即可
1. 完成华为云平台注册和实名认证(注意:实名需要成年)
2. 搜索"设备接⼊IoTDA"服务,点击免费试⽤
华为云物联网平台_华为云IoT平台_IoT_设备接入-华为云 (huaweicloud.com)
3. 控制台设置为"北京四",可以在标准版和基础版之间转化,标准版和基础版基本功能一样
创建产品设备
1.点击"产品","创建产品"
2.所属资源空间根据自己的情况选择,自定义填写产品名称,行业自行选择即可
3.点击 "详情"、 "自定义模型"
4.输入服务ID和服务类型(自定义),点击"确定",注意:自定义ID名称在后续使用的,类似于数据库的表名
5.点击【新增属性】,属性名称和数据格式根据自己的需求设置,选择可写,在上云过程中属性名称和数据格式和后面代码里面的名称需要一一对应,使用过hispark上过云的都懂。
属性类似于数据库表格里面的内容,根据实际上传数据的名称和数据类型进行设计
生成密钥
1.点击【在线调试】 、【新增测试设备】 (创建成功后先别关闭弹窗,后续要复制弹窗的信息)
2.填写设备名称和标识码(根据设备设置,如果要测试则自定义),密钥最好自己一个好记的,不然系统会自动生成一个复杂的密钥,如果忘了,也是可以修改的
3.注册成功后,会有如下弹窗,可以把密钥复制保存
如何修改密钥
密钥修改也很简单,找到刚刚自己创建的设备,点击详细
输入自己心仪的密钥,不需要其他操作
Mqtt Password
目前最新的华为云连接方式采用更加简便的方式(博主只在HI3861实现过),只需要使用设备ID、密钥以及MQTT华为云Iot的URL即可。目前这个方法还是通用滴
1.打开下列网址:Huaweicloud IoTDA Mqtt ClientId Generator (myhuaweicloud.com)
2.点击生成并将生成的结果保存。生成的Password短时间内有效,如果时间长需要重新生成,否则会显示404连接失败
esp8266环境
esp8266环境配置咱就不多解释,我将头文件引入的方法放入了,作者自身配置过基本无误
在arduino中安装【ArduinoJson.h】:
.在arduino中安装【PubSubClient】
感谢博主提供的教程,解决这个报错,我就直接分享了
在Arduino IDE中添加PubSubClient库--Arduino开发中找不到PubSubClient.h的解决方法-CSDN博客
代码介绍
本案例是实现2个随机数上传华为云。
流程:先连接wife,然后连接华为云平台,将数据上传
整体代码
#include <Wire.h>
#include <ESP8266WiFi.h>//esp8266库
#include <PubSubClient.h>
#include <ArduinoJson.h>
//全局变量
float temperature;
float humidity;
/*MQTT连接配置*/
//wifi设置和MQTT 连接参数
const char* ssid = "wifeid"; //WiFi名称
const char* password = "Password"; // WiFi密码
//接收到命令后上发的响应topic
const char* Iot_link_MQTT_Topic_Report = "$oc/devices/64681485a1e0862b43d12061_1405242004/sys/properties/report";
char* topic_Commands_Response = "$oc/devices/64681485a1e0862b43d12061_1405242004/sys/commands/response/request_id=";
//华为云接入地址
const char* mqttServer = "。";
//接入端口
const int mqttPort = 1883;
//以下3个参数可以由HMACSHA256算法生成,为硬件通过MQTT协议接入华为云IoT平台的鉴权依据
//https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/(网址)
const char* clientId = "661959ae71d845632a050031_wind_1_0_1_2024041405"; //ClientId
const char* mqttUser = "661959ae71d845632a050031_wind_1"; //Username
const char* mqttPassword ="5eba210e99bf339a6ac049788b7fe860ba9bb0563cbc004f762717e3ef5490ed"; //Password
//定义了一个ESP32 WiFI模式的客户端用于连接WiFi网络
WiFiClient espClient;
// 定义了一个MQTT协议的客户端,用于与MQTT服务器进行通信,基于WiFi网络,实现订阅发布数据的功能。
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
// 连接WiFi网络
WiFi.begin(ssid, password); // 启动网络连接
Serial.print("Connecting to "); // 串口监视器输出网络连接信息
Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接
int i = 0; // 这一段程序语句用于检查WiFi是否连接成功
while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。
delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED
Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
} // 同时NodeMCU将通过串口监视器输出连接时长读秒。
// 这个读秒是通过变量i每隔一秒自加1来实现的。
Serial.println(""); // WiFi连接成功后
Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。
Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
Serial.println(WiFi.localIP());
}
void MQTT_Init()
{
//MQTT服务器连接部分
client.setServer(mqttServer, mqttPort); //设置连接到MQTT服务器的参数1883
client.setKeepAlive (120); //设置心跳时间
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(1000);
}
}
}
void MQTT_POST()
{
char properties[32];
char jsonBuf[128] ;
//#define Iot_link_Body_Format "{\"services\":[{\"service_id\":\"140524(服务id)\",\"properties(属性名称)\":{%s(上传数据类型)}}]}”, encoderRPM(上传的数据) //发送单一属性
#define Iot_link_Body_Format "{\"services\":[{\"service_id\":\"Agriculture\",\"properties\":{\"temperature\":%f,\"humidity\":%f}}]}",temperature,humidity
sprintf(jsonBuf,Iot_link_Body_Format); //将发送的数据生成json格式
client.publish(Iot_link_MQTT_Topic_Report, jsonBuf);//串口打印华为云平台接受数据后的响应
Serial.println(Iot_link_MQTT_Topic_Report);
Serial.println(jsonBuf);
Serial.println("Publish OK!");
}
void loop() {
temperature = random(3000, 4000) / 100.0;
humidity = 30;
MQTT_POST();//向华为云平台发送数据
if (!client.connected()){
MQTT_Init();
}
delay(2000); // 每隔2秒上传一次数据
}
参数配置
1、.wifi 名称和密码部分都需要改成⾃⼰热点的 WiFi 名称和密码
注意:wife频率修改为2.4ghz,否则会连接华为云失败
2. 华为云接入地址:打开华为云【总览】,下拉⻚⾯找到【接⼊信息】并打开,找到 mqtt(1883) 的接⼊地址,复制到代码中的“mqttServe”变量 ( 1833 是代码中设定的端⼝,要根据实际寻找对应的接入 地址 )
4、端口为1883不需要修改、响应topic不需要修改,将原先保存的password填入
#include <Wire.h>
#include <ESP8266WiFi.h>//esp8266库
#include <PubSubClient.h>
#include <ArduinoJson.h>
//全局变量
float temperature;
float humidity;
/*MQTT连接配置*/
//wifi设置和MQTT 连接参数
const char* ssid = "wife"; //WiFi名称
const char* password = "password"; // WiFi密码
//接收到命令后上发的响应topic
const char* Iot_link_MQTT_Topic_Report = "$oc/devices/64681485a1e0862b43d12061_1405242004/sys/properties/report";
char* topic_Commands_Response = "$oc/devices/64681485a1e0862b43d12061_1405242004/sys/commands/response/request_id=";
//华为云接入地址 2
const char* mqttServer = ".com";
//接入端口
const int mqttPort = 1883;
//以下3个参数可以由HMACSHA256算法生成,为硬件通过MQTT协议接入华为云IoT平台的鉴权依据
//https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/(网址)
const char* clientId = "661959ae71d845632a050031_wind_1_0_1_2024041405"; //ClientId
const char* mqttUser = "661959ae71d845632a050031_wind_1"; //Username
const char* mqttPassword ="5eba210e99bf339a6ac049788b7fe860ba9bb0563cbc004f762717e3ef5490ed"; //Password
//定义了一个ESP32 WiFI模式的客户端用于连接WiFi网络
WiFiClient espClient;
// 定义了一个MQTT协议的客户端,用于与MQTT服务器进行通信,基于WiFi网络,实现订阅发布数据的功能。
PubSubClient client(espClient);
连接wife代码
void setup() {
Serial.begin(115200);
// 连接WiFi网络
WiFi.begin(ssid, password); // 启动网络连接
Serial.print("Connecting to "); // 串口监视器输出网络连接信息
Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接
int i = 0; // 这一段程序语句用于检查WiFi是否连接成功
while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。
delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED
Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
} // 同时NodeMCU将通过串口监视器输出连接时长读秒。
// 这个读秒是通过变量i每隔一秒自加1来实现的。
Serial.println(""); // WiFi连接成功后
Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。
Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
Serial.println(WiFi.localIP());
}
连接华为云服务器
void MQTT_Init()
{
//MQTT服务器连接部分
client.setServer(mqttServer, mqttPort); //设置连接到MQTT服务器的参数1883
client.setKeepAlive (120); //设置心跳时间
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(1000);
}
}
}
发送数据
注意Iot_link_Body_Format后面配置要和华为云平台一致
void MQTT_POST()
{
char properties[32];
char jsonBuf[128] ;
//#define Iot_link_Body_Format "{\"services\":[{\"service_id\":\"140524(服务id)\",\"properties(属性名称)\":{%s(上传数据类型)}}]}”, encoderRPM(上传的数据) //发送单一属性
#define Iot_link_Body_Format "{\"services\":[{\"service_id\":\"Agriculture\",\"properties\":{\"temperature\":%f,\"humidity\":%f}}]}",temperature,humidity
sprintf(jsonBuf,Iot_link_Body_Format); //将发送的数据生成json格式
client.publish(Iot_link_MQTT_Topic_Report, jsonBuf);//串口打印华为云平台接受数据后的响应
Serial.println(Iot_link_MQTT_Topic_Report);
Serial.println(jsonBuf);
Serial.println("Publish OK!");
}
在线调试
成功烧录并在串⼝正常输出后,返回华为物联⽹云平台,可以观察到设备在线状态以及采集到 的数据
数据发送到后端
实现上述步骤后,恭喜你可以将数据发送到后端保存了
1、创建规则
2、填入相关信息,注意触发事件为属性上报
3、填入发送地址
4、到这步差不多就成功了,后端只需要将数据进行提取即可
其他补充
常⻅连接失败所输出的返回值的含义
0:表示MQTT连接已经成功建⽴,并且客户端与服务器之间存在MQTT通信会话。
1:表示MQTT连接已经建⽴,但客户端尚未与服务器建⽴MQTT通信会话。
2:表示MQTT连接被拒绝。这种情况通常由于客户端提供的信息(例如Client ID等)不正确或不 被允许,或者连接请求中存在错误,例如重复的连接请求。
3: 表示连接过程中发⽣⽹络错误或超时。
4: 表示客户端已经成功连接服务器,但是发送了错误消息,如⽆授权 / 认证,⽆订阅权限等。
5:表示MQTT连接被服务器拒绝。这种情况通常由于客户端提供的凭据信息(例如⽤户名或密 码)不正确或不存在,或者客户端未经授权访问服务器。
6:表示MQTT连接尝试重连(等待⼀段时间后重新连接)。
设备状态说明
遇到的问题:
1.安装时PubSubClient不需要将文件解压,直接在arduino中导入压缩包即可
2.注意检查service_id与华为云平台的设备名称,添加的所有属性与代码的变量一致。
3. wifi 连接若使⽤的是⼿机的热点,注意热点配置AP频段设置为2.4GHz频段
4.连接失败,可以尝试重新生成Password
5、华为云iot平台的页面风格会发生改变,自行判断,如果后续有空就对帖子完善