智能家居入门DIY——【五、执行命令】
前面几篇介绍了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 <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
其中ESP8266WIFI是连接WIFI来的,而WIFICLIENT是用来做客户端和服务器通讯的:
//连接WIFI
bool ConnectWifi() {
if (!WiFi.isConnected()) {
WiFi.begin(ssid, password);
while (!WiFi.isConnected())
{
delay();
}
}
return WiFi.isConnected();// WiFi.status() == WL_CONNECTED;
} //连接服务器
bool ConnectServer() {
if (wClient.status() != ESTABLISHED) {
wClient.stop();
wClient.connect(serverUrl, serverPort);
delay();
}
return wClient.status()==;
}
这都非常简单,然后介绍一下ArduinoJson库,这个库就是用来编辑Json数据的,lewei50的TCP长连要求先发送识别码,相当于登录:
//发送识别码
bool UpDateToServer() {
String info = "";
StaticJsonDocument<> doc;
JsonObject root = doc.to<JsonObject>();
root["method"] = "update";
root["gatewayNo"] = "";
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<> doc;
JsonObject root = doc.to<JsonObject>();
//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<> buffer;
JsonObject obj = buffer.to<JsonObject>();
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这个要灵活丰富很多,当然做起来也就需要更费劲一点。
智能家居入门DIY——【五、执行命令】的更多相关文章
- 智能家居入门DIY——【一、ESP8266之软串口HTTP请求】
前段时间做了一个激光雕刻,玩的不亦乐乎.对Arduino大感兴趣,于是又入手一块20大洋版,配上买学习套件时的诸多零件——红外发射管.一体化红外接收头.DHT11温湿度传感器.ESP8266等,以及某 ...
- 智能家居入门DIY——【六、使用OneNet后台处理数据】
OneNet使用起来要比lewei50复杂一些,它没有前台需要自己开发.命令下发也和之前介绍的lewei50有一些区别,这里着重介绍一下使用MQTT协议来进行通讯. 一.准备 1.Esp8266开发板 ...
- 智能家居入门DIY——【四、组合】
前面几篇介绍了一些传感器和代码,这篇介绍一下把它们组合起来.之所以单独列出这部分,原因在于组合更多功能的时候发现使用软串口库驱动ESP8266时由于内存过小导致发送失败甚至整个系统无法工作的情况.所以 ...
- 智能家居入门DIY——【二、LD3320之语音识别】
前一篇说了一下只有RX,TX,VCC,GND的WIFI模块软串口通讯:在实现了远程观察数据,类似的就可以实现远程控制.接下来说一下近距离控制,很多情况下应用语音识别技术无疑比掏出手机操作要更人性化一些 ...
- 智能家居入门DIY——【七、添加一个LCD12864吧】
今天加了一个LCD12864,IC看说明上是ST7567,结果一顿U8g2,发现两个问题: 1.买的时候不知道是卖家写的我理解错了还是怎么了,反正是不出汉字的. 2.U8g2太大了…………占了uno的 ...
- 智能家居入门DIY——【三、GP2Y10之颗粒物传感器】
这个传感器接线算比较简单的,程序也不麻烦.不过这东西是颗粒物传感器吧,不是神马PM2.5(总悬浮颗粒物),不是神马PM10(可吸入颗粒物).插个螺丝刀进去度数也是变的,不是说的很清楚原理是反光嘛……… ...
- DIY智能家居——零基础入门篇
概要 本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器.后经过探索发现新大陆--Home Assistant&Homebridge,最终实现了一个 ...
- 入门智能家居,从 IFTTT 到 HomeKit 自动化(二)
入门智能家居,从 IFTTT 到 HomeKit 自动化(二) 目录 0. HomeKit.HomeBridge.HomeAssistant 分别是什么?关系是什么? 1. 开始前的准备 2. 整 ...
- Diy智能家居-1.基于esp8266的语音控制系统(开篇)
目录Diy智能家居-1.基于esp8266的语音控制系统(开篇) https://blog.csdn.net/arno1988/article/details/82628589 Diy智能家居-2.基 ...
随机推荐
- 20162311 课堂测试 泛型类—Bag
课堂测试 泛型类-Bag 目录 一.题目要求 二.设计思路 三.问题和解决办法 四.代码运行截图 五.代码托管地址 六.总结 一.题目要求 题目:泛型类-Bag 返回目录 二.设计思路 自定义一个Ba ...
- Pro Git读书笔记 - Git 常用命令
在工作目录中初始化新仓库 要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行git init 检查当前文件状态 要查看哪些文件处于什么状态,可以用git status命令 将工作文件 ...
- (CLR via C#学习笔记)异步操作 - 线程池
一 线程池基础 1.线程池维护了一个操作请求队列,将请求的操作追加到线程池队列中,线程池的代码从队列中提取操作项,派发给线程池中的线程; 2.CLR初始化时,线程池中是没有线程的,当有操作派发给线程池 ...
- redis持久化策略
redis是内存数据库,它把数据存储在内存中,这样在加快读取速度的同时也对数据安全性产生了新的问题,即当redis所在服务器发生宕机后,redis数据库里的所有数据将会全部丢失. 为了解决这个问题,r ...
- ActiveMQ---知识点整理
本文来自于csdn,文章通过介绍ActiveMQ的安装,使用,搭建等等,简单整理了ActiveMQ. 本文转自:http://www.uml.org.cn/zjjs/201802111.asp 一.背 ...
- hdu4289最小割
最近博客断更了一段时间啊,快期末了,先把这个专题搞完再说 最小割=最大流 拆点方法很重要,刚开始我拆点不对就wa了,然后改进后tle,应该是数组开小了,一改果然是 #include<map> ...
- restframework api (二)权限
一 添加权限 (1)API/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # utils/permission.py class SVIP ...
- 数据库链接池 durid 的配置参数详解
这里我主要介绍druid 比较重要的参数解释,不做druid的使用介绍,druid虽然功能强大,但是如果对配置参数理解不到位,性能非但不能达到很优,而且会出现很多异常,所以使用druid之前一定要清楚 ...
- 毒害一代Java程序猿的HttpClient
前言 2016年以来,越来越多Android开发者使用Retrofit作为HTTP请求框架.原因其一,Google发布Android 6.0 SDK (API 23) 抛弃了HttpClient:其二 ...
- 在JavaScript中进行文件处理,第一部分:基础
译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 很多年前,我在一次Goole面试被问到,如何在w ...