欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實戰(zhàn)洞察。

Android智能家居App開發(fā):從MQTT通信到設(shè)備控制全解析

Android智能家居App開發(fā):從MQTT通信到設(shè)備控制全解析 簡介本資源是一套完整的智能家居Android應(yīng)用開發(fā)實戰(zhàn)資料包面向計算機(jī)、物聯(lián)網(wǎng)、自動化、電子信息等專業(yè)的在校學(xué)生、教師及初級開發(fā)者適用于畢業(yè)設(shè)計、課程設(shè)計、項目立項演示及Android進(jìn)階學(xué)習(xí)。壓縮包共220個文件含62個Java源碼文件實現(xiàn)設(shè)備控制、場景聯(lián)動、用戶管理等核心邏輯、82個XML布局與配置文件涵蓋UI界面、權(quán)限聲明及資源適配、53個PNG圖標(biāo)資源支持多分辨率設(shè)備以及Gradle構(gòu)建腳本、APK安裝包、簽名配置等工程必需文件整體大小為6.84MB結(jié)構(gòu)規(guī)范、模塊清晰便于快速編譯運(yùn)行與二次開發(fā)。已有54人下載學(xué)習(xí)項目源自高分實踐成果答辯評分95分所有代碼均經(jīng)實機(jī)測試驗證功能完整穩(wěn)定配套文檔詳盡覆蓋需求分析、架構(gòu)設(shè)計、接口說明與部署指南支持小白入門與中階開發(fā)者快速復(fù)用或拓展功能。1. 項目定位與現(xiàn)實需求1.1 為什么智能家居的終端要落在Android上今年這個時間節(jié)點再聊智能家居App開發(fā)其實已經(jīng)不是要不要做的問題而是怎么做才能做得順手。我接觸過不少從嵌入式轉(zhuǎn)過來做移動端的開發(fā)者也有從后端轉(zhuǎn)過來的大家第一個反應(yīng)都是智能家居系統(tǒng)里設(shè)備固件、網(wǎng)關(guān)協(xié)議都搞定了App不就是個遙控器嗎真做起來才發(fā)現(xiàn)這個遙控器恰恰是整個系統(tǒng)里最容易被用戶感知、也最容易翻車的一環(huán)。資料包和標(biāo)題里反復(fù)出現(xiàn)的Android App本質(zhì)上是整個智能家居系統(tǒng)的三塊拼圖之一設(shè)備端傳感器、開關(guān)、門鎖、服務(wù)端云端API、消息中轉(zhuǎn)、用戶端Android/iOS App。而Android占了國內(nèi)智能家居用戶端的絕大多數(shù)份額原因很直接設(shè)備廠商的網(wǎng)關(guān)和傳感器大多走WiFi、藍(lán)牙、Zigbee這類協(xié)議Android在BLE開發(fā)上有完整API調(diào)試起來比iOS要靈活開放度完全不一樣。Android手機(jī)品牌分散、系統(tǒng)版本跨度大這意味著App寫出來之后要面對各種Rom的兼容性但反而鍛煉了代碼的健壯性工程上更有挑戰(zhàn)也更能積累經(jīng)驗。從成本角度考慮一套Android端的方案可以直接跑在幾百塊的低價平板和舊手機(jī)上用戶把舊手機(jī)掛墻上當(dāng)控制面板體驗比買專用中控屏還好。1.2 這個全部資料詳細(xì)文檔項目到底覆蓋了什么從標(biāo)題的字面信息來看這套項目資料包含的不只是源碼而是完整的工程化交付物Android客戶端工程、硬件端示例大概率包含ESP32、STM32的固件參考、通信協(xié)議文檔、以及UI設(shè)計規(guī)范。這類項目的價值不在于代碼能跑而在于它把智能家居App到底應(yīng)該長什么樣、踩過哪些坑都沉淀了下來。我見過太多人拿到一個類似項目之后第一件事就是把代碼塞進(jìn)Android Studio編譯發(fā)現(xiàn)有報錯然后來來回回改依賴版本一整天過去了還在原地打轉(zhuǎn)。原因很簡單智能家居App不是寫幾個頁面調(diào)幾個接口就完了它涉及網(wǎng)絡(luò)連接、設(shè)備發(fā)現(xiàn)、狀態(tài)同步、離線消息、權(quán)限適配。如果只看代碼不看文檔遇到問題只能猜。所以這篇博文我不打算貼整包源碼來水篇幅因為畢竟你的硬件設(shè)備、云平臺可能和項目里不一樣。我更想基于這類項目的通用結(jié)構(gòu)和實施經(jīng)驗把拿到這套資料之后該怎么看、怎么做才能不踩坑講透。你手里有代碼文檔我這里教你方法論和實操路徑兩者結(jié)合才能真正把這套資料的價值榨干。2. 整體架構(gòu)設(shè)計拆解2.1 設(shè)備控制鏈路從手機(jī)到傳感器的完整路徑智能家居App最難講清楚但又最核心的是它和普通App在架構(gòu)上的本質(zhì)差異。普通App是用戶到服務(wù)器的單向或雙向請求而智能家居App處在一條很長的控制鏈路上手機(jī)App - 通信協(xié)議 - 路由器/網(wǎng)關(guān) - 智能設(shè)備(ESP32/STM32/傳感器) - 執(zhí)行動作 - 狀態(tài)上報 - App刷新看這個鏈路你就會發(fā)現(xiàn)任何一個環(huán)節(jié)斷了用戶的直觀感受就是App失靈了。而App開發(fā)者能掌控的其實只有第一環(huán)和最后一環(huán)中間的網(wǎng)絡(luò)和硬件穩(wěn)定性都不在控制范圍之內(nèi)。所以你在設(shè)計App架構(gòu)時不能假設(shè)網(wǎng)絡(luò)永遠(yuǎn)是通的、設(shè)備永遠(yuǎn)在線必須把異常情況當(dāng)成正常情況來設(shè)計。以我經(jīng)手的WiFi方案為例設(shè)備連接家里的路由器App通過局域網(wǎng)或云端下發(fā)指令。局域網(wǎng)方案的延遲更低但要做設(shè)備發(fā)現(xiàn)比較常見的是UDP廣播加設(shè)備自報云端方案則要依賴服務(wù)器的穩(wěn)定性和設(shè)備長連接的?;顧C(jī)制。真正成熟的商用App都走雙通道局域網(wǎng)可用時優(yōu)先局域網(wǎng)斷網(wǎng)時自動切云端同時把指令的ACK和重發(fā)機(jī)制做進(jìn)去。2.2 .zip項目里的標(biāo)準(zhǔn)分層結(jié)構(gòu)很多初學(xué)者拿到這類項目壓縮包先去找MainActivity和布局文件這是不對的思路。智能家居App的工程結(jié)構(gòu)通常遵循清晰的分層每個目錄都有自己的職責(zé)應(yīng)用層App層負(fù)責(zé)UI展示和用戶交互包括設(shè)備列表、控制面板、場景編輯頁面、個人中心。業(yè)務(wù)層Manager/Repository封裝設(shè)備管理、消息推送、場景聯(lián)動等業(yè)務(wù)邏輯。這一層不關(guān)心按鈕長什么樣只處理做什么。通信層Net/Protocol負(fù)責(zé)MQTT、TCP、BLE等協(xié)議的封裝對外提供統(tǒng)一的發(fā)送和監(jiān)聽接口。數(shù)據(jù)層Local/DB用數(shù)據(jù)庫或SharedPreferences緩存設(shè)備列表和用戶配置保證弱網(wǎng)環(huán)境下App仍能展示基本信息。這個分層的核心價值在于更換硬件方案或者云平臺時只需要替換通信層的數(shù)據(jù)源業(yè)務(wù)層和界面層可以完全復(fù)用。我見過太多項目把所有的邏輯全堆在Activity里一個頁面上千行最后運(yùn)維和迭代成本高到離譜。所以拿到資料包之后建議先畫一張依賴關(guān)系圖理清各個模塊之間的依賴方向再動手改代碼。2.3 通信協(xié)議選型MQTT、TCP、藍(lán)牙與Zigbee網(wǎng)關(guān)智能家居的熱搜詞里頻繁出現(xiàn)esp32stm32zigbee這三類硬件決定了你項目里需要接入的通信協(xié)議不止一種。這里我按實際項目中出現(xiàn)頻率把協(xié)議選型說明一下協(xié)議類型典型硬件適用場景優(yōu)點缺點WiFi MQTTESP32、ESP8266家庭網(wǎng)關(guān)、智能插座云端可控、跨公網(wǎng)、生態(tài)成熟功耗偏高、依賴WiFi環(huán)境WiFi TCP攝像頭、門鎖實時性要求高的控制低延遲、可自定義協(xié)議需要做斷線重連和粘包處理BLE低功耗藍(lán)牙傳感器、手環(huán)、門鎖近距離控制、配網(wǎng)功耗極低、無需WiFi距離短、需要處理兼容性Zigbee網(wǎng)關(guān)海量低功耗節(jié)點全屋智能傳感器網(wǎng)絡(luò)自組網(wǎng)、低功耗、穩(wěn)定需要額外網(wǎng)關(guān)硬件App不直連設(shè)備這里面我特別想提一點很多新手以為App要直接跟每個設(shè)備通信其實在Zigbee方案里App根本不認(rèn)識設(shè)備只認(rèn)識網(wǎng)關(guān)所有指令都發(fā)給網(wǎng)關(guān)由網(wǎng)關(guān)下發(fā)給節(jié)點。這一點在設(shè)計App的數(shù)據(jù)模型時非常重要——你的設(shè)備概念必須是虛擬化的它可以是物理設(shè)備也可以是一個邏輯分組甚至是一個場景。3. 核心功能模塊與關(guān)鍵實現(xiàn)3.1 設(shè)備發(fā)現(xiàn)與配網(wǎng)所有智能家居App的第一道門檻如果給智能家居App的功能模塊做個重要性排序設(shè)備發(fā)現(xiàn)和配網(wǎng)排第一。控制頁面做得再漂亮設(shè)備連不上網(wǎng)用戶第一時間就卸載了。配網(wǎng)的核心流程是這樣的設(shè)備上電后進(jìn)入配網(wǎng)模式通常是長按按鍵或連續(xù)上電三次觸發(fā)此時設(shè)備會打開一個臨時的SoftAP熱點App先連接這個熱點把家庭WiFi的SSID和密碼通過特定協(xié)議發(fā)給設(shè)備設(shè)備再切換模式連上路由器最后App通過局域網(wǎng)廣播確認(rèn)設(shè)備上線。在Android端實現(xiàn)這個流程需要處理兩個比較麻煩的點。第一個是跳WiFi的權(quán)限Android 10及以上版本跳轉(zhuǎn)到系統(tǒng)WiFi設(shè)置后App退到后臺再回來需要監(jiān)聽onResume并輪詢當(dāng)前連接的WiFi是否已經(jīng)切換到設(shè)備的SoftAP熱點。第二個是Android 8.0之后App無法直接操作系統(tǒng)的WiFi連接只能引導(dǎo)用戶到設(shè)置界面手動連接體驗會多一步。另外配網(wǎng)過程一定要給足狀態(tài)反饋。用戶連上設(shè)備熱點后等待設(shè)備重啟再連路由器的過程往往需要10到30秒這段時間如果沒有進(jìn)度提示用戶會以為App卡死了。實操中我會在UI上做三態(tài)切換等待連接設(shè)備熱點、正在下發(fā)配置、確認(rèn)設(shè)備上線三步都配上倒計時和錯誤提示。這一小塊做好了App的專業(yè)感立刻就不一樣了。3.2 設(shè)備列表的狀態(tài)同步不要為了實時而實時App主頁面通常是設(shè)備列表顯示房間內(nèi)所有設(shè)備的工作狀態(tài)。這里的核心問題是設(shè)備狀態(tài)怎么同步很多項目圖省事輪詢接口每兩秒請求一次云端設(shè)備一多服務(wù)器壓力大手機(jī)電量也受不了。更合理的做法是雙模同步實時模式當(dāng)一個設(shè)備狀態(tài)變化時設(shè)備端或云端通過MQTT消息推送給AppApp收到消息后只刷新對應(yīng)的設(shè)備卡片而不是全量刷新。定期全量App從后臺回前臺、或下拉刷新時主動拉一次全量設(shè)備狀態(tài)保證數(shù)據(jù)的一致性。這套方案的邏輯很簡單但落地的時候有幾個坑要提醒一下MQTT消息要帶設(shè)備ID、屬性名和值比如{deviceId:dev_001,attr:power,value:1}App端根據(jù)設(shè)備ID定位到列表里的position做局部刷新。如果在RecyclerView里直接notifyDataSetChanged列表會閃爍體驗很差。狀態(tài)同步一定要帶上時間戳否則設(shè)備離線期間積累的舊消息會覆蓋新狀態(tài)造成顯示臟數(shù)據(jù)。判斷規(guī)則是新消息的時間戳必須大于當(dāng)前UI上記錄的狀態(tài)時間戳才允許更新。首次加載設(shè)備列表時如果設(shè)備比較多建議做成骨架屏加漸進(jìn)加載。先把房間和設(shè)備名稱顯示出來再逐個填充狀態(tài)用戶的等待感知會小很多。3.3 控制指令下發(fā)可靠送達(dá)比什么都重要設(shè)備控制是用戶使用頻率最高的功能指令下發(fā)的可靠性直接決定用戶對App的信任度。我的經(jīng)驗是控制指令必須走發(fā)送-確認(rèn)-反饋三步閉環(huán)缺一步都不行。以最簡單的開關(guān)燈為例用戶點擊開關(guān)按鈕App立即將按鈕置為正在執(zhí)行狀態(tài)本地UI先變過去給用戶即時反饋。App通過MQTT或TCP發(fā)送控制指令同時啟動一個超時定時器一般是3秒。如果3秒內(nèi)沒有收到設(shè)備回復(fù)的ACK就認(rèn)定發(fā)送失敗。設(shè)備執(zhí)行成功后會回傳新的狀態(tài)App收到新狀態(tài)后再把按鈕狀態(tài)從正在執(zhí)行更新為確定狀態(tài)。如果回傳狀態(tài)和本地預(yù)期不一致說明指令沒被執(zhí)行或執(zhí)行異常此時要彈出提示并回滾UI。這條閉環(huán)里最容易被忽略的是超時處理。很多人只發(fā)指令不管結(jié)果設(shè)備離線時用戶點了開關(guān)毫無反應(yīng)體驗就是這個App壞了。加上超時和重試邏輯之后比如失敗后重試2次仍不成功則提示設(shè)備離線請檢查網(wǎng)絡(luò)可靠性的感受會完全不同。另外App往設(shè)備發(fā)指令的協(xié)議格式要盡量簡潔。一個開關(guān)控制指令沒必要搞成JSON大字符串最好是緊湊的二進(jìn)制幀或者短JSON比如{cmd:set,did:dev_01,attr:{power:1}}字段越少越好解析出錯的可能性越低。3.4 場景聯(lián)動把控制設(shè)備升級為操控生活所謂場景就是把多個設(shè)備的狀態(tài)變化編排成一個動作序列。比如回家模式可以定義為打開客廳燈、打開空調(diào)并調(diào)到26度、打開電視。用戶只需要一個按鈕或者設(shè)定時間條件自動觸發(fā)就可以同時執(zhí)行一系列動作。從架構(gòu)上看場景功能包含兩部分場景編輯器和場景執(zhí)行引擎。編輯器負(fù)責(zé)把動作列表組裝成可配置的數(shù)據(jù)結(jié)構(gòu)核心字段包括場景名稱、觸發(fā)條件手動、定時、傳感器觸發(fā)、動作列表每個動作是哪個設(shè)備、設(shè)置為哪個狀態(tài)。執(zhí)行引擎在事件到來時檢查條件一旦滿足就按順序或并發(fā)下發(fā)動作指令。這里有一個Android實現(xiàn)上的經(jīng)驗場景執(zhí)行結(jié)果必須逐條回執(zhí)。設(shè)想一個場景包含5個動作第3個動作執(zhí)行失敗用戶需要知道是哪個失敗、為什么失敗。App端的做法是把每個動作封裝成獨立的任務(wù)各自維護(hù)狀態(tài)待執(zhí)行/執(zhí)行中/成功/失敗執(zhí)行完畢后以列表卡片的方式展示結(jié)果并對失敗動作提供重試單個動作的入口。Android的協(xié)程非常適合做這個編排每個動作起一個Coroutine超時和異常獨立捕獲。3.5 藍(lán)牙功能兼容Android歷史版本的老大難熱詞里的android藍(lán)牙藍(lán)牙app控制esp32指向的是同一件事在Android上通過BLE控制ESP32這類硬件時兼容性是最大的坑。我梳理幾個常見的雷區(qū)權(quán)限適配Android 6.0要動態(tài)申請定位權(quán)限才能掃BLEAndroid 12及以上要申請BLUETOOTH_SCAN和BLUETOOTH_CONNECT權(quán)限且這兩項是危險權(quán)限需要動態(tài)申請。如果漏掉掃描結(jié)果永遠(yuǎn)是空。掃描回調(diào)舊版用LeScanCallback掃描新版推薦用ScanCallback。很多老項目的代碼在新系統(tǒng)上直接不回調(diào)問題就出在API版本差異上。寫兼容層時建議判斷SDK_INT版本大于等于21用ScanCallback否則用LeScanCallback。MTU協(xié)商ESP32的BLE服務(wù)一次能收的字節(jié)數(shù)有限默認(rèn)MTU是23字節(jié)扣掉協(xié)議頭之后實際才20字節(jié)稍長一點的數(shù)據(jù)包就發(fā)不過去。Android 5.0以上可以通過requestMtu動態(tài)協(xié)商建議首次連接后主動請求一個較大的MTU比如247協(xié)商成功后再發(fā)送數(shù)據(jù)。重連機(jī)制BLE連接很容易因為距離、干擾等原因斷開App端必須在onConnectionStateChange里監(jiān)聽斷開事件自動發(fā)起重連并做好重連次數(shù)限制比如最多3次防止設(shè)備斷電時App無限重連耗電。4. 實操從編譯到運(yùn)行把項目跑起來的完整流程4.1 環(huán)境準(zhǔn)備Android Studio安裝與SDK配置拿到項目源碼后先別急著打開把環(huán)境確認(rèn)一遍能省很多時間。這套資料對應(yīng)的開發(fā)工具是Android Studio安裝時需要注意幾個點JDK版本要匹配Gradle版本?,F(xiàn)在新版Android Studio基本都內(nèi)置了JBRJetBrains Runtime但老項目的Gradle插件可能要求JDK 8或JDK 11。如果項目編譯報Unsupported class file major version這類錯誤先檢查JDK版本是否過高。SDK版本方面建議安裝Android SDK Platform 33和Android SDK Build-Tools 33.0.2。兼容寫法是compileSdkVersion用33minSdkVersion看項目支持的設(shè)備下限targetSdkVersion按當(dāng)前市場要求設(shè)到33左右。如果項目里的gradle文件引用的compileSdkVersion版本還沒安裝Android Studio會提示自動安裝但國內(nèi)網(wǎng)絡(luò)環(huán)境下載SDK可能會卡住建議提前配好國內(nèi)鏡像源。下面是我常用的一份gradle依賴倉庫配置放在settings.gradle里pluginManagement { repositories { maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/gradle-plugin } maven { url https://maven.aliyun.com/repository/public } google() mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositories { maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/public } google() mavenCentral() } }另外提醒一件事項目里如果用了第三方MQTT庫例如Eclipse Paho需要確認(rèn)依賴是否已經(jīng)正確拉到本地。編譯報Could not find org.eclipse.paho:org.eclipse.paho.client.mqttv3之類的錯誤多半是倉庫沒有配paho的maven源可以在repositories里加上maven { url https://repo.eclipse.org/content/repositories/paho-releases/ }。4.2 工程目錄結(jié)構(gòu)與AndroidManifest配置一個標(biāo)準(zhǔn)的智能家居App工程目錄結(jié)構(gòu)大致如下app/ ├── src/main/ │ ├── java/com/example/smarthome/ │ │ ├── activity/ # Activity頁面 │ │ ├── adapter/ # RecyclerView適配器 │ │ ├── model/ # 數(shù)據(jù)模型 │ │ ├── net/ # 網(wǎng)絡(luò)請求與MQTT封裝 │ │ ├── db/ # 本地數(shù)據(jù)庫 │ │ └── utils/ # 工具類 │ ├── res/ │ │ ├── layout/ # 布局文件 │ │ ├── values/ # 顏色、字符串、主題 │ │ └── drawable/ # 矢量圖標(biāo)與背景 │ └── AndroidManifest.xml拿到源碼后第一步檢查AndroidManifest把權(quán)限聲明確認(rèn)清楚。智能家居App最基本的權(quán)限集如下uses-permission android:nameandroid.permission.INTERNET / uses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE / uses-permission android:nameandroid.permission.ACCESS_WIFI_STATE / uses-permission android:nameandroid.permission.CHANGE_WIFI_STATE / uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION / uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION / !-- Android 12 藍(lán)牙權(quán)限 -- uses-permission android:nameandroid.permission.BLUETOOTH_SCAN / uses-permission android:nameandroid.permission.BLUETOOTH_CONNECT / !-- Android 12以下藍(lán)牙權(quán)限 -- uses-permission android:nameandroid.permission.BLUETOOTH android:maxSdkVersion30 / uses-permission android:nameandroid.permission.BLUETOOTH_ADMIN android:maxSdkVersion30 /這里有個細(xì)節(jié)ACCESS_FINE_LOCATION之所以是必需項是因為Android系統(tǒng)規(guī)定掃描BLE必須要有定位權(quán)限雖然邏輯上看似無關(guān)但這是系統(tǒng)層面的強(qiáng)制要求不加就掃不到設(shè)備。4.3 MQTT通信模塊的代碼骨架網(wǎng)絡(luò)通信是智能家居App的心臟。下面這份代碼是我在多個項目里用下來的最小骨架直接參考它做本地調(diào)試可以省掉很多摸索時間public class MqttManager { private MqttAndroidClient client; private String brokerUrl tcp://192.168.1.100:1883; private String clientId android_ System.currentTimeMillis(); public MqttManager(Context context) { client new MqttAndroidClient(context, brokerUrl, clientId); } public void connect() { MqttConnectOptions options new MqttConnectOptions(); options.setCleanSession(false); options.setAutomaticReconnect(true); options.setConnectionTimeout(10); // 實際項目中一般會啟用用戶名密碼認(rèn)證 // options.setUserName(user); // options.setPassword(pass.toCharArray()); try { client.connect(options, null, new IMqttActionListener() { Override public void onSuccess(IMqttToken asyncActionToken) { Log.d(MqttManager, connected); subscribeTopic(devices//status); } Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Log.e(MqttManager, connect failed, exception); } }); } catch (MqttException e) { e.printStackTrace(); } } private void subscribeTopic(String topic) { try { client.subscribe(topic, 1); } catch (MqttException e) { e.printStackTrace(); } } public void publish(String topic, String payload) { try { MqttMessage message new MqttMessage(payload.getBytes()); message.setQos(1); client.publish(topic, message); } catch (MqttException e) { e.printStackTrace(); } } public void setCallback(MqttCallbackExtended callback) { client.setCallback(callback); } }這里解釋幾個關(guān)鍵參數(shù)的含義setCleanSession(false)的作用是讓服務(wù)端保留該客戶端的會話當(dāng)App斷線重連后可以收到離線期間發(fā)布的消息。setAutomaticReconnect(true)是讓SDK自動處理斷線重連不用自己在業(yè)務(wù)層寫循環(huán)。QoS設(shè)為1的意思是消息至少送達(dá)一次兼顧了實時性和可靠性是智能家居場景下用得最多的等級。收到消息后的回調(diào)通常長這樣client.setCallback(new MqttCallbackExtended() { Override public void connectComplete(boolean reconnect, String serverURI) { // 重連成功后重新訂閱所需主題 } Override public void connectionLost(Throwable cause) { // 提示用戶設(shè)備離線 } Override public void messageArrived(String topic, MqttMessage message) { String payload new String(message.getPayload()); // 解析topic和payload更新對應(yīng)設(shè)備狀態(tài) updateDeviceStatus(topic, payload); } Override public void deliveryComplete(IMqttDeliveryToken token) { // 消息送達(dá)確認(rèn)可用于刷新指令狀態(tài) } });注意connectComplete這個回調(diào)很多初學(xué)者會忽略它。當(dāng)自動重連成功后SDK不會自動恢復(fù)之前訂閱的主題必須在這里重新subscribe否則設(shè)備狀態(tài)就斷了。4.4 藍(lán)牙掃描與連接ESP32的關(guān)鍵代碼如果你的項目里需要直接通過BLE控制ESP32不用WiFi網(wǎng)關(guān)我強(qiáng)烈建議封裝一個單獨的BleManager類把權(quán)限檢查、掃描、連接、收發(fā)數(shù)據(jù)全部收攏起來。以下是掃描部分的核心邏輯class BleManager(private val context: Context) { private val bluetoothAdapter: BluetoothAdapter? by lazy { val manager context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager manager.adapter } fun checkPermissions(): Boolean { return if (Build.VERSION.SDK_INT Build.VERSION_CODES.S) { ContextCompat.checkSelfPermission( context, Manifest.permission.BLUETOOTH_SCAN ) PackageManager.PERMISSION_GRANTED ContextCompat.checkSelfPermission( context, Manifest.permission.BLUETOOTH_CONNECT ) PackageManager.PERMISSION_GRANTED } else { ContextCompat.checkSelfPermission( context, Manifest.permission.ACCESS_FINE_LOCATION ) PackageManager.PERMISSION_GRANTED } } fun startScan(callback: (BluetoothDevice) - Unit) { val scanner bluetoothAdapter?.bluetoothLeScanner ?: return val scanCallback object : ScanCallback() { override fun onScanResult(callbackType: Int, result: ScanResult) { val device result.device if (device.name?.contains(ESP32) true) { callback(device) } } override fun onScanFailed(errorCode: Int) { // 錯誤碼1代表掃描啟動失敗需要檢查藍(lán)牙是否開啟 } } scanner.startScan(scanCallback) } }在連接設(shè)備之后需要動態(tài)協(xié)商MTU并查找服務(wù)UUID。ESP32上常見的BLE服務(wù)UUID可以在固件的代碼里找到App端要與它保持一致否則GATT通信會失敗。4.5 Android 9及以上強(qiáng)制啟用明文傳輸?shù)倪m配這是最容易踩的一個坑。從Android 9API 28開始系統(tǒng)默認(rèn)禁止App使用明文HTTP請求而智能家居的局域網(wǎng)控制大部分走的是http://192.168.x.x:8080這類明文協(xié)議。如果你在調(diào)試時發(fā)現(xiàn)局域網(wǎng)請求直接報Cleartext HTTP traffic not permitted就是這個原因。解決方案有幾種第一種是在AndroidManifest.xml的application節(jié)點加上android:usesCleartextTraffictrue這是全局放行適合內(nèi)部項目或者工具類App。第二種是配置network security config只允許特定域名或IP走明文network-security-config base-config cleartextTrafficPermittedfalse / domain-config cleartextTrafficPermittedtrue domain includeSubdomainstrue192.168.1.100/domain domain includeSubdomainstruesmarthome.local/domain /domain-config /network-security-config然后在Manifest里引用application android:networkSecurityConfigxml/network_security_config ... /推薦使用第二種因為全局放行會帶來安全審計上的風(fēng)險而上架應(yīng)用商店時審核人員對明文流量會重點檢查。定好一套白名單式的配置既能滿足開發(fā)調(diào)試也能保證上架安全。5. 從跑起來到用得住體驗優(yōu)化與避坑錦囊5.1 離線策略App斷網(wǎng)不能變成磚頭智能家居App有一個很特殊的場景用戶回到家里手機(jī)連著WiFi但外網(wǎng)斷線了這時候如果所有功能都依賴云端那App基本癱瘓用戶的家庭控制也跟著完蛋。這個體驗問題直接決定產(chǎn)品和競品之間的差距。我的建議是核心控制鏈路必須支持純局域網(wǎng)模式。具體做法是App在啟動時先嘗試連接云端同時啟動局域網(wǎng)設(shè)備發(fā)現(xiàn)UDP廣播或者掃描設(shè)備熱點。如果云端連接失敗但局域網(wǎng)設(shè)備發(fā)現(xiàn)成功App自動進(jìn)入局域網(wǎng)模式此時所有控制指令直接走局域網(wǎng)IP下發(fā)。UI上可以加個小角標(biāo)提示局域網(wǎng)模式。這里面有一個值得注意的數(shù)據(jù)存儲問題局域網(wǎng)模式下設(shè)備的名稱、房間位置、狀態(tài)這些數(shù)據(jù)要從本地緩存讀取不能依賴云端下發(fā)。所以App在首次從云端拉取設(shè)備列表之后務(wù)必將設(shè)備信息持久化到數(shù)據(jù)庫。我用的是Room簡單可靠數(shù)據(jù)模型長這樣Entity(tableName device) data class Device( PrimaryKey val deviceId: String, val name: String, val roomId: String, val ipAddress: String, val stateJson: String, val updateTime: Long )每次收到設(shè)備狀態(tài)更新時除了更新UI還要同步更新數(shù)據(jù)庫里的stateJson和updateTime。這樣即使完全離線用戶在列表頁也能看到最后一次的已知狀態(tài)。5.2 通知欄與快捷開關(guān)智能家居App的高頻入口設(shè)備放在App二級頁面里每次控制都要解鎖、開App、點菜單、再點設(shè)備繁瑣程度太高。成熟的智能家居App一般會做兩個高頻入口通知欄常駐控制面板和桌面快捷開關(guān)Widget。通知欄常駐面板的實現(xiàn)方式有兩種第一種是使用Notification的自定義RemoteViews把常用設(shè)備的開關(guān)按鈕直接做到通知欄但RemoteViews支持的控件有限點擊事件需要通過PendingIntent廣播回傳實現(xiàn)起來有一定復(fù)雜度第二種是使用懸浮窗或者通知欄大布局BigContentViewStyle可以承載更多控件。我建議第一版先做桌面快捷開關(guān)成本低見效快。Android提供了AppWidget框架可以放一個4x1的桌面小組件顯示客廳燈、空調(diào)、窗簾等常用設(shè)備的開關(guān)狀態(tài)。點擊按鈕時發(fā)送廣播到App的WidgetProvider在onReceive里解析action攜帶的設(shè)備ID和指令走已有的指令下發(fā)通道。需要注意Android 12之后桌面組件引入了動態(tài)顏色適配如果你希望小組件看起來不那么突??梢宰x取系統(tǒng)壁紙顏色來設(shè)置背景色。這個功能不用也行但做了會明顯提升整體觀感。5.3 多家協(xié)議混用的兼容層Zigbee、Wifi、藍(lán)牙的歸一化處理很多智能家居項目越做越復(fù)雜就是因為接的設(shè)備種類太多傳感節(jié)點是Zigbee的插座是WiFi的門鎖是藍(lán)牙的。如果App里每種協(xié)議都寫一套接口上層頁面就要跟著寫分叉邏輯維護(hù)成本成倍增長。更好的做法是設(shè)計一層設(shè)備抽象層把不同協(xié)議的設(shè)備統(tǒng)一成同一個接口public interface IDeviceController { void turnOn(String deviceId); void turnOff(String deviceId); void setBrightness(String deviceId, int value); void setTemperature(String deviceId, int value); void queryStatus(String deviceId); }然后分別實現(xiàn)WifiDeviceController、ZigbeeDeviceController通過網(wǎng)關(guān)轉(zhuǎn)發(fā)、BleDeviceController。上層業(yè)務(wù)只依賴IDeviceController接口完全不關(guān)心底下是什么協(xié)議。當(dāng)用戶編輯場景時也不需要區(qū)分設(shè)備的連接方式統(tǒng)一按動作列表處理。這個抽象層的價值在你拿到別人的資料包時最能體現(xiàn)項目里如果已經(jīng)把不同硬件方案封裝好了你換硬件平臺時只需要實現(xiàn)新的Controller界面代碼一行都不用改如果項目里沒有這層抽象你會發(fā)現(xiàn)頁面里全是if (device.type wifi)之類的分支判斷那就要小心重構(gòu)成本了。5.4 性能優(yōu)化設(shè)備數(shù)量多時列表和內(nèi)存都別崩全屋智能的設(shè)備數(shù)量輕松就到幾十上百個RecyclerView如果不做優(yōu)化滾動時會明顯掉幀。幾個關(guān)鍵優(yōu)化點ViewHolder復(fù)用。RecyclerView本身已經(jīng)做了復(fù)用機(jī)制但前提是不要在onBindViewHolder里做耗時操作比如不要在這里解析JSON、不要在這里創(chuàng)建新對象。設(shè)備圖標(biāo)的加載。如果圖標(biāo)是網(wǎng)絡(luò)圖片務(wù)必使用圖片加載庫Glide或Coil并設(shè)置合理的緩存策略。每次設(shè)備狀態(tài)變化導(dǎo)致圖標(biāo)變化時要注意別讓同一張圖片重復(fù)加載。狀態(tài)更新時使用DiffUtil。拿到新設(shè)備列表后通過DiffUtil計算差異只刷新變化的那幾項避免整個列表閃爍。避免內(nèi)存泄漏。在Activity銷毀時一定要解綁MQTT回調(diào)、藍(lán)牙連接、以及定時任務(wù)。我見過最多的線上崩潰就是Activity已經(jīng)關(guān)閉了MQTT的消息還在往里面塞直接空指針。5.5 發(fā)布上架與多機(jī)型適配的實操經(jīng)驗項目進(jìn)入發(fā)布階段又有幾個細(xì)節(jié)容易被忽略。第一是簽名文件調(diào)試簽名的App無法更新到生產(chǎn)簽名版本所以第一個正式版發(fā)布的時候就一定要用正式簽名并且備份好keystore文件和密碼。每年都能聽到開發(fā)者把簽名文件丟了導(dǎo)致App無法更新只能換包的悲劇。第二是混淆配置。如果項目里用了MQTT庫或BLE庫混淆規(guī)則要特別小心。常見的做法是在proguard-rules.pro里追加-keep class org.eclipse.paho.client.mqttv3.** { *; } -keep class com.example.smarthome.model.** { *; }模型類和外部庫都需要keep住否則Gson解析時字段被混淆后對不上運(yùn)行期就會崩。第三是targetSdkVersion的適配。如果上架到應(yīng)用市場新版本要求targetSdkVersion必須到指定版本目前主流在33以上。從舊版本升上來的時候有一個地方特別容易出問題Android 13及以上外接設(shè)備時BLUETOOTH_CONNECT權(quán)限需要單獨申請并且不能在Manifest里把這個權(quán)限的maxSdkVersion限制住否則會導(dǎo)致運(yùn)行時權(quán)限申請異常。6. 基于這套資料還能擴(kuò)展什么方向做到這里你已經(jīng)擁有一個能跑通、能控制設(shè)備、能同步狀態(tài)、能聯(lián)動場景的智能家居Android App了。再往后走可以在這個基礎(chǔ)上做幾個高價值的方向一是語音控制集成。接入國內(nèi)主流的語音助手SDK通過語音命令觸發(fā)場景或控制設(shè)備這是目前智能家居體驗升級最快的方式。二是多用戶與家庭共享。支持家庭成員邀請和權(quán)限管理比如僅可控制客廳設(shè)備或可管理所有設(shè)備這就需要引入賬號體系和權(quán)限模型。三是自動化規(guī)則的圖形化編輯器。讓用戶在App里通過拖拽的方式配置當(dāng)溫度高于30度且人在家時關(guān)閉窗簾并打開空調(diào)這背后是一個定時任務(wù)加規(guī)則引擎的組合數(shù)據(jù)模型做得好交互體驗的護(hù)城河會很高。四是設(shè)備固件的OTA升級。在App里通知用戶設(shè)備有新固件下載固件包后通過BLE或局域網(wǎng)下發(fā)到設(shè)備端這個功能需要和設(shè)備端深度配合但很能體現(xiàn)產(chǎn)品的專業(yè)度?;氐綐?biāo)題里那份全部資料詳細(xì)文檔優(yōu)秀項目.zip我想用的方式是先看文檔里的通信協(xié)議再看源碼里的通信層封裝接著梳業(yè)務(wù)層最后才是界面。沿著這條路徑走你把項目吃透之后哪怕?lián)Q一套硬件平臺、換一個云服務(wù)商也能快速把App改造成自己的方案。我這里分享的架構(gòu)思路、代碼骨架、避坑清單都是基于這類項目的真實實施場景整理的。做智能家居App最考驗人的不完全是寫得漂亮的前端頁面而是把各種協(xié)議、各類硬件、各種異常情況都穩(wěn)穩(wěn)接住的能力。希望這些經(jīng)驗?zāi)軒湍闵僮咭欢螐澛?。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天天操夜夜爱| 99热97| 色色五月婷婷网| 丁香五月激情性色郤| 日韩欧美一道四区中文字幕| 色域五月丁香| 免费观看欧美成人AA片爱我多深| 日韩AAAAA| 狠狠色丁香久久婷婷综合五月| 激情五婷网| 国外亚洲成AV人片在线观看| 人妻无码精品一区| 久热 91| 九六五月天婷婷| 色婷婷在线影院| 91九色精品熟女内射| 99色亚洲| 五月激情六月婷婷| 久久久久思思热| 九月丁香| 丁香婷婷六月激情文学| 亚洲精品视频在线| 婷婷久久综合久| 色九九丁香九月色九九色| 99精品在线| 99热综合色图| 激情综合啪啪| 日韩无码专区| 色综合99| 狠狠狠狠狠狠| 亚洲中文字幕在线观看| 九九九九操逼| 国产女18毛片多18精品| 色欲色香,www,com| 日韩日比视频| 亚洲操人| 狠狠色丁婷婷日日,伊人激情综合网 | 国产暴力强伦轩1区二区小说| 狠狠色色| 99精品在线观看| 99九九热在线观看| 五月色综合| 五月天堂色| 久久99大全| 日本天天操| 激情五月婷婷网| 综合视频五月| 天天婷婷综合亚洲亚洲| 九九综合九九| 无码AV免费精品一区二区三区 | 婷婷综合五月| 婷婷综合五月天| 91人操| 婷婷五月丁香五月| 97色色色色色| 666555。COm毛片| 超碰成人公开| 99热插| 91久久综合亚洲噜噜成人在线| 久婷自拍视频| 秋霞三级色戒| 性日本精品| 五月激情五月婷婷五月天在线| 天天精品视频在线观看视频| 婷婷五月天Av| 大陆极品少妇内射AAAAAA| 色色婷婷五月天| 精品无码久久久久久久久 | 日本三级第一页| 一级黄色片看看| 欧美在线ee日韩| 亚洲 成人 电影av在线观看| 综合网色| 五月WWW| 婷婷五月天啪啪| 五月天涩涩| 激情五月天视频| 色婷五月| 色综啪啪啪啪啪啪| 新久久五月天激情| 国产26uuu| 99在线观看| 婷婷色婷婷| 少妇被下春药玩弄A片| 少妇出轨做爰高潮A片| 91免费啪视频| 婷婷激情五月天7| 婷婷丁香六月激情综合| 丁香五月婷婷激情网| 99热18| 五月丁香综合久久夜夜| 狠狠干天天内射| 日韩小视频在线99| 亚洲综合激情五月久久| 日本三日本三级少妇三级66| 丁香五月激情综合在线观看| 五月激情网站| 99久久综合狠狠综合久久| www.9797国产| 五月婷婷开心丁香| 狠狠精品干练久久久无码中文字幕| 色综合99色| www.99婷婷| 99热这里只有的精品视| 亚洲妇女熟BBW| 九月av在线| 99色综合网| 天天色激情| 午夜婷婷| 激情四射婷婷| 丁香婷婷激情五月天无毒不卡蜜桃| 夜夜撸日日操| 色热久资源| 99热在线精品观看| 国产高清视频91九九九久久久| 久久久婷| 99视频内射三四| 久草x色在线观看99| 日本久热| 久婷婷| 久久五月丁香综合| 婷婷伊人五月| 色婷婷丁香女女| 青草青草久热这里只有精品| 91精品无码| 久久久五月天婷婷成人网| 亚洲婷婷在线播放十月| 涩涩涩五月天| 成人羞羞啪啪 全 视频| 丁香婷婷久久| 九九综合精品| 中文毛片无遮挡高潮免费| 日本啪啪天堂| 天天射综合网站| 五月天色婷婷基地| 色亭亭九月| 九九精品这里只有| 最近中文字幕2019视频1| 亚洲精品亚洲人成人网| 久草五月| 99热只有这里才是精品| 丁香九月色| 日本成人噜噜噜噜噜| 天天玩夜夜操| 先锋男人99资源| 久99久视频| 偷拍91九色| 99热这里只有精品3| 丁香婷婷影院| 国产精品色| www,色综合| 激情五月视频在线婷婷| 成人AV中文字幕| 色播五月婷婷| 日韩无码专区| 日日干日日| 色色啊| 色99视频| 九九色视频| 91嫩草国产线观看亚洲一区二区| 99r这里只有精品在线观看| 日本韩国视频在线观看社区免费的9| 五月天色官网| 婷婷成人在线| 色五月天婷婷| 亚洲激情综合五月婷婷啪啪| 大香蕉操操| 丁香五月色网| 天天爱天天做天天舔| 国产毛多水多女人A片| 日韩无码人妻一区二区三区综合| 婷婷伊人五月丁香天堂网| 婷婷五月天国产在线播放| 久久九九re热| 激情综合五月| 天天狠狠干| 色色影院黄大片| 99热综合网| 97精品综合| 99国产精品白浆在线观看免费| 五月激情综合五月| 99视频在线播放大全| 成人婷99最新| 亚洲爆乳无码精品AAA片蜜桃| 婷婷激情五月综合丁| 色色五月天 亚洲| 欧美五月丁香| 五月婷婷丁香五月亚洲色| 欧美五月停| 色婷婷五月天不卡| 国产欧美婷婷| 91九色欧美| 激情欧美五月丁香| 99五月婷| 美女久久天堂| 国产成人网| 天天日天天干天天爽| 午夜激情婷婷| 久久一品区| a久久| www.99成人视频| 五月丁香花激情综合网| 97爱艹婷婷开心丁香激情综合| 日韩aaaaa| 99热这里在线精品| 色综合大香蕉| 婷婷 丁香 久久| 乱精品一区字幕二区| 色爱亚洲| 六月丁香影院| WWW激情五月天| 国产av影片| 国产精品久久久爽爽爽麻豆色哟哟| 六月激情网| 综合视频五月| 激情婷婷综合| 国产精品久久久99视频| 综合网啪啪| 两性婷婷丁香五月| 日韩无码AV电影网站| 成人五月丁香社区| 欧美啪啪9| 国产一区男女| 人人射av| α久久| 色碰碰视频| 91VIP在线观看| 五月婷婷无码| 色婷婷影院| 精品女人九九九| 五月婷婷综合精品| 国产色五月| 很很操96| 激情q青青草在线婷婷| 婷婷狠狠18禁久久| 丁香五月婷婷亚洲色图| 亚洲超级碰| 伊人大香蕉爱聚| 久色网| 五月丁香综合激情| 婷婷亚洲天堂| 91成人电影| 久久99日本精品视频免费观看| A片试看50分钟做受视频| 激情五月天影院| 操碰99| 激情五月天开心| 另类综合婷婷五月天欧美视频| 婷婷激情五月天色| Jh7Uf088VHafNm| 婷婷五月天国产手机在线视频观看| 色射影院| 丁香五月在线视频| 无码婷婷五月天| 26uuu欧美亚洲日韩| 五月色婷婷在线观看| 九九精品99| 99re热99| 丁香五月综合色婷婷| wwwss在线观看| 婷婷成人综合| 丁香六月毛片| 婷婷综合激情| 中文字幕在线观看视频www| 亚州操操| 天天干,天天日| 亚洲激情综合| 婷婷不卡基地| 51XX午夜影福利| 久久久久网站| 久久亚洲色导航| 综合色五月天| 淑女丝袜bi操逼123| 激情五月天 婷婷| 美女天天爽| 五月婷婷激情| 99热精品在线播放| 丁香五月婷婷高清| 丁香婷婷性久久| 久久最新色色色| 久久激情五月天| 色欧美日| 性爱人人网| 午夜福利8055| 日韩欧美一道四区中文字幕| 91无码高清| 丁香社92视频| 黄色一级影片| 99视频内射三四| 五月婷婷av| 久久精品99久久| 婷婷五月色情| 丁香六月啪| 五月婷婷99热| 五月婷婷丁香深深爱| 思思99热这里只有精品| 丁香婷婷六月婷婷六月婷婷六月婷婷| 激情com| 26uuu.| 这里只有精品,日韩视频| 婷激情五月天视频导航| 天天操夜夜夜拍拍拍| 2025中文在线视频字幕免费观看| 久久只这里有精品| 丁香五月婷综合网| 97色97干| 色婷婷av在线观看| 在线成人va| 99久久婷婷精品视频| 99热最新国内| 五月天婷婷爱| 男男野外做爰全过程69| 婷婷五月天国产传媒| 五月婷婷黄色网址| 色激情五月| 狠狠操综合| 成人精品一区二区三区四区五区| 国产色五月婷婷| 无码人妻一区| 久久XX| 五月婷婷综合在线| 五月激情婷婷四射| 亚洲成人综合在线| 天天干天天爽天天爽| 热久久99热欧美国产亚洲| 久热69| www.五月.com| 亚洲av| 色婷婷色五月综合| 五月六月丁香激情视频| 久久99性爱视频| 五月婷婷九| 天天综合精品| 婷婷五月无码| 日日色五月天| 日本美女五月天| 色爱亚洲| 五月天堂六月丁香亚州中文字幕久久| 六月色婷婷色| 激情婷婷啪啪| 极品人妻VIDEOSSS人妻| 日本久久99久久| 五月婷成人| 米奇影视资源婷婷狠狠色激情欧美五月丁香 | 五月综合无码| 欧美69色| 777精品成人a v久久| 亚洲国产99| 99性爱| 97在线日韩| 色五月激情网| 九九热在线视频观看| 五月婷激情| 婷婷色综合网日韩国产| 天天色情站| 超级97碰碰| 噜噜噜狠狠色综合| 五月激情影院| 久久婷婷五月丁香蜜桃网| 三级毛片7979| 99视频只有这里精品| 天天色亚洲| 热婷婷av| 九九婷婷五月天影视| 中文字幕,综合,91| 亚洲欧洲中文日韩久久AV乱码| 五月婷婷丁香啪啪| 天天插插天天| 99久久超级| 99re在线视频精品,这里只有精品18,| 79精品视频在线观看,| 亚洲无AV在线中文字幕| 男人的天堂999| 激情五月丁香亭亭| 五月激情婷婷偷拍| 手机AVAV天堂看网| 五月丁香网站| 五月丁香六月婷婷,婷| 综合99久久天天综合| 激情小说色五月| 这里有精品99| 婷婷色五月丁香六月欧美啪| 91精品91久久久中77777久久玖玖九九| 欧美Va在线| 丁香五月久久| 色色自拍视频网站| 久久ab| 欧美乱码国产一级A片| 99热99re6国产在线播放| 中文字幕日产A片在线看| 91大神操美女| 欧洲综合视频| 久99久在线| 69色婷婷| 丁香五月性爱| 91大神操美女| 色播婷婷五月天| 日本一级大片| 五月丁香成人网| 殴美97色| 色偷偷色婷婷| 九九偷拍网| 日本色色色| 亚洲成人影视在线| 久久婷婷五月天亚洲欧美| 九九视频在线观看视频6| 婷婷五月天成人在线视频| 91精品久久久久久久| 小色小蛇伊人婷婷色香五月| 色私五月婷婷| 五月婷啪| 五月天婷婷激情| 九月丁香婷婷综合激情| 婷婷五月天影院| 六月激情婷婷色| 91精品综合久久久久久五月丁香| 六月丁香射婷婷欧美色图片 | 六月婷婷av| 婷婷五月综激情| 天堂中文国产| 亚洲婷婷免费| 色噜噜狠狠色综合日日免费| www.色色色com| 天天干、天天日日| 婷婷五月乱交换| 五月激情小说网| 亚洲精品网址| 夜夜撸天天操| 色五月婷婷开心| 国精产品一区一区三区免费视频| 99亚洲色色| 五月婷婷亚洲色图| 伊人激情啪啪| 襙比视频| 艹天天射| 九九这里有精品视频| 性一交一乱一交A片久久四色| 5月色亭亭视频| 91久久久久久久久久18| 99热这里只有精品86| 69综合在线| 成人精品在线| 婷婷五月天亚洲精品| 亚洲免费成人电影AV| 激情综合网五月天| www.99热| 亚洲精品九九| 亚洲成人网站在线观看| 99久久思思| 成人精品网站在线观看| 丁香六月综合激情| 一本伊人色婷| 综合婷婷久久| 五月天色软件| 久久九九网| 五月天播播综合| 大大香蕉综合在线| 性色五月天| 五月婷婷欲色| www,久久久| 亚洲亚洲人成综合网络| 欧美日韩成人高清在线| 日日鲁鲁夜夜爽爽| 色色激情五月| 丁香五月之久操视频| 9久热免费视频99| 亚洲色五月天是什么| 极品少妇婷婷五月| 婷婷五月综合在线| 无码髙清| 婷婷六月天亚州| 激情99热| 成人精品网站在线观看| 99热综合| 色情久久久| 五月天玖玖狠狠色色| 夜夜大香蕉婷婷丁香| 色婷婷丁香五月| 夜夜撸夜夜骑| 久久婷婷丁香六月天| 中文字幕永久免费| 男人的天堂97| 九九精品免费视频99| av大香蕉| 91丨九色丨熟女丰满| 五月丁香五月天现场视频| 日本一级一片免费视频| 久久久五月天婷婷| 婷婷丁香社区| 丁香五月天综合| 五月婷婷在线观看黄| 色婷婷狠狠色| 这里只有精9| 激情综合在线观看| 人人干人人操外国| 欧美日本国产| 黄桃AV无码免费一区二区三区| www.99久久久| 天天综合五月天| 深爱五月日韩| 婷婷丁香激情五月天色色| 777色婷婷爱五月| 久久久久久久久久91| 十二区无码| 五月色情| 亚洲精品V天堂中文字幕| 色欲天天综合网| 久久五月婷婷丁香| 五月婷婷啪啪综合网| 99久久免费精品| 开心日韩丁香婷婷五月| 亚洲亚洲激情| 五月丁香怕怕综合| 天天搽天天射| 激情小说婷婷小说| 亚洲色精彩| 大香蕉婷婷色| 天天射综合网站| 色色色在线观看| 五月婷婷色白丝| 97婷婷五月丁香| 九九婷| 610018岁成人视频| 亚洲综合五月天婷婷| 久久精品A片777777| 狠狠综合网| 99热66| 亚洲精品字幕在线观看| 风流少妇A片一区二区蜜桃 | 免费看成人747474九号视频在线观看| 天天激情欧美美女| 亚洲精品色| 99免费视频| 超碰网站在线观看| 人妻人人操| 丁香婷婷六月天| 天堂久久精品| 五月丁香色综合| 婷婷亚洲综合| 三十熟女| 色婷婷影视99| AV动漫不卡无码免费| 五月天婷婷綜合院| 五月丁香六月色婷| 激情五月综合色婷婷| 蜜乳A√| 色婷婷五月综合网| 婷婷综合激情| 婷婷色在线观看| 人妻啪啪啪| 99热这里只有精品8| 免费无码毛片一区二区A片| 精品国产乱码久久久久久免费| 成人免费120分钟啪啪| 综合久久五| 毛片九九九九九九| 人伦30P| 亚洲操逼网| 99热这里只有在线播放| 丁香五月欧美激情| www.婷婷五月天| 国内外色色色色色成人视频| 99re欧美精品| 日本人人干| 五月丁香六月婷婷综合在线| 六月婷婷影院| 97色啪| 高清无码入口| 中文超碰视在线| 欧美色色色色色色| 色色色在线播放| 丁香五月婷婷在线视频| 性爱网五月天| 少妇高潮呻吟A片免费看软件| 亚洲视频码| 狠狠色噜噜狠狠狠狠综合| 第四色五月激情网| 可以看的AV| 婷婷色婷婷| 91九色超碰| 国产精品色婷婷99久久精品| 激情五月天之六月婷婷| 免费看欧美成人A片无码| 99性色| 超碰69天堂| 99日本精品视频热| 婷婷在线免费| 亚洲色热| 东京热免费视频网站| 激情五月黄色小说| 色婷婷精品视频| 久久怡红院| 综合激情在线观看| 五月激情婷婷色| 六月婷婷视频| 色涩视频久久| 五月天激日本色情在线| 天天操夜夜操| www久久久久久久久久久久久久久久久| 丁香九月综合激情| 中国激情网| 五月综合激情| 任你日视频| 五月婷在线视频免费播放| 激情AV| 日韩有码一区| 五月丁香六月色情网欧美| 秋霞AV淫| 丁香婷婷老司机久操| 色色色99韩| 影视av久久久噜噜噜噜噜三级| 国产毛片精品一区二区色欲黄A片 99国产在线精品视频 | 色噜噜狠噜噜视频| 激情五月四色| 婷婷丁香五月天综合网| 超碰99在线观看| 青青草婷婷久久| 综合在线丁香五月| 五月婷婷五月天| 吊色AV男人的天堂| 亚洲成人五月天| 怎么样可以看免费的一级av| 久久久久久久久久久久久久人妻视频| 97在线精品视频| 日本人妻久久| 99在这里有精品| 三男玩一女三A片| 色色婷婷丁香| 五月天啪啪视频| 99视频在线观看网址| 丁香五月婷在线观看| AA片在线观看视频在线播放| 婷婷色五月综合丁香| 日本久久婷婷| 任你搞网站| 思思热视频| 伊人超碰在线| 激情五月天激情综合网| 丁香六月婷婷激情| 99热成人在线| 五月天啪啪网| 五月开行婷婷色五月| 任你躁XXXXX麻豆精品| 99热在这里只有免费精品| 色五月激情婷婷| 婷婷丁香五另类网站| 色综合大香蕉| 色丁香婷婷| 久久婷婷综| 五月丁香六月成人| 91碰视频| 欧美日韩999| 激情色播| 美女五月激情| 99在线精品免费视频| 怡红院院在线导航网 | 天天色天天搡| 激情综合网色播五月| 五月丁欧美| 欧美性爱五月天| 婷婷五月丁香五月丁香| 九九热精品视频在线观看| 五月丁香综合网色欲| 欧美日韩91| 五月天婷五月天综合网在线观| 韩国真做片在线观看| 激情五月综合色婷婷| 91在线就要啪| 日韩AV大全| 婷婷激情五月视频| 久婷婷| 五月丁香激情片| 丰满少妇猛烈A片免费看观看| www天天干| 超碰97在线观看免费| 色综合香蕉视频| 女人被男人吃奶到高潮| 91狠狠综合网| 国产成人+综合亚洲+天堂| 丁香婷婷免费| 99久久天堂婷婷| 精品久热69| 91狠狠综合久久久| 亚洲经典三级| 欧美黄色AA片哗啦啦啦| 五月丁香婷中文| 99日韩| 丁香五月欧美色综合| 艹天天射| www.色综合| 五月丁香激情婷婷综合| 欧美激情中文字幕| 色一情一乱一乱一区91Av| 九九热手机在线视频| 日本久久9| 四色99久久| 天天综合亚洲综合| 91肏| 9精品久久999| 婷婷五月天AV在线| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 婷婷精品在线| 在线18av | 激情五月天婷婷在线网址发给我| wwwss在线观看| 99热传媒| 开心激情网在线| 蜜臀嫩草| 天天色播| 九九色情网五月天| 99免费在线视频| 深情五月天| 五月天日日操夜夜操| 97久久精品视频| 99综合免费视频| 婷婷五月噜噜| 国产一级片| 久久九九99.www| 99在线小视频| 人人摸人人摸| 狠狠久久婷五月综合色| 色婷婷色情| 五月天久久色| 99热手机在线精品| 九九热这里只有精品6| a69在线视频| 91综合在线视频| 激情操逼婷婷| 99热综合网| 五月丁香六月婷婷色情| 囯产精品一品二区三区| 开心五月婷婷激情| 久热9热| 国产精产国品一二三在观看| 丁香婷婷色五月| 思思久久精品| 天天爽夜夜爽| 日本在线免费中文com.| 九九AV在线| 婷婷久久天堂网| 成人无码精品1区2区3区免费看 | 五月天激情网开心网| 狠狠狠婷婷五月综合| 婷婷久久性爱| 91婷婷五月天嫩女| xxx综合在线| 五月婷婷丁香啪啪| 91九色丨国产丨爆乳| 丁香社92视频| 日操夜操天天操不卡| 99激情视频| 99热国产这里只有精品| 丁香六月啪啪啪| 色色色com| 夜夜操,天天撸| 五月天婷婷激情小说| 五月综合亚洲色| 秋霞性爱AV| 香蕉久久六月| 色婷婷先锋| www久久久久| 九一牛视频探花| 久月久在线视频| 在线看的免费网站| 中字幕视频在线永久在线观看免费 | 91视屏在线观看com.wwwvv| 国产1区2区3区在线观| 91精品无码| 婷婷九月亚洲| 99久久精品色老| 99碰网站| 中文字幕av久久爽一区| 五月丁香亭亭操逼| 久久久性爱视频| a九九热www| 五月婷婷丁香大陆免费| 殴美激情综合网| 超碰九九热| 色色五月天激情| 亚洲综合字幕色色| 日韩欧美一区二区三区四区| 日日天天天| 99成人网站| 激情网站综合五月天| 五月人妻婷婷| 天天成人丁香美女AV| 丁香五月天激情网| www99热| 99久在线精品99re8热| 99热色精品| 综合99综合久久久久久久| 4399在线日本A片| 亚州色婷婷| www.91久久| 国产精品久久久久久久久久久久| 亚洲精品无人区| 成人精品免费在线观看| 人妻五月天激情开心网| 玖玖在线| 九九蜜臀精品| 99久久综合精品五月天| 欧美色色色色色| 久久电影4399| 99rewww| 99.色| 色婷婷亚洲六月婷婷中文字幕| 噜噜狠狠色综合久| 99精色| 老师的粉嫩小又紧水又多A片视频| 成人 在线观看国产| 丁香九色不卡aaa | 色五月丁香A欧美com| 丁香五月天婷婷大香蕉| WWW色色色COm| 第二色AⅤ| 婷婷色欧美激情| 五月丁香六月婷婷成人电影| 日韩啊啊啊| 综合久久狠狠| 日本99在线| 第二色AⅤ| 99精品小视频| 久久婷婷五月天| 九九丁香社区欧美激情| 综合一区二区三区| 五月六月丁香婷婷在线观看| 久久人妻视步| 婷婷天天日婷婷| 97操碰人免费| 五月天婷婷久久| 青草激情在线| 热九九精品| 啪啪日本欧美| www婷婷| 狠狠狠狠狠草| 二色AV| 天天干在线播放| 9热视频在线观看| 欧美97p| 99热国产精品| 国产一级黄色影片,| 97香蕉碰碰人妻国产欧美| 欧美色小说婷婷| 五月婷婷色影院| 久久99久久99久久99| 丁香五月中文字幕| 久久久久久久人妻| 香蕉婷婷色五月| 夜夜夜夜撸夜夜操| 激情婷婷五月天| 婷婷九月在线| 天天操夜夜玩!| 97碰碰人人| 亚洲啪啪自拍| 亚洲视频丁香网va| 色综合综合色| 亚洲视频另类| 九九九九九无码| 日本欧美国产| 一级黄色片看看| 丁香五月图片| 99热碰碰热| 3DAV亚洲香蕉久久 一区二区| 激情小说五月天社区丁香 | 99热这里只有精品8| 国产亚洲精品久久久久苍井松 | 婷婷五月激情欧美大胆视频| 超碰在线人妻| 狠狠插狠狠插| AV片在线观看| 深爱五月中文字幕| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 99精品视频在线观看| 热99久| 天堂草在线观| 亚洲亚洲人成综合网络| 国产美女无遮挡裸体毛片A片| 99超级碰碰| 夜丁香综合| 丁香五月婷婷综合啪啪| 狠狠操天天操| 九九视频这里只有精品| 午夜爱爱网站| 99精品色| 丁香五月色情av| 五月丁香婷中文| 国产又粗又大又爽又黄| 99久久66| 激情五月天社区| 激情久久五月天| 狠狠狠狠狠狠色| 亚洲无码激情| 五月综合无码| 婷婷五月天大香蕉在线视频观看| 国产精品蜜臀99| 97在线观视频免费观看| 亚洲五月天天| 午夜不卡久久精品无码免费 | 色五月婷婷亚洲最大| 深爱激清网| 九九视频在线| 五月丁香激情婷婷| 欧美日韩一区二区三区四区| 99在线免费视频| 欧美性做爰大片免费看办公室| 人妻久久久久久| 亚洲V国产V欧美V久久久久久| 丰满人妻妇伦又伦精品国产| 伊人99久久| 久青草大香蕉| 九色91国产| 五月婷婷六月丁香激情深爱| 丁香激情合作五月| 五月婷婷丁香av| 九九热视| 久色网| 青草视频在线播放| 在线免费观看激情视频| 五月丁香啪啪综合网| 丁香五月婷婷亚洲人| 一本道综合网| 丁香五月六月综合欧美| 九九色精品| 国产肥白大熟妇BBBB视频| 色五月婷婷丁香凹凸| 久婷久婷激情肉| 玖玖在线视频| 五月丁六月婷| 97久久精品| 婷婷五月成人| 综合激情九月婷婷,激情综合婷婷中文字| 色色影院黄大片| 丁香婷婷六月婷婷六月婷婷六月婷婷| 丁香五月激情视频在线| 久草狼人| 欧美成人AAA片一区国产精品| 亚洲天堂色| 97狠狠色| 激情综合色婷婷啪啪六月天| 久99热在线观看| 熟妇人妻中文字幕无码老熟妇 | 五月丁香啪| 99热精地址| 大香蕉综合| 久爱综合| 91久久1118| 婷婷丁香综合| 女人天堂AV| 色婷婷亚洲在线观看| 五月丁香婷婷福利| 妻久久人久久| 日韩精品AV一区二区三区| 丁香婷婷婷五月综合色情| 丁香五月天色| 五月丁香五月综合欧美| 日本乱子人伦在线视频| 九九精品亚洲| 日韩按摩二区| 大香蕉精品视频| 影音先锋91视频| 996er在线观看| 美国十月色婷婷在线观看| 久久99热网| 久久精品99| 婷婷99狠狠躁| 99视频在线观看地址| 婷婷性爱网| 天天综合在线网| 少妇真实被内射视频三四区| 亚洲AV网址| 欧美国产一区二区三区| 亚洲无AV在线中文字幕| 9色在线| 亚洲无码yw| 99综合入口| 深爱开心激情网| 噜噜五月天综合| 射久久丁香五月| 婷婷五月天综合色| 成人视频网| 激情视频网址| 97人凄人人操人人爽| 日本在线视频看se99| AV79| 六月婷婷综合网2| 五月婷婷综合色啪| 成片免费播放| 99色热| 亚洲AV综合网| 婷婷99狠狠躁天天躁中文| 第四色首页| www天堂99| 深爱五月亚洲| www.色五月| 婷婷五月 丁香六月| 久久九九色| 九九热AV| 色婷婷基地| 91色在线/日韩| 在线观看中文字幕亚洲| 久久久婷丁香五月天激情综合| 五月婷婷六月丁香在线| 激情骚五月| 99热这里只有精品首页| 九色porny在线观看激情四射| 狠狠干 狠狠操| 日韩在线视频9色| 五月婷婷花| 婷婷九月久久| 99热这里只| 玖玖综合玖玖| 激情开心五月天| 九月婷婷色色| 五月丁香性爱| 婷婷大香蕉| 97人人干| 五月天激情日色在线| 伊人久久婷婷五月综合97色| 激情婷婷五月天在线观看| 色综合色香蕉网| 91色情播放| 婷婷五月综合色中文字幕| 丁香婷婷激情五月天无毒不卡蜜桃| 69精品人人人人人人| 女人天堂AV| 激情五月天色色网| www.色五月| 操一操插一插| 婷婷五月天天激情| 五月天天综合| 五月天激情黄色小说在线观看| 激情五月婷婷| 婷婷狠狠五月综合| 牛牛色av| 久久精典| 婷婷五六日| 五月婷婷婷色| 超碰二区| 久久er+| 亚洲人成网站999综合| 99热碰碰| 涩涩五月天综合| 九九热123| 第四色五月婷婷| 婷婷五月中文在线| 五月天sesese| 九九热精品99| 五月天激情网图片 - 百度| 黄色激情网站在线观看| 丁香激情四射| 开心婷婷五月花| 国产在线视频1234| 亚洲天天| 就爱射中文字幕资源网| 天天se在线视频| 99在线精品视频| 激情综合激情五月一起草| 欧美99热| av五月天婷婷丁香| 丁香大香蕉| 秋霞网在线观看理论91| 色综合狠狠色| 天天射影院| 丁香五月激情网| 激情合网婷婷| 久久婷婷色情7777网站| 超碰97在线操| 大香蕉五月丁香| 日日肏天天操| 99精品在线观看| 久久月天堂| 亚洲综合五月天| 激情五月丁香六月| 亚洲激情免费久久| 天天操天天曰天天射| 99精品偷自拍| 香蕉婷婷| 五月激情六月综合| 丁香六月视频| 日本啪啪网| 黄色激情网站在线观看| 五月天成人免费视频| 精品人妻伦一二三区久| 丁香五月天激情AV| 性爱综合网| 久久婷婷的综合色丁香五月| 五月花婷婷| av在线观看网站| 开心激情网五月| 五月丁香六月婷婷亚洲激情综合| 日韩综合久久| 久久五月婷婷视频| 大香蕉久久视频久久视频 | 久久精品一区二区三区四区| 超碰人人干| 天天在线XXX| 亚洲五月天婷婷在线| 日韩狠狠色婷婷| 色情婷婷| 日本久久人人| 亚洲另类av| 色婷婷人人| 久久无码成人| 思思热在线观看| 丁香五月天激情| 91人操| 激情深爱五月天| 日本人人xxx| 激情五月婷婷综合色播小说| 丁香五月婷婷成人色区| 五月婷视频久久| 五月婷婷影| 成人毛片在线免费观看| 婷婷五月欧美| 久久婷鲁| 蜜臀av 粉嫩av 懂色av| 色婷婷网大全在线| 四LLL少妇BBBB槡BBBB| 色五月av| 天天日天天舔| 精品人妻一区二区| www,com,五月色色| 欧美性丁香色色五月天| 翔田千里aV中文字幕| www九九| 色婷婷色九月| 先锋资源91| 丁香激情四射| 色播婷婷大香蕉| 婷婷五月天综合网| 久99视频在线观看| 久婷| 丁香五月婷婷六月婷婷| 伊人春天av| 噜噜综合网| 五月婷婷丁香五月亚洲色| 99久久a线观| 五月天小说激情| 色综合日日| 97色色在线视频| 99爱视频在线| 色九亚洲| 在线中文字幕视频| 久草热在线视频| 免费看欧美成人A片无码 | 五月天激情美女久久| wwwwww.色| 六月综合婷婷开心伊人| 一级二级色大片| 久久婷狠狠色| 婷婷五月色天| 香蕉久久av一区二区三区| 久久婷婷五月综合色丁香花| 97操女视频| 亚洲网站999| 激情五月综合色| 夜夜做天天爽| 韩国天天婷婷| 五月丁香啪啪激情| 丁香六月婷| 九九色婷婷Av| 久久九九@| 五月婷婷 欧美| 99精品网站| 色婷婷亚洲婷婷| 五月婷婷天| 日韩av一区二区在线/日产精品久久久| 热日韩欧美| 色五月婷婷91| 99亚洲综合| 天天爽天天摸人妻综合网| pom538精品视频| 婷婷五月天小说| 综合五月激情| 丁香婷婷六月天| 五月丁香六月婷婷中合网| 色婷婷丁香五月综合| 伊人婷婷大香蕉| 性一交一乱一交A片久| 久久182| 九九热这里有精品视频| 九九无码视屏| 欧美内射AA| 九九爱激情| 色99网| 夜夜撸日日骑| 久久综合九九| 狠狠婷婷日韩| 欧美内射AA| 五月成人综合| 五月婷婷天| 久久免费干| eeuss人妻| 久久金品黃色| 丁香五月激情五月| 超碰国产av| 天天操天天日天天爽| 日本久久高清| 美女被肏网站在线看| 激情文学 综合 色| www夜夜操| 亚洲欧美在线观看| 狠狠爱婷婷| 色色免费网战视频| www.婷婷六月天| 久热伊人9| 99热这里精| 亚洲视频99| 超碰97久久| 五月丁香五月天现场视频| 六月婷婷开心| 九九av在线| 日撸夜撸日操| 大香蕉av在线| 99久在线精品| 99无吗| 日韩精品一区二区三区,四区,五区视频| 五月丁香大相交| 开心激情网在线| 爱超碰性| 开心五月天私房婷婷| 午夜丁香综合婷婷| 性爱五月婷| 丁香色情五月综合网站| 丁香六月婷婷久久综合| 99热这里| 99色在线观看视频| 色婷婷无吗| 亚洲精品五月| 日日影院 | site:901-07.com| 超碰人人艹| 婷婷五月天AV在线| 色五月激情五月天| 一本色道久久综合狠狠躁一二三| 开心五月天私房婷婷| 亚洲综合99| 久久九九@| 五月丁香婷婷综合| 狠狠色综合网站久久久久| 欧美草久久五月天91| 2025超碰| 天天综合五月| 日本精品人妻无码77777| 婷婷激情五月天7| 99精品无码| 只有精品在线观看| 五月天狠狠| 丁香六月啪啪| 草草视频91| 五月丁香影院| 26uuu精品一区二区| 色色婷| 五月丁香综合在线| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 九九热这里只有精品首页| 久久ww| 色婷五月婷婷| 天天爽天天爽| 丁香激情合作五月| 日韩无码专区| 热99re| 狠狠色噜噜色狠狠狠综合色| 国产精品色婷婷AV综合色色| 99热一本久道| 97热精品|