乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      樹莓派 + EMQX + eKuiper 搭建智能家居網關,實現邊緣計算

       風聲之家 2022-10-09 發(fā)布于江蘇

      智能家居系統(tǒng)利用大量的物聯(lián)網設備(如溫濕度傳感器、安防系統(tǒng)、照明系統(tǒng))實時監(jiān)控家庭內部狀態(tài),完成智能調節(jié)、人機互動。隨著物聯(lián)網技術的發(fā)展,其應用范圍、數據規(guī)模、市場份額將進一步擴大,智能家居設備之間的智能聯(lián)動也將變的越來越困難,同時由于家庭數據的隱私性,用戶數據上傳至云端處理還有一定的安全問題。

      為此我們將使用 Raspberry Pi + EMQX + eKuiper 搭建智能家居網關,實現智能家居設備數據的邊緣計算處理,減少家庭私密數據外流。

      本次教程中我們將用 BH1750FVI 光照強度傳感器采集家庭光照強度數據,使用 eKuiper 對光照強度數據進行分析和處理,并依據預先定義的數據規(guī)則對 LED 燈進行相應的控制。

      所需組件

      樹莓派 3b+ 以及更高版本

      樹莓派3代B+ 型是一款基于 ARM 的微型計算機主板,以 SD/MicroSD卡進行存儲,該主板提供 USB 接口和以太網接口,可以連接鍵盤、鼠標和網線,該主板具備 PC 的基本功能,同時樹莓派集成了 Wi-Fi,藍牙以及大量 GPIO,是智能家居網關的理想選擇。

      EMQX

      智能家居設備之間通信協(xié)議有 MQTT, Wi-Fi, 藍牙 等,其中 MQTT 協(xié)議 是基于發(fā)布/訂閱模式的物聯(lián)網通信協(xié)議,它簡單易實現、支持 QoS、報文小。在本文中我們將使 MQTT 協(xié)議作為智能家居設備之間的通信協(xié)議。

      由于 Raspberry Pi 內存以及處理能力有限,我們選擇由 EMQ 開源的 EMQX 作為 MQTT broker,EMQX 是開源云原生分布式物聯(lián)網 MQTT 消息服務器,支持部署在資源受限的物聯(lián)網邊緣硬件。

      eKuiper

      智能家居設備之間數據傳輸格式不同,并且數據存在波動性,我們需要對設備上報的數據進行處理。在本文中我們將使用由 EMQ 開源的 EMQX Kuiper 對智能家居設備數據進行邊緣化處理,EMQX Kuiper 是基于 SQL 的輕量級邊緣流式消息處理引擎,可以運行在資源受限的邊緣設備上。

      通過實時分析智能家居設備的各類數據,可以實現對設備的即時狀態(tài)管理與控制。

      其他組件

      • BH1750FVI 光照強度傳感器

      • LED

      • 330 Ω電阻

      • 面包板, 跳線若干

      項目示意圖

      環(huán)境搭建

      電路連接

      樹莓派配置

      我們選擇 raspbian 8 作為樹莓派操作系統(tǒng),并選擇 python 3 作為項目編程語言

      # 創(chuàng)建名為 smart-home-hubs 的項目目錄
      mkdir ~/smart-home-hubs

      EMQX 安裝與運行

      $ cd ~/smart-home-hubs
      # 下載軟件包
      $ wget https://www./zh/downloads/edge/v4.1.0/emqx-edge-raspbian8-v4.1.0.zip
      $ unzip emqx-edge-raspbian8-v4.1.0.zip
      $ cd ./emqx
      # 運行 EMQX Edge
      $ ./bin/emqx start

      eKuiper 安裝與運行

      $ cd ~/smart-home-hubs
      # 下載軟件包
      $ wget https://github.com/emqx/kuiper/releases/download/0.4.2/kuiper-0.4.2-linux-armv7l.zip
      $ unzip kuiper-0.4.2-linux-armv7l.zip
      $ mv kuiper-0.4.2-linux-armv7l ./kuiper
      $ cd ./kuiper
      # 創(chuàng)建 rules 目錄,用來存放規(guī)則文件
      $ mkdir ./rules
      # 運行 EMQX Kuiper
      $ ./bin/server

      代碼編寫

      BH1750FVI 光照傳感器數據上傳

      編寫代碼讀取并計算 BH1750FVI 傳感器光照強度數據,并以 1次/秒 的頻率將光照強度數據通過 MQTT協(xié)議 發(fā)布到 smartHomeHubs/light 主題上。

      # gy30.py
      import json
      import time
      
      import smbus
      from paho.mqtt import client as mqtt
      
      
      # BH1750FVI config
      DEVICE = 0x23  # Default device I2C address
      POWER_DOWN = 0x00
      POWER_ON = 0x01
      RESET = 0x07
      CONTINUOUS_LOW_RES_MODE = 0x13
      CONTINUOUS_HIGH_RES_MODE_1 = 0x10
      CONTINUOUS_HIGH_RES_MODE_2 = 0x11
      ONE_TIME_HIGH_RES_MODE_1 = 0x20
      ONE_TIME_HIGH_RES_MODE_2 = 0x21
      ONE_TIME_LOW_RES_MODE = 0x23
      bus = smbus.SMBus(1)
      
      # MQTT broker config
      broker = '127.0.0.1'
      port = 1883
      topic = 'smartHomeHubs/light'
      
      def read_light():
          data = bus.read_i2c_block_data(DEVICE, ONE_TIME_HIGH_RES_MODE_1)
          light_level = round((data[1] + (256 * data[0])) / 1.2, 2)
          return light_level
      
      
      def connect_mqtt():
          client = mqtt.Client(client_id='light_01')
          client.connect(host=broker, port=port)
          return client
      
      
      def run():
          mqtt_client = connect_mqtt()
          while True:
              light_level = read_light()
              publish_msg = {'lightLevel': light_level}
              mqtt_client.publish(
                  topic,
                  payload=json.dumps(publish_msg)
              )
              print(publish_msg)
              time.sleep(1)
      
      
      if __name__ == "__main__":
          run()

      配置 EMQX Kuiper 流處理規(guī)則

      我們將在 eKuiper 上創(chuàng)建名為 smartHomeHubs 的流,并配置規(guī)則對光照強度數據進行實時分析,以實現對 LED 燈的控制。

      本文中我們將計算光照強度平均值,當平均光照強度 持續(xù) 5 秒 小于 55 時開啟 LED(大于 55 時關閉 LED)。

      • 創(chuàng)建流

      $ cd ~/smart-home-hubs/kuiper
      
      $ ./bin/cli create stream smartHomeHubs '(lightLevel float) WITH (FORMAT="JSON", DATASOURCE="smartHomeHubs/light")'
      • 編寫開啟 LED 規(guī)則(./rules/onLed.rule)

      當持續(xù) 5 秒鐘平均光照強度小于 55 時,向 smartHomeHubs/led 主題發(fā)送 "{\"status\": \"on\"}" 消息打開 LED。

      {
         "sql":"SELECT avg(lightLevel) as avg_light from smartHomeHubs group by TUMBLINGWINDOW(ss, 5) having avg_light < 55;",
         "actions":[
            {
               "mqtt":{
                  "server":"tcp://127.0.0.1:1883",
                  "topic":"smartHomeHubs/led",
                  "sendSingle":true,
                  "dataTemplate": "{\"status\": \"on\"}"
               }
            }
         ]
      }
      • 編寫關閉 LED 規(guī)則(./rules/offLed.rule)

      當持續(xù) 5 秒鐘平均光照強度大于 55 時,向 smartHomeHubs/led 主題發(fā)送 "{\"status\": \"off\"}" 消息關閉 LED。

      {
         "sql":"SELECT avg(lightLevel) as avg_light from smartHomeHubs group by TUMBLINGWINDOW(ss, 5) having avg_light > 55;",
         "actions":[
            {
               "mqtt":{
                  "server":"tcp://127.0.0.1:1883",
                  "topic":"smartHomeHubs/led",
                  "sendSingle":true,
                  "dataTemplate": "{\"status\": \"off\"}"
               }
            }
         ]
      }
      • 添加規(guī)則

      $ ./bin/cli create rule onLed -f ./rules/onLed.rule 
      $ ./bin/cli create rule onLed -f ./rules/offLed.rule
      • 查看規(guī)則

      $  ./bin/cli show rules


      LED 燈控制

      編寫代碼連接到 EMQX Edge,并訂閱 smartHomeHubs/led 主題。監(jiān)聽訂閱的 MQTT 消息內容,當 status 為 on 時打開 LED,當 status 為 off 時關閉 LED。

      # led.py
      import paho.mqtt.client as mqtt
      import RPi.GPIO as GPIO
      import json
      
      
      # MQTT broker config
      broker = '127.0.0.1'
      port = 1883
      topic = 'smartHomeHubs/led'
      
      
      def on_connect(client, userdata, flags, rc):
          print("Connecting to the MQTT broker...")
          if rc == 0:
              print("Connection success")
          else:
              print("Connected with result code "+str(rc))
          client.subscribe(topic)
      
      
      def on_message(client, userdata, msg):
          payload = json.loads(msg.payload)
          led_status = payload.get('status')
          gpio_status = GPIO.input(4)
          if led_status == 'on' and gpio_status == 0:
              GPIO.output(4, True)
              print('LED on')
          elif led_status == 'off' and gpio_status == 1:
              GPIO.output(4, False)
              print('LED off')
          else:
              pass
      
      
      def run():
          # connect MQTT broker
          client = mqtt.Client()
          client.on_connect = on_connect
          client.on_message = on_message
          client.connect(broker, 1883, 60)
          # set Raspberry Pi GPIO pin
          GPIO.setmode(GPIO.BCM)
          GPIO.setwarnings(False)
          GPIO.setup(4, GPIO.OUT)
          try:
              client.loop_forever()
          except KeyboardInterrupt:
              GPIO.cleanup()
      
      
      if __name__ == "__main__":
          run()

      運行測試

      1、python gy30.py 獲取光照數據,并將數據上報到 smartHomeHubs/light 主題。

      2、python led.py 訂閱 smartHomeHubs/led 主題,監(jiān)聽 LED 控制信息。

      3、當我們手動降低或升高光照時,可以看到 LED 燈同時也開啟和關閉。


      總結

      至此,我們已成功搭建基于 Raspberry Pi + EMQX + eKuiper 的智能家居網關。

      我們使用 Raspberry Pi 為網關提供豐富的外部通信接口,使用 EMQX 為網關提供設備之間的通信功能,使用 eKuiper 為網關提供設備數據處理以及分析功能。

      之后,我們使用光照傳感器獲取光照強度,通過光照強度來控制 LED 的開和關。在整個過程中所有數據都在本地處理和分析,降低了家庭私密數據泄漏的風險。

      via @Lynn - https://make.quwj.com/project/425

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多