Ai-笔记:嚎出一个极简物联网第一集:美味的云端LAMP派

嚎出一个极简物联网(1).png

前言:这篇是「威玲旺卡Aileen」和「阿狗A-Go」的原创物联网边造边写系列笔记。没有告知时请不要转载呐,谢谢。另外我要感谢Marcel Ochsendorf(马赛)同学对我的指导。

0. 本集问题情景:

阿狗想在何时何地都可以知道他生命中最重要的地方——狗窝的温度和湿度。这样他可以决定是不是需要打开暖气和加湿器以保持他狗毛的蓬松和柔软,同时也可以知道供暖系统和加湿器的真正效果。目前他能在一个网页上看到实时数据就满意了,阿狗对web框架一无所知,手边也只有一块树莓派,他打算用很老很成熟的LAMP(Linux-Apache-MySQL-PHP)来实现它。

0. 这个边造边写的笔记将会涵盖:

  1. 部署一个aws虚拟主机,打造服务器+web构架+域名
  • 创建aws Linux AMI主机
  • 通过yum安装LAMP
  • 为主机申请静态IP,修改域名DNS到主机
  1. 用树莓派读取温度湿度传感器数值并上传数据库(通过requests)
  • 硬件连接DHT传感器
  • 安装Adafruit Sensor Library,测试读取传感器数据
  • 这里狗要思考一下在哪里登录数据库,所以狗先去了第三部分,然后回到这个点继续
  • 安装requests,通过它进行数据交流
  1. 创建数据库表结构,用php与MySQL对话,最终显示传感器实时数据至页面
  • 通过phpMyAdmin界面设计表结构
  • 写用来登录数据库的db.php
  • 写用来执行插入操作的insert.php(回到2.4,在树莓派上requests它,测试数值是否插入数据库成功)
  • 写显示页面
    我们开始动手啦。

1. 部署一个aws虚拟主机,打造服务器+web构架+域名

1.1装一个aws实例

按照非常好的官方文档,
Amazon EC2 Linux 实例入门
新手教程-如何在 Amazon AWS 上搭建和部署网站
使用 SSH 连接到 Linux 实例
这一步的目标是:
ssh链接实例成功!

ssh链接实例成功.png

我当下的安全组设置,感觉非常不安全,后面一定要改改。
安全组设置截图.png

说到要熟悉aws最快最好的方式,我不得不提qwiklabs,真实环境lab,非常棒。

1.2安装Web构架

教程走一个
教程:在 Amazon Linux 上安装 LAMP Web 服务器
这一部的完成的鉴定是,登录主机DNS可以看到它:

Apache主页.png

登录主机DNS/phpinfo.php可以看到装的php版本,
phpinfo.png

登录主机DNS/phpMyAdmin可以看到数据库登录入口,
phpMyAdmin.png

我安装的过程中原来用

sudo yum install -y http php php-mysql mysql mysql-server

后来折腾了好久也弄不好phpMyAdmin,后来只能全卸载,确定版本,这才搞定

sudo yum install -y httpd24 php70 mysql56-server php70-mysqlnd

创建index.php或者index.html就可以替换掉默认主页了。

这些都是在主机里弄的,没有用到亚马逊的RDS(Relational Database Service)也没有挂载EFS(Elastic File System)留给之后探索。

1.3为主机申请静态IP,修改域名DNS到主机

官方文档 弹性 IP 地址
获得IP后一定要关联运行着的主机,否则没有关联实例的IP会被扣费,此外,如果申请了静态IP并且关联后,把主机给关掉了,那么这个IP也会被扣费。
阿狗买了一个叫wolfiethedog.de的域名,在DNS中将A地址指向静态IP就完成了。但当我用CNAME将www指向主机地IPv4地址(ec2-xxxxxxxx.eu-central-1.compute.amazonaws.com)却一直失败,现在也没搞定,我把subdomain的“www”设置成域名跳转到主页作为临时的办法。

至此,我们的aws+LAMP搞定了,用时没超过2小时。

2. 用树莓派读取温度湿度传感器数值并上传数据库(通过requests)

2.1 硬件连接DHT传感器

树莓派针脚的布局(派3至少是这样的)


pi3_gpio.png

淘宝来的温度湿度传感器,一定要找找模块名字,找到了叫DHT11,三个针脚VCC,DATA和GND
分别接到01(3.3v电压),07(GPIO04)和06(GOUND)


IMG_20171118_152932-01.jpeg

okay,希望成功吧,启动派,准备读取数值了。

2.2 安装Adafruit Sensor Library,测试读取传感器数据

我原来一直以为我需要读出二进制raw data再换算成可读数据,还琢磨着我该怎么查看它的输出结构呢?
但其实库类已经把这个问题给handle了。移步 https://github.com/adafruit/Adafruit_Python_DHT
安装完之后,因为我的传感器是DHT11,所以需要修改一下它的simpletest.py

