ESP8266开发、ESP8266连接阿里云物联网、天猫精灵控制esp8266、esp8266一键配网、智能家居

ESP8266开发、ESP8266连接阿里云物联网、天猫精灵控制esp8266、esp8266一键配网、智能家居

项目介绍

最近会 将arduino IDE开发ESP8266中一些值得记录得部分写下来。 我也是借助前者整理得文章与经验进行整合,有些部分过程我会直接将更好得作者链接加上。这篇文章对于新手小白可能无法直接使用。学习的过程就是不断的探索测试总结,需要一点点了解各个知识点后遇到整合瓶颈时使用。我也是这样一点点测试总结推理开发的。

通过这个教程其实可以简单的了解到智能家居的控制基本技术。 通过硬件、软件、app、小程序、网络、语音、等方式搭建各种环境的物联网。由于涉及功能比较多 如服务器端、小程序端、后端语言、域名、ssl、http、post、get、阿里云iot、mqtt 等 每一项都需要了解一些,所以以下部分内容我会将我开发时的一些有用地址附上,大家自行查看。可能看不懂可以加我微信 look10086 说明你的情况

本文主要目标是通过阿里的天猫精灵控制esp8266模块,esp8266模块再继续控制其他元器件的工作。
中间涉及的知识点有

  1. esp8266在arduino ide环境开发前的搭建(包含搭建操作流程)
    • 地址:https://blog.csdn.net/tiandiren111/article/details/107032096
  2. 阿里云物联网iot创建设备 获取 设备mqtt连接三元素
  3. esp8266与阿里云物联网iot mqtt连接 上报信息
    • 地址:https://blog.csdn.net/tiandiren111/article/details/107032096
  4. 天猫精灵设置技能
    • 地址:https://gitee.com/walkline/aligenie_voice_skills/tree/master
  5. 天猫精灵发送指令 服务器处理执行
  6. 服务器控制阿里云物联网与esp8266交互
    • 服务器端开发语言php 使用阿里云php iot SDK
  7. esp8266一键配网

流程:

命令
处理后响应让天猫精灵执行 好的主人马上执行
命令
命令
打开/关闭
语音
天猫精灵
服务器处理
阿里云iot
esp8266模块
热水器或led等

测试视频连接: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;
    }
  }
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值