使用esp8266通过代码连接阿里云

本篇文章主要介绍使用esp8266通过代码将温湿度传感器所测数据发送到阿里云服务器,以及介绍一下本人所踩过的坑。

1.创建阿里云设备

首先登录到阿里云官网,在首页搜索“物联网平台”,如下图
在这里插入图片描述
在这里插入图片描述
进入管理控制台后选择环境
在这里插入图片描述
然后进去按照下图顺序创建产品
在这里插入图片描述
在这里插入图片描述
创建成功后直接点添加设备就行
在这里插入图片描述
然后返回产品界面,点击功能定义,然后是前往编辑草稿
在这里插入图片描述
然后点击添加标准功能,选择其他类型,选择功能的时候记录下功能下面的标识符,上传数据的时候会用到
在这里插入图片描述
如果标准功能没有的话,也可以选择自定义功能
在这里插入图片描述
然后点击发布上线,就可以在设备->物模型数据中看到刚才添加的功能了
在这里插入图片描述
最后在产品中点击动态注册,然后发布就可以了
在这里插入图片描述

2.esp8266代码部分

相关参数的定义在代码下面解释

/*本段代码是esp接收arduino发送过来的温湿度数据然后展示到阿里云平台的,其中arduino先对数据进行封装,转为Json数据,然后esp再将数据提取出来进行整理,然后发送到云平台*/
#include <ESP8266WiFi.h>
#include <LiquidCrystal.h>
#include<SoftwareSerial.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
char ssid[]="你的wifi名";//WiFi名称
char pswd[]="你的wifi密码";//wifi密码*/
#define WIFI_SSID         "123456" //要改的地方你的WiFi名(热点)
#define WIFI_PASSWD       "1234567890"//要改的地方你的WiFi密码
bool setup_camera = false;
 #define PRODUCT_KEY       "你的PRODUCT_KEY" //要改的地方
#define DEVICE_NAME       "你的DEVICE_NAME" //要改的地方
#define DEVICE_SECRET     "你的DEVICE_SECRET"//要改的地方
#define REGION_ID         "cn-shanghai"//一般情况下不用改

/* 线上环境域名和端口号,不需要改 */
#define MQTT_SERVER       PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
#define MQTT_PORT         1883
#define MQTT_USRNAME      DEVICE_NAME "&" PRODUCT_KEY
/*							*/
#define CLIENT_ID         "可以通过工具生成,下面介绍" //要改的地方
#define MQTT_PASSWD       "可以通过工具生成,下面介绍"  //要改的地方
#define ALINK_BODY_FORMAT         "{\"id\":\"dht11\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST     "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
unsigned long lastMs = 0;
float h,t,RH_sum,T_sum;
unsigned char count=0;
WiFiClient espClient;
PubSubClient  client(espClient);
SoftwareSerial espSerial(3,1);  // RX, TX

void callback(char *topic, byte *payload, unsigned int length) 
{
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    payload[length] = '\0';
    Serial.println((char *)payload);
 
}
void wifiInit()
{
    WiFi.mode(WIFI_STA);
    WiFi.begin(WIFI_SSID, WIFI_PASSWD);   //连接WiFi
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(1000);
        espSerial.println("WiFi not Connect");
    }
    espSerial.println("Connected to AP");
    espSerial.println("IP address: ");
    espSerial.println(WiFi.localIP());  
    espSerial.print("espClient [");
    client.setServer(MQTT_SERVER, MQTT_PORT);   /* 连接WiFi之后,连接MQTT服务器 */
    client.setCallback(callback);
}
void mqttCheckConnect()
{
    while (!client.connected())
    {
        espSerial.println("Connecting to MQTT Server ...");
        if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))
 
        {
 
            espSerial.println("MQTT Connected!");
 
        }
        else
        {
            espSerial.print("MQTT Connect err:");
            espSerial.println(client.state());
            delay(5000);
        }
    }
}
 void mqttIntervalPost()
{
    char param[32];
    char jsonBuf[128];
    sprintf(param, "{\"CurrentTemperature\":%f}",T_sum/count);
    sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
    espSerial.println(jsonBuf);
    boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
    if(d){
      espSerial.println("publish Temperature success"); 
    }else{
      espSerial.println("publish Temperature fail"); 
    }
    sprintf(param, "{\"CurrentHumidity\":%f}",RH_sum/count);
    sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
    espSerial.println(jsonBuf);
    d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
    if(d){
      espSerial.println("publish Humidity success"); 
    }else{
      espSerial.println("publish Humidity fail"); 
    }
}
 
 
void setup()
{
    Serial.begin(115200);
    espSerial.begin(9600);
    /*BLINKER_DEBUG.stream(Serial);*/
    wifiInit();
    
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
    
 
}
 
