前言:
在开始正式介绍如何将我们的设备接入准备好了的服务器前,假设你已经阅读过了前三篇有关于物联网该主题的简略介绍
还是先上视频,以勾起大家的兴趣
微信远程控制 LED
今天的主题就是如何将我们手中的设备接入网络中,从而实现远程控制。阅读过第一篇关于物联网介绍推文的同学们应该知道我们使用的设备是ESP8266,使用的开发工具是 Arduino IDE。所以关于如何配置ESP8266的编程环境再此将不再赘述,需要了解的同学请移步上文给出的链接。
依旧是下面的这张关系图:
应用关系图
由图可知,我们需要使ESP8266查询云端的数据库,要做到这一点涉及到了如何进行发送 HTTP 请求,同时会接收到 HTTP 响应。我们的思路是,发送请求的时候给出一个密钥,然后经服务端确认密钥,服务端连接数据库,查询数据库并将我们需要的值返回;ESP8266 接收到数据之后,判断该值,如果值为"1"则使LED灯亮,否则熄灭。示意图如下:
控制流程图
接下来我们分为两部分(ESP8266编程 和 云端编程)来介绍。
PART I 硬件代码实现
首先我们来看关于如何编写 ESP8266 在 Arduino IDE 中的代码,我们无需写下所有的代码,只需在将 Example 中的代码稍加修改就可以加以应用。
步骤一 启动并载入 Example
启动 Arduino ,并在安装好 ESP8266 库的前提下(如何安装请看物联网基础篇),依次选择 File -> Examples -> ESP8266WiFi -> WiFiClient .
步骤二 修改代码
在弹出的代码中需要修改的地方我将在下图中用红色背景标记出,在需要添加代码的地方我将以“TODO: ”的格式并用黄色背景标出。在后面我将详解如何修改及如何补充。
#include
const char* ssid = "your-ssid"; //输入自己的WiFi账号
const char* password = "your-password"; //WiFi 密码
const char* host = "data.sparkfun.com"; //修改为云主机的 公网 IP
const char* streamId = "....................";//注释掉该句
const char* privateKey = "...................."; //改为自己喜欢的,为发起HTTP请求时的私钥
void setup() {
Serial.begin(115200);
delay(10);
// TODO1: 初始化引脚用以点亮led 灯
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
int value = 0;//注释该句
void loop() {
delay(5000);//修改为500以加快发起请求的速度
++value;//注释该句
// TODO2: 判断HTTP响应返回值即云端数据库的statu, 并用以判断是否点亮led
Serial.print("connecting to ");
Serial.println(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// We now create a URI for the request
String url = "/input/"; //修改为网络服务器根目录下的资源文件,即服务器处理代码的文件
url += streamId;//注释该句
url += "?private_key=";
url += privateKey;
url += "&value=";//注释该句
url += value;//注释该句
Serial.print("Requesting URL: ");
Serial.println(url);
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
String line = client.readStringUntil('\r');
// TODO3: 格式化返回值line
Serial.print(line);
}
Serial.println();
Serial.println("closing connection");
}
相关的红色背景的修改大部分我都以注释写在代码之后;黄色背景为需要我们添加代码的部分,具体如下:
TODO 1: 初始化与LED 相连的引脚(Pin2)
pinMode(2, OUTPUT);
digitalWrite(2, HIGH);
TODO 2 :控制 LED 的亮灭
if(line == "0"){
digitalWrite(2, HIGH);
}
else if(line == "1"){
digitalWrite(2, LOW);
}
其中 变量line为收到的 HTTP 响应,其中会包括我们需要的数据库中的statu值,依据该值为“1”或为“0”,我们分别点亮或熄灭 LED 灯。
TODO 3:格式化返回值以供判断
if(line.length()
line.trim();
由于 HTTP 响应不仅仅包括了数据库中的 statu 值,还有一些 HTTP 的状态(在这里不做介绍,有兴趣的同学自行搜索), 所以我们做了一个判断,当字符串变量line长度小于3时(我们需要的是“1”和“0”,但实际上获得的会有空格或者换行符存在变量中,所以需要我们对其进行格式化),我们去掉变量中的空格以及换行符(利用方法trim()),使得上文TODO 2的 if 语句中可以正确地进行字符串的比较。
步骤三 下载至 ESP8266 开发板
根据物联网基础篇中的介绍,插入开发板至电脑USB接口,并在IDE中选择好端口,最后按下 “->” 按钮将代码编译后Upload至开发板中。
PART II 云端代码实现
步骤一 登入云主机
我们按照物联网进阶 I中的介绍,登入云主机终端
步骤二 新建PHP文件 并编辑代码
在终端输入
sudo vim /var/www/html/test.php
新建了一个名为test.php的PHP文件,这里贴出代码:
if($_GET['private_key']=='你的私钥'){
if($con = mysqli_connect('localhost', 'root', '******', 'devices')){
$sql = 'select statu from led';
if($id = mysqli_fetch_array(mysqli_query($con, $sql))){
echo $id[0]."\r";
}
else{
echo " FAILED to fetch data, Error: ". mysqli_error();
}
}
else{
echo " FAILED to connect to database devices". mysqli_error();
}
mysqli_close($con);
}
?>
上面的代码中需要修改为自定义部分的我以粉色底色标记出。“你的私钥” 指的时在 ESP8266 编程中,你设定的privateKey;“××××××” 则无需多说,之前的篇章也提到过,这是你在安装 MySQL 时设置的个人密码。
此处的代码逻辑为:由 if 语句判断请求中的 private_key 是否等于 “你的私钥”,等于的话则连接数据库,并查询数据库中 led 的 statu 的值,并与 HTTP 响应一并返回。这也正是为什么我们通过微信发送信息修改数据库中的值而 LED 灯状态会改变的原因,关于为什么查询statu的值在之前构建数据库时已有提及,示意图如下:
数据库结构图
修改完代码后 依次按Esc -> : -> wq -> Enter。将代码保存并退出。至此我们的实验就全部结束了,不出意外的话你就能实现开头的视频中的效果了。
END
领取专属 10元无门槛券
私享最新 技术干货