树莓派 + EMQX + eKuiper 搭建智能家居边缘计算网关实战

智能家居系统利用大量的物联网设备(如温湿度传感器、安防系统、照明系统)实时监控家庭内部状态,完成智能调节、人机互动。随着物联网技术的发展,其应用范围、数据规模、市场份额将进一步扩大,智能家居设备之间的智能联动也将变的越来越困难,同时由于家庭数据的隐私性,用户数据上传至云端处理还有一定的安全问题。

为此我们将使用 Raspberry Pi + EMQX + eKuiper 搭建智能家居网关,实现智能家居设备数据的边缘计算处理,减少家庭私密数据外流。

本次教程中我们将用 BH1750FVI 光照强度传感器采集家庭光照强度数据,使用 eKuiper 对光照强度数据进行分析和处理,并依据预先定义的数据规则对 LED 灯进行相应的控制。

01.

项目所需组件

树莓派 3B+

树莓派3代B+ 型是一款基于 ARM 的微型计算机主板,以 SD/MicroSD卡进行存储,该主板提供 USB 接口和以太网接口,可以连接键盘、鼠标和网线,该主板具备 PC 的基本功能,同时树莓派集成了 Wi-Fi,蓝牙以及大量 GPIO,是智能家居网关的理想选择。

EMQX

智能家居设备之间通信协议有 MQTT, Wi-Fi, 蓝牙 等,其中 MQTT 协议 是基于发布/订阅模式的物联网通信协议,它简单易实现、支持 QoS、报文小。在本文中我们将使 MQTT 协议作为智能家居设备之间的通信协议。

由于 Raspberry Pi 内存以及处理能力有限,我们选择由 EMQ 开源的 EMQX 作为 MQTT broker,EMQX 是开源云原生分布式物联网 MQTT 消息服务器,支持部署在资源受限的物联网边缘硬件。

EMQX eKuiper

智能家居设备之间数据传输格式不同,并且数据存在波动性,我们需要对设备上报的数据进行处理。在本文中我们将使用由 EMQ 开源的 EMQX Kuiper 对智能家居设备数据进行边缘化处理,EMQX Kuiper 是基于 SQL 的轻量级边缘流式消息处理引擎,可以运行在资源受限的边缘设备上。

通过实时分析智能家居设备的各类数据,可以实现对设备的即时状态管理与控制。

其他组件

  • BH1750FVI 光照强度传感器

  • LED

  • 330 Ω电阻

  • 面包板, 跳线若干


02.

项目示意图

39697e52f7b0cd2e06b0af915ab69e28.png


03.

环境搭建


电路连接

19e46fca49bc9e5360bed0028915bfb2.png

树莓派配置

我们选择 raspbian 8 作为树莓派操作系统,并选择 python 3 作为项目编程语言

# 创建名为 smart-home-hubs 的项目目录
mkdir ~/smart-home-hubs

EMQX 安装与运行

$ cd ~/smart-home-hubs
# 下载软件包
$ wget https://www.emqx.com/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

EMQX 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
# 创建 rules 目录,用来存放规则文件
$ mkdir ./rules
# 运行 EMQX Kuiper
$ ./bin/server

04.

代码编写

BH1750FVI 光照传感器数据上传

编写代码读取并计算 BH1750FVI 传感器光照强度数据,并以 1次/秒 的频率将光照强度数据通过 MQTT协议 发布到 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 流处理规则

我们将在 eKuiper 上创建名为 smartHomeHubs 的流,并配置规则对光照强度数据进行实时分析,以实现对 LED 灯的控制。

本文中我们将计算光照强度平均值,当平均光照强度 持续 5 秒 小于 55 时开启 LED(大于 55 时关闭 LED)。

  • 创建流

$ cd ~/smart-home-hubs/kuiper

$ ./bin/cli create stream smartHomeHubs '(lightLevel float) WITH (FORMAT="JSON", DATASOURCE="smartHomeHubs/light")'
  • 编写开启 LED 规则(./rules/onLed.rule)

