Python 物联网入门指南(五)(4)

简介: Python 物联网入门指南(五)

Python 物联网入门指南(五)(3)https://developer.aliyun.com/article/1507235

在新的浏览器窗口中打开前面截图中列出的 URL。它提供了POST请求的 URL 以及如何进行 web 请求的解释(如下截图所示):

使用之前提到的 URL 进行 POST 请求(为了隐私而隐藏密钥)

  1. 在发出请求时(如 IFTTT 文档中所述),如果我们在请求的 JSON 主体中包括自行车的数量(使用Value1),它可以显示在移动通知上。
  2. 让我们重新查看 Python 示例,当自行车数量低于一定阈值时进行网络请求。将IFTTT URL 和您的 IFTTT 访问密钥(从您的 IFTTT 帐户中检索)保存到您的代码中,如下所示:
IFTTT_URL = "https://maker.ifttt.com/trigger/mobile_notify/ 
       with/key/$KEY"
  1. 当自行车数量低于一定阈值时,我们需要使用 JSON 主体中编码的自行车信息进行POST请求:
for station in station_list: 
         if station['id'] == 65 and 
            station['availableBikes'] < 3: 
           print("The available bikes is %d" % 
           station['availableBikes']) 
           payload = {"value1": station['availableBikes']} 
           response = requests.post(IFTTT_URL, json=payload) 
           if response.status_code == 200: 
             print("Notification successfully triggered")
  1. 在上述代码片段中,如果自行车少于三辆,将使用requests模块进行POST请求。可用自行车的数量使用键value1进行编码:
payload = {"value1": station['availableBikes']}
  1. 将所有这些放在一起,我们有这个:
#!/usr/bin/python3 
       import requests 
       import datetime 
       BIKE_URL = "http://feeds.bayareabikeshare.com/stations/
       stations.json" 
       # find your key from ifttt 
       IFTTT_URL = "https://maker.ifttt.com/trigger/mobile_notify/
       with/key/$KEY" 
       if __name__ == "__main__": 
         # fetch the bike share information 
         response = requests.get(BIKE_URL) 
         parsed_data = response.json() 
         station_list = parsed_data['stationBeanList'] 
         for station in station_list: 
           if station['id'] == 65 and 
              station['availableBikes'] < 10: 
             print("The available bikes is %d" % station
             ['availableBikes']) 
  payload = {"value1": station['availableBikes']} 
             response = requests.post(IFTTT_URL, json=payload) 
             if response.status_code == 200: 
               print("Notification successfully triggered")

上述代码示例可与本章一起下载,名称为bike_share.py。在设置 IFTTT 上的配方后尝试执行它。如果需要,调整可用自行车数量的阈值。您应该会收到移动设备上的通知:

在您的移动设备上通知

读者的挑战

在此示例中,自行车信息被获取和解析,如果必要,将触发通知。您将如何修改此代码示例以确保它在一天中的特定时间执行?(提示:使用datetime模块)。

您将如何构建一个作为视觉辅助的桌面显示?

项目挑战

尝试找出您所在地区的交通系统是否向其用户提供此类数据。您将如何利用数据帮助通勤者节省时间?例如,您将如何使用此类数据向您的朋友/同事提供交通系统建议?

完成书后,我们将发布一个类似的示例,使用旧金山湾区快速交通(BART)的数据。

提高你的词汇量

使用 Python 可以提高您的词汇量!想象一下设置一个大型显示屏,它显眼地安装在某个地方,并且每天更新。我们将使用wordnik API(在www.wordnik.com/signup注册 API 密钥)。

  1. 第一步是为 python3 安装wordnik API 客户端:
git clone https://github.com/wordnik/wordnik-python3.git
 cd wordnik-python3/
 sudo python3 setup.py install

wordnik API 有使用限制。有关更多详细信息,请参阅 API 文档。

  1. 让我们回顾一下使用wordnik Python 客户端编写我们的第一个示例。为了获取当天的单词,我们需要初始化WordsApi类。根据 API 文档,可以这样做:
