一、案例背景
物聯網通過物品上的嵌入式裝置采集、處理并發送周圍的環境資料,進而實作人與物、物與物之間的資訊交流和資料交換。是以,物聯網形成了一個巨大的萬物網際網路絡。 尤其在智能家居方面應用極為廣泛,将物聯網技術應用于智能家居的目的是将家庭中的電器和生活設施連接配接起來,實作視訊監控、智慧安防、智能照明、智能電器控制、智能門窗控制等功能。
二、案例總體設計
本設計的系統由傳感層、網絡層和應用層組成。其中傳感層以ESP8266子產品為核心形成控制節點,其上裝有監控室内的環境傳感器;網絡層使用家庭路由器組網并使用 MQTT 協定通信;應用層以華為雲IOT平台作為整個系統的伺服器,由移動端開發的應用服務程式能跨平台展示和控制系統資訊。
系統的工作流程如下:控制節點通過各種家用傳感器采集資料,經家用路由器傳輸到MQTT(消息隊列遙測傳輸)伺服器;MQTT伺服器将資料整理後發送到移動應用端;移動端将控制指令經伺服器轉發給控制節點,進而實作使用者随時随地對家居裝置進行監控。
三、硬體設計
系統的控制節點主要包括ESP8266子產品、輸入輸出接口、供電電源三大部分。 ESP8266 是一個無線傳輸子產品,以低成本提供最大的實用性。 輸入輸出部分主要包括DHT11溫濕度傳感器子產品、繼電器子產品和OLED顯示屏子產品。 供電部分采用USB供電,使用锂電池和USB接口以保證節點一直運作。
系統流程圖:
四、軟體設計
伺服器采用 MQTT 伺服器,其作用是接收控制節點和應用端的資料,将這些資料流彙總并進行可視化顯示和操作,以保證智能家居系統傳感網正常工作和友善使用者登入伺服器檢視所連接配接的裝置并進行管理。
MQTT 是一種基于釋出/ 訂閱範式的“輕量級”消息協定,其最大優點在于可以用極少的代碼和有限的帶寬為連接配接到的遠端裝置提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通信協定,MQTT在物聯網、小型裝置、移動應用等方面得到了廣泛應用。
移動端應用使用 Android 開發,可以實作實時遠端監控室内環境資料。 界面有顯示溫濕度、人體資料的文本框,自動或手動單選按鈕和繼電器的控制開關按鈕。 移動端連接配接伺服器後,訂閱消息并收到訂閱的消息;解析 JSON 資料包,将溫濕度、人體資訊顯示在相應的文本框内,并更新繼電器相應控制按鈕的狀态。
資料傳輸方案:
連接配接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