void loop()
{
 if (!client.connected()) {
        mqttCheckConnect();
    }
    client.loop();

    if (espSerial.available()) {
        String receivedData = espSerial.readStringUntil('\n'); // 读取串口数据直到换行符
        espSerial.println("Received data: " + receivedData);

        // 解析JSON数据
        DynamicJsonDocument doc(256); // 适当调整JSON文档大小
        DeserializationError error = deserializeJson(doc, receivedData);
        if (!error) {
            float temperature = doc["temperature"];
            float humidity = doc["humidity"];

            // 累加温度和湿度数据,以便后续计算平均值
            T_sum += temperature;
            RH_sum += humidity;
            count++;

            // 现在你可以使用temperature和humidity变量进行处理
            espSerial.println("Temperature: " + String(temperature, 2) + "°C");
            espSerial.println("Humidity: " + String(humidity, 2) + "%");

            // 在这里添加你的数据发送逻辑,比如按照一定条件发送到阿里云
            if (count >= 10) { // 你可以根据需要自定义发送频率
                mqttIntervalPost();
                count = 0;
                T_sum = 0;
                RH_sum = 0;
            }
        } else {
            espSerial.println("JSON parsing error.");
        }
  
    }
}

代码中的PRODUCT_KEY,DEVICE_NAME,DEVICE_SECRET在设备页面查看
在这里插入图片描述

生成CLIENT_ID MQTT_PASSWD的工具:
链接:https://pan.baidu.com/s/1OI2a596gKDqIETmoX38zCw?pwd=ddrx
提取码:ddrx
界面如下
在这里插入图片描述
在这里插入图片描述
接着复制到代码中即可。

3.连接过程中出现的问题

1.连接的wifi需要时2.4G频段的
2.arduino向esp发送数据是需要连接esp的rx和tx串口,然后使用

#include<SoftwareSerial.h>

这个库中的

SoftwareSerial mySerial(2, 3); // RX, TX

这个方法定义一个通信串口,然后arduino使用这个串口进行传输信息
esp中也需要使用上述头文件和上述串口,

SoftwareSerial espSerial(3,1); // RX, TX

但是这个串口初始化后还使用原来的串口打印数据时可能会造成wifi连接的一些问题,所以在上面的代码中我全部都用espSerial来打印数据了,具体原因有大牛知道的话可以在评论区指出。
3.使用上述代码连接mqtt时,可能会报

mqtt connect err:2

遇到这个问题呢,我们需要操作一下库函数
打开arduinoIDE,然后点击左上角 文件->首选项 可以看到你的项目文件夹地址
在这里插入图片描述
然后找到这个位置,进入libraries文件夹,然后进入PubSubClient文件夹,接着进入src,找到PubSubClient.h头文件,打开找到MQTT_MAX_PACKET_SIZE,将256修改为1024,再找到MQTT_KEEPALIVE,将15修改为40后编译烧录后即可。

以上就是本人通过代码将数据发送到阿里云的全过程,如果有疑问或者错误请大家在评论区提出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将ESP8266连接阿里云,需要先创建一个阿里云账户并设置IoT平台,然后在IoT平台中创建一个设备和一个Topic,并为设备生成一个身份验证信息(DeviceSecret)。 然后,使用ESP8266开发板和MQTT库(例如PubSubClient)连接阿里云。下面是连接步骤: 1. 在代码中引用MQTT库和WiFi库。 2. 设置WiFi连接参数并连接到WiFi网络。 3. 设置阿里云MQTT服务器地址和端口号。 4. 设置设备ID和DeviceSecret。 5. 连接到MQTT服务器并订阅Topic。 6. 在循环中发送和接收MQTT消息。 下面是一些示例代码,你可以根据自己的情况进行修改: ```C++ #include <ESP8266WiFi.h> #include <PubSubClient.h> // WiFi连接参数 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // 阿里云MQTT服务器地址和端口 const char* mqtt_server = "your_server_address"; const int mqtt_port = 1883; // 设备ID和DeviceSecret const char* client_id = "your_device_id"; const char* device_secret = "your_device_secret"; // Topic const char* topic = "/your_topic"; // WiFi客户端 WiFiClient espClient; // MQTT客户端 PubSubClient client(espClient); void setup() { // 启动串口 Serial.begin(115200); // 连接WiFi网络 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("WiFi connected"); // 设置MQTT服务器和端口 client.setServer(mqtt_server, mqtt_port); // 设置MQTT回调函数 client.setCallback(callback); // 连接到MQTT服务器 if (!client.connect(client_id, device_secret)) { Serial.println("Failed to connect to MQTT server"); return; } // 订阅Topic client.subscribe(topic); } void loop() { // 发送MQTT消息 client.publish(topic, "Hello from ESP8266"); // 接收MQTT消息 client.loop(); } // MQTT回调函数 void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message received: "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); } ``` 在你的阿里云控制台中,你可以查看设备的连接状态和收到的消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值