# sign up for an API key 
       API_KEY = 'API_KEY' 
       apiUrl = 'http://api.wordnik.com/v4' 
       client = swagger.ApiClient(API_KEY, apiUrl) 
       wordsApi = WordsApi.WordsApi(client)
  1. 现在WordsApi类已初始化,让我们继续获取当天的单词:
example = wordsApi.getWordOfTheDay()
  1. 这将返回一个WordOfTheDay对象。根据wordnik Python 客户端文档,该对象包括不同的参数,包括单词、其同义词、来源、用法等。当天的单词及其同义词可以打印如下:
print("The word of the day is %s" % example.word) 
       print("The definition is %s" %example.definitions[0].text)
  1. 将所有这些放在一起,我们有这个:
#!/usr/bin/python3 
       from wordnik import * 
       # sign up for an API key 
       API_KEY = 'API_KEY' 
       apiUrl = 'http://api.wordnik.com/v4' 
       if __name__ == "__main__": 
         client = swagger.ApiClient(API_KEY, apiUrl) 
         wordsApi = WordsApi.WordsApi(client) 
         example = wordsApi.getWordOfTheDay() 
         print("The word of the day is %s" % example.word) 
         print("The definition is %s" %example.definitions[0].text)

上述代码片段可与本章一起下载,名称为wordOfTheDay.py。注册 API 密钥,您应该能够检索当天的单词:

The word of the day is transpare
 The definition is To be, or cause to be, transparent; to appear,
       or cause to appear, or be seen, through something.

读者的挑战

您将如何将此应用程序守护程序化,以便每天更新当天的单词?(提示:cronjob 或datetime)。

项目挑战

可以使用wordnik API 构建一个单词游戏。想想一个既有趣又有助于提高词汇量的单词游戏。您将如何构建一个提示玩家并接受答案输入的东西?

尝试在显示器上显示当天的单词。您将如何实现这一点?

日志记录

日志(docs.python.org/3/library/logging.html)有助于解决问题。它通过跟踪应用程序记录的事件序列来确定问题的根本原因。让我们通过一个简单的应用程序来回顾日志。为了回顾日志,让我们通过发出一个POST请求来回顾它:

  1. 日志的第一步是设置日志文件位置和日志级别:
