一、概要
1.平台架构
2.DEMO介绍
外部数据 接口(入) 百度云 接口(出) 应用
天气数据 MQTT 物接入 规则引擎 TSDB Restful API 个人或者企业应用
二、物接入
1.概念
物接入IoT Hub 是全托管的云服务,可以在智能设备与云端之间建立安全的双向连接,并通过主流的物联网协议(如MQTT)通讯,快速实现物联网项目(抄的官方介绍)。
简单描述:抽象了物的概念,使得外部数据通过mqtt协议接入云端。
2.mqtt
MQTT(Message Queuing Telemetry Transport Protocol)的全称是消息队列遥感传输协议的缩写,是一种基于轻量级代理的发布/订阅模式的消息传输协议,运行在TCP协议栈之上,为其提供有序、可靠、双向连接的网络连接保证。
2.1 MQTT模型
客户端只需要把数据发给代理服务器,代理服务器会将数据传给订阅客户端。这里的客户端既可以是发布者又可以是订阅者。
百度云物接入配置参照文档:
https://cloud.baidu.com/doc/IOT/GettingStarted.html#.E5.88.9B.E5.BB.BA.E7.89.A9.E6.8E.A5.E5.85.A5.E5.AE.9E.E4.BE.8B
三、规则引擎
1.概览
2.目的
规则引擎可以简单的理解将物接入的数据做简单处理后,放入TSDB。
四、时序数据库
1.概念
在物联网时代,企业需要处理各种设备产生的带有时间标签的数据,即时间序列数据。时间序列数据主要由各类型实时监测、检查与分析设备所采集或产生,涉及电力行业、化工等行业。这些工业数据的典型特点是:产生频率快、严重依赖于采集时间、测点多信息量大等。普通关系型数据库无法高效地处理此类数据。为了更好的处理时间序列数据,时序数据库(Time Series Database,下简称TSDB)应运而生。TSDB是用于管理时间序列数据的专业化数据库。区别于传统的关系型数据库,TSDB针对时间序列数据的存储、查询和展现进行了专门的优化,从而获得极高的数据压缩能力、极优的查询性能,特别适用于物联网应用场景。
2.作为数据云端存储的路径,为其他应用提供接口。
五、代码
1.外部数据(入口)
1.1功能:获取实时pm2.5数据传给百度云物接入
1.2 代码:
# -*- coding: utf8 -*-
import time
import paho.mqtt.client as mqtt
import datetime
import sys, urllib, urllib2, json
def on_publish(msg, rc): #成功发布消息的操作
if rc == 0:
print("publish success, msg = " + msg)
def on_connect(client, userdata, flags, rc): #连接后的操作 0为成功
print("Connection returned " + str(rc))
client = mqtt.Client(
client_id="test_mqtt_sender_1", #用来标识设备的ID,用户可自己定义,在同一个实例下,每个实体设备需要有一个唯一的ID
clean_session=True,
userdata=None,
protocol='MQTTv311'
)
trust = "./root_cert.pem" #开启TLS时的认证文件目录
user = "weather/thing1"
pwd = "XXXXXXXXXXXXXXXXXXXXXXXXXX" #换成自己的
endpoint = "weather.mqtt.iot.gz.baidubce.com"
port = 1884
topic = "test-iot-server"
client.tls_set(trust) #设置认证文件
client.tls_insecure_set(True) #检查hostname的cert认证
# client.tls_set_context()
client.username_pw_set(user, pwd) #设置用户名,密码
client.connect(endpoint, port, 60) #连接服务 keepalive=60
client.on_connect = on_connect #连接后的操作
client.loop_start()
time.sleep(2)
count = 0
area = "suzhou"
url = 'http://www.pm25.in/api/querys/pm2_5.json?city=%s&token=5j1znBVAsnSf5xQyNQyq'%area
while True:
req = urllib2.Request(url)
resp = urllib2.urlopen(req)
content = resp.read()
msg = str(json.loads(content)[0]["pm2_5"])
send_mseg = '{"pm_25": %s,"area":"%s","time":"%s"}'%(msg,area,datetime.datetime.now())
print(send_mseg)
rc , mid = client.publish(topic, payload=send_mseg, qos=1) #qos
on_publish(send_mseg, rc)
time.sleep(10)
2.数据读取(TSDB restful api)
1.1功能:通过调用TSDB restful api来查询数据
1.2代码:
# -*- coding: UTF-8 -*-
import hashlib
import hmac
import string
import datetime
import time
from baidubce.auth.bce_credentials import BceCredentials
from baidubce.auth import bce_v1_signer
import sys, urllib, urllib2, json
if __name__ == "__main__":
credentials = BceCredentials("XXXXXXX","XXXXXXXXXXXXXXXX") #换成自己的
http_method = "PUT"
path = "/v1/datapoint"
headers = {"host": "dbtest.tsdb.iot.gz.baidubce.com"}
params = {'query':''}
timestamp = 0
headers_to_sign = {"host"}
result = bce_v1_signer.sign(credentials, http_method, path, headers, params, timestamp, 1800, headers_to_sign)
print result
# 请求百度TSDB的目录
url = 'https://dbtest.tsdb.iot.gz.baidubce.com'
# half_url = u'/v1/metric'
half_url = u'/v1/datapoint?query'
#构造get请求
req = urllib2.Request(url+half_url.encode('utf-8'))
#添加header
req.add_header('Authorization', result)
req.add_header('Host','dbtest.tsdb.iot.gz.baidubce.com')
req.add_header('Content-Type','application/json; charset=utf-8')
# req.get_body("")
# 构造put
req.get_method = lambda: 'PUT'
req_data = "{\"queries\": [{\"metric\": \"pm_25\",\"filters\": {\"start\": 0},\"limit\":1000}],\"disablePresampling\":false}"
response = urllib2.urlopen(req,req_data)
print response.read()
参考:
百度云官方文档:https://cloud.baidu.com/doc/index.html