实战百度天工云

来源:互联网 发布:湖南银楼软件下载 编辑:程序博客网 时间:2024/04/30 15:08

一、概要

       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 timeimport paho.mqtt.client as mqttimport datetimeimport sys, urllib, urllib2, jsondef 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 = 1884topic = "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=60client.on_connect = on_connect #连接后的操作client.loop_start()time.sleep(2)count = 0area = "suzhou"url = 'http://www.pm25.in/api/querys/pm2_5.json?city=%s&token=5j1znBVAsnSf5xQyNQyq'%areawhile 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 hashlibimport hmacimport stringimport datetimeimport timefrom baidubce.auth.bce_credentials import BceCredentialsfrom baidubce.auth import bce_v1_signerimport sys, urllib, urllib2, jsonif __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

原创粉丝点击