文章目录
- 1、AliyunIoTSDK简介
- 2、相关库安装
- 3、阿里云创建产品,订阅发布
- 4、对开源的Arduino ESP8266源代码修改
- 5、使用阿里云点亮一个LED灯
- 6、设备向阿里云上传温度数据
- 7、项目源码
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);
}
}
下面,我们使用阿里云开始点灯
6、设备向阿里云上传温度数据
我们要上传数据到阿里云,首先阿里云上的设备先要定义好温度这个功能,然后我们修改如下函数即可。
将修改好的程序下载到开发板上,我们就可以在阿里云查看设备上传的数据了。
7、项目源码
// 引入 wifi 模块,并实例化,不同的芯片这里的依赖可能不同
#include <ESP8266WiFi.h>
static WiFiClient espClient;
// 引入阿里云 IoT SDK
#include <AliyunIoTSDK.h>
// 设置产品和设备的信息,从阿里云设备信息里查看
#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);
}
}