logging.basicConfig(format='%(asctime)s : %(levelname)s :
       %(message)s', filename='log_file.log', level=logging.INFO)

在初始化logging类时,我们需要指定日志信息、错误等的格式到文件中。在这种情况下,格式如下:

format='%(asctime)s : %(levelname)s : %(message)s'

日志消息的格式如下:

2016-10-25 20:28:07,940 : INFO : Starting new HTTPS
       connection (1):
       maker.ifttt.com

日志消息保存在名为log_file.log的文件中。

日志级别确定我们应用程序所需的日志级别。不同的日志级别包括DEBUGINFOWARNERROR

在这个例子中,我们将日志级别设置为INFO。因此,属于INFOWARNINGERROR级别的任何日志消息都将保存到文件中。

如果日志级别设置为ERROR,则只有这些日志消息会保存到文件中。

  1. 让我们根据POST请求的结果记录一条消息:
response = requests.post(IFTTT_URL, json=payload) 
       if response.status_code == 200: 
         logging.info("Notification successfully triggered") 
       else: 
         logging.error("POST request failed")
  1. 将所有这些放在一起,我们有:
#!/usr/bin/python3 
       import requests 
       import logging 
       # find your key from ifttt 
       IFTTT_URL = "https://maker.ifttt.com/trigger/rf_trigger/
       with/key/$key" 
       if __name__ == "__main__": 
         # fetch the bike share information 
         logging.basicConfig(format='%(asctime)s : %(levelname)s
         : %(message)s', filename='log_file.log', level=logging.INFO) 
         payload = {"value1": "Sample_1", "value2": "Sample_2"} 
         response = requests.post(IFTTT_URL, json=payload) 
         if response.status_code == 200: 
           logging.info("Notification successfully triggered") 
         else: 
           logging.error("POST request failed")

前面的代码示例(logging_example.py)可与本章一起下载。这是 Python 中日志概念的一个非常简单的介绍。

Python 中的线程

在本节中,我们将讨论 Python 中的线程概念。线程使得能够同时运行多个进程成为可能。例如,我们可以在监听传感器的同时运行电机。让我们通过一个例子来演示这一点。

我们将模拟一个情况,我们希望处理相同类型传感器的事件。在这个例子中,我们只是打印一些内容到屏幕上。我们需要定义一个函数来监听每个传感器的事件:

def sensor_processing(string): 
  for num in range(5): 
    time.sleep(5) 
    print("%s: Iteration: %d" %(string, num))

我们可以利用前面的函数同时使用 Python 中的threading模块监听三个不同传感器的事件:

thread_1 = threading.Thread(target=sensor_processing, args=("Sensor 1",)) 
thread_1.start() 
thread_2 = threading.Thread(target=sensor_processing, args=("Sensor 2",)) 
thread_2.start() 
thread_3 = threading.Thread(target=sensor_processing, args=("Sensor 3",)) 
thread_3.start()

将所有这些放在一起,我们有:

import threading 
import time 
def sensor_processing(string): 
  for num in range(5): 
    time.sleep(5) 
    print("%s: Iteration: %d" %(string, num)) 
if __name__ == '__main__': 
  thread_1 = threading.Thread(target=sensor_processing, args=("Sensor 1",)) 
  thread_1.start() 
  thread_2 = threading.Thread(target=sensor_processing, args=("Sensor 2",)) 
  thread_2.start() 
  thread_3 = threading.Thread(target=sensor_processing, args=("Sensor 3",)) 
  thread_3.start()

前面的代码示例(可作为threading_example.py下载)启动三个线程,同时监听来自三个传感器的事件。输出看起来像这样:

Thread 1: Iteration: 0 
Thread 2: Iteration: 0 
Thread 3: Iteration: 0 
Thread 2: Iteration: 1 
Thread 1: Iteration: 1 
Thread 3: Iteration: 1 
Thread 2: Iteration: 2 
Thread 1: Iteration: 2 
Thread 3: Iteration: 2 
Thread 1: Iteration: 3 
Thread 2: Iteration: 3 
Thread 3: Iteration: 3 
Thread 1: Iteration: 4 
Thread 2: Iteration: 4 
Thread 3: Iteration: 4

Python 的 PEP8 样式指南

PEP8是 Python 的样式指南,它帮助程序员编写可读的代码。遵循某些约定以使我们的代码可读是很重要的。一些编码约定的例子包括以下内容:

  • 内联注释应以# 开头,后面跟着一个空格。
  • 变量应该遵循以下约定:first_var
  • 避免每行末尾的空格。例如,if name == "test":后面不应该有空格。

你可以在www.python.org/dev/peps/pep-0008/#block-comments阅读完整的 PEP8 标准。

验证 PEP8 指南

有工具可以验证您的代码是否符合 PEP8 标准。编写代码示例后,请确保您的代码符合 PEP8 标准。可以使用pep8包来实现。

pip3 install pep8

让我们检查我们的代码示例是否符合 PEP8 规范。可以按照以下步骤进行:

pep8 opencv_test.py

检查指出了以下错误:

opencv_test.py:5:50: E231 missing whitespace after ','
 opencv_test.py:6:19: E231 missing whitespace after ','

根据输出结果,以下行缺少逗号后的空格,分别是第5行和第6行:

逗号后缺少尾随空格

让我们修复这个问题,并且我们的代码应该遵循 PEP8 规范。重新检查文件,错误将会消失。为了使你的代码可读,总是在将代码提交到公共存储库之前运行 PEP8 检查。

总结

在这一章中,我们讨论了 Python 中的高级主题。我们讨论了包括语音识别、构建通勤信息工具以及改善词汇量的 Python 客户端在内的主题。Python 中有许多在数据科学、人工智能等领域广泛使用的高级工具。我们希望本章讨论的主题是学习这些工具的第一步。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
2天前
|
数据采集 运维 API
适合所有编程初学者,豆瓣评分8.6的Python入门手册开放下载!
Python是一种跨平台的计算机程序设计语言,它可以用来完成Web开发、数据科学、网络爬虫、自动化运维、嵌入式应用开发、游戏开发和桌面应用开发。 Python上手很容易,基本有其他语言编程经验的人可以在1周内学会Python最基本的内容(PS:没有基础的人也可以直接学习,速度会慢一点) 今天给小伙伴们分享一份Python语言及其应用的手册,这份手册主要介绍 Python 语言的基础知识及其在各个领域的具体应用,基于最新版本 3.x。
|
5天前
|
数据可视化 API Python
Python零基础“圣经”!300W小白从入门到精通首选!
今天分享的这本书在让你尽快学会 Python基础知识的同时,能够编写并正确的运行程序(游戏、数据可视化、Web应用程序) 最大的特色在于,在为初学者构建完整的 Python 语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是 后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽 又面面俱到。相信这本书能够得到更多 Python 初学者的喜爱。
|
6天前
|
Python
小白入门必备!计科教授的Python精要参考PDF开放下载!
随着互联网产业的高速发展,在网络上早已积累了极其丰富的Python学习资料,任何人都可以基于这些资源,自学掌握 Python。 但实际上,网络上充斥的资源太多、太杂且不成体系,在没有足够的编程/工程经验之前,仅靠“看”线上资源自学,的确是一件非常困难的事。
|
6天前
|
数据可视化 API Python
豆瓣评分9.4!堪称经典的Python入门圣经,你还没看过吗?
最理想的新人入门书应该满足两个特点:第一就是内容通俗易懂;第二就是要有实战,能够让读者在学完之后知道具体怎么用。 今天给小伙伴们分享的这份Python入门手册,在为初学者构建完整的Python语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽又面面俱到。
|
8天前
|
数据采集 运维 API
适合所有编程初学者,豆瓣评分8.6的Python入门手册开放下载!
Python是一种跨平台的计算机程序设计语言,它可以用来完成Web开发、数据科学、网络爬虫、自动化运维、嵌入式应用开发、游戏开发和桌面应用开发。 Python上手很容易,基本有其他语言编程经验的人可以在1周内学会Python最基本的内容(PS:没有基础的人也可以直接学习,速度会慢一点)
|
9天前
|
数据采集 SQL 数据可视化
使用Python和Pandas库进行数据分析的入门指南
使用Python和Pandas库进行数据分析的入门指南
73 0
|
9天前
|
Linux iOS开发 MacOS
Python入门指南
Python入门指南
33 0
|
10天前
|
数据采集 前端开发 JavaScript
Python爬虫入门
网络爬虫是自动抓取网页数据的程序,通过URL获取网页源代码并用正则表达式提取所需信息。反爬机制是网站为防止爬取数据设置的障碍,而反反爬是对这些机制的对策。`robots.txt`文件规定了网站可爬取的数据。基础爬虫示例使用Python的`urllib.request`模块。HTTP协议涉及请求和响应,包括状态码、头部和主体。`Requests`模块是Python中常用的HTTP库,能方便地进行GET和POST请求。POST请求常用于隐式提交表单数据,适用于需要发送复杂数据的情况。
16 1
|
13天前
|
机器学习/深度学习 人工智能 数据可视化
Python编程入门:从零开始探索编程的奇妙世界
这篇教程引导初学者入门Python编程,从安装Python开始,逐步讲解基本语法,如`print()`、变量、条件判断、循环以及自定义函数。文章强调了Python在数据处理、数据分析、人工智能和机器学习等领域的重要性,并鼓励学习者探索Python的广泛应用,开启编程之旅。
|
14天前
|
数据可视化 API Python
Python零基础“圣经”!300W小白从入门到精通首选!
今天分享的这本书在让你尽快学会 Python基础知识的同时,能够编写并正确的运行程序(游戏、数据可视化、Web应用程序) 最大的特色在于,在为初学者构建完整的 Python 语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是 后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽 又面面俱到。相信这本书能够得到更多 Python 初学者的喜爱。