ESP8266开发、ESP8266连接阿里云物联网、天猫精灵控制esp8266、esp8266一键配网、智能家居
项目介绍
最近会 将arduino IDE开发ESP8266中一些值得记录得部分写下来。 我也是借助前者整理得文章与经验进行整合,有些部分过程我会直接将更好得作者链接加上。这篇文章对于新手小白可能无法直接使用。学习的过程就是不断的探索测试总结,需要一点点了解各个知识点后遇到整合瓶颈时使用。我也是这样一点点测试总结推理开发的。
通过这个教程其实可以简单的了解到智能家居的控制基本技术。 通过硬件、软件、app、小程序、网络、语音、等方式搭建各种环境的物联网。由于涉及功能比较多 如服务器端、小程序端、后端语言、域名、ssl、http、post、get、阿里云iot、mqtt 等 每一项都需要了解一些,所以以下部分内容我会将我开发时的一些有用地址附上,大家自行查看。可能看不懂可以加我微信 look10086 说明你的情况
本文主要目标是通过阿里的天猫精灵控制esp8266模块,esp8266模块再继续控制其他元器件的工作。
中间涉及的知识点有
- esp8266在arduino ide环境开发前的搭建(包含搭建操作流程)
- 地址:https://blog.csdn.net/tiandiren111/article/details/107032096
- 阿里云物联网iot创建设备 获取 设备mqtt连接三元素
- esp8266与阿里云物联网iot mqtt连接 上报信息
- 地址:https://blog.csdn.net/tiandiren111/article/details/107032096
- 天猫精灵设置技能
- 地址:https://gitee.com/walkline/aligenie_voice_skills/tree/master
- 天猫精灵发送指令 服务器处理执行
- 服务器控制阿里云物联网与esp8266交互
- 服务器端开发语言php 使用阿里云php iot SDK
- esp8266一键配网
流程:
测试视频连接:https://v.qq.com/x/page/z3216x7calp.html
文章目录
前言
本文主要介绍 如何通过服务器处理天猫精灵发送的指令 并将指令发给esp8266模块进行执行 知识点主要是5、6两部分
一、服务器环境要求?
服务器环境要求是 可以做域名解析 安装php运行环境 (后端代码使用php语言,主要看自己用什么语言开发后端)。
二、开发逻辑
服务器端工作主要逻辑是
- 接收天猫精灵发送过来的指令
- 指令解析
- 根据解析后的结果 发送给阿里云iot指令
- 阿里云iot将服务器指令通过mqtt协议发给esp8266
esp8266逻辑
- 接收数据 根据数据状态 控制gpio端子输出
三、资料
资料这部分我主要整理了 后端执行代码、php版本的阿里云iot SDK 、esp8266带一键配网的代码、修改了arduino中的阿里云iot的库。
arduino AliyunIoTSDK库中文件修改
文件路径 C:\Users\cola\Documents\Arduino\libraries\AliyunIoTSDK\src\AliyunIoTSDK.cpp
修改内容是 callback这个函数中的代码
// 所有云服务的回调都会首先进入这里,例如属性下发
static void callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("Message arrived jiang [");
Serial.print(topic);
Serial.print("] ");
payload[length] = '\0';
Serial.println((char *)payload);
if(strstr(topic,"/user/get"))
{
Serial.println("this is /user/get");
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, payload); //反序列化JSON数据
Serial.println("error is befor");
if (!error) //检查反序列化是否成功
{
Serial.println("error is false");
parmPass(doc.as<JsonVariant>()); //将参数传递后打印输出
}
}
if(strstr(topic,"/rrpc/request"))
{
Serial.println("this is /user/get");
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, payload); //反序列化JSON数据
Serial.println("error is befor");
if (!error) //检查反序列化是否成功
{
Serial.println("error is false");
parmPass(doc.as<JsonVariant>()); //将参数传递后打印输出
}
}
if (strstr(topic, AliyunIoTSDK::ALINK_TOPIC_PROP_SET))
{
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, payload); //反序列化JSON数据
Serial.println("error is befor");
if (!error) //检查反序列化是否成功
{
Serial.println("error is false");
parmPass(doc.as<JsonVariant>()); //将参数传递后打印输出
}
}
}
esp8266中代码 代码中包含一键配网
一键配网需要搭配乐鑫官网中的EspTouch App应用使用(连接wifi后打开应用 确定wifiSSID后输入wifi密码 点击确认)。
一键配网学习地址:https://www.bilibili.com/video/BV197411B725?t=995
#include <ESP8266WiFi.h>
int count=0;
bool WIFI_Status = true;
//iot
static WiFiClient espClient;
// 引入阿里云 IoT SDK
#include <AliyunIoTSDK.h>
// 设置产品和设备的信息,从阿里云设备信息里查看
#define PRODUCT_KEY "123" //修改成自己阿里云iot的
#define DEVICE_NAME "Unit01" //修改成自己阿里云iot的
#define DEVICE_SECRET "1111111111111111111111111111" //修改成自己阿里云iot的
#define REGION_ID "cn-shanghai"
int ledpin = 2;
void setup() {
Serial.begin(115200);
delay(10);
pinMode(LED_BUILTIN, OUTPUT);
Serial.println("\r\n正在连接");
// 下面判断一键配网
while(WiFi.status()!=WL_CONNECTED)
{
if(WIFI_Status)
{
Serial.print(".");
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
count++;
if(count>=5)//5s
{
WIFI_Status = false;
Serial.println("WiFi连接失败,请用手机进行配网");
}
}
else
{
smartConfig(); //智能配网
}
}
Serial.println("连接成功");
Serial.print("IP:");
Serial.println(WiFi.localIP());
// iot开始执行
// 初始化 iot,需传入 wifi 的 client,和设备产品信息
AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
// 绑定一个设备属性回调,当远程修改此属性,会触发 powerCallback
// PowerSwitch 是在设备产品中定义的物联网模型的 id
AliyunIoTSDK::bindData("PowerSwitch", powerCallback);
// 发送一个数据到云平台,LightLuminance 是在设备产品中定义的物联网模型的 id
AliyunIoTSDK::send("LightLuminance", 100);
pinMode(ledpin,OUTPUT);
}
void loop() {
AliyunIoTSDK::loop();
}
// 电源属性修改的回调函数 iot执行函数
void powerCallback(JsonVariant p)
{
// {"params":{"PowerSwitch":1}}
Serial.print("ppppp: ");
int PowerSwitch = p["PowerSwitch"];
if (PowerSwitch == 1)
{
Serial.println("进入启动设备");
digitalWrite(ledpin,HIGH);
// 启动设备
}
else if(PowerSwitch == 2){
Serial.println("进入启动设备222");
digitalWrite(ledpin,LOW);
}
}
//配网函数
void smartConfig()
{
WiFi.mode(WIFI_STA);
Serial.println("\r\nWait for Smartconfig...");
WiFi.beginSmartConfig();//等待手机端发出的用户名与密码
while (1)
{
Serial.print(".");
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
if (WiFi.smartConfigDone())//退出等待
{
Serial.println("SmartConfig Success");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
break;
}
}
}