物联网与仪表盘:从基础到实践
1. 物联网概述
1.1 物联网的发展
物联网(IoT)的起源可以追溯到20世纪60年代末的ARPANET,最初它仅连接了四所大学,到1970年底增长到10个节点。在过去的50年里,全球连接到互联网的计算机、智能手机、平板电脑和其他各类设备已达数十亿。任何连接到互联网的设备都是物联网中的“物”。
1.2 IP地址的演变
每个设备都有一个唯一的互联网协议地址(IP地址)来标识。随着连接设备的爆炸式增长,大约43亿个可用的IPv4地址已耗尽,这促使了IPv6的发展,IPv6支持约3.4×10³⁸个地址。
1.3 物联网设备类型
物联网设备的类型繁多,以下是一些常见的类型:
| 设备类型 | 具体示例 |
| — | — |
| 活动追踪器 | Apple Watch、FitBit等 |
| 智能音箱 | Amazon Echo(Alexa)、Apple HomePod(Siri)、Google Home(Google Assistant) |
| 家电 | 烤箱、咖啡机、冰箱等 |
| 自动驾驶汽车 | - |
| 传感器 | 化学、气体、GPS、湿度、光线、运动、压力、温度等传感器 |
| 智能家居设备 | 灯光、车库开门器、摄像机、门铃、灌溉控制器、安全设备、智能锁、智能插头、烟雾探测器、恒温器、通风口等 |
| 地震和海啸传感器 | - |
| 追踪设备 | - |
| 酒窖冰箱 | - |
| 无线网络设备 | - |
1.4 物联网面临的问题
尽管物联网带来了很多机遇,但也存在许多安全、隐私和伦理问题:
-
安全问题
:未受保护的物联网设备可能被用于对计算机系统进行分布式拒绝服务(DDOS)攻击。
-
隐私问题
:家庭安全摄像头可能被黑客攻击,导致他人可以访问视频流;语音控制设备始终处于“监听”状态,可能引发隐私和安全担忧。例如,儿童可能会意外通过与Alexa设备对话在亚马逊上订购产品,公司也可能通过触发词激活Google Home设备。
-
伦理问题
:一些人担心这些设备可能被用于窃听。最近,一位法官下令亚马逊交出Alexa录音用于刑事案件。
2. 发布/订阅模型
2.1 基本概念
物联网设备(以及许多其他类型的设备和应用程序)通常通过发布/订阅(pub/sub)系统相互通信。发布者是向基于云的服务发送消息的设备或应用程序,该服务会将消息发送给所有订阅者。每个发布者通常指定一个主题或频道,每个订阅者指定一个或多个他们希望接收消息的主题或频道。
2.2 常用的pub/sub系统
常见的pub/sub系统包括PubNub、Dweet.io和Apache Kafka。Apache Kafka是Hadoop生态系统的一个组件,提供高性能的发布/订阅服务、实时流处理和流式数据存储。
3. 使用Freeboard.io可视化PubNub样本实时流
3.1 PubNub服务简介
PubNub是一个面向实时应用的pub/sub服务,任何连接到互联网的软件和设备都可以通过小消息进行通信。其常见用例包括物联网、聊天、在线多人游戏、社交应用和协作应用。PubNub提供了几个用于学习的实时流,包括一个模拟物联网传感器的流。
3.2 Freeboard.io简介
Freeboard.io是一个基于云的动态仪表盘可视化工具,无需编写代码,就可以轻松连接到各种数据流并可视化数据。它除了提供付费服务外,还在GitHub上提供了一个开源版本(选项较少),并提供了如何添加自定义插件的教程。
3.3 操作步骤
3.3.1 注册Freeboard.io
在https://freeboard.io/signup注册一个30天的免费试用版。注册后,会出现“My Freeboards”页面,你可以点击“Try a Tutorial”按钮来可视化来自智能手机的数据。
3.3.2 创建新仪表盘
在“My Freeboards”页面的右上角,在“enter a name”字段中输入“Sensor Dashboard”,然后点击“Create New”按钮创建一个仪表盘,此时会显示仪表盘设计器。
3.3.3 添加数据源
在设计仪表盘之前添加数据源,这样可以在添加每个可视化组件时进行配置:
1. 在“DATASOURCES”下,点击“ADD”指定一个新的数据源。
2. 在“DATASOURCE”对话框的“TYPE”下拉列表中选择“PubNub”。从https://www.pubnub.com/developers/realtime-data-streams/sensor-network/复制PubNub传感器网络页面上的“Channel”和“Subscribe key”值,并将其插入到“DATASOURCE”对话框的相应字段中。为数据源提供一个名称,然后点击“SAVE”。
3.3.4 添加湿度传感器面板
Freeboard.io仪表盘被划分为多个面板,用于分组可视化组件。可以拖动多个面板进行重新排列。点击“+ Add Pane”按钮添加一个新面板,点击面板上的扳手图标,在“TITLE”中输入“Humidity”,然后点击“SAVE”。
3.3.5 添加湿度传感器的仪表和迷你图
- 添加仪表 :点击面板的“+”按钮,在“TYPE”下拉列表中选择“Gauge”。在“VALUE”字段右侧点击“+ DATASOURCE”,选择数据源名称,然后点击“humidity”选择湿度传感器的值。在“UNITS”中指定“%”,然后点击“SAVE”。如果需要,可以使用JavaScript表达式对湿度值进行四舍五入,例如在“VALUE”字段前插入“Math.round(”,字段后插入“)”,然后点击“SAVE”。
- 添加迷你图 :点击湿度面板的“+”按钮,在“TYPE”下拉列表中选择“Sparkline”。对于“VALUE”,再次选择数据源和“humidity”,然后点击“SAVE”。
3.3.6 完成仪表盘
使用上述技术再添加两个面板,分别命名为“Radiation Level”和“Ambient Temperature”,并将它们拖动到第一个面板的右侧。为每个面板配置一个仪表和迷你图。对于“Radiation Level”仪表,在“UNITS”中指定“Millirads/Hour”,“MAXIMUM”设置为400;对于“Ambient Temperature”仪表,在“UNITS”中指定“Celsius”,“MAXIMUM”设置为50。
4. 在Python中模拟联网恒温器
4.1 模拟的重要性
模拟是计算机的重要应用之一,在物联网开发中,通常使用模拟器来测试应用程序,特别是在开发过程中无法访问实际设备和传感器时。许多云供应商都具备物联网模拟功能,如IBM Watson IoT Platform和IOTIFY.io。
4.2 安装Dweepy
要使用Python向dweet.io发布消息,首先需要安装Dweepy库:
pip install dweepy
你可以在https://github.com/paddycarey/dweepy查看其文档。
4.3 运行模拟器脚本
模拟恒温器的Python脚本
simulator.py
位于
ch16
示例文件夹的
iot
子文件夹中。使用两个命令行参数来调用模拟器,分别表示要模拟的消息总数和发送消息之间的延迟(秒):
ipython simulator.py 1000 1
4.4 发送dweets
以下是
simulator.py
的代码:
# simulator.py
"""A connected thermostat simulator that publishes JSON
messages to dweet.io"""
import dweepy
import sys
import time
import random
MIN_CELSIUS_TEMP = -25
MAX_CELSIUS_TEMP = 45
MAX_TEMP_CHANGE = 2
# get the number of messages to simulate and delay between them
NUMBER_OF_MESSAGES = int(sys.argv[1])
MESSAGE_DELAY = int(sys.argv[2])
dweeter = 'temperature-simulator-deitel-python' # provide a unique name
thermostat = {'Location': 'Boston, MA, USA',
'Temperature': 20,
'LowTempWarning': False,
'HighTempWarning': False}
print('Temperature simulator starting')
for message in range(NUMBER_OF_MESSAGES):
# generate a random number in the range -MAX_TEMP_CHANGE
# through MAX_TEMP_CHANGE and add it to the current temperature
thermostat['Temperature'] += random.randrange(
-MAX_TEMP_CHANGE, MAX_TEMP_CHANGE + 1)
# ensure that the temperature stays within range
if thermostat['Temperature'] < MIN_CELSIUS_TEMP:
thermostat['Temperature'] = MIN_CELSIUS_TEMP
if thermostat['Temperature'] > MAX_CELSIUS_TEMP:
thermostat['Temperature'] = MAX_CELSIUS_TEMP
# check for low temperature warning
if thermostat['Temperature'] < 3:
thermostat['LowTempWarning'] = True
else:
thermostat['LowTempWarning'] = False
# check for high temperature warning
if thermostat['Temperature'] > 35:
thermostat['HighTempWarning'] = True
else:
thermostat['HighTempWarning'] = False
# send the dweet to dweet.io via dweepy
print(f'Messages sent: {message + 1}\r', end='')
dweepy.dweet_for(dweeter, thermostat)
time.sleep(MESSAGE_DELAY)
print('Temperature simulator finished')
在第一次调用
dweepy
的
dweet_for
函数发送dweet时,dweet.io会创建设备名称。执行脚本后,可以在浏览器中访问https://dweet.io/follow/temperature-simulator-deitel-python来跟踪消息。如果使用了不同的设备名称,需要替换相应的名称。该网页包含两个标签:“Visual”标签显示单个数据项,为任何数值显示一个迷你图;“Raw”标签显示Dweepy发送到dweet.io的实际JSON消息。
5. 使用Freeboard.io创建仪表盘
5.1 默认仪表盘
dweet.io和freeboard.io由同一家公司运营。在dweet.io网页中,点击“Create a Custom Dashboard”按钮可以打开一个新的浏览器标签,其中已经为温度传感器实现了一个默认仪表盘。默认情况下,freeboard.io会配置一个名为Dweet的数据源,并自动生成一个仪表盘,为dweet JSON中的每个值创建一个面板,每个面板内的文本小部件会在消息到达时显示相应的值。
5.2 自定义仪表盘
如果你想创建自己的仪表盘,可以使用前面介绍的步骤创建一个数据源(这次选择Dweepy),并创建新的面板和小部件,也可以修改自动生成的仪表盘。以下是一个包含四个小部件的仪表盘示例:
| 小部件类型 | 配置说明 |
| — | — |
| 仪表小部件 | 显示当前温度。在“VALUE”设置中选择数据源的“Temperature”字段,将“UNITS”设置为“Celsius”,“MINIMUM”和“MAXIMUM”值分别设置为 -25 和 45 度。 |
| 文本小部件 | 以华氏度显示当前温度。将“INCLUDE SPARKLINE”和“ANIMATE VALUE CHANGES”设置为“YES”,在“VALUE”设置中选择数据源的“Temperature”字段,在字段末尾添加“* 9 / 5 + 32”进行摄氏度到华氏度的转换,在“UNITS”字段中指定“Fahrenheit”。 |
| 指示灯小部件(低温警告) | 在“VALUE”设置中选择数据源的“LowTempWarning”字段,将“TITLE”设置为“Freeze Warning”,“ON TEXT”值设置为“LOW TEMPERATURE WARNING”。 |
| 指示灯小部件(高温警告) | 在“VALUE”设置中选择数据源的“HighTempWarning”字段,将“TITLE”设置为“High Temperature Warning”,“ON TEXT”值设置为“HIGH TEMPERATURE WARNING”。 |
6. 创建Python PubNub订阅者
6.1 PubNub样本流
PubNub提供了
pubnub
Python模块,方便进行发布/订阅操作。同时,它还提供了七个样本流供你进行实验,包括四个实时流和三个模拟流:
| 样本流名称 | 说明 |
| — | — |
| Twitter Stream | 每秒提供多达50条来自Twitter实时流的推文,无需Twitter凭证。 |
| Hacker News Articles | 该网站的近期文章。 |
| State Capital Weather | 美国各州首府的天气数据。 |
| Wikipedia Changes | Wikipedia编辑的流。 |
| Game State Sync | 多人游戏的模拟数据。 |
| Sensor Network | 辐射、湿度、温度和环境光传感器的模拟数据。 |
| Market Orders | 五家公司的模拟股票订单。 |
6.2 安装pubnub模块
在Python中使用PubNub之前,需要安装最新版本的
pubnub
模块:
pip install "pubnub>=4.1.2"
6.3 消息格式
模拟的市场订单流返回包含五个键值对的JSON对象,键分别为
'bid_price'
、
'order_quantity'
、
'symbol'
、
'timestamp'
和
'trade_type'
。在这个示例中,我们只使用
'bid_price'
和
'symbol'
。PubNub客户端将JSON数据作为Python字典返回。
6.4 代码实现
以下是
stocklistener.py
的代码:
# stocklistener.py
"""Visualizing a PubNub live stream."""
from matplotlib import animation
import matplotlib.pyplot as plt
import pandas as pd
import random
import seaborn as sns
import sys
from pubnub.callbacks import SubscribeCallback
from pubnub.enums import PNStatusCategory
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub
companies = ['Apple', 'Bespin Gas', 'Elerium', 'Google', 'Linen Cloth']
# DataFrame to store last stock prices
companies_df = pd.DataFrame(
{'company': companies, 'price' : [0, 0, 0, 0, 0]})
class SensorSubscriberCallback(SubscribeCallback):
"""SensorSubscriberCallback receives messages from PubNub."""
def __init__(self, df, limit=1000):
"""Create instance variables for tracking number of tweets."""
self.df = df # DataFrame to store last stock prices
self.order_count = 0
self.MAX_ORDERS = limit # 1000 by default
super().__init__() # call superclass's init
def status(self, pubnub, status):
if status.category == PNStatusCategory.PNConnectedCategory:
print('Connected to PubNub')
elif status.category == PNStatusCategory.PNAcknowledgmentCategory:
print('Disconnected from PubNub')
def message(self, pubnub, message):
symbol = message.message['symbol']
bid_price = message.message['bid_price']
print(symbol, bid_price)
self.df.at[companies.index(symbol), 'price'] = bid_price
self.order_count += 1
# if MAX_ORDERS is reached, unsubscribe from PubNub channel
if self.order_count == self.MAX_ORDERS:
pubnub.unsubscribe_all()
def update(frame_number):
"""Configures bar plot contents for each animation frame."""
plt.cla() # clear old barplot
axes = sns.barplot(
data=companies_df, x='company', y='price', palette='cool')
axes.set(xlabel='Company', ylabel='Price')
plt.tight_layout()
if __name__ == '__main__':
sns.set_style('whitegrid') # white background with gray grid lines
figure = plt.figure('Stock Prices') # Figure for animation
# 创建PubNub配置
pnconfig = PNConfiguration()
pnconfig.subscribe_key = "your_subscribe_key" # 替换为实际的订阅密钥
pubnub = PubNub(pnconfig)
# 创建订阅回调
callback = SensorSubscriberCallback(companies_df)
# 订阅市场订单流
pubnub.add_listener(callback)
pubnub.subscribe().channels('market_orders').execute()
# 设置动画
ani = animation.FuncAnimation(figure, update, interval=100)
# 显示图形
plt.show()
6.5 代码说明
-
SensorSubscriberCallback类 :继承自SubscribeCallback,用于接收PubNub的消息和状态通知。__init__方法存储用于存储股票价格的DataFrame,status方法处理连接和断开连接的状态通知,message方法在新消息到达时更新DataFrame中的股票价格,并在达到最大订单数时取消订阅。 -
update函数 :使用Seaborn的barplot函数可视化companies_dfDataFrame中的数据,每次动画帧更新时清除旧的条形图并重新绘制。 - 主程序 :设置Seaborn的绘图风格,创建一个图形对象,创建PubNub配置和订阅回调,订阅市场订单流,设置动画并显示图形。
通过以上步骤,你可以深入了解物联网的基本概念、发布/订阅模型,并通过实际操作掌握如何使用Freeboard.io创建仪表盘、模拟物联网设备和创建Python PubNub订阅者。
7. 总结与拓展
7.1 关键知识点回顾
- 物联网基础 :物联网设备通过唯一的IP地址连接到互联网,随着设备数量的爆炸式增长,IPv6应运而生以解决IPv4地址耗尽的问题。物联网设备类型丰富多样,但也面临着安全、隐私和伦理等诸多问题。
- 发布/订阅模型 :这是物联网设备和应用程序常用的通信方式,PubNub、Dweet.io和Apache Kafka是常见的pub/sub系统。
- 可视化与模拟 :可以使用Freeboard.io轻松创建仪表盘来可视化各种数据源,如PubNub的实时流和模拟的物联网设备数据。同时,使用Python可以模拟物联网设备,如联网恒温器,并将数据发布到dweet.io。
7.2 拓展应用场景
- 工业物联网 :在制造业中,物联网设备可以实时监测生产设备的运行状态、温度、压力等参数,通过仪表盘可视化这些数据,帮助企业及时发现设备故障,提高生产效率和质量。
- 智能农业 :利用物联网传感器监测土壤湿度、温度、光照等环境参数,通过发布/订阅模型将数据传输到云端,农民可以通过仪表盘实时了解农田情况,实现精准灌溉和施肥。
7.3 未来发展趋势
- 人工智能与物联网的融合 :人工智能技术可以对物联网产生的大量数据进行分析和处理,实现智能决策和预测。例如,通过机器学习算法预测设备故障,提前进行维护。
- 5G技术的推动 :5G的高速、低延迟特性将进一步促进物联网的发展,使得更多的设备能够实时连接和通信,为物联网应用带来更广阔的发展空间。
8. 流程图总结
8.1 创建Freeboard.io仪表盘流程图
graph LR
A[注册Freeboard.io] --> B[进入My Freeboards页面]
B --> C[创建新仪表盘]
C --> D[添加数据源]
D --> E[添加面板]
E --> F[添加小部件]
F --> G[完成仪表盘配置]
8.2 模拟联网恒温器流程图
graph LR
A[安装Dweepy库] --> B[运行simulator.py脚本]
B --> C[生成随机温度变化]
C --> D[检查温度范围]
D --> E[判断是否触发警告]
E --> F[发送dweet到dweet.io]
F --> G[等待指定时间]
G --> C
8.3 创建Python PubNub订阅者流程图
graph LR
A[安装pubnub模块] --> B[配置PubNub]
B --> C[创建订阅回调]
C --> D[订阅样本流]
D --> E[接收消息并更新数据]
E --> F[可视化数据]
9. 常见问题解答
9.1 Freeboard.io相关问题
-
问
:Freeboard.io的开源版本和付费版本有什么区别?
答 :开源版本选项较少,付费版本提供更多的功能和服务。同时,付费版本可能会有更好的技术支持和更新频率。 -
问
:如何添加自定义插件到Freeboard.io仪表盘?
答 :Freeboard.io提供了教程,你可以参考这些教程开发自己的自定义插件,并添加到仪表盘上。
9.2 模拟和订阅相关问题
-
问
:如果没有实际的物联网设备,如何测试应用程序?
答 :可以使用模拟器来测试应用程序,如本文中使用Python模拟联网恒温器。许多云供应商也提供了物联网模拟功能,如IBM Watson IoT Platform和IOTIFY.io。 -
问
:PubNub的样本流有使用限制吗?
答 :一般来说,PubNub的样本流是用于学习和实验的,可能会有一定的使用限制。具体限制可以参考PubNub的官方文档。
10. 资源推荐
10.1 学习资料
- 书籍 :《物联网:技术、应用与创新》《Python数据分析实战》等书籍可以帮助你深入了解物联网和Python编程。
- 在线课程 :Coursera、Udemy等平台上有许多关于物联网、Python编程和数据可视化的课程,可以根据自己的需求选择学习。
10.2 工具和平台
- 物联网平台 :除了本文介绍的PubNub、dweet.io和Freeboard.io,还有AWS IoT、Azure IoT等知名的物联网平台,可以提供更强大的功能和服务。
- 数据分析工具 :Python的Pandas、NumPy、Seaborn等库,以及R语言都是进行数据分析和可视化的强大工具。
通过本文的介绍和实践,你已经对物联网和仪表盘有了较为深入的了解。希望你能够将所学知识应用到实际项目中,不断探索和创新,为物联网的发展贡献自己的力量。
超级会员免费看
40

被折叠的 条评论
为什么被折叠?



