背景知识视频教程
使用Flask进行专业的Python Web开发viadean.com使用Flask构建RESTful APIviadean.com
物联网基础:操作系统应用程序 - 国外课栈viadean.com
介绍
物联网(IoT)是由相互连接的计算机,电话,平板电脑和诸如恒温器,车库门开启器,灯泡,门铃摄像头,气象站之类的物理设备组成的网络。 当我们谈论Internet时,通常是指与网页,程序和应用程序通信的计算机,平板电脑,电话和服务器。 物联网通过包含除计算机,电话,平板电脑和服务器以外的设备在Internet上的构建。
物联网设备
我有两个基于ESP8266的WiFi气象站。 这些小设备是物联网的一部分。 气象站由ESP8266微控制器和通过跨接线和面包板连接的温度传感器组成。 基于ESP8266的WiFi气象站将温度测量结果传输到云中的服务器。 这些WiFi气象站是物联网设备。
物联网服务器
与物联网设备交互的服务器(如基于ESP8266的WiFi气象站)称为物联网服务器或IoT服务器。 物联网服务器与物联网设备通信。 在该项目开始时,基于ESP8266的WiFi气象站与http://ThingSpeak.com物联网服务器进行通信。 WiFi气象站将温度测量结果发送到保存数据的http://ThingSpeak.com IoT服务器。
物联网服务器需求
IoT服务器需要实现两个主要功能:
从两个基于ESP8266的WiFi气象站接收并存储温度测量值
将两个基于ESP8266的WiFi气象站测得的温度发布到网页中
项目步骤
使用flask和Python构建IoT服务器是一个多部分的问题。我们可以将问题分解为以下步骤:
设置
构建在云中运行的基于Flask的服务器(Digital Ocean)
组装WiFi气象站的硬件
使用flask和Python构造一个Web API,以接受来自Web浏览器的请求并保存数据点
将数据库添加到服务器以保存来自WiFi气象站的数据点
在基于ESP8266的WiFi气象站上上传代码,以使用服务器的Web API发送温度测量值
设置
在本文中,我们将描述项目中使用的服务器设置和微控制器硬件。
前提
服务器
Digital Ocean云服务器(从现在开始仅称为服务器)
连接到服务器的域名
PuTTY或可以SSH进入服务器的终端
服务器上的非root用户sudo用户
以下软件包apt-get安装在服务器上:python3-pip python3-dev python3-setuptools python3-venv build-essential libssl-dev libffi-dev nginx
在服务器上安装了flask和uwsgi pip的Python 3.6虚拟环境
uWSGI和NGINX安装在服务器上的配置上
Flask应用程序作为系统服务运行
附加到域名和NGINX实例的SSL
硬件
以下是用于构建基于ESP8266的WiFi气象站的硬件列表。
请注意,作为该项目的一部分,我使用了两个ESP8266微控制器。 一个ESP8266连接到BMP280温度传感器,另一个ESP8266连接到MCP9808温度传感器。 这两个温度传感器是以前项目中遗留下来的(我本来应该使用两个相同的传感器,但是我所用的是一个BMP280和一个MCP9808)。
一个ESP8266-温度传感器组合用于测量外部温度,另一个ESP8266-温度传感器组合用于测量内部温度。
起点
我构建的flask应用程序是相对基本的,主要包含2个文件:flaskapp.py和index.html。 Digital Ocean服务器上的文件结构如下所示:
~/└── flaskapp ├── flaskapp.ini ├── flaskapp.py ├── flaskapp.sock ├── flaskappenv ├── templates │ ├── index.html └── wsgi.py
~/└── flaskapp ├── flaskapp.ini ├── flaskapp.py ├── flaskapp.sock ├── flaskappenv ├── templates │ ├── index.html └── wsgi.py
~/└── flaskapp ├── flaskapp.ini ├── flaskapp.py ├── flaskapp.sock ├── flaskappenv ├── templates │ ├── index.html └── wsgi.py
~/└── flaskapp ├── flaskapp.ini ├── flaskapp.py ├── flaskapp.sock ├── flaskappenv ├── templates │ ├── index.html └── wsgi.py
~/└── flaskapp ├── flaskapp.ini ├── flaskapp.py ├── flaskapp.sock ├── flaskappenv ├── templates │ ├── index.html └── wsgi.py
~/└── flaskapp ├── flaskapp.ini ├── flaskapp.py ├── flaskapp.sock ├── flaskappenv ├── templates │ ├── index.html └── wsgi.py
~/└── flaskapp ├── flaskapp.ini ├── flaskapp.py ├── flaskapp.sock ├── flaskappenv ├── templates │ ├── index.html └── wsgi.py
~/└── flaskapp ├── flaskapp.ini ├── flaskapp.py ├── flaskapp.sock ├── flaskappenv ├── templates │ ├── index.html └── wsgi.py
~/└── flaskapp ├── flaskapp.ini ├── flaskapp.py ├── flaskapp.sock ├── flaskappenv ├── templates │ ├── index.html └── wsgi.py
运行flask应用程序的主要文件是flaskapp.py
>
flask应用程序用于构建网页的唯一jinja模板位于/ templates目录中,名为index.html:
>
创建了flask应用程序并配置了域名,nginx,uWSGI,systemd和SSL后,该应用程序将在服务器上启动,并具有以下功能:
>
生成的网页如下所示:
Web API
我们已经在Digital Ocean上托管了一个工作Flask应用程序。现在,我们需要将Web API添加到flask应用程序的功能中。
什么是web API
Web API是基于Web的应用程序编程接口。这是一种幻想的说法,即服务器根据服务器从Web浏览器接收的URL保存输入或生成输出。
Web API的一个示例是http://ThingSpeak.com Web API。当网络浏览器(例如chrome)定向到以下URL时:
channel 266256
field 2
last entry
.txt format
如果粘贴到Web浏览器中的URL不同,则http://ThingSpeak.com的响应也将不同。
对上述URL的响应是存储在http://ThingSpeak.com上的数据条目,其对应于:
channel 9
field 1
last entry
.json format
大多数Web API允许您从其服务器中提取数据,但是许多Web API也使您能够在其服务器上放置数据。
如果粘贴到Web浏览器中的URL的格式如下,http://ThingSpeak.com将存储一个新的数据点。
user with an API Key = THECLASSAPIKEY
field = 1
data = 87
我们将使用flask构建的Web API需要完全满足http://ThingSpeak.com Web API实现的两个基本功能:
根据Flask IoT服务器接收的特定URL输出数据点
根据Flask IoT服务器接收的特定URL存储数据点
Web API设计
我们将在Flask IoT服务器Web API中模仿http://ThingSpeak.com Web API的一部分。 为了基于服务器接收的URL存储数据点,我们需要指定URL的结构。 我们基于ESP8266的WiFi气象站需要知道URL格式,才能将数据点发布到Flask IoT服务器上。
数据将基于服务器从基于ESP8266的WiFi气象站接收的URL存储在我们的Flask IoT服务器上。
每个基于ESP8266的WiFi气象站都有几个独特的方面:
用户:每个WiFi气象站都有一个用户。在这种情况下,用户就是我。
mac地址:mac地址是分配给每个硬件的唯一地址。每个基于ESP8266的WiFi气象站都有一个不同的mac地址。
字段:基于ESP8266的WiFi气象站具有输出温度和湿度的功能。 现在,我们将要处理温度,但是最好为同一设备的多个数据流(例如温度和湿度)提供一个额外的字段。
数据:每个基于ESP8266的WiFi气象站的温度测量值。
如果我们将这4个标识符作为Web API URL的一部分,我们的IoT服务器将提供WiFi气象站所需的功能。
我们的Web API URL的一般形式如下:
在上面的网址中,我们提供了:
update(告诉IoT服务器保存数据点,而不仅仅是提供网页)
API_key=ASCIISTR(识别用户)
mac=6c:rf:7f:2b:0e:g8(识别基于ESP8255的WiFi气象站)
field=1(指定数据是温度,而不是湿度)
data=72.3(指定温度为72.3度)
现在,当出现类似于我们上面指定的URL时,我们需要使Flask IoT服务器保存数据点。
构造一个Flask Web API
由于flask可以选择在路由中包含变量,因此在flask中构建Web API非常容易。通用语法如下:
@app.route("/update/key=", methods=['GET'])def update(route_var): # code to run return render_template("index.html")
@app.route("/update/key=", methods=['GET'])def update(route_var): # code to run return render_template("index.html")
@app.route("/update/key=", methods=['GET'])def update(route_var): # code to run return render_template("index.html")
@app.route("/update/key=", methods=['GET'])def update(route_var): # code to run return render_template("index.html")
在上面的代码中,路由"/update/key="中包含变量。 大于/小于符号<>告诉flask路径中有一个变量。 在第二行中,变量route_var(来自@ app.route()行)作为参数传递给update()函数。 最后,update()函数返回一个名为index.html的模板。
建立新路由
在Flask Web API的@ pp.route()URL中分配了四个变量:
参阅构建Flask和Python物联网服务器五部曲:设置、Web API、验证和时间戳记、添加数据库、代码上传viadean.com