国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

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

基于騰訊云構(gòu)建企業(yè)級物聯(lián)網(wǎng)OTA系統(tǒng):架構(gòu)設(shè)計與安全實踐

基于騰訊云構(gòu)建企業(yè)級物聯(lián)網(wǎng)OTA系統(tǒng):架構(gòu)設(shè)計與安全實踐 1. 項目概述為什么我們需要一個“云上”的OTA系統(tǒng)做嵌入式或者物聯(lián)網(wǎng)設(shè)備開發(fā)的朋友對“OTA”這個詞肯定不陌生。它全稱是“Over-The-Air”翻譯過來就是“空中下載技術(shù)”。簡單說就是讓你的設(shè)備比如一個智能插座、一個工業(yè)網(wǎng)關(guān)或者一塊開發(fā)板能夠通過網(wǎng)絡(luò)自動下載并更新固件而不用你跑到現(xiàn)場去插線、燒錄。這聽起來很美好對吧但真正自己動手從零搭建一套穩(wěn)定、安全、可管理的OTA系統(tǒng)坑可不少。幾年前我負(fù)責(zé)的一個智能家居項目就踩過大坑。當(dāng)時為了快速上線OTA功能做得非常簡陋設(shè)備直接從一個靜態(tài)的HTTP服務(wù)器拉取固件包。結(jié)果呢服務(wù)器被刷爆、升級包被惡意替換、設(shè)備變磚……各種問題層出不窮運維同事差點把我“祭天”。痛定思痛我開始研究如何構(gòu)建一個企業(yè)級的OTA解決方案。經(jīng)過多個項目的迭代我發(fā)現(xiàn)基于成熟的公有云平臺來構(gòu)建OTA后端是性價比最高、最穩(wěn)妥的選擇。而騰訊云憑借其豐富的產(chǎn)品矩陣和穩(wěn)定的服務(wù)成為了我的首選。今天我就把自己基于騰訊云搭建OTA遠(yuǎn)程升級系統(tǒng)的實戰(zhàn)經(jīng)驗從架構(gòu)設(shè)計、核心組件選型到安全策略、實操步驟和避坑指南毫無保留地分享出來。這套方案不僅適用于物聯(lián)網(wǎng)設(shè)備對于任何需要遠(yuǎn)程管理、分發(fā)二進(jìn)制文件的場景比如邊緣計算盒子、自助終端等都有參考價值。你會發(fā)現(xiàn)借助云服務(wù)我們能把精力從繁瑣的基礎(chǔ)設(shè)施運維中解放出來更專注于業(yè)務(wù)邏輯和設(shè)備本身。2. 整體架構(gòu)設(shè)計與核心思路拆解在動手敲代碼之前我們必須把架構(gòu)想清楚。一個完整的OTA系統(tǒng)遠(yuǎn)不止是“設(shè)備下載文件”那么簡單。它至少需要解決四個核心問題固件存儲與分發(fā)、升級任務(wù)管理、設(shè)備狀態(tài)追蹤、升級過程安全?;谶@些需求我設(shè)計了下面這套以騰訊云為核心的后端架構(gòu)。2.1 核心組件選型與職責(zé)劃分我的核心思路是用對象存儲做倉庫用云函數(shù)做大腦用消息隊列做神經(jīng)用數(shù)據(jù)庫做記憶。下面是每個騰訊云組件扮演的角色騰訊云對象存儲COS這是整個系統(tǒng)的“倉庫”。所有版本的固件包.bin, .img文件都安全地存放在這里。COS提供了高可靠性、高可用性和極強(qiáng)的擴(kuò)展性完全不用擔(dān)心存儲空間和帶寬問題。更重要的是它可以生成具有時效性的簽名URL實現(xiàn)安全、可控的固件下載。云函數(shù)SCF這是系統(tǒng)的“大腦”和“調(diào)度中心”。所有業(yè)務(wù)邏輯比如創(chuàng)建升級任務(wù)、驗證設(shè)備升級權(quán)限、生成固件下載鏈接、處理設(shè)備上報的狀態(tài)等都通過一個個云函數(shù)來實現(xiàn)。它無服務(wù)器Serverless的特性讓我們無需關(guān)心服務(wù)器運維按實際調(diào)用次數(shù)付費成本極低。消息隊列CMQ/TDMQ這是系統(tǒng)的“神經(jīng)系統(tǒng)”。當(dāng)管理后臺創(chuàng)建一個升級任務(wù)后可以通過消息隊列將任務(wù)指令異步、可靠地推送給海量設(shè)備。設(shè)備端的SDK訂閱相關(guān)主題就能實時收到升級通知。這解耦了后臺任務(wù)創(chuàng)建和設(shè)備端觸發(fā)提升了系統(tǒng)的響應(yīng)能力和可靠性。云數(shù)據(jù)庫MySQL/RedisMySQL作為“核心記憶”存儲結(jié)構(gòu)化數(shù)據(jù)。主要包括firmware_meta表存儲固件元信息版本號、文件COS路徑、MD5、文件大小、適用設(shè)備型號、更新日志、創(chuàng)建時間。ota_task表存儲升級任務(wù)任務(wù)ID、目標(biāo)固件版本、設(shè)備篩選條件、升級策略、任務(wù)狀態(tài)、創(chuàng)建時間。device_upgrade_record表存儲每臺設(shè)備的升級記錄設(shè)備ID、任務(wù)ID、升級狀態(tài)、開始時間、結(jié)束時間、失敗原因。Redis作為“高速緩存”存儲會話級和狀態(tài)數(shù)據(jù)。例如設(shè)備上報的臨時升級狀態(tài)、頻繁訪問的固件信息、防止重復(fù)請求的令牌等可以放在Redis中極大提升接口性能。API網(wǎng)關(guān)API Gateway這是系統(tǒng)的“門面”。它將后端的云函數(shù)包裝成標(biāo)準(zhǔn)的HTTP/HTTPS API接口提供給設(shè)備端和管理后臺調(diào)用。API網(wǎng)關(guān)負(fù)責(zé)認(rèn)證、鑒權(quán)、流量控制、監(jiān)控和日志是我們實現(xiàn)安全訪問的第一道關(guān)卡。這個架構(gòu)的優(yōu)勢在于全托管、高彈性、強(qiáng)安全。每個組件都是騰訊云托管的服務(wù)我們不需要維護(hù)任何物理服務(wù)器。當(dāng)設(shè)備量從幾百臺暴增到幾十萬臺時COS和SCF可以自動擴(kuò)容消息隊列能保證消息不丟失整個系統(tǒng)能平穩(wěn)支撐。2.2 升級流程的“雙車道”設(shè)計設(shè)備如何知道該升級了我推薦兩種主流模式可以比作“廣播通知”和“主動查詢”雙車道。車道一服務(wù)端推送模式推薦用于實時性要求高的場景管理員在后臺創(chuàng)建升級任務(wù)選擇目標(biāo)設(shè)備和固件。后臺調(diào)用云函數(shù)云函數(shù)將升級指令包含任務(wù)ID、固件版本號等信息發(fā)布到消息隊列的特定主題。設(shè)備端SDK長期在線并訂閱了該主題實時接收到升級指令。設(shè)備觸發(fā)升級流程。這種模式實時性最好設(shè)備能在秒級內(nèi)響應(yīng)升級指令。適合用于緊急漏洞修復(fù)或重要功能推送。車道二設(shè)備定時輪詢模式兼容性最好適用于所有設(shè)備設(shè)備在啟動后或定時如每2小時向服務(wù)端的“檢查更新”API發(fā)起請求。請求中攜帶設(shè)備ID、當(dāng)前固件版本、設(shè)備型號等信息。提供該API的云函數(shù)查詢數(shù)據(jù)庫判斷是否存在針對該設(shè)備的、未執(zhí)行的升級任務(wù)。如果存在則返回升級任務(wù)信息和帶簽名的固件下載URL。設(shè)備觸發(fā)升級流程。這種模式對設(shè)備端要求低即使設(shè)備不支持長連接也能工作。是OTA系統(tǒng)的保底機(jī)制。在實際項目中我通常兩者結(jié)合使用。設(shè)備端同時實現(xiàn)消息訂閱和定時輪詢。平時通過消息隊列保持低功耗的實時監(jiān)聽一旦網(wǎng)絡(luò)異常或消息丟失定時輪詢可以作為可靠的備份機(jī)制確保升級指令最終能送達(dá)。3. 核心細(xì)節(jié)解析與實操要點架構(gòu)清晰了我們來看看幾個最關(guān)鍵環(huán)節(jié)的實現(xiàn)細(xì)節(jié)這些地方直接決定了OTA系統(tǒng)的穩(wěn)定性和安全性。3.1 固件包的安全設(shè)計與完整性校驗固件包是OTA的核心資產(chǎn)絕不能出問題。我設(shè)計了一套從生成到驗證的完整鏈條1. 固件包預(yù)處理編譯服務(wù)器上完成# 假設(shè)已有編譯好的 firmware.bin # 1. 計算固件的MD5和SHA256用于完整性校驗 md5sum firmware.bin firmware.bin.md5 sha256sum firmware.bin firmware.bin.sha256 # 2. 使用開發(fā)團(tuán)隊的私鑰對固件的SHA256哈希值進(jìn)行簽名 # 例如使用 openssl openssl dgst -sha256 -sign private_key.pem -out firmware.sig firmware.bin # 3. 將固件、MD5文件、SHA256文件和簽名文件打包成一個升級包 tar -czvf firmware_v1.0.1.tar.gz firmware.bin firmware.bin.md5 firmware.bin.sha256 firmware.sig最終上傳到COS的就是這個firmware_v1.0.1.tar.gz包。同時需要將固件的版本號、MD5、SHA256、簽名或簽名文件的COS路徑、文件大小、適用型號等元信息寫入數(shù)據(jù)庫的firmware_meta表。2. 設(shè)備端升級時的校驗流程設(shè)備上完成設(shè)備下載完升級包并解壓后必須按順序執(zhí)行以下校驗任何一步失敗都應(yīng)立即中止升級并報錯大小校驗比對下載文件的大小與服務(wù)端告知的大小是否一致防止網(wǎng)絡(luò)傳輸不完整。哈希校驗計算下載的firmware.bin的MD5或SHA256與包內(nèi)的.md5或.sha256文件內(nèi)容比對。這一步防止文件在傳輸或存儲過程中損壞。簽名校驗最關(guān)鍵使用預(yù)置在設(shè)備安全存儲區(qū)如efuse的公鑰對firmware.sig進(jìn)行驗簽驗證其是否與firmware.bin的SHA256哈希值匹配。這一步是防止固件被惡意篡改的最后防線。只有通過簽名校驗的固件才被認(rèn)為是合法、來自官方開發(fā)團(tuán)隊的。實操心得密鑰管理是命門用于簽名的私鑰必須離線保存最好使用硬件安全模塊HSM。編譯服務(wù)器的私鑰一旦泄露整個OTA系統(tǒng)的安全基石就崩塌了。設(shè)備端的公鑰則需要在出廠時燒錄且不可被后續(xù)軟件修改。對于資源受限的MCU可能無法進(jìn)行非對稱加密驗簽?zāi)敲粗辽僖靡粋€設(shè)備端預(yù)置的對稱密鑰來計算HMAC作為替代方案但安全性稍弱。3.2 升級任務(wù)與設(shè)備分組的灰度發(fā)布策略“一刀切”的全量升級是危險的。一個未經(jīng)充分測試的新固件如果直接推給所有設(shè)備可能導(dǎo)致大規(guī)模變磚。因此灰度發(fā)布金絲雀發(fā)布是OTA系統(tǒng)的必備功能。我的實現(xiàn)方案依賴于數(shù)據(jù)庫中的ota_task表和device_info表。ota_task表中有一個target_devices字段它不直接存儲設(shè)備ID列表那樣不靈活而是存儲一個篩選規(guī)則。例如任務(wù)可以設(shè)定為target_devices:{model: GW-2000, version: 1.2.0, percentage: 10}含義針對型號為“GW-2000”且當(dāng)前版本低于1.2.0的設(shè)備隨機(jī)選取10%進(jìn)行升級。當(dāng)設(shè)備調(diào)用“檢查更新”API或收到消息時云函數(shù)會根據(jù)設(shè)備ID查詢device_info表獲取其型號、當(dāng)前版本、所屬區(qū)域等標(biāo)簽。查詢所有活躍的ota_task用設(shè)備的標(biāo)簽去匹配任務(wù)的target_devices規(guī)則。如果匹配成功再根據(jù)“percentage”等灰度規(guī)則通過一個確定的算法如device_id % 100 percentage判斷該設(shè)備是否命中本次升級。如果命中則返回升級信息?;叶韧七M(jìn)流程內(nèi)部測試創(chuàng)建任務(wù)target_devices指定為內(nèi)部測試設(shè)備的ID列表。1%灰度任務(wù)目標(biāo)改為特定型號的1%隨機(jī)設(shè)備。觀察這批設(shè)備的升級成功率、失敗原因和設(shè)備運行日志。10%灰度如果1%灰度表現(xiàn)穩(wěn)定將比例擴(kuò)大到10%。繼續(xù)觀察。50% - 全量逐步擴(kuò)大范圍直至覆蓋全部目標(biāo)設(shè)備。注意事項灰度規(guī)則的靈活性target_devices字段的設(shè)計要足夠靈活支持多維度篩選。除了型號、版本、隨機(jī)比例還可以加入“城市”、“網(wǎng)絡(luò)運營商”、“設(shè)備分組”等業(yè)務(wù)標(biāo)簽。這樣我們可以先對“北京聯(lián)通的設(shè)備”進(jìn)行灰度再推廣到全國。3.3 利用COS簽名URL實現(xiàn)安全下載我們不可能把COS的固件文件設(shè)置為公開可讀那太危險了。也不能把COS的永久密鑰放在設(shè)備端因為一旦泄露對象存儲就門戶大開。騰訊云COS的“臨時密鑰”和“預(yù)簽名URL”機(jī)制完美解決了這個問題。流程如下設(shè)備通過認(rèn)證后向“獲取下載地址”API發(fā)起請求。該API背后的云函數(shù)首先校驗設(shè)備是否有權(quán)限升級到此版本。校驗通過后云函數(shù)使用騰訊云的SDK生成一個針對該固件文件的、具有時效性例如15分鐘的預(yù)簽名URL。# Python示例在云函數(shù)中 from qcloud_cos import CosConfig, CosS3Client import datetime def generate_presigned_url(bucket, key, expired_seconds900): config CosConfig(Regionap-guangzhou, SecretId臨時密鑰Id, SecretKey臨時密鑰Key) client CosS3Client(config) url client.get_presigned_download_url( Bucketbucket, Keykey, # 固件在COS中的完整路徑 Params{}, # 可以加響應(yīng)頭參數(shù)如ResponseContentDisposition指定下載文件名 Expiredexpired_seconds ) return url將這個僅15分鐘內(nèi)有效的URL返回給設(shè)備。設(shè)備在有效期內(nèi)使用此URL直接下載固件。過期后該URL自動失效。這樣即使URL在傳輸過程中被截獲攻擊者也只有很短的窗口期進(jìn)行利用大大提升了安全性。云函數(shù)本身使用的是從CAM訪問管理獲取的臨時密鑰其權(quán)限被嚴(yán)格限制在“生成指定目錄下文件的簽名URL”這一最小范圍內(nèi)遵循了最小權(quán)限原則。4. 實操過程從零搭建OTA后端核心理論說了這么多我們動手搭一個最簡單的可運行原型。這里我以“設(shè)備定時輪詢”模式為例演示最核心的“檢查更新”和“上報狀態(tài)”兩個API的實現(xiàn)。4.1 環(huán)境準(zhǔn)備與云資源創(chuàng)建首先你需要在騰訊云控制臺創(chuàng)建以下資源假設(shè)你已有騰訊云賬號對象存儲COS創(chuàng)建一個存儲桶例如ota-firmware-1250000000。在桶內(nèi)創(chuàng)建目錄結(jié)構(gòu)firmware/{device_model}/。例如firmware/gw2000/。上傳一個測試固件包如firmware/gw2000/v1.0.1.bin。重要存儲桶的訪問權(quán)限設(shè)置為“私有讀寫”。云數(shù)據(jù)庫MySQL購買一個MySQL實例最低配置即可。創(chuàng)建數(shù)據(jù)庫ota_center。執(zhí)行以下SQL創(chuàng)建核心表CREATE TABLE firmware_meta ( id int(11) NOT NULL AUTO_INCREMENT, version varchar(50) NOT NULL COMMENT 版本號如v1.0.1, model varchar(50) NOT NULL COMMENT 適用設(shè)備型號, file_path varchar(255) NOT NULL COMMENT COS文件路徑, file_size bigint(20) NOT NULL COMMENT 文件大小(字節(jié)), file_md5 varchar(32) NOT NULL COMMENT 文件MD5, description text COMMENT 更新描述, is_released tinyint(1) DEFAULT 0 COMMENT 是否已發(fā)布, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY idx_version_model (version,model) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE ota_task ( id int(11) NOT NULL AUTO_INCREMENT, task_name varchar(100) NOT NULL, firmware_id int(11) NOT NULL COMMENT 關(guān)聯(lián)的固件id, target_condition json DEFAULT NULL COMMENT 目標(biāo)設(shè)備篩選條件JSON, status enum(pending,running,paused,completed) DEFAULT pending, creator varchar(50) DEFAULT NULL, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE device_upgrade_record ( id bigint(20) NOT NULL AUTO_INCREMENT, device_id varchar(64) NOT NULL, task_id int(11) NOT NULL, from_version varchar(50) DEFAULT NULL, to_version varchar(50) DEFAULT NULL, status enum(downloading,verifying,upgrading,success,failed) NOT NULL, error_msg varchar(255) DEFAULT NULL, start_time datetime DEFAULT NULL, end_time datetime DEFAULT NULL, PRIMARY KEY (id), KEY idx_device_id (device_id), KEY idx_task_id (task_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;云函數(shù)SCF與API網(wǎng)關(guān)我們將通過API網(wǎng)關(guān)觸發(fā)云函數(shù)。在創(chuàng)建云函數(shù)時選擇“Web函數(shù)”或“事件函數(shù)”并關(guān)聯(lián)API網(wǎng)關(guān)觸發(fā)器會更方便。4.2 核心云函數(shù)代碼實現(xiàn)Python示例我們創(chuàng)建兩個云函數(shù)check_update和report_status。函數(shù)一check_update檢查更新這個函數(shù)接收設(shè)備ID和型號返回是否有可用的升級任務(wù)及下載信息。# -*- coding: utf8 -*- import json import logging import pymysql from qcloud_cos import CosConfig, CosS3Client from datetime import datetime, timedelta import os logger logging.getLogger() logger.setLevel(logging.INFO) # 從環(huán)境變量讀取配置安全 db_host os.getenv(DB_HOST) db_user os.getenv(DB_USER) db_password os.getenv(DB_PASSWORD) db_name os.getenv(DB_NAME) cos_secret_id os.getenv(COS_SECRET_ID) # 應(yīng)使用臨時密鑰此處簡化演示 cos_secret_key os.getenv(COS_SECRET_KEY) cos_region os.getenv(COS_REGION, ap-guangzhou) cos_bucket os.getenv(COS_BUCKET) def main_handler(event, context): 處理設(shè)備檢查更新請求 # 1. 解析請求參數(shù) try: # 從API網(wǎng)關(guān)事件中獲取請求體 if body not in event: return {code: 400, message: Invalid request} req_body json.loads(event[body]) device_id req_body.get(device_id) device_model req_body.get(model) current_version req_body.get(current_version) if not all([device_id, device_model, current_version]): return {code: 400, message: Missing required fields} except Exception as e: logger.error(fParse request error: {e}) return {code: 400, message: Bad request format} # 2. 查詢數(shù)據(jù)庫檢查是否有符合條件的升級任務(wù)和固件 connection None try: connection pymysql.connect(hostdb_host, userdb_user, passworddb_password, databasedb_name, charsetutf8mb4) with connection.cursor(pymysql.cursors.DictCursor) as cursor: # 查找針對該型號、已發(fā)布、且版本高于設(shè)備當(dāng)前版本的固件 sql SELECT fm.* FROM firmware_meta fm WHERE fm.model %s AND fm.is_released 1 AND fm.version %s ORDER BY fm.version DESC LIMIT 1 cursor.execute(sql, (device_model, current_version)) firmware cursor.fetchone() if not firmware: # 無新固件 return { code: 200, data: {has_update: False} } # 檢查是否有正在進(jìn)行的、包含此設(shè)備的升級任務(wù) (簡化邏輯實際需匹配target_condition) task_sql SELECT ot.id FROM ota_task ot WHERE ot.firmware_id %s AND ot.status running LIMIT 1 cursor.execute(task_sql, (firmware[id],)) task cursor.fetchone() if not task: # 有固件但無任務(wù)可能未開始灰度 return { code: 200, data: {has_update: False} } # 3. 生成固件的預(yù)簽名下載URL (有效期15分鐘) cos_config CosConfig(Regioncos_region, SecretIdcos_secret_id, SecretKeycos_secret_key) cos_client CosS3Client(cos_config) # 假設(shè)file_path是類似 firmware/gw2000/v1.0.1.bin 的路徑 file_key firmware[file_path] download_url cos_client.get_presigned_download_url( Bucketcos_bucket, Keyfile_key, Expired900 # 15分鐘 ) # 4. 在升級記錄表中插入一條“待開始”的記錄 insert_sql INSERT INTO device_upgrade_record (device_id, task_id, from_version, to_version, status, start_time) VALUES (%s, %s, %s, %s, downloading, %s) ON DUPLICATE KEY UPDATE statusdownloading, start_time%s, error_msgNULL now datetime.now() cursor.execute(insert_sql, (device_id, task[id], current_version, firmware[version], now, now)) record_id cursor.lastrowid connection.commit() # 5. 返回升級信息 response_data { has_update: True, task_id: task[id], record_id: record_id, firmware: { version: firmware[version], size: firmware[file_size], md5: firmware[file_md5], description: firmware.get(description, ), url: download_url # 預(yù)簽名URL } } return { code: 200, data: response_data } except pymysql.Error as e: logger.error(fDatabase error: {e}) if connection: connection.rollback() return {code: 500, message: Database operation failed} except Exception as e: logger.error(fUnexpected error: {e}) return {code: 500, message: Internal server error} finally: if connection: connection.close()函數(shù)二report_status上報狀態(tài)設(shè)備在升級過程中的每個關(guān)鍵節(jié)點開始下載、校驗成功、開始寫入、升級成功/失敗都需要調(diào)用此接口上報狀態(tài)。# -*- coding: utf8 -*- import json import logging import pymysql from datetime import datetime import os logger logging.getLogger() logger.setLevel(logging.INFO) # 數(shù)據(jù)庫配置同上略 def main_handler(event, context): 處理設(shè)備升級狀態(tài)上報 try: req_body json.loads(event[body]) device_id req_body.get(device_id) record_id req_body.get(record_id) # 檢查更新時返回的記錄ID status req_body.get(status) # downloading, verifying, upgrading, success, failed error_msg req_body.get(error_msg, ) if not all([device_id, record_id, status]): return {code: 400, message: Missing required fields} if status not in [downloading, verifying, upgrading, success, failed]: return {code: 400, message: Invalid status} except Exception as e: logger.error(fParse request error: {e}) return {code: 400, message: Bad request format} connection None try: connection pymysql.connect(hostdb_host, userdb_user, passworddb_password, databasedb_name, charsetutf8mb4) with connection.cursor() as cursor: now datetime.now() update_sql UPDATE device_upgrade_record SET status %s, error_msg %s, end_time CASE WHEN %s IN (success, failed) THEN %s ELSE end_time END WHERE id %s AND device_id %s # 只有當(dāng)狀態(tài)是成功或失敗時才更新end_time end_time_value now if status in [success, failed] else None cursor.execute(update_sql, (status, error_msg, status, end_time_value, record_id, device_id)) if cursor.rowcount 0: # 未找到對應(yīng)記錄可能是record_id或device_id不匹配 return {code: 404, message: Upgrade record not found} connection.commit() return {code: 200, message: Status updated successfully} except pymysql.Error as e: logger.error(fDatabase error: {e}) if connection: connection.rollback() return {code: 500, message: Database operation failed} except Exception as e: logger.error(fUnexpected error: {e}) return {code: 500, message: Internal server error} finally: if connection: connection.close()4.3 設(shè)備端升級流程偽代碼設(shè)備端的邏輯相對固定以下是一個簡化的主流程偽代碼你可以根據(jù)實際平臺如FreeRTOS、Linux、Android等用C/C或其他語言實現(xiàn)// 設(shè)備端OTA核心流程偽代碼 int device_ota_main_loop() { while (1) { // 1. 定時檢查更新例如每2小時 if (should_check_update()) { ota_info_t info check_update_from_server(); if (info.has_update) { // 2. 上報狀態(tài)開始下載 report_status_to_server(DOWNLOADING); // 3. 下載固件包 if (download_firmware(info.url, info.size, LOCAL_FILE_PATH) ! SUCCESS) { report_status_to_server(FAILED, Download failed); continue; } // 4. 上報狀態(tài)下載完成開始校驗 report_status_to_server(VERIFYING); // 5. 完整性校驗大小、MD5、簽名 if (verify_firmware(LOCAL_FILE_PATH, info.md5, info.size) ! SUCCESS) { report_status_to_server(FAILED, Verification failed); delete_file(LOCAL_FILE_PATH); continue; } // 6. 上報狀態(tài)校驗通過開始升級 report_status_to_server(UPGRADING); // 7. 進(jìn)入Bootloader或特定分區(qū)進(jìn)行固件燒寫 // 這是最關(guān)鍵的步驟需要硬件支持雙分區(qū)、恢復(fù)機(jī)制等 if (perform_upgrade(LOCAL_FILE_PATH) ! SUCCESS) { // 升級失敗嘗試回滾如果有備份分區(qū) rollback_if_possible(); report_status_to_server(FAILED, Upgrade process error); } else { // 8. 上報狀態(tài)升級成功 report_status_to_server(SUCCESS); // 9. 重啟設(shè)備運行新固件 system_reboot(); } } } sleep(CHECK_INTERVAL); } return 0; }5. 常見問題與排查技巧實錄在實際部署和運營中你會遇到各種各樣的問題。下面是我踩過坑后總結(jié)的一些典型問題及其排查思路。5.1 設(shè)備端升級失敗問題排查設(shè)備端是問題的高發(fā)區(qū)。當(dāng)設(shè)備上報“failed”狀態(tài)時我們需要根據(jù)error_msg和設(shè)備日志快速定位。問題現(xiàn)象可能原因排查步驟與解決方案下載失敗1. 網(wǎng)絡(luò)不穩(wěn)定。2. COS簽名URL過期。3. 設(shè)備存儲空間不足。1. 檢查設(shè)備網(wǎng)絡(luò)連接重試機(jī)制是否生效建議實現(xiàn)斷點續(xù)傳。2. 確認(rèn)設(shè)備從獲取URL到開始下載的時間間隔是否超過URL有效期如15分鐘。可適當(dāng)延長有效期或在下載前重新請求URL。3. 檢查設(shè)備可用存儲空間是否大于固件包大小的2倍需要臨時存儲。校驗失敗MD5不匹配1. 下載文件不完整或損壞。2. 設(shè)備端MD5計算邏輯有誤。3. 服務(wù)端存儲的MD5值錯誤。1. 優(yōu)先懷疑下載問題。對比下載文件大小與服務(wù)器記錄是否一致。實現(xiàn)下載后的文件大小校驗。2. 在設(shè)備端用標(biāo)準(zhǔn)工具如md5sum命令對下載文件進(jìn)行計算與程序計算結(jié)果比對。3. 核對數(shù)據(jù)庫firmware_meta表中該固件的file_md5值是否正確。簽名校驗失敗1. 設(shè)備端公鑰與簽名私鑰不匹配。2. 固件包在簽名后被篡改。3. 設(shè)備端驗簽代碼邏輯錯誤。1.這是最嚴(yán)重的問題。確認(rèn)出廠燒錄的公鑰與編譯服務(wù)器使用的私鑰是否配對??赏ㄟ^在服務(wù)器上用私鑰簽名一個測試文件在設(shè)備端用公鑰驗證來測試。2. 確保從COS下載到驗簽的整個鏈路中固件文件未被修改。3. 檢查驗簽函數(shù)的輸入?yún)?shù)原始固件數(shù)據(jù)、簽名數(shù)據(jù)是否正確。升級過程中斷電變磚1. 沒有實現(xiàn)雙分區(qū)或恢復(fù)機(jī)制。2. 升級流程非原子操作中途斷電導(dǎo)致系統(tǒng)損壞。1.必須實現(xiàn)回滾機(jī)制。推薦A/B雙分區(qū)設(shè)計設(shè)備始終從A分區(qū)運行升級時下載固件到B分區(qū)校驗成功后將B標(biāo)記為活動分區(qū)重啟后從B運行。如果B分區(qū)啟動失敗Bootloader應(yīng)能自動回滾到A分區(qū)。2. 升級過程如擦寫Flash應(yīng)盡可能原子化并做好電源管理意外斷電后能從中斷點恢復(fù)或回滾。升級后設(shè)備無法啟動1. 新固件本身有Bug。2. 固件與設(shè)備硬件型號不匹配。3. 升級過程破壞了Bootloader或關(guān)鍵參數(shù)區(qū)。1. 這正是灰度發(fā)布要避免的?;貪L到上一版本。2. 檢查服務(wù)端firmware_meta表中的model字段與設(shè)備型號是否精確匹配。設(shè)備上報的型號信息必須準(zhǔn)確。3. 確保升級腳本或Bootloader嚴(yán)格限制了固件的寫入范圍絕不觸碰Bootloader區(qū)域。實操心得日志日志日志在設(shè)備端務(wù)必在升級流程的每一個關(guān)鍵步驟開始下載、下載完成、開始校驗、校驗通過、開始寫入、寫入完成、重啟前都打印詳細(xì)的日志并盡可能通過狀態(tài)上報接口同步到云端。這些日志是線上問題排查的“生命線”。我曾遇到一次升級失敗最終就是靠設(shè)備上報的“在校驗前存儲空間檢查失敗”這條日志定位到是某個日志文件過大占滿了空間。5.2 服務(wù)端性能與穩(wěn)定性保障當(dāng)設(shè)備量達(dá)到十萬、百萬級別時服務(wù)端的壓力會劇增。數(shù)據(jù)庫瓶頸device_upgrade_record表會快速增長頻繁的插入和更新可能成為瓶頸。解決方案對device_upgrade_record表進(jìn)行分表。可以按device_id哈?;虬碿reate_time月份進(jìn)行分表。對于歷史完成的數(shù)據(jù)可以定期歸檔到冷存儲如COS從在線MySQL中移除。COS下載帶寬與費用海量設(shè)備同時下載固件會產(chǎn)生巨大的下行流量和費用。解決方案啟用CDN加速為COS存儲桶開啟CDN加速。設(shè)備從離它最近的CDN節(jié)點下載固件速度更快且能降低COS源站的壓力和流量費用。利用P2P分發(fā)高級對于非常大的固件包如超過100MB可以考慮讓已升級成功的設(shè)備作為種子為其他設(shè)備提供P2P下載這能極大降低云端帶寬成本。但這會顯著增加設(shè)備端和協(xié)調(diào)服務(wù)的復(fù)雜度。云函數(shù)并發(fā)與超時檢查更新接口可能被海量設(shè)備在短時間內(nèi)調(diào)用。解決方案適當(dāng)調(diào)高云函數(shù)的并發(fā)實例上限和內(nèi)存配置。優(yōu)化函數(shù)內(nèi)代碼特別是數(shù)據(jù)庫查詢。為firmware_meta和ota_task表的查詢條件字段如model,version,status建立合適的索引。對于“檢查更新”這種讀多寫少的場景可以考慮使用Redis緩存。將針對每個設(shè)備型號的最新可用固件信息緩存到Redis并設(shè)置合理的過期時間如5分鐘。云函數(shù)先查緩存緩存未命中再查數(shù)據(jù)庫能極大減輕數(shù)據(jù)庫壓力。消息隊列堆積在推送模式下如果設(shè)備端離線消息會堆積。解決方案為消息隊列設(shè)置合理的消息保留時間如3天。同時設(shè)備端SDK需要實現(xiàn)可靠的消息接收和去重機(jī)制避免重復(fù)升級。5.3 安全加固的額外思考除了前面提到的簽名校驗和臨時URL還有幾個安全點需要注意設(shè)備身份認(rèn)證check_update和report_status接口不能裸奔。最簡單的方案是使用設(shè)備證書或動態(tài)令牌。每個設(shè)備在出廠時預(yù)置一個唯一證書或密鑰。每次請求服務(wù)端時用該密鑰對請求參數(shù)和時間戳生成一個簽名服務(wù)端驗證簽名合法性。這能防止偽造設(shè)備請求。接口防重放攻擊上面的簽名機(jī)制中加入了時間戳服務(wù)端可以校驗請求時間戳與服務(wù)器時間的偏差如±5分鐘超過范圍的請求視為重放攻擊直接拒絕。升級指令防篡改在推送模式下發(fā)送到消息隊列的升級指令包含固件版本、URL等也應(yīng)進(jìn)行簽名。設(shè)備端收到指令后需驗證簽名確保指令來自可信的服務(wù)端。管理后臺安全創(chuàng)建升級任務(wù)的管理后臺必須有嚴(yán)格的權(quán)限控制RBAC并開啟操作審計。任何固件上傳、任務(wù)創(chuàng)建的操作都應(yīng)記錄操作人、時間和詳情。搭建一套基于騰訊云的OTA系統(tǒng)就像為你的設(shè)備艦隊建立了一個空中指揮所。它讓你能安全、精準(zhǔn)、可控地對成千上萬的設(shè)備進(jìn)行“外科手術(shù)式”的更新。從最初的簡單文件服務(wù)器到如今這套集成了對象存儲、云函數(shù)、消息隊列和數(shù)據(jù)庫的完整方案我最大的體會是擁抱云原生把專業(yè)的事交給專業(yè)的云服務(wù)。我們不再需要為服務(wù)器擴(kuò)容、帶寬不足、安全防護(hù)而焦慮可以將全部精力投入到設(shè)備端升級邏輯的健壯性和業(yè)務(wù)功能的迭代上。最后分享一個小技巧在項目初期可以不用一步到位實現(xiàn)所有功能。先跑通最小閉環(huán)——讓一臺測試設(shè)備能完整地走完“檢查-下載-校驗-升級-上報”的流程。這個閉環(huán)通了你就有了底氣。然后再逐步疊加灰度發(fā)布、安全加固、狀態(tài)監(jiān)控、數(shù)據(jù)分析等高級功能。這樣迭代開發(fā)風(fēng)險可控團(tuán)隊也更容易看到成果。希望這篇長文能幫你少走彎路如果你在實踐過程中遇到新的問題歡迎隨時交流。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
精品中文字幕第一页| 午夜精品久久久久久久99蜜桃一| 国产一区二区三区久久久精品| 嗯嗯嗯,草死我| 啪啪资源网| 91 丝袜在线播放| 99re这里只有精品2| 超碰调教97| 亚洲熟女性高潮久久久| 强奸乱伦免费网站| 亚洲国产精品无石码久久| 中文字幕AV片| 中文字幕视频一区视频二区| 99这里有精品| 欧亚免费视频| 福利社区午夜一区二区| 久久av一级av少妇av高潮| 亚洲欧美不卡线| 黄久在线| 加勒比性爱成人在线| 青青青国产| 日本女人操逼| 国产极品一区二区三区三州| 天天日天天插| 激情综合五月| 天天做日日做天天欢。| 国产一区二区三三视频| 国产免a费看黄片在线| 火箭成精品视频884必出精品| 东北女人性交| 黄色一区三区| 91精品久久久久久77777| 欧美嗯啊……在线观看视频免费| 成人网址在线观看| 野狼激情网| 国模精品娜娜一二三区| 日韩激情中文字幕有码| 操逼视频亚洲| 欧美性爱视频免费一区一A| 蜜乳中文字幕a在线| 欧美AB在线| 青青青青青手机视频| 风月影院男女十八禁| 老女人老91妇女老热女| 在线电影亚洲色图| 在线视频亚洲无码| 家庭乱伦国产| 激情视屏国产乱伦强奸| 中文字幕 国产 精品| 日韩色欲久久一二三四区| 在线有码中文字幕| 久精品无码av一区二免费国产在线观看| 欧美系列在线一区二区| 无码99| 久久99视频| 亚洲性综合9| 国产久久一区二区午夜| 97超碰热线| 神马久久69| 成人久久久精品| 国产精品久久久久久9999| 另类图片五月天| 天天操妹子| 中国一级αV| 日韩成人性日韩成人性爱视频在线免费观看| 啊啊啊草死我| 欧美日韩性爱视屏免费看了| 亚洲影视综合网| 自拍盗摄一区| 一本色道综合久久欧美日韩精品| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 日本狂喷奶水在线播放212| 国产高清免费不卡av| 国产精品视频麻豆入口| 中文字幕天天天天天| 国产熟女| 本道综合精品| 中国少妇XXXX做受| 久久久久久夜夜夜夜夜| 懂色AV中文| 狠狠操一区二区| 天天影视之亚洲综合网| 激情综合网激情综合| 乱伦熟女专区| 丁香久久| 老熟妇一区二区三区啪啪| 天天天干977| 高潮毛片无遮挡高清免费| 亚洲AV成人无码久久精品播放| 男人的天堂亚洲| av在线人气| 久久成人网站| 自拍视频一区在线观看| 大香蕉 222| 九九五月天| 久久成人国产精品| 亚洲91极品| 青青草亚洲一区| 综合亚洲网| 日本不卡在线二区三区| 最新啪啪视频| 亚洲免费97免费| 超碰97丝袜| 911粉嫩人妻| 久草精品国产蜜臀| 久九色| 天堂中文资源在线bt| 欧美中文字幕男人天堂久久精品| 国产精品一区二区麻豆| 五月婷婷丁香中文字幕| 蜜桃香蕉久草精品在线| 日韩国产乱子伦App| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 夜色AV无码手机在线影院| 人人污日韩一区二区| 欧美碰碰综合色| 无码日韩网站| 男人天堂毛片| 屌逼传媒| 野狼福利社区| 国产欧美日韩在线观看麻豆传媒公司| 男人天堂无码| 91美女中出| 99精品九九九九九九| 亚洲αv一区二区三区| 91色伦综合| 国产一级高跟丝袜| 九一综合网| 正在播放国产精品一区| 好看的久久不射无码影视影院| 百度百度日本操逼| 人人妻人人操人人乐| 精品国产乱码久久久久久网站入口| 日本在线视频导航| 日韩免费簧片| 嗯嗯嗯啊啊啊操的我好爽| 免费精品无码一级毛片牛牛影视 | 操操吧亚洲乱伦视频| 96AV久久久| 免费中文综合精品| 亚洲天天精品| 婷婷五月天成人| 欧美日韩不卡传媒| 日韩乱码av| 国产精品女aA片爽爽视频| 殴美牲| 奇米四色网| 亚洲色情在线影视| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 午夜天天碰综合视频| 校园春色亚洲色图| 亚洲AV免费在线观看| 啪啪视频免费在线观看| 精品十三区| 国内毛片婷婷六月色| 大香交| 天天流夜夜操| 欧美日韩另类在线播放| 超碰偷拍| 亚洲宗合电影| 久久五月份| 水多多映视AV| 999九九九九国产动| 黄色性爱网网| 中文字幕丰满人妻日本| 嗯~啊~快点 死我视频免费看网站| 久久一区二区三区入口| 久久久999国产精品| 亚洲综合97中文网| 日韩精品在线观看观看| 综合第一页| 97午夜剧场日韩| 太久视频| 国产福利一区二| 91欧美丝袜| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 国产99热| 久99热| 成 人片 黄色大片| 91成人无码| 天美传媒AV国产在线| 成人短视频在线观看| 日本操逼视频免费| 男人天堂新在线| 亚洲丝袜色图| 欧美|91色综合| 日韩性爱毛片操骚逼| 欧美成人性活片| 99热 按摩 日韩| 禁止观看美女黄| 国产亚洲精品农村妇女 | 九九精品美女高溯喷水| 日本道久久综合色色| 91久久免费视频互動交流| 97资源站国产精品| 熟妇一区,二区,三区。| 91九九九小逼| 久久天天躁日日躁狠狠躁| 立川理惠加勒比无码| 精品国产无码中文| 久久久久久久强迫| 人人贴人人摸| 草草电影院| 国产精品熟女一区二区三区| 成人青青草原伊人| 日曰骚久久精品| 天天日美女的B| 亚洲一区二区三区麻豆传媒| 欧美久久草熟女| 殴美牲| 六月丁香网| 天天日夜夜爽| 欧美性生活免费网| 人人操人人摸人人看人人干| www.yeyecao| 久久久99免费| 日韩欧美午夜一区二区| 无码外流操逼视频| 中文字幕91页| 精品国产91av一区二区三区| 日韩激情中文字幕有码| 多毛小伙内射老太婆 | 大香蕉AV在线| 人妻嗯啊啊在线播放| www超碰| 九九AV| 大香网伊人久久综合| 黄片免费看黄片免费看| 黄色片大香蕉| 95精品在线| 日本99久久| 久碰视频| 色天堂综合| 欧美视频激情久久久久久| 91爱看| 美腿丝袜偷拍亚洲欧美| 久久精品导航| 91操熟女| 国产精品免费日韩| 午夜理论片在线观看免费| 操逼网免费无码视频| 青娱乐日韩无码| 91粉芽高清在线一区二区| 91九色网| 极品后入免费视频| 欧美 亚洲 91| 大香蕉中文201| 天天影视色香欲综合网小说| 综合激情二| 日韩欧美中文| 婷婷月色| 久操av在线| 久久黄人人爽视频| 国产激情av女片自拍| 91九色精品熟女内射| 99热这里只有精| 亚洲老司机123专区| 丰满丝袜少妇AV| 97久久国产亚洲精品超碰热| 日韩综合色图| 国产激情片在线观看| 99色综合| 夜夜做夜夜爽精品视频| 一级毛片电影免费看| 成人亚欧免费视频| 蜜臀久久久久久999| 亚洲色丰满少妇高潮| 中文字幕av片| 国产探花精品在线| 青青草日逼视频| 97超碰欧美手机在线| 清纯唯美亚洲另类| 免费的很黄很污的全部视频| 91碰碰碰| 狠狠操狠狠燥| 啪啪视频亚洲第一| 1024亚洲中文字幕久在线看片你懂的 | 久久精彩免费视频| 天操天操夜操夜月操月年年操操| 日本性感人妻91| 在线国产一区二区av| 日韩AV一区二区三区三州三州| 国产视频第2页| 欧洲在线性爱视频| 综合激情五月丁香| 91美女视频电影| 国产精品爱欲| 国产熟妇一区二区| 中文字幕丰满人妻日本| 亚洲情色第一页| 久久禁| 插穴性爱视频在线观看| 九九九久千久久激情蜜桃在线看| av黄图片在线观看| 国产人伦精品一区二区三区| 啪啪视频免费在线观看| 超碰97色色| 射综合网| 好一吊区二区| 免费操逼视频下载| asc国产精品| 久久人人爽爽人人爽人人片αV| 人妻天天爽夜夜爽爽| 天天综合-91入口| www.久久久久| 男人的天堂一区| 中文久久爆乳| 国产精品96久久久久久| 亚洲另类久操网| 男人天堂网站| 中文字幕老熟妇黄色视频| 综合网 欧美| 一二三区在线| 日韩卡一卡二卡三在线| 超碰偷拍| 大香蕉宅男伊人| 亚州男人天堂| 色欲人妻一区二区在线| 九九探花视频在线观看| 韩国嫰模上门援交视频| 婷婷五月天久久久| 日日操丁香五月天| 九九热视频这里只有精品| 欧美亚洲天堂| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 伊人麻豆传媒| 很黄很污的免费网站| 午夜精品久久久久久久久久久久久| 婷婷伊人网| 天堂性色| 国精综合一二三区影视| 99国产精品视频尤物| 久久精品人妻一区二区| 国产激情片在线观看| 天天综合91入口| 天天舔天天 | 色五月综合网| 久久大黄片| 九九成人精品| 国产一区二区视频在线播放| 亚洲丝袜综合| 九草在线大香蕉| 福利视频一区二区微拍| 九久9精品| 国产第11页| 日韩精品一区二区三区色欲| 日韩性爱长视频免费| 青青三级视频| 97人肏| 国产福利小视频高清在线观看| 新怡红院| 99色婷婷中文字幕乱色| 亚洲五月丁香花狠狠干一区二区三区| 国产男女边吃边摸视频网站| 99热在线只有精品| 五毛骚逼极品美女怕怕| 少妇六月天| 久久精品国产亚洲AV成人直播| 99999国产精品| 青草香蕉网| 丝袜美腿诱惑亚洲欧美视频在线观看| 日本成人A片免费看| 亚洲第一视频 欧美风情 日韩| 97超碰69| www.婷婷| 俺去也婷婷| 在线播放一级无码视频| 超碰午夜| 日韩无码一区二区三区| 日本 情色 1区2区3区| 绑缚麻绳人妻寝取完整版| 97人人操人人干| 3d成人精品一区二区| 操逼操2| 欧美瑟综合| 欧美一二在线| 又大又长又爽| 亚洲综合色男人网| 婷婷色婷婷| 亚洲综合中文字幕有码| 天天草天天日| 91欧美综合| 亚洲中文字幕av | 欧美一二三区四五区| 亚洲一本大道中文字幕无码在线| 日韩一区二区三区四区五区| 日韩免费看在线黄色片| 精品国产一区探花在线观看| 18禁无码永久免费无限制| 亚洲在线91| 91中出视频| 97人人夜夜精品视频| 九九九九九九九九九国产精品 | 精品国产一区二区久久| 激情综合网激情五月天| 亚洲一区二区三区四区视频| 伊人AAA| 抽插无码高清一区| 天堂种子在线www网资源| 粉嫩绯色AV一区二区在线| 国产一级不卡在线观看| 人人妻人人狠人人| 精品超碰国产| www.yw尤物| av九九| 啊啊啊好爽快点啊啊啊嗯嗯| 人人爽天天爽| 欧美一二三区四五区| 97在线免费看| 91熟女综合| 丝袜av一区二区三区| 97精品在线| 天天综合91入口| 国产蜜臀精品一区二区尤物| 三级日本一区二区三区| 欧美一二三级精品在线| 国产精品美女在线一区| 欧美性爱91| 国产www色在线观看| 日韩性爱小视频在线观看| 9999久久久久| 7月婷婷综合| 啊啊啊在线观看免费视频| 精品久久艹| suv精产一二三区| 日韩免费a级毛片无码a∨| 91人妻最真实刺激绿帽| 在线观看国产黄色| 啊啊啊啊啊在线观看网址 | 日日AAvv| 亚洲乱码精品一区二区| 97精品熟女少妇一区| 亚洲97久久精品亚洲| 操人91| 97欧美精品综合| 久久偷偷色综合蜜桃| 青青草大香蕉视频| 欧美大香蕉专区网| 蜜桃色色网站视频三区| 欧美影音在线| 俄罗斯及免费在线看| 福利操逼| 人人爱夜夜爱| 久久久91| ?亚洲伊人伊成久久人综合网| 久久午夜伦| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 精品国产久久乱码| 国产精品久久久久久久久久久久| 岛国黄片网站| 蜜臀av在线播放一区二区三区| 精品无码一二三四区| 欧美日韩欧美| 亚洲精品亚洲人成在线麻豆| 日韩午夜国产| 超碰2017| 九月婷婷综合| 99热18这里只有精品| 九七超碰| 日韩欧美亚洲国产日韩| 91蜜臀人妻中文字幕在线| 久久riav中文精品| 67194无码不卡| 91美女视频。| 一起草av| 亚洲影视高清第一页| 自怕偷自怕亚洲精品| 青青草九九九九九| 欧美综合网A| 色成人Www精品永久观看| 亚洲自拍欧美国产首页网曝| 97超碰色| 翘臀vidoes| 九九热精品| 人妻精品视频一区二区| 超碰人人干天天射| 99只有精品| 亚洲做性| 青青操轻轻| 亚洲视频二区| 亚洲最大成人a毛毛片| 国产传媒一区日韩| 操操逼视频| 日韩AV色图| 国产又色又粗又黄又爽| 欧美国产有色电影| 亚洲欧美自拍偷拍| 亚洲涩涩| 狠狠穞A片一區二區三區| 精品一区二区三区18| 国人欧美精品一区二区| 青青草依人大香蕉| 97这里有精品| 爱射综合| 免费观看成人www精品视频| 久久人妻四季| 69少妇一区二区| 国产丸一视频| 久久久精品国产亚洲AV无码| 久久久天堂| 超碰97精品在线| 日韩免费三级黄片电影| 九九九九九九视频| 亚洲一区日韩| 久久久久久久9999| AV高清一区| 久久美女国产| 91熟女丨老女人| 中文字暮97| 日韩av在线精品观看| 亚码人妻| 99久视频| 黄片视频观看| 男人的天堂久久狠| 欧美大香蕉卡久久| 精品亚洲国产成人精品| 欧美亚洲首页| 加勒比AV网| 精品超碰国产| 日韩一区二区精彩视频| 天天天做天天天爱天天天爽| 欧美黑人性猛交91| 亚洲中文字幕熟女| 少妇特黄一区二区三区| 午夜天天碰综合视频| 午夜男人av| 色爱亚洲| 国产青青综合伊人| 日韩精品人妻中文字幕久久久| 天天干夜夜一操| 亚洲天堂男人天堂| 大干人妻| 91熟女综合| 激情久久久| 国产精品爱欲| 精品无码久久久久久久杏吧| 少妇九九九九| 成人久久精品| 美女露胸露屁股| 日本人妻A片成人免费看片| 熟女激情综合网| 999久久芭蕾| 欧美亚洲日韩16色| 人人操av| 粉嫩av在线一区二区| 18禁看网站一区| 亚洲黄色电影| 久久久久网站-538在线视频-欧美永久乱码| 人妻熟女av国产网站| 成人一道本免费视频| 欧美日韩色| 91亚洲丝袜| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 97人人模人人爽人人| AV在线性爱| 中文字幕无码不卡啪啪| 黄色av播放免不| 最新精品久久蜜桃 | 久久久久久久久久久久黄色 | 综合亚洲情色| 日韩午夜啪啪视频| 人人考人人摸人人干| 黄片com.| 黄色一区二区秘书性感| 91这里只有精品| 91在线视频国产网站| 天天综合网~91| 蜜桃视频啊啊啊啊| 国偷自 一区二区| 超碰97首页| 97视频在线视频| 吉川爱美亚洲二区在线| 欧美中字二区| 97精品久久久久中文字幕| 熟女自慰久久久| 九九九九九九亚洲| 精品视频123区小说区| 亚洲AO在线| 精产国品一区二三产品| 亚洲 图片 欧美 色图| 久久久久久性爱片| 久久精品72| 超碰98综合网| 欧美综合网1| 精品综合久久久久久97| 干B网| 天天综合中文字幕 91| 3P丝袜熟女 色综合| 亚州性色| 日本人妻丰满熟妇久久久久久| a级免费在线观看| 日韩强奸av| 久操网线| 色五月激情综合网| 亚洲情色1区| 老熟女91av| 少妇内射www在线观看视频| 夜夜操中文字幕| 九九九久| 欧美性生活男人的天堂| 色色香蕉| 六月激情网| 啊啊啊啊啊啊好湿好爽视频| 99在线精品观看视频中文| 夜夜欧美| 色黄污美女啪啪啪免费网站| a级成人毛片免费视频高清| 中文字幕成人| 久久鲁夜| 91久热| 日本加勒比无码专区| 日韩中文字幕精品一区在线| 久久亚洲熟妇在线视频| 99精品丰满人妻无码| 精品人妻一区二区免费看| 黑人娇小av在线播放| 另类 日韩 熟女| 91neishe| 欧美日韩亚洲少妇寂寞影院正在播放 | 久青草影院| 日本不卡码黄色 | 大香蕉中文201| 四虎国产精品永久入口| 五月婷婷丁香中文字幕| 欧美 亚洲 大香| 国产青视频| 国产欧美另类久久久精品课程| 无码 黑人一区二区三区| 熟女视频久久| 欧美人妻另类在线| 中文字幕一区二区三区字幕| 91无码中出人妻视频| 日韩美女久久一区二区三区| 东京太热男人的天堂久久久| 九月丁香婷婷色| 人妻天堂综合网| 中文字幕青青草| 黄页视频网站野外| 青青草精玖玖69精品| 久久午夜神马| 成人网址在线观看| 国产情色第一第二页在线观看| 成·人免费午夜在线观看| 免费又黄又裸乳的视频| 亚洲欧美九九九| 婷婷爽人人婷婷爽视频| 人人看人人摸人人色| 久久精品高清无码一区| 日本无码1| 亚洲精品欧洲精品| 女人与公拘交酡2020视频| 欧美精品人妻视频| 人妻欧美| 五月婷婷深深爱| 亚洲少妇视频| 四虎影院成年人片| 4tube欧美女厕所| 精品性爱一二三区| 亚洲天堂久| 欧美日韩激情无码专区| 欧美性爱网97| 404操逼福利视频| av东京热男人的天堂| 亚洲第一免费视频| 欧美72网页| 中文字幕奈奈美被公侵犯| 久久夜夜夜夜| 亚洲精品国产专区在线观看| 国产视频第2页| 中文字幕中文字幕一区二区| 国产亚洲精品美女| 亚洲乱伦图片视频| 久久久性少妇| 色五月婷婷色| 好吊色青靑草| 久久的网站啊啊啊啊啊| 又粗又长又大国产不卡| 熟女啪啪视频| 国模无码人体一区二区三| 亚洲视频,小说| 日韩av不卡在线看| 日韩中文字幕av在线播放| 18禁精品网站在线看| 国模91| 亚洲欧美激情在线视频| 久久一区二区三区四区五区| 天操天操夜操夜月操月年年操| 日韩操逼性鲍| 深夜激情| 人妻天天爽夜夜爽爽| 97资源视频| 麻豆黄四叶草网站| 久久婷婷热| 日韩欧美性爱电影在线观看| 欧美影音在线| 猛交交| xxxx网站亚洲精品| 骚货操死你| 美国久久一二三四| 久久老子无码午夜伦不卡| 四虎在线观看视频| 日韩欧美偷拍美女视频| 在线中文字幕极品av| 亚洲在线欧美| 超碰无码五月97| 亚洲日韩AV视色| 口爆吞精在线观看| 色爱天堂| 97色涩| 人人喜人人妻| 亚洲午夜福利视频| 欧美亚洲天堂| 蜜臀AV一区二区三区| 91麻豆天美国产| 丁香婷婷啪啪| 大JI巴好深好爽又大又粗视频| 男人天堂网手机版婷婷| 亚州操操穴网| 99热99色| 欧亚性爱视频免费看| 激情综合网激情综合| 女上位精品在线| 色婷婷婷五月天激情四射| 婷婷五月天影院| 强奸乱伦AV网址| 亚洲 欧美 日本 国内 首页| 亚洲精品97中文字幕| 激激五月| 五月婷婷色色| 亚洲欧美日韩综合在线尤物| AV和黑人在线播放| 精品九九九九| 中文久久久| 婷婷五月天色网| 欧日韩在线观看| 精品小视频在线| 精品少妇后入一区二区三区四区人妻巨乳 | 综合久久久久久久综合网| 三级日本一区二区三区| 精品九九| 日韩av影片在线观看| 美女被啪到深处抽搐视频| 少妇淫妇久久久久久久| 91熟女视频网| 少妇99| 伊人成人情色综合| 玖玖97综合| 91 刺激在线| 激情视屏国产乱伦强奸| 丝袜剧情| 欧美顶级黄色大片免费| 亚洲色图尤物视频| 毛片久久| 91看黄片| 无码丰满熟妇一区二区浪潮AV| 老熟女乱伦一区| 成年人黄色| 操b在线观看| 肉动漫无遮挡h在线观看| 中文久久久| 自拍偷拍第26| 欧美特大AA级黄片| 飘花国产午夜精品不卡| 在线综合色| 欧美日韩国内不卡| 国产亚洲精品自在线亚洲情侣| 国产精品三级视频网站| 91综合天天看| 亚洲一区二区中文字幕| 污色区网站| 乱伦日本中文自拍| .精品人妻一区二区三| 国产精品无码av在线| 福利在线观看一区二区| 欧美性爱在线无码| 久悠悠av| 成人热久久精品| 蜜桃视频啊啊啊啊| 中文字幕激情小说| 欧美日韩在线视频网站| 国产精品爽爽v| 国模精品娜娜一二三区| 一二三区在线| 又摸又舔在线观看网站| 偷偷人人精品女女久久| 综合久久97| 收看日本人日bb| 色牛牛AV| 五月久久HDAV| 中文字幕视频免费| 色欧洲| 亚洲无线码欧洲精品区别| 51一区二区三区| 久久久久13| 欧美在线55555| 熟妇国产免费一区| 国产剧情在线| 久久久久久国产精品免费网站| 性色一线| 2017天天透天天通天天擦| 无码人妻精品一区二区三区九九| 97操97干| 亚洲激情综合另类男同| 久久婷婷伊人| 激情四射婷婷四五月天| 91麻豆天美国产欧美高潮| 在线观看中文字幕| 中文字幕人成乱码熟女香港| 99久久网站| 欧美在线啊啊啊| 欧美草草高清日韩视频| 久久久精品中文字幕爱豆| 日韩不卡av一二三| 亚洲人成网www| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 一本大道久| 色视频蜜乳| 色综合天天| 亚洲 欧美 日韩另类 麻豆| 无码一区免费在线不卡| 亚洲国产激情国产av| 亚洲熟女一区| 黄色一级视| 777琪琪午夜免费A片| 乱操乱伦AV| 国产1024在线播放| 色综合九九| 韩国嫰模上门援交视频| 婷婷av在线中文字幕| 五月天开心网| 综合网少妇| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 亚洲熟女精品| 91人人爽人人爽| 免费视频一二三区| 五月色网| 青青国产在线拍揄自揄拍| 久久草草亚洲蜜桃臀| 国产久久一区二区午夜| 久午视频| 婷婷五月丁香五月| 欧亚 另类 久| 五月天激情综合网| 久久精品女同亚洲女同13| 综合影院永久入口国产| 极品粉嫩一区二区| 男人在线天堂| 国产丝袜美女诱惑| 屁股久久久久久| 啪啪综合网| 天天插网| 嗯嗯嗯嗯啊啊啊好紧好大| 国内毛片四区| 国产精品久久久三级无码| 精品人妻一区二区蜜桃视频 | 国产女主播视频在线观看| 日韩AV无码中文一区二区| 98精品国产乱码久久久久久| xxxx网站亚洲精品| 久久精品91| 狠狠色噜噜狠狠狠狠狠色综合久久| 欧美激情色婷婷花野真衣一区二区| 亚洲精品人妻在线| 欧美影音在线| 亚洲AV成人无码一区二区三区在线观看| 久久综合久色欧美综合狠狠| 无码操逼网| 人妻丰满熟妇av无码区蜜桃| 欧美黄片视频在线观看免费 | 午夜大香蕉| 91美女小视频| 极品内射| 嗯啊抽插大香蕉网页| 五十路熟女,国产欧美精品区一区二区三区 | 欧美日韩国产高清在线一二三区 | 飘花国产午夜精品不卡| 狠狠干2020| 婷婷色在线| 97在线免费看视频| 美日韩在线不卡人妻| 曰本人妻人人澡人人夹| 国产精品久久泡妞网站| 色哟哟-国产专区| 成人a级高清视频在线观看| 九久久精品| 青青草日韩无码| ,成人免费啪啪视频| 91女优在线观看 | 猛猛干| 中文字幕日产av人| 99久久久久久久久| 91亚洲人| 屁股久久久久久久久| 丁香五月影院| 超碰在线人妻中文字幕| 天美传媒精品久久视频| 热天堂一区二区| 日韩乱伦视频| 四虎国产精品永久在线囯在线| 国产熟女二区| 蜜桃久久综合视频| 夜夜天天噜狠狠爱2021| 一区二区三| 激情婷婷丁香| 久久最新免费视频23| 黑人精品成人一区二区三区 | 亚洲成人一区二区精品| 婷婷色综合欧美日韩| 色在线69堂| 超碰 另类 欧美| 曰韩无码777| 久久精品国产亚洲妲己影视| 人妻少妇精品视频一区二区三区| 天天舔天天| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 熟女视频久久| 亚洲精品乱码线路中文字幕 | 东京热天堂网| 蜜臀网址在线| 成人片视频| 欧美亚洲一区二区久久久婷精品大包诱| 久操视频资源站公开| 男人天堂新在线| 成人九九| 久久久久久久久久久久欧美日| 天堂资源欧美| 99re视频在线观看这里只有精品| 日韩欧美成人午夜福利| 蜜臀久久99精品久久久久| 久久亚州大香蕉| 香蕉大久久久| 97碰碰日本乱偷人妻中文的| 青青久操| 嗯嗯啊啊用力视频免费| 啊啊啊好爽快点啊啊啊嗯嗯| 婷婷亚洲色| 无码高清专| 综合操逼| 黄骗免费| 国产传媒午夜理伦精品| 亚洲啪啪综合?v一区综合精品区| 久久婷婷苹果| 高清无码91| 夜夜国自区| 欧美日韩制服| 神马久久久久久久久| 中文字幕欧洲有码| 中文字幕伊人| 亚洲有码第一页| 五十路人妻在线| 搡老女人老91妇女熟女| 夜夜嗨老熟女AV一区二区三区| 都市激情人妻一区二区青青操视频 | 麻豆国产视频精品观看| 370p日韩欧美亚洲精品| 国产人妖的免费的视频| 综合影院永久入口国产| 91影库| 久久国产乱子伦精品免费女人| 久草国产在线视频| 国产 无码 一区二区| 日韩在线观看中文字幕视频| 噜噜吧,噜噜色,噜噜| 亚洲一区中文字幕一区| 六六久久日韩不卡| 亚洲欧美校园另类春色| 久久熟妇五十路一区| 97人人中文网| 风月影院男女十八禁| 亚洲中文字幕久久无码精品| 精品人妻一区二区三区蜜桃视频| 青草精品视频日本久久久久网站在线| 91熟女丨91老女人| 日韩三级伦理中文字幕| 亚洲图片激情综合另类| www成人啪啪18秘 免费| 日韩av乱伦| 免费A V在线| 麻豆亚洲Av成人无码一区精品| 天堂资源欧美| 伊人久久亚洲色欲综合网站 | 欧美,日韩,中文,另类| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 亚洲自拍一区夜夜操| 熟妇精品juliaannAV| 欧美日韩亚洲少妇寂寞影院正在播放| 91色夜| 国产精品久久久久久久电影渣男| 美女极品一区二区三区| 骚逼高潮久久精品| 成人综合网 欧美| 中文字幕免费在线观看| 成年无码动漫av片无尽在线 | 粉嫩av在线一区二区| 成年女人一区| 岛国999| 精品二区三四区五电影| 极品销魂美女一区二区| 国产精品999zyz| 国产原创自拍| 日韩电影天堂视频二区三区| 性色综合网| 日本人妻中文字幕精品| 男人天堂2019亚洲| WWW.加勒比人妻一区不卡.com| 麻豆性爱视频在线播放| 男人天堂2030| 国产熟女完整版中字| 亚洲欲色9532548967一区| 国产视频小说| JIZZJIZZ亚洲女人被躁| 成人性爱电影网| 日夜干射色啊| 欧美综合网| 五月天社区| 欧美999999| 97操97干| 精品人妻中文字幕4399| 67914亚洲精品| 超碰98综合网| 国产日韩手机视频在线| 99视频内射三四| 久久久久久久久国产| 免费国产电影一区二区| 九九热精品免费视频| 老色鬼成人精品视频下载大在线观看| 上床啊啊啊| 亚洲无线码一区国产欧美国| 97久久精品国产| 中国人高清www色视频免费| 亚洲国产成人精品无码专区| 超碰在线97国产| 日本中文字幕不卡视频| 精品一区二区三区蜜桃臀赵总| 国产人妻精品一区二区三区秋霞 | 亚洲经典啪啪| 久操 高清| 成人一道本免费视频| 日本 欧美 亚中文字幕| 97久久久久| 强免费黄色网址| 久久久久国产精品人妻aⅴ天堂| 日韩高清黄片| 国产精品久久久777| 欧美乱伦专区| 亚洲一二三精品久久网 | 精品国产丝袜一区二区三区乱码| 超碰天天久久79| 亚洲欧美色图片| 国产欧美精品日韩区二区麻豆天美| 久久久性少妇| www99热| 91欧美情色| 日韩熟妇二区| 国产熟女无套内射| 国内精品999| 人妻夜夜爽天天爽三区麻豆AV网站| 亚洲图片欧美91N| 天天噜| 日欧美色| 欧美不卡在线一区二区| 熟女色图在线| 国产精品分类在线观看| 亚av顶级裸体一区二区三区四区五区| 午夜啪| 久久九精品| 日本五十路熟女一区二区| 大香蕉 222| ss久久| 不卡中文字幕aⅴ在线| 日本有码影片下载 | 97在线免费观看视频| 青青草亚洲一区| 日婷婷| 日韩不卡一二三四| 一级A啪啪啪啪| 黑人猛交| 一区二区三区日韩欧美 | 亚洲免费精品一区| 51国产午夜精品视频| 久草精品一区| 在线国产一区二区av| 九九碰九九爱97超| 国产污视频麻豆传媒一区二区| 久久亚洲AV无码专区国产精品| 香蕉色网| 国产日本熟女顶级一区二区三区视频| 免费A片三p视频| 亚洲人人夜夜澡人人爽| 中文字幕成人| 秋霞一级A片黄色视频| 亚洲欧美91√| 狠狠躁AV| 97在线精品观看视频| 国产suv一区二区三区6| 人妻夜夜爽天天爽麻豆三区网站| 日韩无码黄色片| 欧美啪啪啪91| 欧美 青青草| 日韩性爱小视频在线观看| 日韩免费a级毛片无码a∨| 欧美 日韩 婷婷 五月| 亚洲激情AV| 蜜臀AV秘一区翔田千里| 国产后入式在线观看| 性色中出| 91九九| 国产精品无码久久久久2025| 一本色道久久综合精品婷婷| 日本999精品视频| 久久,精品一二三| 国产成人一级av88| 91精品国产91久久青草| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 国产在线播放成人免费| 超碰久草| 大香蕉中文aV在线| 亚洲成人av色网| 福利伊人玖玖国产| 亚洲av综合伊人久久| 9精品久久久久| 偷拍片久久| 九九热免费在线国产视频伊人五月| 亚洲精品成人| 欧美激情另类一区二区| 99久久久无码国产精品性啊聊| nuu12国产麻豆精品| 黄日韩| yirendaxiangjiashipin| 五月综合色| 久久成人午夜精品影院| 久久成年片色大黄全免费网站| 91 天天综合| 91无摭挡| 亚洲天堂日本| 97青娱乐超碰久久| 亚洲国产综合久久久性感熟妇| 久操热| 91精品久久久久久77777| 国产日韩精品人妻久久久久色欲网站 | 8x福利精品第一福利视频导航| 玖玖综合网| 91c色| 亚洲人妻爽爽爽| 理论久久婷婷网8| 丝袜美腿丝袜| 亚洲蜜臀精品视频久久| 久久久内射良家| 久久99草| 偷拍片久久| 欧美综合网1| 九九九精品一区二区无码| 天色综合网| aaa淫乱视频| 成人老鸭窝人人在线视频| 欧美色三级片91| 怡红院怡春院| 蜜桃传媒一区二区亚洲| 亚洲色9| 超碰97男人|