当持续 5 秒钟平均光照强度小于 55 时,向 smartHomeHubs/led 主题发送 "{\"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 规则(./rules/offLed.rule)

当持续 5 秒钟平均光照强度大于 55 时,向 smartHomeHubs/led 主题发送 "{\"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\"}"
         }
      }
   ]
}
  • 添加规则

$ ./bin/cli create rule onLed -f ./rules/onLed.rule 
$ ./bin/cli create rule onLed -f ./rules/offLed.rule
  • 查看规则

$  ./bin/cli show rules

b0c380d8e3e0bc9614806c03680cedbb.png


LED 灯控制

编写代码连接到 EMQX Edge,并订阅 smartHomeHubs/led 主题。监听订阅的 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()

05.

运行测试

1、python gy30.py 获取光照数据,并将数据上报到 smartHomeHubs/light 主题。

507990c6a9c45a2bbddf302f36a5f203.png

2、python led.py 订阅 smartHomeHubs/led 主题,监听 LED 控制信息。

96573946725b03efc3d637cf51836c0f.png

3、当我们手动降低或升高光照时,可以看到 LED 灯同时也开启和关闭。

77652f369a80dfd2fd7ff61a753a5cb2.png


06.

总结

至此,我们已成功搭建基于 Raspberry Pi + EMQX + eKuiper 的智能家居网关。

我们使用 Raspberry Pi 为网关提供丰富的外部通信接口,使用 EMQX 为网关提供设备之间的通信功能,使用 eKuiper 为网关提供设备数据处理以及分析功能。

之后,我们使用光照传感器获取光照强度,通过光照强度来控制 LED 的开和关。在整个过程中所有数据都在本地处理和分析,降低了家庭私密数据泄漏的风险。

往期推荐

☞ 中国云计算第一股关停 IoT云服务

☞ 国内 IoT 物联网平台终局的思考

☞ 2022年IoT平台趋势:私有化部署

☞ 5个值得分享的物联网创业失败教训

☞ 国内 4 大 IoT物联网平台选型对比

☞ 云厂商的 [IoT物联网平台] 不香了吗?

a798be9d4adf207468245a13d7c4db86.png

1b6589cf35b5ef09c8281904ad2ede7a.gif

808543ee860e4ce48d18b0c86d7af50f.gif

4dc88793b971df260f304c3ede2738b8.gif

f1210fb2d9f415aff107e72f89aaa53e.gif

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP/IP是一种常用的络通信协议套件,它是互联的基础架构。TCP/IP协议是基于电子设备之间互联的一种技术标准,它通过将数据分割成小的数据包,然后通过络进行传输,以实现电子设备之间的通信。TCP/IP 设备是在家庭络中使用的一种络设备,它的作用是将家庭中的各种智能设备(如智能手机、电视、音响等)连接到互联上,以实现智能家居的功能。 TCP/IP 设备除了将智能设备连接到互联上,还可以实现智能家居中的其他功能。例如,它可以与各种传感器(如温度传感器、湿度传感器等)进行通信,从而实现温度、湿度的远程监控与控制。此外,它还可以与智能家居的中央控制器(如智能手机、平板电脑等)进行通信,用户可以通过手机等设备对智能家居进行远程控制,如开灯、调节温度等。 智能家居是利用物联技术将家居设备和系统与互联连接起来,从而实现智能化、便捷化和高效化的生活方式。通过TCP/IP 设备,用户可以方便地控制智能家居设备,实现家居自动化、远程控制和智能管理。智能家居可以改变传统家居的运作方式,提高生活的便利性和舒适度。例如,通过智能手机应用程序,用户可以在外出时远程控制家中的电器设备,避免浪费和意外事故。 总而言之,TCP/IP 设备是连接智能设备与互联键设备,在智能家居中起到重要的作用。它通过实现设备之间的通信和连接,使智能家居更加智能化、便捷化和高效化。智能家居的出现为人们带来了更加便捷和舒适的生活方式,同时也带来了更多的可能性和挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值