• Arduino ESP8266使用AliyunIoTSDK.h连接阿里云物联网平台


    1、AliyunIoTSDK简介

    AliyunIoTSDK是arduino的一个库,可以在arduino的应用商店中搜索到这个库,当时版本不一定是最新的,而且下载的地址在国外,下载会比较久,有时还不能下载成功,我之前就在下载他的库的时候花费了大量的时间。
    我这里提供基于AliyunIoTSDK库的开源项目地址:
    https://github.com/xinyu198736/arduino-aliyun-iot-sdk
    如果网站无法打开,可以使用我已经下载好的项目包:
    链接:https://share.weiyun.com/urYMY5tN 密码:yr6d78

    2、相关库安装

    Arduino有非常多的已经写好库,我们使用Arduino开发ESP8266的时间只需了解库的使用即可,学过面向对象的语言如java、Python应该能很好的理解。其实,Arduino是基于C++语言开发的。

    Arduino需要下载安装ArduinoJson, Crypto, PubSubClient, ESP8266库,这些库文件可以在ArduinoIDE上下载,这里不在展开。

    我AliyunIoTSDK使用的是离线的安装方式,可以直接将下载好的项目负责到Arduino的项目文件保存地址。
    在这里插入图片描述
    在这里插入图片描述
    根据开源项目的安装教程,安装PubSubClient成功后,有一个地方需要修改。
    在这里插入图片描述
    文件的地址同样在Arduino的项目文件夹下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3、阿里云创建产品,订阅发布

    需要连接阿里云,首先应该在阿里云物联网平台上创建产品
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    像上图所示,我们在阿里云物联网平台上创建了一个产品,在产品里定义了一个led开关的功能,接下来我们只需发布上线,设备就可以连接上物联网平台了。

    4、对开源的Arduino ESP8266源代码修改

    阿里云平台搭建好后,只需将文章开头的AliyunIoTSDK库开源项目的代码复制过来进行一个简单的修改,项目的有详细的使用说明。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这里连接WiFi的时候,我选择的是手机的热点。

    之前遇到有人问过我,“明明WiFi的名称和密码都正确,但是ESP8266无法连接WiFi。是什么原因呢?”
    这时需要检查一下手机热点信息设置是否正确,WiFi名称需要以中文命名,手机热点AP频段选择2.4GHZ,设备标识默认、隐藏热点关闭。
    我把我手机的热点信息附上。
    请添加图片描述
    如果是使用路由器无法连接的话,也重新检查一下路由器的设置,多到网上找找教程,我还没有使用路由器连接过WiFi,不管跟手机热点的设置是一样的。

    当ESP8266成功连接上WiFi后,我们在阿里云物联网平台上重新刷新一下,便会发现平台提示连接成功。
    在这里插入图片描述

    5、使用阿里云点亮一个LED灯

    使用阿里云物联网平台点灯需要在ESP8266绑定一个属性回调,名称要与设备功能一致。
    还需要初始化LED,我之前走过一个坑,绑定LED后,没有初始化LED导致一直没有实现这个功能找了很久的bug,这里也将这个问题记录下。
    善于运用串口调试可以快速并定位找到这种bug,作为开发者,快速解决bug的能力也是很重要的。我当时解决这个bug的时候就是使用串口调速,我将会把源代码在下面附上。
    在这里插入图片描述
    绑定属性回调后,需要根据需求编写回调的函数,其实,只要将开源项目的电源属性修改的回调函数修改一下即可,我修改后如下:

    // 电源属性修改的回调函数
    void powerCallback(JsonVariant p)
    {
        int PowerSwitch = p["LEDSwitch"];
        if (PowerSwitch == 1)
        {
            //开灯
            Serial.println("LED_ON");
            digitalWrite(LED_BUILTIN, LOW);
            
        }
        if (PowerSwitch == 0)
        {
          //关灯
          Serial.println("LED_OFF");
          digitalWrite(LED_BUILTIN, HIGH);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    下面,我们使用阿里云开始点灯
    在这里插入图片描述
    在这里插入图片描述

    6、设备向阿里云上传温度数据

    我们要上传数据到阿里云,首先阿里云上的设备先要定义好温度这个功能,然后我们修改如下函数即可。
    在这里插入图片描述
    将修改好的程序下载到开发板上,我们就可以在阿里云查看设备上传的数据了。
    在这里插入图片描述

    7、项目源码

    // 引入 wifi 模块,并实例化,不同的芯片这里的依赖可能不同
    #include 
    static WiFiClient espClient;
    
    // 引入阿里云 IoT SDK
    #include 
    
    // 设置产品和设备的信息,从阿里云设备信息里查看
    #define PRODUCT_KEY "xxxxxxxxxx"
    #define DEVICE_NAME "xxxxxxx"
    #define DEVICE_SECRET "xxxxxxx"
    #define REGION_ID "cn-shanghai"
    
    // 设置 wifi 信息
    #define WIFI_SSID "xxxxxxx"
    #define WIFI_PASSWD "xxxxxxx"
    
    // 温度
    float f_temperature = 25.1;
    
    void setup()
    {
        Serial.begin(9600);
        
        // 初始化 wifi
        wifiInit(WIFI_SSID, WIFI_PASSWD);
        
        // 初始化 iot,需传入 wifi 的 client,和设备产品信息
        AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
    
        // initialize digital pin LED_BUILTIN as an output.
        pinMode(LED_BUILTIN, OUTPUT);
        
        // 绑定一个设备属性回调,当远程修改此属性,会触发 powerCallback
        // AliyunIoTSDK::bindData("设备功能标识符", powerCallback);
        AliyunIoTSDK::bindData("LEDSwitch", powerCallback);
    }
    
    void loop()
    {
        AliyunIoTSDK::loop();
    
        //每隔1秒发送一次数据
        delay(1000);
        
        // 发送一个数据到云平台,AliyunIoTSDK::send("设备标识符", 要发送的数据);
        AliyunIoTSDK::send("temperature", f_temperature);
    }
    
    // 初始化 wifi 连接
    void wifiInit(const char *ssid, const char *passphrase)
    {
        WiFi.mode(WIFI_STA);
        WiFi.begin(ssid, passphrase);
        while (WiFi.status() != WL_CONNECTED)
        {
            delay(1000);
            Serial.println("WiFi not Connect");
        }
        Serial.println("Connected to AP");
    }
    
    // 电源属性修改的回调函数
    void powerCallback(JsonVariant p)
    {
        int PowerSwitch = p["LEDSwitch"];
        if (PowerSwitch == 1)
        {
            //开灯
            Serial.println("LED_ON");
            digitalWrite(LED_BUILTIN, LOW);
        }
        if (PowerSwitch == 0)
        {
          //关灯
          Serial.println("LED_OFF");
          digitalWrite(LED_BUILTIN, HIGH);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
  • 相关阅读:
    Spring Boot 日志文件
    【Java挑战赛】——static、代码块
    【PTA 题目详解】 7-10 猴子吃桃
    【软考-中级】系统集成项目管理工程师-人力资源管理历年案例
    【MySQL架构篇】存储引擎
    Mysql笔记1
    Oracle EBS AR收款核销异常会计事件ID丢失修复
    硬件设计基础----MOS管
    (二十三)大数据实战——Flume数据采集之采集数据聚合案例实战
    springboot证书管理系统的设计与实现毕业设计源码162317
  • 原文地址:https://blog.csdn.net/lzxiaotu/article/details/134344316