esp8266接入米家,小爱同学控制

第一步 下载程序到esp8266

/*

* 智能语言控制控制,支持天猫、小爱、小度、google Assistent同时控制

* 2021-08-12

* QQ交流群:566565915

* 官网https://bemfa.com

*/

#include <ESP8266WiFi.h>

#define server_ip "bemfa.com" //巴法云服务器地址默认即可

#define server_port "8344" //服务器端口,tcp创客云端口8344

//********************需要修改的部分*******************//

#define wifi_name  "asus"    //WIFI名称,区分大小写,不要写错

#define wifi_password  "qy123456"  //WIFI密码

String UID = "2c74942a07014a37836dbb0ea2db0106";  //用户私钥,可在控制台获取,修改为自己的UID

String TOPIC = "light002";        //主题名字,可在控制台新建

const int LED_Pin = D2;              //单片机LED引脚值,D2是NodeMcu引脚命名方式,其他esp8266型号将D2改为自己的引脚

//**************************************************//

//最大字节数

#define MAX_PACKETSIZE 512

//设置心跳值30s

#define KEEPALIVEATIME 30*1000

//tcp客户端相关初始化,默认即可

WiFiClient TCPclient;

String TcpClient_Buff = "";//初始化字符串,用于接收服务器发来的数据

unsigned int TcpClient_BuffIndex = 0;

unsigned long TcpClient_preTick = 0;

unsigned long preHeartTick = 0;//心跳

unsigned long preTCPStartTick = 0;//连接

bool preTCPConnected = false;

//相关函数初始化

//连接WIFI

void doWiFiTick();

void startSTA();

//TCP初始化连接

void doTCPClientTick();

void startTCPClient();

void sendtoTCPServer(String p);

//led控制函数,具体函数内容见下方

void turnOnLed();

void turnOffLed();

/*

  *发送数据到TCP服务器

*/

void sendtoTCPServer(String p){

  if (!TCPclient.connected())

  {

    Serial.println("Client is not readly");

    return;

  }

  TCPclient.print(p);

}

/*

  *初始化和服务器建立连接

*/

void startTCPClient(){

  if(TCPclient.connect(server_ip, atoi(server_port))){

    Serial.print("\nConnected to server:");

    Serial.printf("%s:%d\r\n",server_ip,atoi(server_port));


    String tcpTemp="";  //初始化字符串

    tcpTemp = "cmd=1&uid="+UID+"&topic="+TOPIC+"\r\n"; //构建订阅指令

    sendtoTCPServer(tcpTemp); //发送订阅指令

    tcpTemp="";//清空

    /*

    //如果需要订阅多个主题,可再次发送订阅指令

      tcpTemp = "cmd=1&uid="+UID+"&topic="+主题2+"\r\n"; //构建订阅指令

      sendtoTCPServer(tcpTemp); //发送订阅指令

      tcpTemp="";//清空

    */


    preTCPConnected = true;

    preHeartTick = millis();

    TCPclient.setNoDelay(true);

  }

  else{

    Serial.print("Failed connected to server:");

    Serial.println(server_ip);

    TCPclient.stop();

    preTCPConnected = false;

  }

  preTCPStartTick = millis();

}

/*

  *检查数据,发送心跳

*/

void doTCPClientTick(){

//检查是否断开,断开后重连

  if(WiFi.status() != WL_CONNECTED) return;

  if (!TCPclient.connected()) {//断开重连

  if(preTCPConnected == true){

    preTCPConnected = false;

    preTCPStartTick = millis();

    Serial.println();

    Serial.println("TCP Client disconnected.");

    TCPclient.stop();

  }

  else if(millis() - preTCPStartTick > 1*1000)//重新连接

    startTCPClient();

  }

  else

  {

    if (TCPclient.available()) {//收数据

      char c =TCPclient.read();

      TcpClient_Buff +=c;

      TcpClient_BuffIndex++;

      TcpClient_preTick = millis();


      if(TcpClient_BuffIndex>=MAX_PACKETSIZE - 1){

        TcpClient_BuffIndex = MAX_PACKETSIZE-2;

        TcpClient_preTick = TcpClient_preTick - 200;

      }

      preHeartTick = millis();

    }

    if(millis() - preHeartTick >= KEEPALIVEATIME){//保持心跳

      preHeartTick = millis();

      Serial.println("--Keep alive:");

      sendtoTCPServer("ping\r\n"); //发送心跳,指令需\r\n结尾,详见接入文档介绍

    }

  }

  if((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200))

  {

    TCPclient.flush();

    Serial.print("Rev string: ");

    TcpClient_Buff.trim(); //去掉首位空格

    Serial.println(TcpClient_Buff); //打印接收到的消息

    String getTopic = "";

    String getMsg = "";

    if(TcpClient_Buff.length() > 15){//注意TcpClient_Buff只是个字符串,在上面开头做了初始化 String TcpClient_Buff = "";

          //此时会收到推送的指令,指令大概为 cmd=2&uid=xxx&topic=light002&msg=off

          int topicIndex = TcpClient_Buff.indexOf("&topic=")+7; //c语言字符串查找,查找&topic=位置,并移动7位,不懂的可百度c语言字符串查找

          int msgIndex = TcpClient_Buff.indexOf("&msg=");//c语言字符串查找,查找&msg=位置

          getTopic = TcpClient_Buff.substring(topicIndex,msgIndex);//c语言字符串截取,截取到topic,不懂的可百度c语言字符串截取

          getMsg = TcpClient_Buff.substring(msgIndex+5);//c语言字符串截取,截取到消息

          Serial.print("topic:------");

          Serial.println(getTopic); //打印截取到的主题值

          Serial.print("msg:--------");

          Serial.println(getMsg);  //打印截取到的消息值

  }

  if(getMsg  == "on"){      //如果是消息==打开

    turnOnLed();

  }else if(getMsg == "off"){ //如果是消息==关闭

      turnOffLed();

    }

  TcpClient_Buff="";

  TcpClient_BuffIndex = 0;

  }

}

