5

#物联网征文#基于ESP8266的智能家居案例-开源基础软件社区-51CTO.COM

 2 years ago
source link: https://ost.51cto.com/posts/15795
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一、案例背景

  物联网通过物品上的嵌入式设备采集、处理并发送周围的环境数据,从而实现人与物、物与物之间的信息交流和数据交换。因此,物联网形成了一个巨大的万物互联网络。 尤其在智能家居方面应用极为广泛,将物联网技术应用于智能家居的目的是将家庭中的电器和生活设施连接起来,实现视频监控、智慧安防、智能照明、智能电器控制、智能门窗控制等功能。

二、案例总体设计

    本设计的系统由传感层、网络层和应用层组成。其中传感层以ESP8266模块为核心形成控制节点,其上装有监控室内的环境传感器;网络层使用家庭路由器组网并使用 MQTT 协议通信;应用层以华为云IOT平台作为整个系统的服务器,由移动端开发的应用服务程序能跨平台展示和控制系统信息。
    系统的工作流程如下:控制节点通过各种家用传感器采集数据,经家用路由器传输到MQTT(消息队列遥测传输)服务器;MQTT服务器将数据整理后发送到移动应用端;移动端将控制指令经服务器转发给控制节点,进而实现用户随时随地对家居设备进行监控。

三、硬件设计

系统的控制节点主要包括ESP8266模块、输入输出接口、供电电源三大部分。 ESP8266 是一个无线传输模块,以低成本提供最大的实用性。 输入输出部分主要包括DHT11温湿度传感器模块、继电器模块和OLED显示屏模块。 供电部分采用USB供电,使用锂电池和USB接口以保证节点一直运行。

#物联网征文#基于ESP8266的智能家居案例-开源基础软件社区

系统流程图:

#物联网征文#基于ESP8266的智能家居案例-开源基础软件社区

四、软件设计

    服务器采用 MQTT 服务器,其作用是接收控制节点和应用端的数据,将这些数据流汇总并进行可视化显示和操作,以保证智能家居系统传感网正常工作和方便用户登录服务器查看所连接的设备并进行管理。
    MQTT 是一种基于发布/ 订阅范式的“轻量级”消息协议,其最大优点在于可以用极少的代码和有限的带宽为连接到的远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通信协议,MQTT在物联网、小型设备、移动应用等方面得到了广泛应用。
    移动端应用使用 Android 开发,可以实现实时远程监控室内环境数据。 界面有显示温湿度、人体数据的文本框,自动或手动单选按钮和继电器的控制开关按钮。 移动端连接服务器后,订阅消息并收到订阅的消息;解析 JSON 数据包,将温湿度、人体信息显示在相应的文本框内,并更新继电器相应控制按钮的状态。
数据传输方案:

#物联网征文#基于ESP8266的智能家居案例-开源基础软件社区

连接MQTT源码:

'''
消息传送demo
包括订阅topic
发布消息
'''

import logging
import time
# from email.encoders import encode_base64

from IoT_device.client import IoTClientConfig
from IoT_device.client import IotClient

# 日志设置
from IoT_device.request import ServicesProperties
import base64

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

flag = False
base64_str = None


def get_base64(file_path):
    global flag
    global base64_str
    with open(file_path, 'rb') as f:
        base64_str = base64.b64encode(f.read())
        flag = True
        return base64_str


def run():
    global flag
    global base64_str
    # 客户端配置
    client_cfg = IoTClientConfig(server_ip='a160fe5baa.iot-mqtts.cn-north-4.myhuaweicloud.com',
                                 device_id='XXXX',
                                 secret='XXXX', is_ssl=False)
    # 创建设备
    iot_client = IotClient(client_cfg)
    iot_client.connect()  # 建立连接

    base64_str = encode_base64(r'G:\Data\AsdAudio.wav')

    # print(base64_str)

    # 设备接受平台下发消息的响应
    # def message_callback(device_message):
    #     logger.info(('device message, device id:  ', device_message.device_id))
    #     logger.info(('device message, id = ', device_message.id))
    #     logger.info(('device message, name: ', device_message.name))
    #     logger.info(('device message. content: ', device_message.content))
    #
    # # 设置平台下发消息响应的回调
    # iot_client.set_device_message_callback(message_callback)
    # # 设置平台下发自定义topic消息响应的回调
    # iot_client.set_user_topic_message_callback(message_callback)

    '''
    订阅自定义topic, 需提前在平台配置自定义topic
    支持批量订阅(topic存放列表中),和逐个订阅(单个topic,无需放入列表)
    $oc/devices/{device_id}/sys/messages/up
    '''
    # topic_1 = r'$oc/devices/' + str(client_cfg.device_id) + r'/sys/messages/up'
    # topic_2 = r'$oc/devices/' + str(client_cfg.device_id) + r'/user/myself_prop/up'
    # topic_3 = r'$oc/devices/' + str(client_cfg.device_id) + r'/user/wpy/up'
    # iot_client.subscribe(topic=[topic_1, topic_2, topic_3])
    # iot_client.subscribe(topic=[topic_1])
    # 取消订阅,使用方法同订阅功能
    # iot_client.unsubscribe(topic_1)
    time_tuple = time.localtime(time.time())
    json_data = {
        "services": [{
            "service_id": "Connectivity",
            "properties": {
                "audio_data": str(base64_str)
            },
            "event_time": "20151212T121212Z"
        }
        ]
    }
    # 线程启动
    iot_client.start()
    # 定时上报属性
    # while True:
    # 按照产品模型设置属性
    service_property = ServicesProperties()
    service_property.add_service_property(service_id="get_audio", property='audio_data', value=base64_str)
    iot_client.report_properties(service_properties=service_property.service_property, qos=1)
    # print(base64_str)
    # time.sleep(10)

    # 发送自定义topic消息
    # $oc/devices/{device_id}/sys/properties/report
    # iot_client.report_properties(r'$oc/devices/' + str(client_cfg.device_id) + r'/sys/messages/report', json_data)

    # iot_client.publish_message('raw message: Hello Huawei cloud IoT')
    # 设备向平台发送消息,系统默认topic
    # iot_client.publish_message(json_data)



def encode_base64(file):
    with open(file, 'rb') as f:
        img_data = f.read()
        base64_data = base64.b64encode(img_data)
        # print(type(base64_data))
        # print(base64_data)
        # 如果想要在浏览器上访问base64格式图片,需要在前面加上:data:image/jpeg;base64,
        base64_str = str(base64_data, 'utf-8')
        # print(base64_str)
        return base64_str


if __name__ == '__main__':
    run()


【本文正在参加物联网有奖征文活动】,活动链接:https://ost.51cto.com/posts/14758


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK