热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

智能家居入门DIY——【五、执行命令】

前面几篇介绍了ESP8266使用AT命令来连接WIFI实现一系列功能。这一篇介绍一下使用WemosD1Wifi来进行开发,当然也可以用常见的8针ESP8266来完成(只是需要按网上

        前面几篇介绍了ESP8266使用AT命令来连接WIFI实现一系列功能。这一篇介绍一下使用Wemos D1 Wifi来进行开发,当然也可以用常见的8针ESP8266来完成(只是需要按网上的方法将Arduino作为烧写器,我是买了一个)。如果不用连接太多的传感器,那么ESP8266模块本身就够用了。

一、工具选择

1、VS2015社区版,安装FOR ARDUINO IDE。

2、SOCKET调试工具NetAssist。

二、过程

1、安装ESP8266开发板到IDE

2、选择NodeMCU1.0

3、编写代码然后烧录

这个不涉及到任何刷固件之类的软件,直接用IDE做就可以了。非常简单不是?

作为例子,依然用lewei50的TCP连接,后面文章可能还会说一下OneNet的MQTT协议:

此时,可以使用如下库:

#include
#include
#include

其中ESP8266WIFI是连接WIFI来的,而WIFICLIENT是用来做客户端和服务器通讯的:

//连接WIFI
bool ConnectWifi() {
    if (!WiFi.isConnected()) {
        WiFi.begin(ssid, password);
        while (!WiFi.isConnected())
        {
            delay(100);
        }
    }
    return WiFi.isConnected();// WiFi.status() == WL_CONNECTED;
}

//连接服务器
bool ConnectServer() {
    if (wClient.status() != ESTABLISHED) {
        wClient.stop();
        wClient.connect(serverUrl, serverPort);
        delay(1000);
    }
    return wClient.status()==4;
}

这都非常简单,然后介绍一下ArduinoJson库,这个库就是用来编辑Json数据的,lewei50的TCP长连要求先发送识别码,相当于登录:

//发送识别码
bool UpDateToServer() {
    String info = "";
    StaticJsonDocument<200> doc;
    JsonObject root = doc.to();
    root["method"] = "update";
    root["gatewayNo"] = "01";
    root["userkey"] = userKey;
    serializeJson(root, info);
    info += (String)"&^!";
    return wClient.print(info)== info.length();
}

这样就实现了这个登录格式要求(API参考文档为:http://www.lewei50.com/dev/doc/155)

{

    "method": "update",

    "gatewayNo": "你的网关号",

    "userkey": "你的userkey"

}&^!

接下来来点干货,怎么实现这样的格式:

{

    "method": "response",

    "result": {

        "successful": true,

        "message": "xxxx"

    }

}&^!

还有这样的格式:

{

    "method": "upload",

    "data":[

    {

        "Name":"T1",

        "Value":"1"

    },

    {

        "Name":"01H1",

        "Value":"96.2"

    }

]

}&^!

这样的格式:

{

    "method": "response",

    "result": {

        "successful": true,

        "message": "xxxx",


        "data":[

      {
         "id":"C1",
         "value":"1"
      },
      {
         "id":"C2",
         "value":"2"
      }] 
      

    }

}&^!

JsonObject是可以嵌套的,实现代码如下:

//上传数据
bool UpLoadToServer() {
    String info = "";
    //根节点
    StaticJsonDocument<500> doc;
    JsonObject root = doc.to();
    //method节点
    root["method"] = "upload";
    //data节点
    JsonArray data= root.createNestedArray("data");
    //data数据
    data.add(CreateJsonObject("Name", "T1", "Value", (String)dht22.getTemperature()));
    data.add(CreateJsonObject("Name", "H1", "Value", (String)dht22.getHumidity()));
    serializeJson(root, info);
    info += (String)"&^!";
    return wClient.print(info) == info.length();
}

//创建data子json对象
JsonObject CreateJsonObject(String key1,String val1,String key2 ,String val2) {
    StaticJsonDocument<100> buffer;
    JsonObject obj = buffer.to();
    obj[key1] = val1;
    obj[key2] = val2;
    return obj;
}

至于执行命令,就是获取服务器发送来的消息,然后解析Json就可以了。

    String serverMessage = "";
    if (wClient.available()) {
        serverMessage = wClient.readString();
        Serial.println("read");
        //Serial.println(serverMessage);
    }
    if (serverMessage != "") {
        Serial.println("docommand");
         DoCommand(serverMessage);
    }
//执行服务器的命令
void DoCommand(String serverMessage) {
    String cmd = DumpServerMessage(serverMessage, "f");
    //回复服务器对控制器状态的查询
    if (cmd == "getAllSensors") {
        ResponseState();
    }
    //服务器更新控制器的命令
    else if (cmd == "updateSensor") {
        String id = DumpServerMessage(serverMessage, "p1");            //命令参数1,控制器ID
        int state = DumpServerMessage(serverMessage, "p2").toInt();    //命令参数2,控制器状态0=关,1=开
        if (!ResponseCommand((String)id + ":" + state)) {
            Serial.println("re command err");
        }
        else {
            if (id == "C1") {
                digitalWrite(C1Pin, state);
            }
        }
    }
    //服务器的其他消息
    else {
        //Serial.println((String)"cmd:\r\n" + cmd);
    }
}

 

嗯,就到这里吧,剩下的可以自己去研究一下。下一篇介绍一下OneNet的MQTT,OnetNet比lewei50这个要灵活丰富很多,当然做起来也就需要更费劲一点。


推荐阅读
  • 本文探讨了Web API 2中特性的路由机制,特别是如何利用它来构建RESTful风格的URI。文章不仅介绍了基本的特性路由使用方法,还详细说明了如何通过特性路由进行API版本控制、HTTP方法的指定、路由前缀的应用以及路由约束的设置。 ... [详细]
  • 转自:http:blog.sina.com.cnsblog_67419c420100vmkt.html 1.为什么要使用blocks将一个blocks作为函数或者方法的参数传递,可 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置单节点的Redis服务,包括下载、解压、编译安装以及启动服务的具体步骤。 ... [详细]
  • 本文详细探讨了在 Xamarin.Forms 中使用 AbsoluteLayout 进行精确布局的方法,以及如何利用 Device.StartTimer 实现定时任务。通过具体的代码示例,帮助开发者更好地理解和应用这些功能。 ... [详细]
  • Activity跳转动画 无缝衔接
    Activity跳转动画 无缝衔接 ... [详细]
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • HTTP中的Chunked编码与Content-Length的区别及应用场景
    本文探讨了在HTTP协议中,当使用Transfer-Encoding为chunked时为何无需设置Content-Length,以及这种编码方式的具体实现和优势。 ... [详细]
  • 本文探讨了HTA(HTML Application)环境中HTML5 IndexedDB的可用性问题,并提供了一种替代方案,即通过使用COM ActiveX对象来实现数据存储功能。 ... [详细]
  • 本文章利用header()函数来实现页面跳,我们介绍到404,302,301等状态跳转哦,下面有很多的状态自定的函数有需要的同学可以测试一下。heade ... [详细]
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • Navicat Premium中MySQL用户管理:创建新用户及高级设置
    本文作为Navicat Premium用户管理系列的第二部分,主要介绍如何创建新的MySQL用户,包括设置基本账户信息、密码策略、账户限制以及SSL配置等。 ... [详细]
  • 本文介绍了JSP的基本概念、常用标签及其功能,并通过示例详细说明了如何在JSP页面中使用Java代码。 ... [详细]
  • Nagios可视化插件开发指南 —— 配置详解
    本文详细介绍了Nagios监控系统的配置过程,包括数据库的选择与安装、Nagios插件的安装及配置文件的解析。同时,针对常见的配置错误提供了具体的解决方法。 ... [详细]
  • 本文详细解析了Java中流的概念,特别是OutputStream和InputStream的区别,并通过实际案例介绍了如何实现Java对象的序列化。文章不仅解释了流的基本概念,还探讨了序列化的重要性和具体实现步骤。 ... [详细]
author-avatar
历史本轻狂
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有