/*

  *初始化wifi连接

*/

void startSTA(){

  WiFi.disconnect();

  WiFi.mode(WIFI_STA);

  WiFi.begin(wifi_name, wifi_password);

}

/**************************************************************************

                                WIFI

***************************************************************************/

/*

  WiFiTick

  检查是否需要初始化WiFi

  检查WiFi是否连接上,若连接成功启动TCP Client

  控制指示灯

*/

void doWiFiTick(){

  static bool startSTAFlag = false;

  static bool taskStarted = false;

  static uint32_t lastWiFiCheckTick = 0;

  if (!startSTAFlag) {

    startSTAFlag = true;

    startSTA();

  }

  //未连接1s重连

  if ( WiFi.status() != WL_CONNECTED ) {

    if (millis() - lastWiFiCheckTick > 1000) {

      lastWiFiCheckTick = millis();

    }

  }

  //连接成功建立

  else {

    if (taskStarted == false) {

      taskStarted = true;

      Serial.print("\r\nGet IP Address: ");

      Serial.println(WiFi.localIP());

      startTCPClient();

    }

  }

}

//打开灯泡

void turnOnLed(){

  Serial.println("Turn ON");

  digitalWrite(LED_Pin,LOW);

}

//关闭灯泡

void turnOffLed(){

  Serial.println("Turn OFF");

    digitalWrite(LED_Pin,HIGH);

}

// 初始化,相当于main 函数

void setup() {

  Serial.begin(115200);

  pinMode(LED_Pin,OUTPUT);

  digitalWrite(LED_Pin,HIGH);

  Serial.println("Beginning...");

}

//循环

void loop() {

  doWiFiTick();

  doTCPClientTick();

}

本demo 是利用arduino IDE开发,关于arduino IDE 的ESP8266环境配置可参考:

需要修改的信息有:

需要修改的信息有WIF名称,WIFI密码,用户私钥UID,设备主题topic。

//********************需要修改的部分*******************////WIFI名称,区分大小写,不要写错#define DEFAULT_STASSID  "newhtc"//WIFI密码

#define DEFAULT_STAPSW   "air123456"//用户私钥,可在控制台获取,修改为自己的UID

#define UID  "4d9ec352e0376f2110a0c601a2857xxx"//主题名字,可在控制台新建

#define TOPIC  "light002"//单片机LED引脚值

const int LED_Pin = D2;

//**************************************************//

用户私钥可以巴法云控制台 获取,注册绑定邮箱即可在巴法创客云控制台获取。

关于主题topic:主题可在控制台  新建,字母+数字自定义组合即可。

现在支持的设备有:灯泡、插座、风扇、传感器设备。

关于设备类型,由创建的主题名称决定:

当主题名字后三位是001时为插座设备。

当主题名字后三位是002时为灯泡设备。

当主题名字后三位是003时为风扇设备。

当主题名字后三位是004时为传感器设备。

在本demo中主题为light002,故为灯泡设备,详细介绍见巴法云官方接入文档。

修改好,下载到ESP8266即可。

测试程序:控制台推送on是开灯。推送off关灯,可打开串口调试助手查看调试。

第二步 绑定到米家

打开米家app,底部--我的---其他平台设备---->点击添加--->找打巴法,登录你的巴法云账号,如果巴法云控制台有创建设备,设备就会自动同步过去了。(如果没同步到,再次点击底部的同步设备即可)

设备成功同步后,就成功接入到了米家,现在就可以使用小爱同学来控制灯了。,比如说:小爱同学,打开台灯,此时esp8266就会收到on的字符串,从而执行打开操作,可打开单片机串口调试助手查看调试信息。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容