import Adafruit_DHT
sensor = Adafruit_DHT.DHT11
pin = 4
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
    print('Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temperature, humidity))
else:
    print('Failed to get reading. Try again!')

成功啦!


传感器数据读取成功.png

2.3 要思考一下在哪里登录数据库

我们差一点就要在树莓派连接数据库了,因为当时我一直在想用php连接数据库该怎么码,后来Marek说用python连接MySQL不就好了,我那个时候思维被偏向了,我在派上安了MySQLdb,打算远程登录数据库,然后再插入数据,用root的身份和密码竟然被拒绝,这时我发现root是默认没有远程登录权限的,我要通过mysql script去赋予权限,

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

随后还经历了mysql需要升级,却一直失败,最后要--force才通过

mysql_upgrade --force -uroot -p

直到都折腾完了,我才顿悟,我为什么要在派上登录呢?这情况派只要构建一个 Request 对象,其他事情都该交给服务器。所以接下来我们要开始在服务器上写php。

3. 创建数据库表结构,用php与MySQL对话,最终显示传感器实时数据至页面

3.1 通过phpMyAdmin界面设计表结构

本科知识复习,建表,我们在数据库DHT下,建立了一个叫Pi_reader的表,其中有键:

3.2 写用来登录数据库的db.php

Apache的web文件默认地址是 /var/www/html
其实root根本不需要远程登录权限。
db.php代码

<?php

DEFINE('DB_USERNAME','root');
DEFINE('DB_PASSWORD','password');
DEFINE('DB_HOST','xx.xx.xxx.xxx');
DEFINE('DB_DATABASE','DHT');

$mysqli = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_DATABASE);

if (mysqli_connect_error()){
die('Connect Error('.mysqli_connect_error().')'.mysqli_connect_error());
}
echo '<i>数据库已成功连接。</i>';

?>

3.3 写用来执行插入操作的insert.php

我们需要将收到的请求,如果是合理的,就添加进数据库。
合理是指符合这样的格式
http://xx.xx.xxx.xxx.xxx/insert.php?temp=aa&hum=bb&token=0000
那么温度aa,湿度bb和timestamp都会被加入到数据库。
其中token是充当一个密码保护的功能。
如果数据项目很多的话,可以传输一个xml或者json
insert.php代码

<?php
include 'db.php';

if(!isset($_GET["token"]) || $_GET["token"] != "0000"){
echo "wrong_token";
exit();
}

$temp = $_GET["temp"];
$hum = $_GET["hum"];
echo $temp;

$sql = "INSERT INTO Pi_reader (id,temperature,humidity,timestamp) VALUES (NULL, '". $temp ."','". $hum ."', CURRENT_TIMESTAMP);";
$result = mysqli_query($mysqli, $sql);

?>

3.4 写显示页面

在第一集中,我只写了白板。
连接数据库后,读取一个表的所有记录,循环输出三个键值,温度,湿度,时间戳。
index.php

<?php

echo "<h1>阿狗狗窝的温度湿度实时监视器</h1>";

include 'db.php';

$query = "SELECT * FROM Pi_reader";
$result = mysqli_query($mysqli, $query);

echo "<table>";
echo "<tr><td>" . "<b>温度</b>" . "</td><td>" . "<b>湿度</b>" . "</td><td>". "<b>时间</b>". "</td></tr>";

while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))
{
echo "<tr><td>" . $row[temperature] . "°C  </td><td>" . $row[humidity] . "%  </td><td>". $row[timestamp]. "</td></tr>";
}

echo "</table>";
mysql_close();

?>

2.4 回到树莓派,完成最后的对服务器的请求

现在只剩下最后一步了,在派每次读取数据后,我们想要它发送一个请求到服务器,这个请求说,“我请求把xx温度xx湿度加入数据库。”
而且我们希望1分钟可以更新一次数据。
我们安装了 Requests
直接在刚才读取数据的脚本上粗暴地改动:

#!/usr/bin/python

import Adafruit_DHT
import requests
import time

sensor = Adafruit_DHT.DHT11
pin = 4

#humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

temp_temp = 0
temp_hum = 0

while(1):
        humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

        if humidity is not None and temperature is not None:

                if str(humidity) is not str(temp_hum) or str(temperature) is not str(temp_temp):
                        r = requests.get("http://xx.xx.xxx.xxx/insert.php?token=0000&temp="+ str(temperature) +"&hum=" +str( humidity))
                        print(r.status_code)
                        print('Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temperature, humidity))
                        temp_temp = temperature
                        temp_hum = humidity
        else:
                print('Failed to get reading. Try again!')
        time.sleep(60)

测试!
好,我们现在登录 http://wolfiethedog.de/woofaniot/s01e01/ 看看效果

监视页面.png

页面出现了树莓派中获取的当下温度和湿度,细细研究,时间间距并不是准时的1分钟。request给服务器的过程中还是出现了些短小的延时的。

没有css的html终究是难看的,但是我们的毛坯房已经有了。下一集我和阿狗会专门研究显示的仪表盘,dashboard。

这个实验的额外收获就是,那个小小的加湿器在整个房间的效果上还是有功效的。
至此,《嚎出一个极简物联网》第一集《美味的云端LAMP派》就完成了。

耶!

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 快过年了,忙里偷闲,写一篇博客记录一下前面这么多天玩树莓派的心得。 树莓派是什么? 英文名字叫Raspberry ...
    天堂迈舞阅读 1,953评论 0 6
  • Composer Repositories Composer源 Firegento - Magento模块Comp...
    零一间阅读 3,940评论 1 66
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 杨树叶子葱绿,柳絮满天飞,是石家庄一年中最好的季节,多想让这种天气永久驻足! 股市好像故意跟石家庄天气做对似的,难...
    静泽福淼阅读 178评论 0 0