久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

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

Android智能家居App開發(fā):從MQTT通信到設(shè)備控制全解析 簡介本資源是一套完整的智能家居Android應(yīng)用開發(fā)實戰(zhàn)資料包面向計算機、物聯(lián)網(wǎng)、自動化、電子信息等專業(yè)的在校學生、教師及初級開發(fā)者適用于畢業(yè)設(shè)計、課程設(shè)計、項目立項演示及Android進階學習。壓縮包共220個文件含62個Java源碼文件實現(xiàn)設(shè)備控制、場景聯(lián)動、用戶管理等核心邏輯、82個XML布局與配置文件涵蓋UI界面、權(quán)限聲明及資源適配、53個PNG圖標資源支持多分辨率設(shè)備以及Gradle構(gòu)建腳本、APK安裝包、簽名配置等工程必需文件整體大小為6.84MB結(jié)構(gòu)規(guī)范、模塊清晰便于快速編譯運行與二次開發(fā)。已有54人下載學習項目源自高分實踐成果答辯評分95分所有代碼均經(jīng)實機測試驗證功能完整穩(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)。資料包和標題里反復(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、藍牙、Zigbee這類協(xié)議Android在BLE開發(fā)上有完整API調(diào)試起來比iOS要靈活開放度完全不一樣。Android手機品牌分散、系統(tǒng)版本跨度大這意味著App寫出來之后要面對各種Rom的兼容性但反而鍛煉了代碼的健壯性工程上更有挑戰(zhàn)也更能積累經(jīng)驗。從成本角度考慮一套Android端的方案可以直接跑在幾百塊的低價平板和舊手機上用戶把舊手機掛墻上當控制面板體驗比買專用中控屏還好。1.2 這個全部資料詳細文檔項目到底覆蓋了什么從標題的字面信息來看這套項目資料包含的不只是源碼而是完整的工程化交付物Android客戶端工程、硬件端示例大概率包含ESP32、STM32的固件參考、通信協(xié)議文檔、以及UI設(shè)計規(guī)范。這類項目的價值不在于代碼能跑而在于它把智能家居App到底應(yīng)該長什么樣、踩過哪些坑都沉淀了下來。我見過太多人拿到一個類似項目之后第一件事就是把代碼塞進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è)備控制鏈路從手機到傳感器的完整路徑智能家居App最難講清楚但又最核心的是它和普通App在架構(gòu)上的本質(zhì)差異。普通App是用戶到服務(wù)器的單向或雙向請求而智能家居App處在一條很長的控制鏈路上手機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ò)永遠是通的、設(shè)備永遠在線必須把異常情況當成正常情況來設(shè)計。以我經(jīng)手的WiFi方案為例設(shè)備連接家里的路由器App通過局域網(wǎng)或云端下發(fā)指令。局域網(wǎng)方案的延遲更低但要做設(shè)備發(fā)現(xiàn)比較常見的是UDP廣播加設(shè)備自報云端方案則要依賴服務(wù)器的穩(wěn)定性和設(shè)備長連接的?;顧C制。真正成熟的商用App都走雙通道局域網(wǎng)可用時優(yōu)先局域網(wǎng)斷網(wǎng)時自動切云端同時把指令的ACK和重發(fā)機制做進去。2.2 .zip項目里的標準分層結(jié)構(gòu)很多初學者拿到這類項目壓縮包先去找MainActivity和布局文件這是不對的思路。智能家居App的工程結(jié)構(gòu)通常遵循清晰的分層每個目錄都有自己的職責應(yīng)用層App層負責UI展示和用戶交互包括設(shè)備列表、控制面板、場景編輯頁面、個人中心。業(yè)務(wù)層Manager/Repository封裝設(shè)備管理、消息推送、場景聯(lián)動等業(yè)務(wù)邏輯。這一層不關(guān)心按鈕長什么樣只處理做什么。通信層Net/Protocol負責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里一個頁面上千行最后運維和迭代成本高到離譜。所以拿到資料包之后建議先畫一張依賴關(guān)系圖理清各個模塊之間的依賴方向再動手改代碼。2.3 通信協(xié)議選型MQTT、TCP、藍牙與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低功耗藍牙傳感器、手環(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根本不認識設(shè)備只認識網(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)排第一??刂祈撁孀龅迷倨猎O(shè)備連不上網(wǎng)用戶第一時間就卸載了。配網(wǎng)的核心流程是這樣的設(shè)備上電后進入配網(wǎng)模式通常是長按按鍵或連續(xù)上電三次觸發(fā)此時設(shè)備會打開一個臨時的SoftAP熱點App先連接這個熱點把家庭WiFi的SSID和密碼通過特定協(xié)議發(fā)給設(shè)備設(shè)備再切換模式連上路由器最后App通過局域網(wǎng)廣播確認設(shè)備上線。在Android端實現(xiàn)這個流程需要處理兩個比較麻煩的點。第一個是跳WiFi的權(quán)限Android 10及以上版本跳轉(zhuǎn)到系統(tǒng)WiFi設(shè)置后App退到后臺再回來需要監(jiān)聽onResume并輪詢當前連接的WiFi是否已經(jīng)切換到設(shè)備的SoftAP熱點。第二個是Android 8.0之后App無法直接操作系統(tǒng)的WiFi連接只能引導用戶到設(shè)置界面手動連接體驗會多一步。另外配網(wǎng)過程一定要給足狀態(tài)反饋。用戶連上設(shè)備熱點后等待設(shè)備重啟再連路由器的過程往往需要10到30秒這段時間如果沒有進度提示用戶會以為App卡死了。實操中我會在UI上做三態(tài)切換等待連接設(shè)備熱點、正在下發(fā)配置、確認設(shè)備上線三步都配上倒計時和錯誤提示。這一小塊做好了App的專業(yè)感立刻就不一樣了。3.2 設(shè)備列表的狀態(tài)同步不要為了實時而實時App主頁面通常是設(shè)備列表顯示房間內(nèi)所有設(shè)備的工作狀態(tài)。這里的核心問題是設(shè)備狀態(tài)怎么同步很多項目圖省事輪詢接口每兩秒請求一次云端設(shè)備一多服務(wù)器壓力大手機電量也受不了。更合理的做法是雙模同步實時模式當一個設(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ī)則是新消息的時間戳必須大于當前UI上記錄的狀態(tài)時間戳才允許更新。首次加載設(shè)備列表時如果設(shè)備比較多建議做成骨架屏加漸進加載。先把房間和設(shè)備名稱顯示出來再逐個填充狀態(tài)用戶的等待感知會小很多。3.3 控制指令下發(fā)可靠送達比什么都重要設(shè)備控制是用戶使用頻率最高的功能指令下發(fā)的可靠性直接決定用戶對App的信任度。我的經(jīng)驗是控制指令必須走發(fā)送-確認-反饋三步閉環(huán)缺一步都不行。以最簡單的開關(guān)燈為例用戶點擊開關(guān)按鈕App立即將按鈕置為正在執(zhí)行狀態(tài)本地UI先變過去給用戶即時反饋。App通過MQTT或TCP發(fā)送控制指令同時啟動一個超時定時器一般是3秒。如果3秒內(nèi)沒有收到設(shè)備回復(fù)的ACK就認定發(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大字符串最好是緊湊的二進制幀或者短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í)行引擎。編輯器負責把動作列表組裝成可配置的數(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ù)各自維護狀態(tài)待執(zhí)行/執(zhí)行中/成功/失敗執(zhí)行完畢后以列表卡片的方式展示結(jié)果并對失敗動作提供重試單個動作的入口。Android的協(xié)程非常適合做這個編排每個動作起一個Coroutine超時和異常獨立捕獲。3.5 藍牙功能兼容Android歷史版本的老大難熱詞里的android藍牙藍牙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é)果永遠是空。掃描回調(diào)舊版用LeScanCallback掃描新版推薦用ScanCallback。很多老項目的代碼在新系統(tǒng)上直接不回調(diào)問題就出在API版本差異上。寫兼容層時建議判斷SDK_INT版本大于等于21用ScanCallback否則用LeScanCallback。MTU協(xié)商ESP32的BLE服務(wù)一次能收的字節(jié)數(shù)有限默認MTU是23字節(jié)扣掉協(xié)議頭之后實際才20字節(jié)稍長一點的數(shù)據(jù)包就發(fā)不過去。Android 5.0以上可以通過requestMtu動態(tài)協(xié)商建議首次連接后主動請求一個較大的MTU比如247協(xié)商成功后再發(fā)送數(shù)據(jù)。重連機制BLE連接很容易因為距離、干擾等原因斷開App端必須在onConnectionStateChange里監(jiān)聽斷開事件自動發(fā)起重連并做好重連次數(shù)限制比如最多3次防止設(shè)備斷電時App無限重連耗電。4. 實操從編譯到運行把項目跑起來的完整流程4.1 環(huán)境準備Android Studio安裝與SDK配置拿到項目源碼后先別急著打開把環(huán)境確認一遍能省很多時間。這套資料對應(yīng)的開發(fā)工具是Android Studio安裝時需要注意幾個點JDK版本要匹配Gradle版本。現(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按當前市場要求設(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需要確認依賴是否已經(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配置一個標準的智能家居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/ # 矢量圖標與背景 │ └── AndroidManifest.xml拿到源碼后第一步檢查AndroidManifest把權(quá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 藍牙權(quán)限 -- uses-permission android:nameandroid.permission.BLUETOOTH_SCAN / uses-permission android:nameandroid.permission.BLUETOOTH_CONNECT / !-- Android 12以下藍牙權(quán)限 -- uses-permission android:nameandroid.permission.BLUETOOTH android:maxSdkVersion30 / uses-permission android:nameandroid.permission.BLUETOOTH_ADMIN android:maxSdkVersion30 /這里有個細節(jié)ACCESS_FINE_LOCATION之所以是必需項是因為Android系統(tǒng)規(guī)定掃描BLE必須要有定位權(quán)限雖然邏輯上看似無關(guān)但這是系統(tǒ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); // 實際項目中一般會啟用用戶名密碼認證 // 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ù)端保留該客戶端的會話當App斷線重連后可以收到離線期間發(fā)布的消息。setAutomaticReconnect(true)是讓SDK自動處理斷線重連不用自己在業(yè)務(wù)層寫循環(huán)。QoS設(shè)為1的意思是消息至少送達一次兼顧了實時性和可靠性是智能家居場景下用得最多的等級。收到消息后的回調(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) { // 消息送達確認可用于刷新指令狀態(tài) } });注意connectComplete這個回調(diào)很多初學者會忽略它。當自動重連成功后SDK不會自動恢復(fù)之前訂閱的主題必須在這里重新subscribe否則設(shè)備狀態(tài)就斷了。4.4 藍牙掃描與連接ESP32的關(guān)鍵代碼如果你的項目里需要直接通過BLE控制ESP32不用WiFi網(wǎng)關(guān)我強烈建議封裝一個單獨的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代表掃描啟動失敗需要檢查藍牙是否開啟 } } scanner.startScan(scanCallback) } }在連接設(shè)備之后需要動態(tài)協(xié)商MTU并查找服務(wù)UUID。ESP32上常見的BLE服務(wù)UUID可以在固件的代碼里找到App端要與它保持一致否則GATT通信會失敗。4.5 Android 9及以上強制啟用明文傳輸?shù)倪m配這是最容易踩的一個坑。從Android 9API 28開始系統(tǒng)默認禁止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 ... /推薦使用第二種因為全局放行會帶來安全審計上的風險而上架應(yīng)用商店時審核人員對明文流量會重點檢查。定好一套白名單式的配置既能滿足開發(fā)調(diào)試也能保證上架安全。5. 從跑起來到用得住體驗優(yōu)化與避坑錦囊5.1 離線策略App斷網(wǎng)不能變成磚頭智能家居App有一個很特殊的場景用戶回到家里手機連著WiFi但外網(wǎng)斷線了這時候如果所有功能都依賴云端那App基本癱瘓用戶的家庭控制也跟著完蛋。這個體驗問題直接決定產(chǎn)品和競品之間的差距。我的建議是核心控制鏈路必須支持純局域網(wǎng)模式。具體做法是App在啟動時先嘗試連接云端同時啟動局域網(wǎng)設(shè)備發(fā)現(xiàn)UDP廣播或者掃描設(shè)備熱點。如果云端連接失敗但局域網(wǎng)設(shè)備發(fā)現(xiàn)成功App自動進入局域網(wǎng)模式此時所有控制指令直接走局域網(wǎng)IP下發(fā)。UI上可以加個小角標提示局域網(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、藍牙的歸一化處理很多智能家居項目越做越復(fù)雜就是因為接的設(shè)備種類太多傳感節(jié)點是Zigbee的插座是WiFi的門鎖是藍牙的。如果App里每種協(xié)議都寫一套接口上層頁面就要跟著寫分叉邏輯維護成本成倍增長。更好的做法是設(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é)議。當用戶編輯場景時也不需要區(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ù)用機制但前提是不要在onBindViewHolder里做耗時操作比如不要在這里解析JSON、不要在這里創(chuàng)建新對象。設(shè)備圖標的加載。如果圖標是網(wǎng)絡(luò)圖片務(wù)必使用圖片加載庫Glide或Coil并設(shè)置合理的緩存策略。每次設(shè)備狀態(tài)變化導致圖標變化時要注意別讓同一張圖片重復(fù)加載。狀態(tài)更新時使用DiffUtil。拿到新設(shè)備列表后通過DiffUtil計算差異只刷新變化的那幾項避免整個列表閃爍。避免內(nèi)存泄漏。在Activity銷毀時一定要解綁MQTT回調(diào)、藍牙連接、以及定時任務(wù)。我見過最多的線上崩潰就是Activity已經(jīng)關(guān)閉了MQTT的消息還在往里面塞直接空指針。5.5 發(fā)布上架與多機型適配的實操經(jīng)驗項目進入發(fā)布階段又有幾個細節(jié)容易被忽略。第一是簽名文件調(diào)試簽名的App無法更新到生產(chǎn)簽名版本所以第一個正式版發(fā)布的時候就一定要用正式簽名并且備份好keystore文件和密碼。每年都能聽到開發(fā)者把簽名文件丟了導致App無法更新只能換包的悲劇。第二是混淆配置。如果項目里用了MQTT庫或BLE庫混淆規(guī)則要特別小心。常見的做法是在proguard-rules.pro里追加-keep class org.eclipse.paho.client.mqttv3.** { *; } -keep class com.example.smarthome.model.** { *; }模型類和外部庫都需要keep住否則Gson解析時字段被混淆后對不上運行期就會崩。第三是targetSdkVersion的適配。如果上架到應(yīng)用市場新版本要求targetSdkVersion必須到指定版本目前主流在33以上。從舊版本升上來的時候有一個地方特別容易出問題Android 13及以上外接設(shè)備時BLUETOOTH_CONNECT權(quán)限需要單獨申請并且不能在Manifest里把這個權(quán)限的maxSdkVersion限制住否則會導致運行時權(quán)限申請異常。6. 基于這套資料還能擴展什么方向做到這里你已經(jīng)擁有一個能跑通、能控制設(shè)備、能同步狀態(tài)、能聯(lián)動場景的智能家居Android App了。再往后走可以在這個基礎(chǔ)上做幾個高價值的方向一是語音控制集成。接入國內(nèi)主流的語音助手SDK通過語音命令觸發(fā)場景或控制設(shè)備這是目前智能家居體驗升級最快的方式。二是多用戶與家庭共享。支持家庭成員邀請和權(quán)限管理比如僅可控制客廳設(shè)備或可管理所有設(shè)備這就需要引入賬號體系和權(quán)限模型。三是自動化規(guī)則的圖形化編輯器。讓用戶在App里通過拖拽的方式配置當溫度高于30度且人在家時關(guān)閉窗簾并打開空調(diào)這背后是一個定時任務(wù)加規(guī)則引擎的組合數(shù)據(jù)模型做得好交互體驗的護城河會很高。四是設(shè)備固件的OTA升級。在App里通知用戶設(shè)備有新固件下載固件包后通過BLE或局域網(wǎng)下發(fā)到設(shè)備端這個功能需要和設(shè)備端深度配合但很能體現(xiàn)產(chǎn)品的專業(yè)度。回到標題里那份全部資料詳細文檔優(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
返回資訊列表
欧美人与动性人交a| 欧美AAAA黄片| 大香蕉操久久| 色网站导航大全| 啊好爽快点-国产一区二区三区撒尿在线-成人AV| 免费男人的天堂| 午夜AV人气不卡| 蜜桃香蕉久草精品在线| 性爱视频久久| 在线观看不卡一区二区三区| 丁香六月激情| 亚洲国产婷婷在线播放| 青青草在线视频播放器| 91av天美性媒精品视频| 国产18精品亚洲精品| 中文字幕一区二区三区人妻不卡| 午夜性| 欧美日韩狠狠爱| 五月婷婷爱六月丁香色| 欧美精品系列| 97一区二压| 日本污ww视频网站| 青青草公开在线免费不卡视频| 把腿张开老子CAO烂你| 欧美少妇高潮视频| 中文字幕在线观看网页| 欧美成人黄网色网站| AV女资源| 狼人综合婷婷激情四射| 欧美老熟另类| 欧美日韩夜夜| 偷拍 精品 另类 四区| 国产激情综合五月久久| 日韩三级在线观看mp4| 哈哈操 大香蕉| av天天在线观看| 性爱av网站| 日韩乱伦影音先锋| 国内毛片婷婷六月色| 96国产精品| 大香蕉92| 在线中文字幕| 18禁无码永久免费无限制| 亚洲欧美另类少妇精品| 天天综合网合集91| 欧美福利视频啊啊啊啊| 日韩在线电影| 精品丰满熟妇人妻一区| 亚洲女毛多水多21P| 最好看的中文字幕在线2018| 久操网视频| 久久久久久电影| 秋霞影音一区二区三区| 91精品久久综合熟女| 久碰视频| 99这里有精品| 91丝袜激情在线| www四虎| 97色涩| 精品日韩人妻视频| 欧美亚洲色图另类国产| 无码137片内射在线影院| 亚洲激情色片| 欲色影视综合吧| 97在线资源| 精品国产99| 性一交一乱一交A片久久四色| 欧美性巨大╳╳╳╳╳高跟鞋| 欧洲无码一区二区| 丝袜狠狠草尤物人妻av91| 亚洲色图久久精品蜜| 国产精品情侣啪啪| 丝袜美腿射精91| 天天肏视频| 国产精品久久久久久照片| 欧美极度丰满熟妇hd| 亚洲va综合va国产va中文| 在线观看一级α片刺激高潮视频| 自拍偷拍亚洲熟女妇人精品| 日韩av影片在线观看| 亚洲A色| 91综合网在线| 日本福利二区视频| 伊人少妇久久久| 大香蕉乱级| 大香蕉草草| 久久婷婷成人综合色怡春院| 免费av在线播放二区| 一区二区三区网站日日骚| 9久9久9久9久视频网站| 欧美不卡在线一区二区| a男人的天堂| 狠狠操狠狠操操| 欧美色棕合| 日夜伊人网| 国产网站在线播放| 日日夜夜国产综合| 中字幕人妻一区二区三区| 91伊人久| 亚州中文字幕超碰97| 日韩人妻丝袜中文字幕| 91天美传媒精品| 日韩成人精品| 国产av热热色| 一起草视频在线| 丁香九月 婷婷| 人妻免费观看| 91精品微拍福利| 清清草影| 久久久爆乳翘臀一线天伦理视频| 人妻少妇精品无码专区二区密桃| 国产精品久久久久久 百度| 亚洲欧美国产中文字幕| 国产精品精品系列在线观看| 日韩二区三四区五区六区在线看| 天天日天天操心| 9999九九九久久久| 男人的天堂2010| 成·人免费午夜在线观看| 91黑丝在线播放| 中国少妇XXXX做受| 亚洲无码一区成人免费午夜| 婷婷伊人一区| 午夜啪啪片| 精品欧美日韩在线观看| 亚洲精品丝袜| 成人免费在线网站| 国产日韩区| 69一区二区三区 | 波多野结衣一级视频| 欧美日本视频一区| 1024亚洲中文字幕久在线看片你懂的 | 五月婷婷无码| 国语国产操逼伊人AV网| 亚洲人妻在线一区| 18禁免费视频| 偷窥自拍A片| 午夜福利免费福利视频| 人妻人人做人人澡人人爽欧美一区| 人妻二区| 欧美v亚洲v综合v国产v妖精| 无码高清少妇久久| 亚洲第一狼人丝袜美女另类| 1000部熟女视频在线观看| 亚洲少妇在线观看| 无码直播久久久| 蜜桃臀av一区二区| 亚州熟女乱伦| 无码高清操逼| 91干熟女| 国精精品无码一二三区水多多| 国语av狠狠色丁香婷婷综合激情| 老熟妇91| 伊人久久在线视频观看| 在线观看高清AV| 国产极品美女高潮无套在线观看| 国产免a费看黄片在线| 国产aⅴ无码片毛片一级网站| 国产第25页在线观看| 欧美裸体美女日麻屄| 99久国产精品午夜性色福利| 国产精品久久久久久久电影渣男| 黄片直播三级黄片两女一男| 大香蕉亚洲中文| 99热这里只有精品9| 天天做日日做天天欢。| 国产不卡精品91| 人妻精品一区二区全免费| 欧美日韩人妻少妇 一区二区三区| 91熟女综合| 9 9无尺码天堂网| 一二三区精品视频| 日韩在线一区高清在线| 九九色热| 国产尤物AV尤物在线观看不卡| 亚洲美女自拍偷拍视频| 欧美中出1| 暖暖精品二区三区观看| 国内外毛片在线观看| 亚洲中文字幕在现观看| 欧美日韩另类在线播放| 亚洲日韩视频二区| 最新加勒比丝袜在线| 日韩淫色网| 97日韩欧美亚洲| 强奸乱伦大香蕉| 国产日韩在线播放| 最新日产中文在线麻豆| 亚洲欧美日韩电影网站一区 | 不卡超碰护士AV在线免费播放| 亚洲吊色| AV乱伦专区| 蜜乳av首页| 欧美性五月| 欧美亚洲首页| 国产AV久久野战精品| 午夜精品久久久99| 青娱乐亚洲自拍| 国产AV久久野战精品| 九九九草| 亚州国产成人精品女人久久| 国产精品探花视频| 青青操在线亚洲视频观看欧美在线 | 2024人人操人人摸| 9ⅰ久久久天天| 久操网址| 日韩人妻一区二区精品| 亚洲欧洲无码一区夜| 蜜臀久久精品久久久久视频| 久久一级无码精品毛片6| 少妇第一页| a片久久久久久久久久久久 | 26uuu欧美| 亚洲欧美洲综合| 伊人久久青青草| 精品久久久久成人码免| 欧美成人性爱视频大全| 亚洲男人天堂2012| 午夜欧美女人操逼| 综合色好色| a男人的天堂| 二男一女成人A片| 亚洲少妇免费视频\| 丁香久久| xxxx网站亚洲精品| 欧美碰碰综合色| 91美女中出| 97精品网| 日本欧美不卡| 亚洲综合有玛| 久久极品一区二区| 精品久久久亚洲AV成人网站| 五月天婷婷社区| 五月天色图| 一级A啪啪啪啪| www.acm成人黄色毛片| 手机在线看片免费人成视频| 大屁股熟女一区二区三区| 亚洲AV性爱电影| 亚洲欧美九九九| 欧美国产日韩高清在线| 免费观看国产不卡av| 97精品97久久| 校园春色综合香蕉| 婷婷丁香五月激情啪啪| 亚洲导航深夜福利| 巨爆乳一区二区爆乳区| 亚洲乱码精品一区二区| 亚洲欧美综合| 日夜伊人网| 9久精品视频在线观看| 久久久成人国产精品无码| 家庭乱伦国产精品| 日韩啊V| 亚洲激情片| 日韩精品一区二区人人人| 五月天精品| 亚洲综合图片在线| 东北操逼| 亚洲图片欧美偷拍| 激情在线青青操| 综合熟妇一区二区三区| 激情婷婷丁香网| 欧美同性恋 的搜索结果 - 91n| 丰满人妻一区二区三区免费,| a网站免费观看| 1024人妻| 日本精品免费一区二区三区四区| 99九九久久| 色汉综合| 亚洲日韩少妇一道本视频| 秋霞蝌科网日本一区| 久久亚码| 伦伦成年午夜免费视频| 4虎在线视频| 翔田千里av一区二区三区| 久久久久ab| 福利视频香蕉免费一区二区在线| 欧亚乱色熟一区二区三四区| 欧美天天干| 日本三级中国三级99人妇网站| 91精品国产一区三一| 青青11操操操操操操操操| 中文字幕在线观看网址| 有码色中文字幕在线观看| 欧美性色网| 超碰 av 女人天堂| 在线播放成人网站| 高清视频一区| 久久国99999| 国产亚洲精品A在线观看下载| 屌色在线97视频| 97色香蕉| 91色综合色| 日本免费亚洲欧美| 亚洲第一精品在线视频| 亚洲日本天堂| 亚洲欧美setu| 黄色小视频日本txt| av2014 日韩在线中文字幕| 一区久久久二区| 色噜噜精品一区二区三| 国产精品电影大全| 亚洲精品成人激情在线| 日韩伦理视频| 国产高潮AA片免费看| 欧美一级美片在线观看免费| 精品九九淫乱男| 天天欧美色| 午夜偷拍久久熟女| 精品人妻视频入口| 久久二| 青青草操逼逼视频| 玖玖玖玖精品国产剧情| 屁股久久久久久久久久| 欧美性区| 极品粉嫩一区二区| 色色综合网站| 久久精品国产AV一区二区三区| 97在线视频免费看| 久久精品无码熟妇一区二区三区视频导航 | 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 国产偷仑| 天天亚洲综合| www久| 无遮挡h肉动漫在线观看| 在线播放成人高清免费视频| 久久久无码视频| 日躁天天爽爽| 精品久| 不卡av免费在线网址| 九九久久国产精品怡红院| 999 久久久| 黑人中出21连凳花野真衣| 人人摸人人摸人人干| 亚洲91在线播放影院| 东京热视频网| 豆花视频操逼网址| 91这里只有精品| 2017天天拍大香蕉| 人妻精品一区二区| 欧美色图色综合| 色淫网站优优视频| 蜜臀久久99精品久久久久久-DVD| 黄色免费一级在线毛片| 999精品乱码| 日韩欧美麻豆| 97精品一区二区视频在线观看| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 黄色av片三级三级三级免费看| 好吊妞转入那个网| 日韩99999| 韩国午夜理伦三级好看| 综合久久婷婷| 日韩精品一区二区三区色欲 | 中出在线视频| 啊啊啊啊免费视频| 国产精品无码久久久久2025| 五月香婷婷| www.色婷婷| 一区=区三区视频| 天天综合麻豆视频| 久久久人妻| 日本性感人妻91| 在线国产福利网址导航| 色牛牛AV| 久久性视频| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 国产不卡中文字幕免费avi| 中文字幕丝袜人妻| 欧色网址| 国产人妻天天干精品| 久久久精品成人国产| 中文字幕加勒比海高清无码免费视频| 中文字幕一二三区| 国产熟女自拍| 国产精品午夜AV完会免费 | 97视频在线观看网站| 东京热双插| 天天干天天干天天干| 人妻内射一区二区在线视频| 日欧操屄| 人妻碰碰碰碰碰碰| 97chaopengongkai| 一,爱啪啪,在线免费视频| 日韩97视频!在线| yazhouzaixian| 日本欧美一区二区三区免费| 啊嗯好大视频在线观看| V A在线| 伊人影院中文字幕| www.夜夜操| 久久成年精品| 久久午夜鲁丝片| 久久久久国产亚洲一区欧美色图日韩| 久草新在线| 色色五月天婷婷| 91女优在线观看| WWW操逼| 超碰这里只有精品| 老司机福利青青草| 我爱大香蕉| 亚洲色欧| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 大香樵伊人网| 日本精品性生活久久久| 天天色黄色影院天天操| 亚洲性综合9| 一区AV| 中文字幕-区二区三区四区视频中国| 高清不卡国产| 精品无码久久久| 无码不卡亚洲成?人片| 91蜜臀在线久久久久| 男女日B国产| 五月亭亭六月丁香| 国产精品片| 色九九综合AV| 偷拍亚洲情色| 亚熟在线| 97鸡把在线视频| 尤物黄色在线观看网站| 日韩精品 资源| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 9/A片 | 操逼内射干逼白丝91| 精品免费成人久久| 草草影院最新网址| 国产第11页| 熟女色综合久久| 久欲AV| 九月丁香综合网| 97久久资源| 操屄日韩| 亚洲春色欧美| 国产精品久久久亚洲一区| 人人操人人肉久久精品| 美女久久久久久久| 激情综合二| 日日夜夜骑| 亚洲国产精品乱码在线观看| 欧美偷拍区| 日韩精品国产精品五码一区二区| 久操视频在线观看| 亚洲熟女乱综合一区二区三区| 五月综合婷婷久久网站| www.acm成人黄色毛片| 男人天堂新| 大香网站| 天天综合网~91入口| 亚洲日韩人妻中文字幕一区| 999久久久久久久精| 色色网91| 91人妻少妇| 日本999精品视频| 日本岛国黄色网址| 在线观看中文字幕| 久久超碰、| 人妻日日干| dy888午夜老子影视达达兔| 久久99精品国产| 成人日韩3| 久久久久九九九| 亚洲AV色图一区| 日本有码影片下载 | 97人人干| 国产精品一区二区三区,亚洲综合| 中文久久| 夜夜爽夜夜| 五十路人妻在线| 日韩精品熟妇| 久久深夜无码| 96AV精品| 欧美系列在线一区二区| 亚洲另类综合欧美| 国产在线视视频有精品| 2018天天日天天日| 国产精品麻豆成人av| 综合色欧美| 久久av色| AA丁香综合激情| 日本一区二区不卡精品| 一区二区三区精品视频| 欧美麻豆成人同性GⅤ在线| 91精品在线播放| 东京热伊久| 少妇高潮喷水无套久久久久久| 狠狠2050在线观看| 久久精品成人一区二区三区蜜臀| 大香蕉综合在线| 美女性91| 东京日日夜夜| 国产最新AV| 成人综合色网| 老熟女熟妇| 久久精品中文字幕女同| AV女资源| 内射老妇BBWX0C0CK| 婷婷色色五月天福利| 亚洲图片激情综合另类| 亚洲 欧美 手机在线观看| 欧美成人黄网色网站| 超碰人人草| 亚洲日韩AV视色| 久久久久久中文字幕中文字幕最新| 青青操狠狠撩| 不卡一区二区日本视频| 欧美色婷婷| 99在线视频播放| 超碰精品人妻狠狠干| 97视频在线看| 国产精品亚洲一区二区三区四区| 日本性爱少妇| 在线啊啊啊啊| 天天综合网~91综合网| 欧美综合天天| 这里只有精品视频在线| 色五月婷婷五月天| AV色五月天| 婷婷久久五月综合激情| 九九无码视频| 91高潮喷水美女| 久久99久久99精品天美传媒棢·纸:. | 亚洲欧美小说| 免费看久久久性性| 久久成年精品| 96精品久久| 狠狠干综合| 性生活性生大爱77AV国产| 性夜影院爽黄A爽免费动漫| 成人一道本免费视频| 久久精品三级影视| 亚洲色图欧美色图制服丝袜| 国产精品扒开腿做爽爽爽视频| 无码av永久免费专区网站| 色综合色| 加勒比无码毛片| 免费黄色A片| 久久久111| 欧美三四五区| 99热超碰在线| 夜夜青青无码影院| 牛牛久久国产精品视频一二三| 性色高清..……| 自拍偷拍第26| 少妇精品久久久八区九区| 少妇久久久| 麻豆天美国美国产| 东京热一区二区中文字幕| 中文字暮97| 91情色在线| 日本一区二区三区四区免费观看| 色香阁在线| 国产成久久综合片| 久久鲁夜| 日韩中文字幕二区| 猛猛干| 黑丝少妇麻豆| h无码动漫在线观看| 97精品在线| 9久久精品| 精久久久| 殴美牲| 热99这里有精品综合久久 | 99少妇| 精品超碰国产| jiujiujiujingpin| 六月天婷婷| 91电影色诱| 国产精品一区二区亚洲人成毛片| 嗯~啊~快点 死我视频| 97视频620| 久草加勒比一区在线| 第四色亚洲色图| 丰满少妇乱子伦精品无| 东京热一区二区中文字幕| 情侣操 逼视频99| 亚洲超碰AV| 久久久天堂| 一区二区 日韩 欧美 国产 传媒| 911粉嫩人妻| 日本乱人伦片中文三区| 亚洲九九视频| 久久久精品久久| 台湾佬中文娱乐自偷自拍| 在线人成亚洲视频免费观看| 欧美最婬乱婬爆婬牲视频| 蜜臀在线免费观看在线免费观看| www.超碰在线| 日韩精品在线观看观看| 91精品人妻一区二区三区蜜桃| 日本熟妇精品九九| 伊人久久久日韩一区| 凹凸视频特色日本特黄| 操逼片国产| 天天操天天干美女网址导航| 色九色久| 久久大陆| 亚洲青色欧美| 91nbbbbbb| 久久国产对白激情浪潮| 99re3这里只有精品| 五月激情啪啪| 91是天天| 大香蕉国产中文自拍| 久久成年精品| 999日韩中文精品观看视频。| 中文字幕在线24| 久久99人妖视频国产| 国产高清无码一区二区三区四区皇冠| www.久久最新地址| 亚洲精品亚洲人成在线麻豆| 国产色精品午夜大片| 成人性爱美曰韩| 日韩AV一起草| 五月婷婷丁香| 日本日日色视频| 久久精品欧美一区蜜桃| 美女91在线观看| 欧美亚洲涩涩| 天天欲望网| 精品少妇999| 人妻少妇精品久久久久久久| 五月丁香六月综合缴清无码 | AV色图| 日日干夜夜欢| 国产熟女无套内射| 无码人妻精品一区二区三区99不卡| 青椒国产97在线熟女| 日本3级一区二区免费| 97久精品| 污电影在线观看| 欧美乱伦专区| 99这里有精品| 亚洲国产精品久久久久婷婷老年| 国产精品美女视频诱惑| 操操逼操操逼操操逼逼| 成人夜夜爽| 日韩av女优在线免费一区| 亚洲精品欧美专业| 色婷婷日韩精品一区二区三区| 91久久青青草原精品| 26uuu欧美日韩| 在线黄页看毛片| 国产少妇内射| 精品人妻一区| 青青草在线视频欧美| www.男人的天堂| 亚洲图片偷拍视频区| 欧美第38页| 探花精品 一区二区| 久久人妻视频网| 欧美精品,四区。五区| 91精品人| 亚洲AV无码乱码在线观看性色| 亚洲AV资源| 九久9精品| 天天综合网站| 熟妇一区,二区,三区。| 精品亚洲国产成人AV制服丝袜 | 丝袜无码a片| 天天综合网~91| 小少妇| 亚洲丝袜少妇在线| 无码国产精品午夜不卡( | 四虎国产精品永久地址入口| 精品一久久久| av爱爱爱| 熟妇激情| 天天操天天插| 成人一二| 99re热| 中文字幕 国产 精品| 大但人体久久久久| 九月丁香综合网| 青青草一本道福利视频| 亚洲高清在线| 亚洲欧美日韩中文播放| 99亚洲精品| 亚洲黑人在线| 啊啊啊97视频| 国产亚洲色婷婷久久99精品91葵花宝典| 欧美 亚洲 综合 制服 另类| 无码伊人久久大杳蕉中文无码| 97超碰色色| 粉嫩不卡一区二区性爱| 人妻密肉在线观看| 亚洲精品影视老司机| 欧美女同在线| 男人天堂2019亚洲| 日韩亚洲国产视频| 天天看片青娱乐| 九九九九久久久久| 日本久久999| 精品国产少妇高潮视频| 香蕉99秘 一区精品蜜桃臀| 美日韩一卡二卡三卡免费人妻精品| 色网在线视频观看免费| 欧洲一区二区三区四区在线观看| 亚洲色图超碰在线| 色情乱伦AV| 激情天天视频| 亚洲 欧美 色图| 91碰碰| 亚洲情色91| 欧美 亚洲 偷拍自拍| 91国模| 91人妻久久久久久久久久久久久| 2018色综合天天操| 大香蕉强奸乱伦| 欧美一级黄色免费专区| 91久久| 天天综合-91入口| 超碰97伊人| 91精品婷婷国产综合久久竹菊| 国产11页| 亚洲人人操| 国产精品视频麻豆入口| 思思久热在线精品66| 人人澡人人澡人人| 热久久无毒不卡| 熟女自慰久久久| 99热精品国产| 久久久久9999妇女| 粉嫩国产精品久久久| 又大又长又爽| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 一牛一区二区三区久久| 神马久久久久久久久久久久| 天天看天天综合成人网| 99热精品在线| 国产欧美伊人| 91色综合激情| 亚欧美天堂在线| 欧美激情视频一区二区三区不卡| 日本三级大片| 欧美日韩超碰在线| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 约操熟妇| 日韩性爱1级片视频| 国产成人无码高清| 国产激情av女片自拍| 性爱视频久久| 亚洲美女30b| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | JULIA人妻风俗店中出电影| 67914亚洲精品| 大香蕉av在线| 亚洲 综合 欧美| 亚洲有码 视频一区| 日韩美女,国产传媒,视频一区| 老司机午夜福利视频一区二区| 97中文字幕一区| TS人妖另类精品视频系列| 色欲天天婬色婬香WWW夜色| 久久五月天婷婷丁香中文字幕| 无码聚合| 大香蕉十区| 欧中美三级一区二区三区| 国产品精品自在在线午夜免费| 日本中文字幕不卡视频 | 天天天干977| 熟女精品日韩一区二区三区| 精品高清av中文字幕| 91热爆在线| AV天堂男人的天堂| 香蕉视频精品亚洲一区二区三区在线播| 中文字幕蜜乳av| 婷婷中文网| 97久久精品国产| 成人怡红院| 午夜福利视频在线一区| 欧美一区二区情色| 欧美 亚洲| 国产又色又爽又舒服的三级视频| 超碰在线97国产| 亚洲无码视频免费在线观看网址!| 五月婷婷激情综合| 97精品在线| 人人艹亚洲| 青青草视频久久久久| 17c嫩草51久久91嫩草| 玖玖97综合| 亚洲精品九九九九九九| 北约熟女超碰| 国产亚洲日本| 国产AV激情无码久久无码| 熟啊v色欧美热| 放黄片放3级黄片没穿衣服| 亚洲精品99| 美女啊啊啊啊啊| 99激情| 搞中出视频在线观看| 国产60区。| 人妻偷拍一区二区三区| 啊啊啊97视频| 日韩操p| 97色97好| 久久亚洲国产成人| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 九热大香蕉| 熟女激情综合网| 久久111| 黄色片,com| 亚洲se电影| www.色综合| 国产精品乱码久久久、久久| 久热9| 久久久久久久9| 亚洲中文人妻色| 老熟妇综合| 久久99视频| 日本羞羞的视频在线播放| 久久久久密臀一区二区| 亚洲暴力强奸AV| 超碰97护士| www.AV有限公司一区| 国产精品一区二区三区,亚洲综合 性开放中文AV高清无码免费看 | 天天操熟妇| 女同在线视频一区| 国产一区二区三区免费视频在性观看| 亚洲欲| 成 人 影视 一区 二区 三区 四区| 精品人妻一区二区视频| 亚洲成成熟女人综合一区二区| 色婷婷在线视频| 中文字幕一区二区三区四区在线视频| 96国产精品| 91 综合 色| 丁香婷婷久久| 操逼操网| 老女人综合| 人妻黑丝袜电影| 熟女日韩| 久久精品性| 午夜男人av| 亚洲熟女乱色一区二区三区| 亚洲情色综合网| 91蜜臀在线久久久久| 2018色综合天天操| 欧美强奸乱能| 九月激情婷婷| 中文字幕三四五区| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 青青草亚洲一区 | 91国产精品熟女| 精品亚洲国产成人精品| 午夜成人爽爽爽爽A片李冰冰| 伊人91| 亚洲人妻精品一区二区| 18精品一二区| 人妻大香蕉| 亚洲性少妇| 丝袜无码a片| 骚逼一区二区| 四虎影视永久在线观看精品免费网站| 超碰98综合网| 欧洲与亚洲欧美精品中文字幕| AV老汉| 91成人社区| 日本顶级天天操狠狠操夜夜操中文字幕| 欧美视频激情久久久久久| www.操| 2017大香蕉国产精品久久| 亚洲黄色网址| 啊啊啊啊啊好舒服视频| 久久久久幕乱码| julia国产在线| 欧美啪啪色吧在线| 日韩无码精品综合久久| 成在线人在线观看视频| 无色无码| 久久的网站啊啊啊啊啊| 丰满人妻一区二区中文| 青草地一本线一区二区三区| 亚洲人久久久久日| 日产操逼| 久久艹逼视频| 久热精品色情| 色色97爱| 国产综合日韩伦理| 亚洲第一成人影院色播| 天天综合网国产| 青青草字幕AV| 日韩欧美传媒一区国产| 大香蕉一区二区在线观看.| 国产热RE99久久6国产精品首| 一区二区偷拍拍视频| 伊人色综合欧美| 丁香婷婷五月| 国产精品呦一区二区三区| 97在线视频观看| 99蜜桃臀亚洲成人在线观看| 99re99| www.色操逼| 大香蕉欧美日韩| 2020久久免费视频| 蜜臀久久久久久999| 98福利在线视频| 欧美偷拍区| 91狠狠综合久久| 天天干天天日天天射黄色片| 亚洲自拍97| 国产67194| 国产三级中文字幕粉嫩 | 一本色道无码DVD中文字幕| 99视频在线| 少妇色综合| 日本三级一区二区 在线| 午夜天堂网| 国产亚洲精品一区二区三区| 欧美一区91大爱| 国产丸一视频| 黄片aaaaa一区| 精品一二三区女同| 国产美女在线精品免费看| 国产免费大片| 成人精品在线免费视频| 青青草精玖玖69精品| 亚洲黄色AV电影| 日韩性爱高清免费视频| 色综和网| 亚洲一区二区在线观看91| 久久超碰亚洲人| 天天操人人操狠狠插| 97精品国产精品免费观看| 亚洲导航深夜福利| 97视频在线视频| 成人午夜无码视频| 国产精品一区二区三区在线| 中文字幕五区| 国产一级内射无挡观看| 欧美高清性猛交| 精品日韩人妻精品一二三区| 大乔未久88一区| 五月婷婷久久综合| 欧美成人一级麻豆| www.91欧美| 色香色欲天天综合网天天来吧| 九九九九免费| 亚洲性综合| 91男女啊啊啊| 亚洲性爱无码乱伦av| 怡红院成人视频| 精品人妻一区二区乱码一区二区| 亚洲操逼视频网站| 韩国三级一线观看久| 久艹99| 国产成自自拍在线观看| 久久久久久久国产a∨| 另类图片综合| 天天天操天天天爱| 2018色综合天天操| 91精品国产日韩欧美综合| 东北女人性交| 91校园春色长篇| 日韩精品午夜操呦呦不卡影院| 日韩三级一区 | 久久久久久久78| 久久久久成人蜜桃精品| 欧美日韩国产黄色片| 久久久不卡| 九九九九一级| 久操黄色视频| 丁香久久| 爱做久久久久久| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 国产熟妇一区二区| 一区二区激情国产熟女| 中文字幕av乱伦| 日韩卡一卡二卡三在线| 超碰97人妻免费在线| 精品国产Av无码久久久伦古装| 男人天堂毛片| 青青操在线视频| 国产激情在线| 色婷婷A V一二三四区麻豆综合| 欧美夜夜骑视频| 欧美色图 人妻| 97玖玖人妻| 99性爱| 26uuu国产| 精品国产乱码久久久久久久久1| 天天干一干| 亚洲色欲一区二区三区| 欧美色图天堂网m| 日日夜夜青青草母狗| 神马影院午夜福利久久久| 狠狠躁天天躁日日躁97| 麻豆精品三区视频| 中文字幕免费在线观看| 日本熟妇自慰性高潮一区二区三区| 97视频在线观看网站| 天天爱综合网| 国产精品一区二区三区在线| 九热中文字幕| 粉嫩av久久一区二区三区| 亚洲精品自拍| 国产专区第一页| www.久久| 中文字幕二区日韩天堂| 久久只有精品一区二区三区| 97中文字幕一区| 人人模人人看| 天天天天天天天天天天干美女| 少妇滛荡视频| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 欧美一二三级精品在线| 亚洲图片日本AⅤ欧美在线| 天天天肏屄肏屄肏屄欧美欧美| 丝袜美腿91| 97爱爱| 国产无码一二三区| 欧美激情 日韩精品| 亚洲情色 无码专区| 少妇综合网| 精品人妻美妇91job| 婷婷伊人綜合中文字幕| 骚乳在线| julia国产在线 | 色色操| 蜜桃精品一区二区三区久在线| 一级毛片电影免费看| 婷婷五月天影院| 神马久久69| 久久久涩| 999国产精品999| 伦理弟一页| 精品国产乱码| 中文字幕视频在线观看一区二区| 色偷综合| 免费观看国产不卡av| 97高清啪啪| 亚春色色| 国产 v乱码一区二| 精品中文日韩字幕视频| 香蕉综合网| 校园春色之综合网| 台湾佬中文娱乐网久久久久久久久久com| 亚洲视频1区| 男人网站婷婷| 在线a v| 精品中文日韩字幕视频| 欧美探花网| 77777亚洲蜜臀精品久久综合蜜臀| 亚洲欧美校园| 国产女人91精品嗷嗷嗷嗷| 97人人色| 亚洲无码色| 亚洲欧美97| 黄色不卡视频| 色在线亚洲视频www| 综合色久欲| 久久九九99| 国产精品不卡高清在线观看| 天天舔九色婷婷| 色黄污美女啪啪啪免费网站| 99精品伊人| JULIA一区二区三区在线播放| 男人的天堂Va| 美腿丝袜偷拍亚洲欧美| 日美免费黄片| 2017亚洲天堂| 秋霞鲁丝午夜无码一区二区三| 黄片在线免费在线观看| 蜜臀99久久国产| 高清不卡视频| 天天色综亚洲91污| 日本五区不卡| 日本免费不卡二区| 亚洲 欧美 手机在线观看| 亚洲熟女综合一区二区| 人人操av| 91成人久久| 丁香九月婷婷| 二对二中文字幕。| 丁香六月综合激情| 青娱乐欧美激情一区二区| 精品人妻一区二区三区不卡断| 60秒免费小视频| 亚洲天堂女优在线| 日韩人体偷拍| 亚洲成av人片色午夜乱码| 色就色综合| 性videos欧美熟妇hdx| 91成人无码| 91日韩网站| 久久是精品| 日韩中文字幕宗合在线| 久久精品免费| 中出91| 九九碰九九爱97超碰| 亚洲最大网站av| 人妻中文字幕日韩电影| 亚洲欧美天堂| 精品人妻一区二区三区免费视频| 玖玖超碰熟| 欧美 综合 亚洲| 制服丝袜第二页| juliaann丝袜大战黑鬼| 美女的肌被草喷水视频| 乱伦系列一区二区| 午夜精品久久久久久久99蜜桃一| 97精品国产97久久久久久免费| 91精品网站| 精品国产AV一区天美传媒| 超碰色大香蕉| 激情欧美97| 测评在线观看AV| 欧美日韩97| 激情小说亚洲| 亚洲精品白浆高清久久久久久| 精品一区二区国产日韩| 黄色片A级一区二区三区| 久久精品久久久久久久久| 天天做日日做天天欢。| 大香蕉五月天婷婷| 在线播放中文字幕| 欧美精品丝袜久久久中文字幕| 欧美有码亚洲中文字幕一区二区三区四区| 欧美国产视频| 大香蕉欧美国产日韩高潮| 成人九九| 岛国网址国产| 久久大陆| 久久久性爱视频| 亚洲伊人久久精品影院| 亚洲视频精选| 欧美中文字幕精品人妻| 一本一道波多野毛片中文在线| 欧美午夜精品久久久久久超碰| 一区二区三区蜜桃成人撸久久东京热| 情色五月天就去干| 欧美日韩97| 亚洲综合一区二区| 精品国产72| 久久日韩肥臀| 一区二区三区黄色片a| 久久久久久久极品香蕉视频| 久久久久久裸体| 欧美日韩免费性爱| 国产少妇肉丝在线观看| 91少妇通奸网站| 国产视频一区二区三区在线免费观看| 亚洲精品乱码久久久久久蜜桃麻豆| 99操99| 中文字幕精品久久久久人妻红杏ⅰ| 91亚洲网站| 色伊人91| 久久男女激情视频网站 | 任你草| 色噜噜国产在线| 久久久精品,3| 色狠狠 - 百度| 久久精品天美| 日韩精品中文字幕人妻| 国内精品不卡无毒99999| 亚洲 欧美 色图| 美国一区二区免费视频| 欧美一区二区三区成人性生活|