esp8266连接到阿里云平台


title: esp8266连接到阿里云平台
date: 2022-08-17 09:51:22
categories: 教程

arduino连接到阿里云平台简易使用教程

/*
    连接阿里云平台的简易教程
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h> 
#include <ArduinoJson.h>
#include "aliyun_mqtt.h"
unsigned long lastMs = 0;
#define PRODUCT_KEY      "h671fF2aMUu" //阿里云IoT平台设备三元组信息
#define DEVICE_NAME      "project1" //阿里云IoT平台设备三元组信息
#define DEVICE_SECRET    "f1d468e72ecc1f5c398e68f563eceecd"//阿里云IoT平台设备三元组信息
#define DEV_VERSION       "1.0.0"        //固件版本信息
#define ALINK_BODY_FORMAT         "{\"id\":\"123\",\"version\":\"1.0.0\",\"method\":\"%s\",\"params\":%s}"    //MQTT消息数据的标准格式
#define ALINK_TOPIC_PROP_POST     "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"    //物模型通信Topic-设备属性上报(本地设备客户端发布消息)
#define ALINK_TOPIC_PROP_SET      "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"   //物模型通信Topic-设备属性设置(云端虚拟设备客户端发布消息,本地设备客户端订阅消息)
#define ALINK_METHOD_PROP_POST    "thing.event.property.post"    //设备属性上报的主题,本地设备(ESP8266)向阿里云IOT平台发布消息时使用
#define ALINK_TOPIC_DEV_INFO      "/ota/device/inform/" PRODUCT_KEY "/" DEVICE_NAME ""    //基础通信Topic-设备上报固件升级信息
WiFiClient   espClient;
PubSubClient mqttClient(espClient); 
//连接WiFi
void connect_wifi()
{
    WiFi.mode(WIFI_STA);
    WiFi.begin("loushangyu", "12345678");
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }
    Serial.println("WiFi已连接");
}
//连接到阿里云平台
void connectAliyun()
{
    while (!mqttClient.connected())
    {
        while(connect_aliyun_mqtt(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))
        {
            Serial.println("MQTT连接成功");
            mqttClient.subscribe(ALINK_TOPIC_PROP_SET);
            Serial.println("订阅成功");
            uploadDeviceVersion();
        }
    }
}
//上报本地信息
void intervalPost()
{
    char param[512];
    char jsonBuf[1024];//用来存放ESP8266将要PUBLISH到服务器的消息

    sprintf(param, "{\"LightSwitch\":%d,\"temperature\":%d,\"Humidity\":%d}", 1, 12, 12); //将要上报的数据格式化后写入param字符串中
    sprintf(jsonBuf, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param);//将要上报的数据加上主题,一起被格式化成标准报文格式后,写入jsonBuf字符串中
    Serial.println(jsonBuf);//串口输出将要上传的报文
    mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
}
//上报设备版本信息
void uploadDeviceVersion()
{
    char param[512];
    sprintf(param,"{\"id\":123,\"params\":{\"version\":\"%s\"}}",DEV_VERSION);
    Serial.println(param);
    mqttClient.publish(ALINK_TOPIC_DEV_INFO,param);
}
//接收到阿里云平台的消息
void receive_message(char *topic, byte *payload, unsigned int length)
{
    /*
            此部分是对从阿里云平台获取到的信息进行解析
    */
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    payload[length]='\0';
    Serial.println((char *)payload);//打印接收到的消息
    if (strstr(topic,ALINK_TOPIC_PROP_SET))
    {
        
        /*
            创建一个静态JSON对象,用于存储接收到的消息 StaticJsonBuffer
        */
        StaticJsonBuffer<200> jsonBuffer;
        /*
            创建最外层的json对象:root对象
            解析JSON数据,并存储到JsonObject对象中
        */
        JsonObject &root = jsonBuffer.parseObject(payload);
        /*
            接下来是解析数据的过程,
            解析出来的数据就是控制本地固件设备运行的数据
            例如灯的打开或者关闭,温度的设置,湿度的设置等等
            例如:led灯的控制
            lightSwitchLocal存储云端开关设置量,
            如果为1,则表示打开灯,如果为0,则表示关闭灯
            LightSwitch是云端设置的设备名
        */
       // %%可以在这个部分设置传递函数将值传递到函数后进行使用,这里便开始了对固件进行控制的编程步骤
       int lightSwitchLocal = root["params"]["LightSwitch"];
 
       /*
            此处可以设置本地设备的控制函数,例如:
            if (lightSwitchLocal == 1)
            {
                digitalWrite(LED_BUILTIN, HIGH);
            }
            else
            {
                digitalWrite(LED_BUILTIN, LOW);
            }
       */
      /*
            判断是否数据解析成功,不成功就return
      */
       if(!root.success())
       {
        Serial.println("数据解析失败");
        return;
       }
    }
}

void setup()
{
    Serial.begin(115200);
    /*
        1. 连接WiFi 函数为 connect_wifi()
    */
    connect_wifi();
    /*
        2. 接收来自阿里云平台的消息
    */
   mqttClient.setCallback(receive_message);
}

void loop()
{
    if (millis()-lastMs>=5000)//millis()函数返回自 Arduino 板开始运行当前程序以来经过的毫秒数。此数字将在大约 50 天后溢出(返回到零)。
    {
        lastMs=millis();
        connectAliyun();
        intervalPost();
    }
    mqttClient.loop();
}
/*
    ## 物联网教程
    1. 首先应该先连接到wifi中,esp8266不支持5g频段,所以需要连接到2.4G频段   connect_wifi()
    2. 设置时间函数,每隔一段时间上报一次数据   millis()-lastMs>=5000r每五秒上报一次数据
    3. 连接到阿里云平台,上报数据   connectAliyun()
        3.1 通过阿里云平台创建的产品对阿里云平台进行连接
        3.2 订阅阿里云平台的主题,接收阿里云平台的消息 mqttClient.subscribe(ALINK_TOPIC_PROP_SET)
        3.3 上报设备版本号 uploadDeviceVersion() 在连接号阿里云平台之后进行上传
        3.4 定时上报数据 intervalPost() 在连接号阿里云平台之后进行上传
    4. 接收阿里云平台的消息 receive_message() 在连接号阿里云平台之后进行接收 receive_message()函数在setup()函数中被调用,mqttClient.setCallback(receive_message)

*/
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值