实战百度天工云

一、概要

       1.平台架构




       2.DEMO介绍

                        外部数据          接口(入)                        百度云                           接口(出)                              应用

                        天气数据          MQTT            物接入        规则引擎       TSDB        Restful API                      个人或者企业应用


二、物接入

    1.概念

        物接入IoT Hub 是全托管的云服务,可以在智能设备与云端之间建立安全的双向连接,并通过主流的物联网协议(如MQTT)通讯,快速实现物联网项目(抄的官方介绍)。

        简单描述:抽象了物的概念,使得外部数据通过mqtt协议接入云端。

    2.mqtt

               MQTT(Message Queuing Telemetry Transport Protocol)的全称是消息队列遥感传输协议的缩写,是一种基于轻量级代理的发布/订阅模式的消息传输协议,运行在TCP协议栈之上,为其提供有序、可靠、双向连接的网络连接保证。

            2.1 MQTT模型

              

        实战百度天工云_第1张图片

          客户端只需要把数据发给代理服务器,代理服务器会将数据传给订阅客户端。这里的客户端既可以是发布者又可以是订阅者。


百度云物接入配置参照文档:

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张图片

       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

你可能感兴趣的:(python)