ESP8266(arduino方式)快速连接阿里云物联网平台(AliYun)

1447 篇文章 12 订阅
1447 篇文章 7 订阅

一、前言

     最近物联网越来越火,阿里也出了自己的物联网平台,对于物联网工程师来说,简直是天大的福音。阿里云物联网平台支持MQTT,手头上正好有ESP8266开发板,拿来练练手。对于开发ESP8266的小伙伴们来说,开发8266可以用SDK或者Arduino来开发,Arduino极大的简化了开发复杂度,所以本次开发就用Arduino。

二、工具准备

     1.一个ESP8266开发板

12

三、阿里云平台注册设备(创建高级设备)

     1.创建教程https://help.aliyun.com/document_detail/73705.html?spm=a2c4g.11174283.4.4.3a8b1668DyM7sV

     2.主要地方用图说明

     12

四、源代码修改

1.修改ESP8266.ino

#include <ESP8266WiFi.h>#include <PubSubClient.h>#include <ArduinoJson.h> #include "aliyun_mqtt.h" // GPIO 13, D7 on the Node MCU v3#define SENSOR_PIN 13 #define WIFI_SSID        "CMCC-123"//替换自己的WIFI#define WIFI_PASSWD      "12345678"//替换自己的WIFI #define PRODUCT_KEY      "abcvfg" //替换自己的PRODUCT_KEY#define DEVICE_NAME      "Temp_Sensor" //替换自己的DEVICE_NAME#define DEVICE_SECRET    "QhT3OdM9Yi4izSgiXdjKOPIoCzQbVcLy"//替换自己的DEVICE_SECRET #define DEV_VERSION       "S-TH-WIFI-v1.0-20190220"        //固件版本信息 #define ALINK_BODY_FORMAT         "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"#define ALINK_TOPIC_PROP_POST     "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"#define ALINK_TOPIC_PROP_POSTRSP  "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post_reply"#define ALINK_TOPIC_PROP_SET      "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"#define ALINK_METHOD_PROP_POST    "thing.event.property.post"#define ALINK_TOPIC_DEV_INFO      "/ota/device/inform/" PRODUCT_KEY "/" DEVICE_NAME ""    #define ALINK_VERSION_FROMA      "{\"id\": 123,\"params\": {\"version\": \"%s\"}}"unsigned long lastMs = 0; WiFiClient   espClient;PubSubClient mqttClient(espClient); void init_wifi(const char *ssid, const char *password){    WiFi.mode(WIFI_STA);    WiFi.begin(ssid, password);    while (WiFi.status() != WL_CONNECTED)    {        Serial.println("WiFi does not connect, try again ...");        delay(500);    }     Serial.println("Wifi is connected.");    Serial.println("IP address: ");    Serial.println(WiFi.localIP());} void mqtt_callback(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))    {        StaticJsonBuffer<100> jsonBuffer;        JsonObject &root = jsonBuffer.parseObject(payload);        if (!root.success())        {            Serial.println("parseObject() failed");            return;        }    }}void mqtt_version_post(){    char param[512];    char jsonBuf[1024];     //sprintf(param, "{\"MotionAlarmState\":%d}", digitalRead(13));    sprintf(param, "{\"id\": 123,\"params\": {\"version\": \"%s\"}}", DEV_VERSION);   // sprintf(jsonBuf, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param);    Serial.println(param);    mqttClient.publish(ALINK_TOPIC_DEV_INFO, param);}void mqtt_check_connect(){    while (!mqttClient.connected())//mqttδ����    {        while (connect_aliyun_mqtt(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))        {            Serial.println("MQTT connect succeed!");            //client.subscribe(ALINK_TOPIC_PROP_POSTRSP);            mqttClient.subscribe(ALINK_TOPIC_PROP_SET);                        Serial.println("subscribe done");            mqtt_version_post();        }    }    } void mqtt_interval_post(){    char param[512];    char jsonBuf[1024];     //sprintf(param, "{\"MotionAlarmState\":%d}", digitalRead(13));    sprintf(param, "{\"CurrentHumidity\":%d,\"CurrentTemperature\":12,\"GeoLocation\":{\"CoordinateSystem\":2,\"Latitude\":2,\"Longitude\":123,\"Altitude\":1}}", digitalRead(13));    sprintf(jsonBuf, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param);    Serial.println(jsonBuf);    mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf);}  void setup(){     pinMode(SENSOR_PIN, INPUT);    /* initialize serial for debugging */    Serial.begin(115200);     Serial.println("Demo Start");     init_wifi(WIFI_SSID, WIFI_PASSWD);     mqttClient.setCallback(mqtt_callback);} // the loop function runs over and over again forevervoid loop(){    if (millis() - lastMs >= 20000)    {        lastMs = millis();        mqtt_check_connect();        /* Post */                mqtt_interval_post();    }     mqttClient.loop();     unsigned int WAIT_MS = 2000;    if (digitalRead(SENSOR_PIN) == HIGH)    {        Serial.println("Motion detected!");    }    else    {        Serial.println("Motion absent!");    }    delay(WAIT_MS); // ms    Serial.println(millis() / WAIT_MS);}

2.修改PubSubClient.h(该图借用别人的)

3.arduino安装加密库

4.编译下载,重新上电

五、源代码下载

1.https://gitee.com/schuck/ESP8266_AliYun

2.https://download.csdn.net/download/ziqi5543/11045211

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值