99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

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

基于騰訊云構(gòu)建企業(yè)級(jí)物聯(lián)網(wǎng)OTA系統(tǒng):架構(gòu)設(shè)計(jì)與安全實(shí)踐 1. 項(xiàng)目概述為什么我們需要一個(gè)“云上”的OTA系統(tǒng)做嵌入式或者物聯(lián)網(wǎng)設(shè)備開發(fā)的朋友對(duì)“OTA”這個(gè)詞肯定不陌生。它全稱是“Over-The-Air”翻譯過來就是“空中下載技術(shù)”。簡單說就是讓你的設(shè)備比如一個(gè)智能插座、一個(gè)工業(yè)網(wǎng)關(guān)或者一塊開發(fā)板能夠通過網(wǎng)絡(luò)自動(dòng)下載并更新固件而不用你跑到現(xiàn)場去插線、燒錄。這聽起來很美好對(duì)吧但真正自己動(dòng)手從零搭建一套穩(wěn)定、安全、可管理的OTA系統(tǒng)坑可不少。幾年前我負(fù)責(zé)的一個(gè)智能家居項(xiàng)目就踩過大坑。當(dāng)時(shí)為了快速上線OTA功能做得非常簡陋設(shè)備直接從一個(gè)靜態(tài)的HTTP服務(wù)器拉取固件包。結(jié)果呢服務(wù)器被刷爆、升級(jí)包被惡意替換、設(shè)備變磚……各種問題層出不窮運(yùn)維同事差點(diǎn)把我“祭天”。痛定思痛我開始研究如何構(gòu)建一個(gè)企業(yè)級(jí)的OTA解決方案。經(jīng)過多個(gè)項(xiàng)目的迭代我發(fā)現(xiàn)基于成熟的公有云平臺(tái)來構(gòu)建OTA后端是性價(jià)比最高、最穩(wěn)妥的選擇。而騰訊云憑借其豐富的產(chǎn)品矩陣和穩(wěn)定的服務(wù)成為了我的首選。今天我就把自己基于騰訊云搭建OTA遠(yuǎn)程升級(jí)系統(tǒng)的實(shí)戰(zhàn)經(jīng)驗(yàn)從架構(gòu)設(shè)計(jì)、核心組件選型到安全策略、實(shí)操步驟和避坑指南毫無保留地分享出來。這套方案不僅適用于物聯(lián)網(wǎng)設(shè)備對(duì)于任何需要遠(yuǎn)程管理、分發(fā)二進(jìn)制文件的場景比如邊緣計(jì)算盒子、自助終端等都有參考價(jià)值。你會(huì)發(fā)現(xiàn)借助云服務(wù)我們能把精力從繁瑣的基礎(chǔ)設(shè)施運(yùn)維中解放出來更專注于業(yè)務(wù)邏輯和設(shè)備本身。2. 整體架構(gòu)設(shè)計(jì)與核心思路拆解在動(dòng)手敲代碼之前我們必須把架構(gòu)想清楚。一個(gè)完整的OTA系統(tǒng)遠(yuǎn)不止是“設(shè)備下載文件”那么簡單。它至少需要解決四個(gè)核心問題固件存儲(chǔ)與分發(fā)、升級(jí)任務(wù)管理、設(shè)備狀態(tài)追蹤、升級(jí)過程安全?;谶@些需求我設(shè)計(jì)了下面這套以騰訊云為核心的后端架構(gòu)。2.1 核心組件選型與職責(zé)劃分我的核心思路是用對(duì)象存儲(chǔ)做倉庫用云函數(shù)做大腦用消息隊(duì)列做神經(jīng)用數(shù)據(jù)庫做記憶。下面是每個(gè)騰訊云組件扮演的角色騰訊云對(duì)象存儲(chǔ)COS這是整個(gè)系統(tǒng)的“倉庫”。所有版本的固件包.bin, .img文件都安全地存放在這里。COS提供了高可靠性、高可用性和極強(qiáng)的擴(kuò)展性完全不用擔(dān)心存儲(chǔ)空間和帶寬問題。更重要的是它可以生成具有時(shí)效性的簽名URL實(shí)現(xiàn)安全、可控的固件下載。云函數(shù)SCF這是系統(tǒng)的“大腦”和“調(diào)度中心”。所有業(yè)務(wù)邏輯比如創(chuàng)建升級(jí)任務(wù)、驗(yàn)證設(shè)備升級(jí)權(quán)限、生成固件下載鏈接、處理設(shè)備上報(bào)的狀態(tài)等都通過一個(gè)個(gè)云函數(shù)來實(shí)現(xiàn)。它無服務(wù)器Serverless的特性讓我們無需關(guān)心服務(wù)器運(yùn)維按實(shí)際調(diào)用次數(shù)付費(fèi)成本極低。消息隊(duì)列CMQ/TDMQ這是系統(tǒng)的“神經(jīng)系統(tǒng)”。當(dāng)管理后臺(tái)創(chuàng)建一個(gè)升級(jí)任務(wù)后可以通過消息隊(duì)列將任務(wù)指令異步、可靠地推送給海量設(shè)備。設(shè)備端的SDK訂閱相關(guān)主題就能實(shí)時(shí)收到升級(jí)通知。這解耦了后臺(tái)任務(wù)創(chuàng)建和設(shè)備端觸發(fā)提升了系統(tǒng)的響應(yīng)能力和可靠性。云數(shù)據(jù)庫MySQL/RedisMySQL作為“核心記憶”存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)。主要包括firmware_meta表存儲(chǔ)固件元信息版本號(hào)、文件COS路徑、MD5、文件大小、適用設(shè)備型號(hào)、更新日志、創(chuàng)建時(shí)間。ota_task表存儲(chǔ)升級(jí)任務(wù)任務(wù)ID、目標(biāo)固件版本、設(shè)備篩選條件、升級(jí)策略、任務(wù)狀態(tài)、創(chuàng)建時(shí)間。device_upgrade_record表存儲(chǔ)每臺(tái)設(shè)備的升級(jí)記錄設(shè)備ID、任務(wù)ID、升級(jí)狀態(tài)、開始時(shí)間、結(jié)束時(shí)間、失敗原因。Redis作為“高速緩存”存儲(chǔ)會(huì)話級(jí)和狀態(tài)數(shù)據(jù)。例如設(shè)備上報(bào)的臨時(shí)升級(jí)狀態(tài)、頻繁訪問的固件信息、防止重復(fù)請(qǐng)求的令牌等可以放在Redis中極大提升接口性能。API網(wǎng)關(guān)API Gateway這是系統(tǒng)的“門面”。它將后端的云函數(shù)包裝成標(biāo)準(zhǔn)的HTTP/HTTPS API接口提供給設(shè)備端和管理后臺(tái)調(diào)用。API網(wǎng)關(guān)負(fù)責(zé)認(rèn)證、鑒權(quán)、流量控制、監(jiān)控和日志是我們實(shí)現(xiàn)安全訪問的第一道關(guān)卡。這個(gè)架構(gòu)的優(yōu)勢(shì)在于全托管、高彈性、強(qiáng)安全。每個(gè)組件都是騰訊云托管的服務(wù)我們不需要維護(hù)任何物理服務(wù)器。當(dāng)設(shè)備量從幾百臺(tái)暴增到幾十萬臺(tái)時(shí)COS和SCF可以自動(dòng)擴(kuò)容消息隊(duì)列能保證消息不丟失整個(gè)系統(tǒng)能平穩(wěn)支撐。2.2 升級(jí)流程的“雙車道”設(shè)計(jì)設(shè)備如何知道該升級(jí)了我推薦兩種主流模式可以比作“廣播通知”和“主動(dòng)查詢”雙車道。車道一服務(wù)端推送模式推薦用于實(shí)時(shí)性要求高的場景管理員在后臺(tái)創(chuàng)建升級(jí)任務(wù)選擇目標(biāo)設(shè)備和固件。后臺(tái)調(diào)用云函數(shù)云函數(shù)將升級(jí)指令包含任務(wù)ID、固件版本號(hào)等信息發(fā)布到消息隊(duì)列的特定主題。設(shè)備端SDK長期在線并訂閱了該主題實(shí)時(shí)接收到升級(jí)指令。設(shè)備觸發(fā)升級(jí)流程。這種模式實(shí)時(shí)性最好設(shè)備能在秒級(jí)內(nèi)響應(yīng)升級(jí)指令。適合用于緊急漏洞修復(fù)或重要功能推送。車道二設(shè)備定時(shí)輪詢模式兼容性最好適用于所有設(shè)備設(shè)備在啟動(dòng)后或定時(shí)如每2小時(shí)向服務(wù)端的“檢查更新”API發(fā)起請(qǐng)求。請(qǐng)求中攜帶設(shè)備ID、當(dāng)前固件版本、設(shè)備型號(hào)等信息。提供該API的云函數(shù)查詢數(shù)據(jù)庫判斷是否存在針對(duì)該設(shè)備的、未執(zhí)行的升級(jí)任務(wù)。如果存在則返回升級(jí)任務(wù)信息和帶簽名的固件下載URL。設(shè)備觸發(fā)升級(jí)流程。這種模式對(duì)設(shè)備端要求低即使設(shè)備不支持長連接也能工作。是OTA系統(tǒng)的保底機(jī)制。在實(shí)際項(xiàng)目中我通常兩者結(jié)合使用。設(shè)備端同時(shí)實(shí)現(xiàn)消息訂閱和定時(shí)輪詢。平時(shí)通過消息隊(duì)列保持低功耗的實(shí)時(shí)監(jiān)聽一旦網(wǎng)絡(luò)異?;蛳G失定時(shí)輪詢可以作為可靠的備份機(jī)制確保升級(jí)指令最終能送達(dá)。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)架構(gòu)清晰了我們來看看幾個(gè)最關(guān)鍵環(huán)節(jié)的實(shí)現(xiàn)細(xì)節(jié)這些地方直接決定了OTA系統(tǒng)的穩(wěn)定性和安全性。3.1 固件包的安全設(shè)計(jì)與完整性校驗(yàn)固件包是OTA的核心資產(chǎn)絕不能出問題。我設(shè)計(jì)了一套從生成到驗(yàn)證的完整鏈條1. 固件包預(yù)處理編譯服務(wù)器上完成# 假設(shè)已有編譯好的 firmware.bin # 1. 計(jì)算固件的MD5和SHA256用于完整性校驗(yàn) md5sum firmware.bin firmware.bin.md5 sha256sum firmware.bin firmware.bin.sha256 # 2. 使用開發(fā)團(tuán)隊(duì)的私鑰對(duì)固件的SHA256哈希值進(jìn)行簽名 # 例如使用 openssl openssl dgst -sha256 -sign private_key.pem -out firmware.sig firmware.bin # 3. 將固件、MD5文件、SHA256文件和簽名文件打包成一個(gè)升級(jí)包 tar -czvf firmware_v1.0.1.tar.gz firmware.bin firmware.bin.md5 firmware.bin.sha256 firmware.sig最終上傳到COS的就是這個(gè)firmware_v1.0.1.tar.gz包。同時(shí)需要將固件的版本號(hào)、MD5、SHA256、簽名或簽名文件的COS路徑、文件大小、適用型號(hào)等元信息寫入數(shù)據(jù)庫的firmware_meta表。2. 設(shè)備端升級(jí)時(shí)的校驗(yàn)流程設(shè)備上完成設(shè)備下載完升級(jí)包并解壓后必須按順序執(zhí)行以下校驗(yàn)任何一步失敗都應(yīng)立即中止升級(jí)并報(bào)錯(cuò)大小校驗(yàn)比對(duì)下載文件的大小與服務(wù)端告知的大小是否一致防止網(wǎng)絡(luò)傳輸不完整。哈希校驗(yàn)計(jì)算下載的firmware.bin的MD5或SHA256與包內(nèi)的.md5或.sha256文件內(nèi)容比對(duì)。這一步防止文件在傳輸或存儲(chǔ)過程中損壞。簽名校驗(yàn)最關(guān)鍵使用預(yù)置在設(shè)備安全存儲(chǔ)區(qū)如efuse的公鑰對(duì)firmware.sig進(jìn)行驗(yàn)簽驗(yàn)證其是否與firmware.bin的SHA256哈希值匹配。這一步是防止固件被惡意篡改的最后防線。只有通過簽名校驗(yàn)的固件才被認(rèn)為是合法、來自官方開發(fā)團(tuán)隊(duì)的。實(shí)操心得密鑰管理是命門用于簽名的私鑰必須離線保存最好使用硬件安全模塊HSM。編譯服務(wù)器的私鑰一旦泄露整個(gè)OTA系統(tǒng)的安全基石就崩塌了。設(shè)備端的公鑰則需要在出廠時(shí)燒錄且不可被后續(xù)軟件修改。對(duì)于資源受限的MCU可能無法進(jìn)行非對(duì)稱加密驗(yàn)簽?zāi)敲粗辽僖靡粋€(gè)設(shè)備端預(yù)置的對(duì)稱密鑰來計(jì)算HMAC作為替代方案但安全性稍弱。3.2 升級(jí)任務(wù)與設(shè)備分組的灰度發(fā)布策略“一刀切”的全量升級(jí)是危險(xiǎn)的。一個(gè)未經(jīng)充分測試的新固件如果直接推給所有設(shè)備可能導(dǎo)致大規(guī)模變磚。因此灰度發(fā)布金絲雀發(fā)布是OTA系統(tǒng)的必備功能。我的實(shí)現(xiàn)方案依賴于數(shù)據(jù)庫中的ota_task表和device_info表。ota_task表中有一個(gè)target_devices字段它不直接存儲(chǔ)設(shè)備ID列表那樣不靈活而是存儲(chǔ)一個(gè)篩選規(guī)則。例如任務(wù)可以設(shè)定為target_devices:{model: GW-2000, version: 1.2.0, percentage: 10}含義針對(duì)型號(hào)為“GW-2000”且當(dāng)前版本低于1.2.0的設(shè)備隨機(jī)選取10%進(jìn)行升級(jí)。當(dāng)設(shè)備調(diào)用“檢查更新”API或收到消息時(shí)云函數(shù)會(huì)根據(jù)設(shè)備ID查詢device_info表獲取其型號(hào)、當(dāng)前版本、所屬區(qū)域等標(biāo)簽。查詢所有活躍的ota_task用設(shè)備的標(biāo)簽去匹配任務(wù)的target_devices規(guī)則。如果匹配成功再根據(jù)“percentage”等灰度規(guī)則通過一個(gè)確定的算法如device_id % 100 percentage判斷該設(shè)備是否命中本次升級(jí)。如果命中則返回升級(jí)信息?;叶韧七M(jìn)流程內(nèi)部測試創(chuàng)建任務(wù)target_devices指定為內(nèi)部測試設(shè)備的ID列表。1%灰度任務(wù)目標(biāo)改為特定型號(hào)的1%隨機(jī)設(shè)備。觀察這批設(shè)備的升級(jí)成功率、失敗原因和設(shè)備運(yùn)行日志。10%灰度如果1%灰度表現(xiàn)穩(wěn)定將比例擴(kuò)大到10%。繼續(xù)觀察。50% - 全量逐步擴(kuò)大范圍直至覆蓋全部目標(biāo)設(shè)備。注意事項(xiàng)灰度規(guī)則的靈活性target_devices字段的設(shè)計(jì)要足夠靈活支持多維度篩選。除了型號(hào)、版本、隨機(jī)比例還可以加入“城市”、“網(wǎng)絡(luò)運(yùn)營商”、“設(shè)備分組”等業(yè)務(wù)標(biāo)簽。這樣我們可以先對(duì)“北京聯(lián)通的設(shè)備”進(jìn)行灰度再推廣到全國。3.3 利用COS簽名URL實(shí)現(xiàn)安全下載我們不可能把COS的固件文件設(shè)置為公開可讀那太危險(xiǎn)了。也不能把COS的永久密鑰放在設(shè)備端因?yàn)橐坏┬孤秾?duì)象存儲(chǔ)就門戶大開。騰訊云COS的“臨時(shí)密鑰”和“預(yù)簽名URL”機(jī)制完美解決了這個(gè)問題。流程如下設(shè)備通過認(rèn)證后向“獲取下載地址”API發(fā)起請(qǐng)求。該API背后的云函數(shù)首先校驗(yàn)設(shè)備是否有權(quán)限升級(jí)到此版本。校驗(yàn)通過后云函數(shù)使用騰訊云的SDK生成一個(gè)針對(duì)該固件文件的、具有時(shí)效性例如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臨時(shí)密鑰Id, SecretKey臨時(shí)密鑰Key) client CosS3Client(config) url client.get_presigned_download_url( Bucketbucket, Keykey, # 固件在COS中的完整路徑 Params{}, # 可以加響應(yīng)頭參數(shù)如ResponseContentDisposition指定下載文件名 Expiredexpired_seconds ) return url將這個(gè)僅15分鐘內(nèi)有效的URL返回給設(shè)備。設(shè)備在有效期內(nèi)使用此URL直接下載固件。過期后該URL自動(dòng)失效。這樣即使URL在傳輸過程中被截獲攻擊者也只有很短的窗口期進(jìn)行利用大大提升了安全性。云函數(shù)本身使用的是從CAM訪問管理獲取的臨時(shí)密鑰其權(quán)限被嚴(yán)格限制在“生成指定目錄下文件的簽名URL”這一最小范圍內(nèi)遵循了最小權(quán)限原則。4. 實(shí)操過程從零搭建OTA后端核心理論說了這么多我們動(dòng)手搭一個(gè)最簡單的可運(yùn)行原型。這里我以“設(shè)備定時(shí)輪詢”模式為例演示最核心的“檢查更新”和“上報(bào)狀態(tài)”兩個(gè)API的實(shí)現(xiàn)。4.1 環(huán)境準(zhǔn)備與云資源創(chuàng)建首先你需要在騰訊云控制臺(tái)創(chuàng)建以下資源假設(shè)你已有騰訊云賬號(hào)對(duì)象存儲(chǔ)COS創(chuàng)建一個(gè)存儲(chǔ)桶例如ota-firmware-1250000000。在桶內(nèi)創(chuàng)建目錄結(jié)構(gòu)firmware/{device_model}/。例如firmware/gw2000/。上傳一個(gè)測試固件包如firmware/gw2000/v1.0.1.bin。重要存儲(chǔ)桶的訪問權(quán)限設(shè)置為“私有讀寫”。云數(shù)據(jù)庫MySQL購買一個(gè)MySQL實(shí)例最低配置即可。創(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 版本號(hào)如v1.0.1, model varchar(50) NOT NULL COMMENT 適用設(shè)備型號(hào), 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ù)時(shí)選擇“Web函數(shù)”或“事件函數(shù)”并關(guān)聯(lián)API網(wǎng)關(guān)觸發(fā)器會(huì)更方便。4.2 核心云函數(shù)代碼實(shí)現(xiàn)Python示例我們創(chuàng)建兩個(gè)云函數(shù)check_update和report_status。函數(shù)一check_update檢查更新這個(gè)函數(shù)接收設(shè)備ID和型號(hào)返回是否有可用的升級(jí)任務(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)使用臨時(shí)密鑰此處簡化演示 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è)備檢查更新請(qǐng)求 # 1. 解析請(qǐng)求參數(shù) try: # 從API網(wǎng)關(guān)事件中獲取請(qǐng)求體 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ù)庫檢查是否有符合條件的升級(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: # 查找針對(duì)該型號(hào)、已發(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è)備的升級(jí)任務(wù) (簡化邏輯實(shí)際需匹配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. 在升級(jí)記錄表中插入一條“待開始”的記錄 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. 返回升級(jí)信息 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上報(bào)狀態(tài)設(shè)備在升級(jí)過程中的每個(gè)關(guān)鍵節(jié)點(diǎn)開始下載、校驗(yàn)成功、開始寫入、升級(jí)成功/失敗都需要調(diào)用此接口上報(bà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è)備升級(jí)狀態(tài)上報(bào) try: req_body json.loads(event[body]) device_id req_body.get(device_id) record_id req_body.get(record_id) # 檢查更新時(shí)返回的記錄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)是成功或失敗時(shí)才更新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: # 未找到對(duì)應(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è)備端升級(jí)流程偽代碼設(shè)備端的邏輯相對(duì)固定以下是一個(gè)簡化的主流程偽代碼你可以根據(jù)實(shí)際平臺(tái)如FreeRTOS、Linux、Android等用C/C或其他語言實(shí)現(xiàn)// 設(shè)備端OTA核心流程偽代碼 int device_ota_main_loop() { while (1) { // 1. 定時(shí)檢查更新例如每2小時(shí) if (should_check_update()) { ota_info_t info check_update_from_server(); if (info.has_update) { // 2. 上報(bào)狀態(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. 上報(bào)狀態(tài)下載完成開始校驗(yàn) report_status_to_server(VERIFYING); // 5. 完整性校驗(yàn)大小、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. 上報(bào)狀態(tài)校驗(yàn)通過開始升級(jí) report_status_to_server(UPGRADING); // 7. 進(jìn)入Bootloader或特定分區(qū)進(jìn)行固件燒寫 // 這是最關(guān)鍵的步驟需要硬件支持雙分區(qū)、恢復(fù)機(jī)制等 if (perform_upgrade(LOCAL_FILE_PATH) ! SUCCESS) { // 升級(jí)失敗嘗試回滾如果有備份分區(qū) rollback_if_possible(); report_status_to_server(FAILED, Upgrade process error); } else { // 8. 上報(bào)狀態(tài)升級(jí)成功 report_status_to_server(SUCCESS); // 9. 重啟設(shè)備運(yùn)行新固件 system_reboot(); } } } sleep(CHECK_INTERVAL); } return 0; }5. 常見問題與排查技巧實(shí)錄在實(shí)際部署和運(yùn)營中你會(huì)遇到各種各樣的問題。下面是我踩過坑后總結(jié)的一些典型問題及其排查思路。5.1 設(shè)備端升級(jí)失敗問題排查設(shè)備端是問題的高發(fā)區(qū)。當(dāng)設(shè)備上報(bào)“failed”狀態(tài)時(shí)我們需要根據(jù)error_msg和設(shè)備日志快速定位。問題現(xiàn)象可能原因排查步驟與解決方案下載失敗1. 網(wǎng)絡(luò)不穩(wěn)定。2. COS簽名URL過期。3. 設(shè)備存儲(chǔ)空間不足。1. 檢查設(shè)備網(wǎng)絡(luò)連接重試機(jī)制是否生效建議實(shí)現(xiàn)斷點(diǎn)續(xù)傳。2. 確認(rèn)設(shè)備從獲取URL到開始下載的時(shí)間間隔是否超過URL有效期如15分鐘??蛇m當(dāng)延長有效期或在下載前重新請(qǐng)求URL。3. 檢查設(shè)備可用存儲(chǔ)空間是否大于固件包大小的2倍需要臨時(shí)存儲(chǔ)。校驗(yàn)失敗MD5不匹配1. 下載文件不完整或損壞。2. 設(shè)備端MD5計(jì)算邏輯有誤。3. 服務(wù)端存儲(chǔ)的MD5值錯(cuò)誤。1. 優(yōu)先懷疑下載問題。對(duì)比下載文件大小與服務(wù)器記錄是否一致。實(shí)現(xiàn)下載后的文件大小校驗(yàn)。2. 在設(shè)備端用標(biāo)準(zhǔn)工具如md5sum命令對(duì)下載文件進(jìn)行計(jì)算與程序計(jì)算結(jié)果比對(duì)。3. 核對(duì)數(shù)據(jù)庫firmware_meta表中該固件的file_md5值是否正確。簽名校驗(yàn)失敗1. 設(shè)備端公鑰與簽名私鑰不匹配。2. 固件包在簽名后被篡改。3. 設(shè)備端驗(yàn)簽代碼邏輯錯(cuò)誤。1.這是最嚴(yán)重的問題。確認(rèn)出廠燒錄的公鑰與編譯服務(wù)器使用的私鑰是否配對(duì)??赏ㄟ^在服務(wù)器上用私鑰簽名一個(gè)測試文件在設(shè)備端用公鑰驗(yàn)證來測試。2. 確保從COS下載到驗(yàn)簽的整個(gè)鏈路中固件文件未被修改。3. 檢查驗(yàn)簽函數(shù)的輸入?yún)?shù)原始固件數(shù)據(jù)、簽名數(shù)據(jù)是否正確。升級(jí)過程中斷電變磚1. 沒有實(shí)現(xiàn)雙分區(qū)或恢復(fù)機(jī)制。2. 升級(jí)流程非原子操作中途斷電導(dǎo)致系統(tǒng)損壞。1.必須實(shí)現(xiàn)回滾機(jī)制。推薦A/B雙分區(qū)設(shè)計(jì)設(shè)備始終從A分區(qū)運(yùn)行升級(jí)時(shí)下載固件到B分區(qū)校驗(yàn)成功后將B標(biāo)記為活動(dòng)分區(qū)重啟后從B運(yùn)行。如果B分區(qū)啟動(dòng)失敗Bootloader應(yīng)能自動(dòng)回滾到A分區(qū)。2. 升級(jí)過程如擦寫Flash應(yīng)盡可能原子化并做好電源管理意外斷電后能從中斷點(diǎn)恢復(fù)或回滾。升級(jí)后設(shè)備無法啟動(dòng)1. 新固件本身有Bug。2. 固件與設(shè)備硬件型號(hào)不匹配。3. 升級(jí)過程破壞了Bootloader或關(guān)鍵參數(shù)區(qū)。1. 這正是灰度發(fā)布要避免的?;貪L到上一版本。2. 檢查服務(wù)端firmware_meta表中的model字段與設(shè)備型號(hào)是否精確匹配。設(shè)備上報(bào)的型號(hào)信息必須準(zhǔn)確。3. 確保升級(jí)腳本或Bootloader嚴(yán)格限制了固件的寫入范圍絕不觸碰Bootloader區(qū)域。實(shí)操心得日志日志日志在設(shè)備端務(wù)必在升級(jí)流程的每一個(gè)關(guān)鍵步驟開始下載、下載完成、開始校驗(yàn)、校驗(yàn)通過、開始寫入、寫入完成、重啟前都打印詳細(xì)的日志并盡可能通過狀態(tài)上報(bào)接口同步到云端。這些日志是線上問題排查的“生命線”。我曾遇到一次升級(jí)失敗最終就是靠設(shè)備上報(bào)的“在校驗(yàn)前存儲(chǔ)空間檢查失敗”這條日志定位到是某個(gè)日志文件過大占滿了空間。5.2 服務(wù)端性能與穩(wěn)定性保障當(dāng)設(shè)備量達(dá)到十萬、百萬級(jí)別時(shí)服務(wù)端的壓力會(huì)劇增。數(shù)據(jù)庫瓶頸device_upgrade_record表會(huì)快速增長頻繁的插入和更新可能成為瓶頸。解決方案對(duì)device_upgrade_record表進(jìn)行分表??梢园磀evice_id哈?;虬碿reate_time月份進(jìn)行分表。對(duì)于歷史完成的數(shù)據(jù)可以定期歸檔到冷存儲(chǔ)如COS從在線MySQL中移除。COS下載帶寬與費(fèi)用海量設(shè)備同時(shí)下載固件會(huì)產(chǎn)生巨大的下行流量和費(fèi)用。解決方案啟用CDN加速為COS存儲(chǔ)桶開啟CDN加速。設(shè)備從離它最近的CDN節(jié)點(diǎn)下載固件速度更快且能降低COS源站的壓力和流量費(fèi)用。利用P2P分發(fā)高級(jí)對(duì)于非常大的固件包如超過100MB可以考慮讓已升級(jí)成功的設(shè)備作為種子為其他設(shè)備提供P2P下載這能極大降低云端帶寬成本。但這會(huì)顯著增加設(shè)備端和協(xié)調(diào)服務(wù)的復(fù)雜度。云函數(shù)并發(fā)與超時(shí)檢查更新接口可能被海量設(shè)備在短時(shí)間內(nèi)調(diào)用。解決方案適當(dāng)調(diào)高云函數(shù)的并發(fā)實(shí)例上限和內(nèi)存配置。優(yōu)化函數(shù)內(nèi)代碼特別是數(shù)據(jù)庫查詢。為firmware_meta和ota_task表的查詢條件字段如model,version,status建立合適的索引。對(duì)于“檢查更新”這種讀多寫少的場景可以考慮使用Redis緩存。將針對(duì)每個(gè)設(shè)備型號(hào)的最新可用固件信息緩存到Redis并設(shè)置合理的過期時(shí)間如5分鐘。云函數(shù)先查緩存緩存未命中再查數(shù)據(jù)庫能極大減輕數(shù)據(jù)庫壓力。消息隊(duì)列堆積在推送模式下如果設(shè)備端離線消息會(huì)堆積。解決方案為消息隊(duì)列設(shè)置合理的消息保留時(shí)間如3天。同時(shí)設(shè)備端SDK需要實(shí)現(xiàn)可靠的消息接收和去重機(jī)制避免重復(fù)升級(jí)。5.3 安全加固的額外思考除了前面提到的簽名校驗(yàn)和臨時(shí)URL還有幾個(gè)安全點(diǎn)需要注意設(shè)備身份認(rèn)證check_update和report_status接口不能裸奔。最簡單的方案是使用設(shè)備證書或動(dòng)態(tài)令牌。每個(gè)設(shè)備在出廠時(shí)預(yù)置一個(gè)唯一證書或密鑰。每次請(qǐng)求服務(wù)端時(shí)用該密鑰對(duì)請(qǐng)求參數(shù)和時(shí)間戳生成一個(gè)簽名服務(wù)端驗(yàn)證簽名合法性。這能防止偽造設(shè)備請(qǐng)求。接口防重放攻擊上面的簽名機(jī)制中加入了時(shí)間戳服務(wù)端可以校驗(yàn)請(qǐng)求時(shí)間戳與服務(wù)器時(shí)間的偏差如±5分鐘超過范圍的請(qǐng)求視為重放攻擊直接拒絕。升級(jí)指令防篡改在推送模式下發(fā)送到消息隊(duì)列的升級(jí)指令包含固件版本、URL等也應(yīng)進(jìn)行簽名。設(shè)備端收到指令后需驗(yàn)證簽名確保指令來自可信的服務(wù)端。管理后臺(tái)安全創(chuàng)建升級(jí)任務(wù)的管理后臺(tái)必須有嚴(yán)格的權(quán)限控制RBAC并開啟操作審計(jì)。任何固件上傳、任務(wù)創(chuàng)建的操作都應(yīng)記錄操作人、時(shí)間和詳情。搭建一套基于騰訊云的OTA系統(tǒng)就像為你的設(shè)備艦隊(duì)建立了一個(gè)空中指揮所。它讓你能安全、精準(zhǔn)、可控地對(duì)成千上萬的設(shè)備進(jìn)行“外科手術(shù)式”的更新。從最初的簡單文件服務(wù)器到如今這套集成了對(duì)象存儲(chǔ)、云函數(shù)、消息隊(duì)列和數(shù)據(jù)庫的完整方案我最大的體會(huì)是擁抱云原生把專業(yè)的事交給專業(yè)的云服務(wù)。我們不再需要為服務(wù)器擴(kuò)容、帶寬不足、安全防護(hù)而焦慮可以將全部精力投入到設(shè)備端升級(jí)邏輯的健壯性和業(yè)務(wù)功能的迭代上。最后分享一個(gè)小技巧在項(xiàng)目初期可以不用一步到位實(shí)現(xiàn)所有功能。先跑通最小閉環(huán)——讓一臺(tái)測試設(shè)備能完整地走完“檢查-下載-校驗(yàn)-升級(jí)-上報(bào)”的流程。這個(gè)閉環(huán)通了你就有了底氣。然后再逐步疊加灰度發(fā)布、安全加固、狀態(tài)監(jiān)控、數(shù)據(jù)分析等高級(jí)功能。這樣迭代開發(fā)風(fēng)險(xiǎn)可控團(tuán)隊(duì)也更容易看到成果。希望這篇長文能幫你少走彎路如果你在實(shí)踐過程中遇到新的問題歡迎隨時(shí)交流。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产色色小草视频| 79色色免费| 操99| 欧美性猛交99久久久99| 五月丁香色婷婷综合| 欧美啪啪9| 日本少妇裸体做爰高潮片 | 99综合网| 婷婷五月六月| 这里精品| 99热无码| 99 福利 导航| 婷婷五月丁香国产| 九九婷婷激情综合网| 日本三级韩三级99久久| 99色五月| 综合婷婷五月天| 激情五月天之六月婷婷| 欧美色骚婷婷五月天| 日韩国产在线免费观看| 日本欧特黄色刺激一区影视久精品无码| 综合大香蕉| 99这里有精品| 中文AV网| 色综合色色| 日日干日日| 精品国产va久久久| 五月激情婷婷女| 精品视频99看在线视频| 五月丁香综合啪啪啪啪啪| 玖玖99精品视频| 人人操9| 九九色综合| 色婷婷综合视频| 精品成人a v无码内射| 亚洲va久久久噜噜噜久久天堂| 狠狠色狠狠| 日本人人xxx| 婷婷九月丁香久久| 亚洲免费99| 亭亭色天香| 色色色色色级无码| 狠狠色无码| 欧美成性色| 六月丁香av| 波多野结衣AV无码Porn| 激情久久久久久| av在线激情| 女人天堂久久| 五月天婷婷基地| 六月婷婷综合久久| 九九aV| 五月丁香亭亭操逼| 色噜噜伊人| 五月丁香六月久久| oVV4WIB3vFi8D| 丁香六月AV| 影音先锋女人av鲁色资源网小说免费 | 五月天婷婷色小说| 79色色| 米奇影视五月天| 五月涩涩网| 欧美综合五月丁香六月婷| 99热九九在线| 极品另类| 国产精品久久久久久久久久| 婷婷欠久少妇| 六月丁香六月婷婷欧美| 丁香六月婷婷综合激情欧美| 五月亭亭综合五码| 人人操97| 99精品偷自拍| 激情九九六月激情免费视频| 婷婷激情伍月网| 日日日日做夜夜夜夜无码| 天天综合天天做天天综合| 婷婷色播综合五月| 婷婷婷婷婷婷婷婷| 丁香六月综合激情| 丁香婷婷五月综合| 99热20| 亚洲无码九九九| 4399在线观看免费高清毛片| 97人人干人人操| 婷婷综合激情五月中文字幕| 欧美VA在线| 1区2区视频| 99色在线视频| 人人操婷婷| 色五月婷婷大香蕉| www激情网| 狠狠做深爱婷婷久久综合一区| 99九九视频| 六月激情婷婷| 五月婷中文娱乐综合| 手机在线日韩视频中文字幕| 久久久久99精品成人片| 色情丁香五月婷婷精品| 五月婷婷综合激情小说| 亚州精品色情无码A片| 色九月激情综合网| 久热91| 国产亚洲精品AAAAAAA片| 大香蕉福利导航| 99热免费精品| 日日夜夜久| 久久九九综合| 97色婷婷在线观看| 精品色色色| 91丨九色丨高潮丰满日本| 五月香婷婷| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 婷婷丁香成人网址| 99精品在这里| 丁香六月婷| 丁香五月日啪| 五月天婷婷无码| 91 久热| 丁香九月婷婷综合| 色婷婷狠狠| 九色视频91| 99色久| 五月丁香六月激情综合啪啪| 99热在这里只有精品| 变态另类色图 | 五月丁激情| 国产.亚洲.欧洲视频在线| 亚洲字幕AV一区二区三区四区| 在线中文亚洲| 五月天久久婷婷| 大战熟女丰满人妻AV| 久久精品99久久久久久| 国产精品久久久海的味道| 国产日韩精品SUV| 99在线热| 婷婷亚洲影院| 中文资源在线a| 无码一级片| 久久网站免费亚洲| 色情综合| 色欲久久综合| 日韩性视频| 久久丁香婷婷色情综合| 色人妻五月| 欧美久热| 天天搽天天射| 激情第四色| 五月婷婷色播| 久久久ww| 大香蕉精品视频| 色婷久久| www.色色五月天.com| 这里只有精品1| 91干婷婷| 这里只有精彩亚洲视频推荐| 婷婷黄色网| 亚洲色情一区二区三区四区| 无码日本精品XXXXXXXXX| 色婷婷综合网| 狠狠操天天干| 99热骚货| 超碰免费电影| 天天搡日日搡aaaaⅩ| 五月激情网综合| 91啪啪视频| 婷婷的99视频网站| 久色网| 日亚二欧美| 综合狠狠干| www.婷婷五月天.com| 精品爆操| 日本片日本片祼观看网站在线看中文版网页在线看 | 婷婷五月丁香综合人妻| www.丁香黄色五月天人与| 六月激情久久婷婷| 女人高潮内射99精品| 亚洲性受XXXX五月丁香| 97香蕉碰碰人妻国产欧美| 99久久精品色老| 久99视频在线观看| 另类激情五月天。| 五月丁香啪| AV激情五月| 久久久中文| 啪啪综合| 丁香五月天电影| 色婷婷在线播放| 97操视频| 丁香伊人综合| www,com,五月色色| 91互操| 五月丁香六月激情综合| 色碰碰| 激情综合网五月婷婷| 99在线视频播放| 九九干视频| 久久婷视频| 中文无码婷婷| 五月激情综合激情五月| 婷婷中文综合网| 亚洲操b| 变天就操逼婷婷五月| 这里只有精品免费| 26uuu视频欧美| 99热久| 99视频在线观看视频| 波多婷婷久久| 九热精品| 亚洲乱码成人| 熟女网站久久| 国产婷婷色综合AV蜜臀AV| 亚洲激情视频网| 亚洲国产黄色电影| 色五月婷婷综合| 色色99色色| 天天在线XXX| av在线免费网站 | 毛片九九九九九九九九18| 婷婷五月天性| 五月婷婷色影院| 婷婷五月激情中文字幕| 丁香 婷婷 亚洲 熟女| 久操97| 99久久网站| 欧美激情 日韩无码 婷婷 五月天| AV片一区在线观看| 日韩欧美成人片| 久久99最新| 丁香花综合永久入口| 狠狠干在线| 色婷婷五月天av在线| 99色爱| 婷婷五月天国产在线播放| 九热视频| 婷婷伊人视婷婷婷| 欧美大片免费播放器| 免费亚洲婷婷| 呦呦v线| 五月天婷婷久草丁香| 色婷婷综合网| 久久草中文日韩欧美| 色欲久久综合| 五月婷婷开心网| 噜综合| 亚洲最大视频网站| 色亭亭影园| 六月婷婷八月丁香| 丁香五月天的网址。| 久久丝袜婷婷| 丁香五月天影院| 人人干人人看| 综合五月丁香六月婷婷| 开心五月天激情| 成人 AV播放| 色色色999| 亚洲色婷婷五月天| 五月丁香婷在线| 91色综合| 精品女人九九九| 国产SUV精品一区二区883| 岛国av网站| 开心五激情网| 任我肏| 亚洲视频国产一区| 婷婷激情五月天激情小说 | 婷婷伊人五月天| 国产激情综合| 97超碰在线免费观看| 99热这里精| 亚洲超碰在线| 久9热视频在线观看| 337久久| 色五月婷婷在线| 9l视频自拍九色9l视频自拍九色9l社区| 天天操,夜夜骑| 五月天色婷婷激情综合| 欧亚洲在线高清视频| 99情色五月天| 九九热这里只有精品9| 色色色综合网| 五月婷婷性爱| 久久丁香| 欧美 日韩 成人在线| 思思热视频在线观看| 九九热手机在线视频| 伍月婷丁香婷| 五月婷婷深深爱爱| 这里只有精品热| 91婷婷丁香| 色99在线看| 欧美婷婷色五月网| 超碰不卡在线| 99热青青草| 五月丁香六月婷婷久久| www.99热视频| 五月天综合视频| 婷婷综合色图| 9999久久久久| 色婷婷六月| 色婷婷亚洲婷婷| 五月丁香婷婷基地| 人妻久久久久久| 成人丁香| 丁香六月综合激情| 婷婷五月激情欧美大胆视频| 大地9中文在线观看免费高清| 日本精品久久久久中文字幕| 极品人妻VIDEOSSS人妻| 99久久超级| 日韩黄在免| 五月婷婷久久大片| 婷婷激情五月天激情小说| 热婷婷久| 国产操逼网站| 色天堂在线| 婷婷五月色综合| 97色片| 五月丁香啪啪啪综合网| 婷婷综合五月天激情| 思思99热在线| 日韩精品无码99| 色色色9| XX色综合| 99久久极情精品一区| 亚洲精品99| 国产熟妇的荡欲午夜视频| 强辱丰满人妻HD中文字幕| 黄网在线免费| 激情五月,激情综合网| 久久激情五月天| 思思久久99热| 婷婷五月深爱五月| 五月天啪啪视频| 五月天播播| 嫩草AV久久伊人妇女超级A| 无码成人AAAAA毛片AI换脸| 色吊丝99| 婷婷丁香五月麻豆| 日本性激情色播| 美女丁香五婷婷| 香蕉婷婷色五月| 久久99热这里只有精品| 久久视9精| 亚洲人成播放网站| 色婷婷手机在线| 思思色综合网站| 五月天激情国产综合婷婷| 99自拍视频网站| 婷婷五月天丁香| 久久99草五月婷婷| 欧美日韩成人在线| 丁香六月婷婷综合| 日欧一片内射VA在线影院| 久久婷婷网址| 五月婷婷新网站| 婷婷丁香综合| 婷婷五月天伊人网| 日韩有码一区| 久草A片| 日韩精品无码99| www.henhenl| 中文中文在线| 人人综合久| 99精彩视频在线观看| 久re热视频| 性爱视频99| 色婷婷啪啪| 久久狠狠欧美| 第四色大香蕉| 激情综合丁香| 婷婷五月天,影院| 深爱五月婷婷| 久婷婷视平| 99久久久久| 中文字幕婷婷五月天在线观看| 婷婷综合五月天| 亚洲99热| 综合色天天| 丁香婷婷色九月| 综合六月久久| 人人色AV| 另类在线| 激情五月天丁香| 丁香涩涩爱| 婷婷性爱| 丁香六月婷月91婷月| 婷婷伊人网| 91妻人人爽人人看片| 色色色色色色色色五月先| 丁香婷婷伊人| 狠狠精品干练久久久无码中文字幕| 五月激情婷婷综合| 丁香五月天堂网| 在线中文AV| 婷婷另类开心| 六月丁香久久| 天天想夜夜爽天天爽| 色五月激情网| 久久aaaaa| 九热视频这里只有精品| 欧美性猛交99久久久久99按摩| 玖玖国产视频一区| 久久综合丁香激情五月| 五月丁香精品| 97在线视频人妻九色| 99久久天堂婷婷| 678五月丁香亚洲综合| 五月丁香色色网| www.综合久久.com| 久大香蕉| 超碰99久久| 五月丁香婷婷深深爱| 天天干天天av天天射| 色婷婷在线视频久| 五月丁香天堂网| 国产67194| 五月丁香久| 激情久久网 | 激情五月婷婷综合| 97操碰在线视频| 久久精热| 久99久视频免费观看| 热99在线| 99五月婷| 色色婷| 超碰人人操人人干| 五月婷婷丁香五月| 午夜九九电影| 日本44久久在线| 国精产品一区二区三区| 免费99色| 99啪啪网| av中文在线| 色婷婷五月天偷拍| 五月婷婷久久开心网| 激情婷婷五月天| 久操大香蕉| 久久综合五月天| 禁欲电影完整版在线播放| 超碰永久在线| 色婷婷丁香五月| 五月丁香六月成人| 可以免费观看的AV| 六月色五月天天婷婷| 激情五月婷婷色综合| 丁香五月六月激情久久| 热久久色| 99热在线播放| 逼逼AV| 2018夜夜草| 亚州视频九九99| 婷婷五月丁香综合亚洲| 另类激情五月在线视频欧美| 五月天激情综合网俺也去| 91爱啪啪| 五月丁香六月婷婷久久久综合| 中文字幕不卡网站| 成人网址在线观看| 色六月天天激情综合网| 婷婷五月天免费99| 日韩 中文 欧美| 丁香五月婷婷啪| 电影91久久久| 中文资源在线a | 色色色视频免费无码| 国产精品扒开腿做爽爽爽A片唱戏| 这里只有精品久| 丁乡久久| 中文字幕日产A片在线看| 亚洲成人黄色网| 九艹在线| 人与禽A片啪啪| 色色AV色色色东莞| 天天摸,天天爽| 99热超碰人| 亚洲乱码w在线观看| 久久婷婷六月| 婷婷的色色五月天| 粉嫩AV久久一区二区三区| 五月丁香婷婷综合视频| VA婷婷| 久久婷五月影院| 丁香五月中文字幕| 婷婷六月久久综合导航| 五月婷婷激情综合在线| 97精品人人A片免费看| 婷婷刺激综合| 天天操,夜夜骑| 人人操97| 日韩成人无码片| 深爱婷婷网| 五月天婷婷基地| 七七九九色色| 激情六月丁香| 丁香五月婷婷高清| 国产精品日本一区二区在线播放| 99精品自拍视频| 精品久久久人妻| 99在线免费视| 成人av在线电影| 99热传媒| 成人无码精品1区2区3区免费看| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 五月丁香婷婷免费视频| 日本熟女一区二区| 天天摸夜夜爽天天做| 亚洲旡码| 亚洲激情五月| 久热A片| 五月婷婷六月激情| 在线播放中文字幕| 九九aV| 色欧洲| 呦呦视频无码播放| 天天舔天天摸天天射| 婷婷99视频精品| 第四色网婷婷| 偷偷操九九| 日韩黄色影院| 精国产品一区二区三区A片| 欧美色色色色色色色色色色| 亚洲成人在线五月天| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | VA婷婷| 99啪99| 国产婷婷久久| 色五月婷婷天堂| 99riAV成人在线视频| 色五月激情五月| 五月婷婷综合网| 色伊人婷婷| 五月婷婷九九热| 欧美丁香五月| 久久伊人五月天| 五月婷婷天| 婷婷激情丁五月| 日韩AAA| 深爱五月天婷综合| 婷婷色香六月综合激情| 婷婷五月天少妇| 五月婷婷六月爱| 久久精品在线| 五月天婷婷开心| 天天干,噜噜色,狠狠色| 天天天添天天操| 九玖欧洲亚洲| 久久精品亚洲一级牲爱综合| 久久婷婷五月综合色和| 丁香五月播播| 婷婷六月色开 | 国产精产国品一二三在观看| 久操欧美在线观看97| 丁香狠狠干| www色五月天| 天天爱天天做天天爽| 丁香五月综合福利视频导航| 日日噜狠狠色综合久久| 噜噜色婷婷| 狠狠狠色激情综合适合| 狼人婷婷久久| 九九热在线视频观看| 五月天伊人网| 六月婷婷色综合| 久久精彩视频| 91919191919久久成人视频| 九九婷婷激情综合网| 97爱艹婷婷开心丁香激情综合| 大香蕉啪啪啪| 色播激情| 五月丁香久久久久| av婷婷丁香 六月| 深爱激情五月天色婷婷| 无码 色| www.久久99热地址发布| 97人人干| 亚洲欧美日韩另类| 色情丁香五月婷婷精品| 久久黄色免费视频| 99国产在线| 97中文在线| 日本美女天天日天天爽| 99久热| 操日本人妻视频| 精品五月天| 91九色国产| 国产精自产拍久久久久久蜜| 五月丁香综合久久夜夜| 日韩啪啪视频| 亚洲99视频| 伊人网啪啪| 99热手机在线精品| 久久久高清| 激情五月,激情综合网| 伊人网欧美在线男人天堂五月丁香| 色婷婷五月天中文字幕| 色久综合天天做视频| 欧美乱码国产一级A片| 丁香五月婷婷在线| 亚洲av成人一区二区电影在线| 色五月婷婷在线观看第一页舔| 看全色黄大色大片| 日本熟女三区| 这里只有精品视频免费在线观看| 亚洲中文字幕av| 91高潮喷水久久久久久久久 | 99色视频| 国产亚洲成AV人片在线| 精品无码av丁香五月激情| 综合图片色色| 极品人妻VIDEOSSS人妻| 亚洲碰碰碰| 天天干,噜噜色,狠狠色| 久操激情| 丁香五月天激情四射网络不好| 五月天激情小说| 天天搞天天色综合| 99精品免费视频| 狠爱婷色| 99色一| 色婷婷影院| 黄页免费一级视频懂色| 久久五月婷综合网| 99热在线观看精品| 九九热re99re6在线精品| 我爱婷婷五月天综合88| 五月丁香婷婷六月| 国产亚洲99久久| 亚洲瑟瑟精品在线| 欧美日韩999| 先锋资源91| 狠狠久综合| 任你爽精品免费视频6| 欧美十二区| 天堂婷婷五月在线| www激情| 五月丁香少妇| 五月花激情| 精品欧美一区二区三区久久久| 日韩综合久| 久久一热| 日韩99无码| 国产六月婷婷| 99无码| 久久婷婷五月天| 一区二区免费看| 人妻五月天激情开心网| 亚洲aV写真天天综合网久久| 666555。COm毛片| 亚洲avjiujiur91| 丁香午夜天| 9热视频在线观看| 思思热视频在线| 99视频日韩| 亚洲AV成人无码久久精品老人法拉利| 五月天综合网| 青青草青青草五月天| 狠狠香婷婷五月| 亚州操人在线视频| 国产日比| 色五月丁香五月| 激情婷婷色色| 六月丁香色色| 亚洲色综合| 激情视频网址| 婷婷五月天成人| 综合久久综合| 五月丁香爱婷婷深深| 五月丁香综合激情| 色婷婷综合网站| 99九九精品| 婷婷五月丁香综合| 人人爱操| 丁香五月老师| 天堂久热| 九九精品热| 91精品综合久久婷婷九色| 亚洲成人无码网站| 色婷婷97| 欧美一级色| 一夜福利不卡| 六月成人网| 91大屁股| 国产操逼网站| 日韩人妻无码精品| 99视频这里只有免费精品| 色婷婷在线视频| 99视频地址| 国产日产亚系列精品版优势| 丁香色婷婷| 色色色五月婷| 开心激情五月天网| 丁香五月骚喷水视频| 男人大jjc女人免费视频| 六月丁香五月天| 在线观看av网站| 狠狠做五月婷婷| WW婷婷五月天com| 色五月婷婷小说亚洲中文字幕组| 激情亚洲婷婷| 99久久9| 五月婷婷激情中心| 五月激情久久| 在线日韩视频| 日日操,天天操| 99偷拍视频在线日本| 国产成人网站在线观看| 六月天无码网址| 久操人| 色婷婷丁香五月天| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 久色中文| 无码橾| 天天综合网在线| 色色丁香激情五月| 黄网网站在线播放| 日本黄色三级片内射| 久久五月天婷婷| 人人草成人视频| 人操91在线| 97av在线视频| 亚洲丁香五月在线观看| 91互操| 最近中文字幕在线中文视频| 欧美婷婷五月天| 成人操呦av| 97久久超视频| 国产暴力强伦轩1区二区小说| www,天天干| 99re这里只有精品9| tingtingseav| 久久香蕉网| 丁香五月香蕉| 男人的天堂在线婷婷| 久久五月视频| 狠狠色丁香| 99视频地址| 玖玖婷婷五月| 99久久超级| 亚洲欧美婷婷五月色综合| 日日.c| 99热 在线观看| 99人妻碰碰碰久久久久视| 日韩AV免费电影在线播放| 五月婷精品| 午夜丁香五月天综合| 欧日美女Va| www.射伊蕉婷婷| 丁香五月婷婷激情97| 99色在线| 99爱视频| 五月婷婷香| 欧美韩日AAA网站| 色九九综合| 91视频久久久| 激情五月天情色| 中字幕视频在线永久在线观看免费| 综合性爱网| 99在线观看视频| www.99热日韩.com| 久久婷婷网| 人人操91色| 婷婷久综合| 风流少妇A片一区二区蜜桃| 九九热黄色| 丁香五月六月婷婷综合| a久久免费视频| 丁香五月婷婷久久综合激情网 | 99在线精品视频免费观看20| 色婷五月| 丁香五月网| 久这里只有精品| 99色在线| 五月色婷婷在线观看| av在线观看网站| 婷婷丁香五月麻豆| 久久久噜噜噜久久人妻| 五月综合婷婷五月| 亚洲色色香蕉| 婷婷情色激情| 这里只有精品视频一区| 操一操| 99热精品9| w婷婷五月婷婷w| 五月天综合区| 日逼免费视频 | 极品人妻XXXXOOOO| 色色色网站| 五月丁香亭亭| 欧美精品999| 天天日天天插| 日产精品久久久久久久蜜臀 | 91婷婷| 九九热只有这里精品| 开心五月婷婷激情| 五月色在线| 操日视频| www.狠狠| 狠狠五月天婷婷| 丁香五月综合福利视频导航| 婷婷五月天日日日干干干| 婷婷深爱五月亚洲综合| 99爱视频在线免费观看| m色激情网| 99无吗| 婷婷狠狠干| 五月天婷婷綜合院| 超碰在线人妻| 午夜少妇在线观看视频| 婷婷无五月无码视频| 亚洲精级| 亚洲天堂色| 色情五月天。| 狠狠大香婷婷爱| 国产Va视频| 丁香六月亭亭久久综合| 日日干天天| 色五月成人| 99在线精品观看99| 日韩啪啪视品| 人妻激情视频| 色五月婷婷婷婷婷婷婷婷婷婷| 五月情婷婷五月| 岛国av电影网站| 日日干天天| 夜夜涩涩涩| 婷婷五月天激情网站| 九九大香视频| AV九九| 婷婷五月天丁香综合网| 欧洲亚洲免费视频9| 这里只有精品在线视频精品| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 五月天色色无码| 97碰碰在线观看视频| 五月天丁香六月综合| 天堂五月婷婷| 亚洲国产精品VA在线看黑人| 天天草天天爽| 精品国婬伦V无码久久久| 99啪啪网| 天天碰天天插天天操| 激情综合五月婷婷| 91色久| 色九月丁香婷婷蜜桃在线观看| 久久婷狠狠色| 26uuu亚洲色| 日日噜噜夜夜狠狠久久丁香五月| 亚洲操人| 一本到不卡高清DVD| 4399亚洲视频| 五月综合亚洲婷婷| 97久久超碰| 激情五月天天| 热九九精品| 久久久久人妻中文| 五月婷婷天| 婷婷丁香五月在线观看91| 日韩久久视频| 五月天成人小说网| 色婷五月| 丁香五月婷婷99| 丁香色播五月天| 色综合久久中文| AⅤ网站在线看| 99碰碰中文| 色综合久久天天综合网| 黄网免费观看| 高清a片基地| 狠狠操天天操| 国产综合婷婷| 99天堂在线观看免费视频| 新久久五月天激情| 天天综合色| 4438亚洲欧美| 亚洲激情亚洲激情| 色五月婷婷大香蕉| 91夫妻网站九色| 精a品a视a频| www.五月丁香| 1024AV视频| 第四色五月激情网| 欧美99| 五月天婷婷AV| 日本激情综合| 91啪啪| 亚洲六月婷婷| 激情影院丁香五月| 婷婷五月天伊人| 五月丁香婷婷爱激情综合网| 99热这里| 超碰自拍天堂| 五月综合激情视频| 日本99热| 色婷婷丁香网| 久久99久久99精品免视看婷婷| 91日精品| 色99热| 国产九月婷婷| 色婷婷六月精品| 天天日天天色| 丁香五月婷婷啪啪| 99热亚洲| 99热99美国在线观看| 五月丁香婷婷三级| 一二线视频 另类| 欧美色骚婷婷五月天| www色五月| 婷婷综合欧美| 五月丁香成人网| 香蕉狠狠爱视频| 99九九玖玖| 色玖玖玖| 久婷五月| 亚州操操| 男人的天堂五月丁香| 五月婷婷色啪| 99人妻碰碰碰久久久久视| 国产黄色av| 激情五月开心五月丁香五月| 亚洲欧洲一二| 婷婷亚洲五月| 狠狠综合区| 六月丁香成人网| 丁香五月伊人| 综合色色色色色色| 久久AAAA片一区二区| 婷婷成人综合五月| 91九色超碰| 99成人小视频| 九九99在线视频| 婷婷在线视频| 丁香五月情| 成人丁香| 色综合天天网| 国产无遮挡又黄又爽免费网站| 婷婷五月丁香色情| 99久操视频| 色五月综合激情| www,色综合| 五月综合激情| 99免费综合网| 日韩免费视频| 丁香六月激情蜜桃| 色婷婷影视99| 99热99精品| 日本色婷婷| 国产亚洲色婷婷久久99精品91| 色月视频| 天堂二区| 九九热精品| 熟女色专区| 久久AV无码精品人妻系列试探| 99久久er| 99色在线观看视频| 婷婷五月色播放| 玖玖在线资源视频| 日本丰满久久| 99九九玖玖| 伊人婷婷青青cao| 五月桃花网综合| 日韩aaaaa| 久久婷婷色| 不卡的AV网站| 色婷婷的五月天| 婷婷五月综合在线| 色爽干| 六月综合在线| 六月婷婷视频| 丁香六月激情综合| 夜夜撸天天日| 变态另类色图| 婷婷综合久久| 五月丁香婷婷啪啪综合网| 九九美女视频| 激情99| 逼里香不卡| 日本超碰在线| 亚洲欧洲美女在线观| 成人综合视频在线| 99国产小视频免费观看| 九九99视频精品| 99干视频| 色之综合网| 欧美色色日韩| 色99在线| 婷婷五月天亚洲五码| 九九爱这里只有精品| 日日操夜夜操中国无码| 久久久久久人妻| 日本va欧美va欧美va| 日本69日人视频| 99碰碰碰| 色婷婷网| 综合成人小说婷婷| 婷婷美女精品视频| 狼人伊人干| 色噜噜狠狠色综合日日| 欧美综合激情丁香五月六月婷| 婷香五月网在线| 狠狠婷婷日韩| 啪啪综合网| 99热这里都是精品| 99re这里只有精品首页| 五月丁香婷婷综合久久| 亚洲精品无码A片一区二区| 亚洲久久激情| 色丁香影院| 色久播播| 97视频.干com| 少妇AB又爽又紧无码网站| 亚洲99精品欧美一区| 色五月丁香激情视频| 黄色五月婷婷| 欧美三级视频| 色情婷婷| 久久九区| 色五月激情五月开心五月| 日韩成人网站精品久久大全| 91久久五月天| 日韩精品一区二区刘| 99精品偷自拍| 99免费| 99色干| 五月婷婷官网色| 五月丁香六月情亚洲| 亚洲VA欧美VA| 五月丁香中文婷婷中文| 五月天天丁香婷婷| 五月天婷婷久久| 天天日天天爽夜夜爽| 久久AV电影| 99er免费在线观看| 任你艹| 影视av久久久噜噜噜噜噜三级| 99草在线免费观看视频| 少妇2做爰HD韩国电影| 六月婷婷中文字幕| 久艹大香蕉| 五月激情站| 婷婷精品性性性性性性性| 亚洲色色精品| 六月香五月婷| 激情五月伊人婷婷| 在线视频色五月| 久久九九综合| 色婷婷瘦婷婷日韩| 在线看黄色| 九九热青青草| 人人超碰99| 91丨人妻丨国产丨丝袜| 国产av天天插天天操天天爽| 人人摸人人操人人爱| 少妇AB又爽又紧无码网站| 婷婷五月天影院| 婷婷丁香18| 特级西西4444www无码| 香蕉综合在线| 情色婷婷五月天| 久久婷婷成人综合色怡春院| 五月婷婷在线综合| 五月天激情www| 五月婷综合| 激情五月影院| 婷婷激情啪啪| 性生活久久人妻| 狠狠色 综合色区| 亚洲综合色五月| 五区毛片七区毛片| 五月婷伊人| 日日干夜夜撸夜夜骑| 天天艹夜夜爽| 深爱丁香激情| www.99热视频在线观看| 九九综合精品| 五月丁香色色综合| 97激情五月天| 激情五月婷婷啪啪| 六月丁香婷婷在线波多| www.五月丁香av| 五月久视频| 久久综合影院| 9色在线| 久久婷婷亚洲| 在线观看国产高清视频免费网站 | 99燥99日| 91久久久久| 九月大香蕉| 色色色色色色色色色色色色色97| 国产黄色一级片| www.五月天色色.com| 色婷婷WWW| 俺去也在线官网| 五月婷婷丁香瑟瑟视频| 五月丁香琪琪| 国产免费一区二区在线A片视频| 色欲一区二区三区精品A片| 人人妖人人97| 色玖玖玖| 婷婷激情五月综合| 婷婷久久六月天| 亚洲综合激情五月久久| 97中文在线| 另类天堂| 97涩婷婷婷婷基地| 久久免费操| 电影蜘蛛女| 五月天六月婷婷电影| 激情综合九月| 国产亚洲成AV人片在线观黄桃 | 色色色com| 色六月 婷婷| 亚洲av日韩无码| 亚洲亚洲激情| 色色com| 激情网五月天| 五月丁香婷婷五月色| 嫩草视频观看| 亚洲网站在线鸭子av| 噜噜久| 婷婷久久综合久| 最近中文字幕在线中文视频| 欧美日韩一区二区三区四区| 婷婷五月天影院| 久香草视频在线观看| 激情九九六月激情免费视频| 桃色五月天| 热九九九九| 九九综合视频在线观看| 天天爽综合网| 97碰在线视频| 性色综合网| 97婷婷丁香五月综合| 26uuu青青| 五月婷视屏在线观看| 伊人超碰| 国产AV成人精品| 密黄站| 久久99热在线观看| 久久女婷| 99草视频在线观看| 丁香激情网| 五月天a婷婷伊人| 99久久久久久www| 婷婷视频在线| 五月丁香激情综合网| 99在线亚洲| 五月天综合| 人人综合久| 中文字幕日韩无码制服诱或| 婷婷深爱五月| 婷婷的五月天另类视频| 妇激情基地| 婷婷五月丁香在线视频| 伊人色综合网| 色呦呦免费观看| 色色AV色色色东莞| 在线看的免费网站| 久久伊人婷婷| 超碰人人干| 91丨九色丨熟女| 久久的爱大香蕉| 99思思热只有在这里看| 生活片五区| 9精品国产在热久久| 丁香五月狠狠在线观看| 2017狠狠干| 韩日AV片| 天天日夜夜操五月| 性爱视频久久| 亚洲色综合| 五月婷婷丁香| 婷婷狠狠干| 97在线99| 狠狠色激情在线| 色婷婷电影网| 亚洲色激情| 99色亚洲| 最近中文字幕大全免费版在线 | 99热99操| 99热在线中文字幕| 精品视频二级九九| 亚洲操B| 日本色色网| 性爱视频久久| 九一99| 久一网站| 国产美女无遮挡裸体毛片A片| 国产熟女日日骚五月丁香爱| 无码色综合| 精品久久99| 九色视频这里只有精品| 色yeye色综合| 欧美成人A片AAA片在线播放| 丁香五月婷婷六月婷| 免费黄色视频网址| 久cao香蕉影院| 五月天婷婷丁香导航| 超碰人人操在线| av高清无码| 深爱五月激情| 开心五月婷婷激情| 少妇水多A片太爽了| 狠狠插日日干撸| 99热99极品观看| 欧美成人精品A片免费一区99| 天天撸天天干天天插| 99精品久久久| 亚洲欧洲中文日韩久久AV乱码| 日本va欧美va精品发布视频| 高清a片基地| 丁香激情网| 99热99精品在线观看| 久久9999| 久久婷婷五月天| 五月婷婷视频ab| 免费亚洲婷婷中文字幕| 青柠影视免费高清电视剧| 婷婷五月花| 91操操| 99玖玖视频| 思思热视频| 日韩三级高清无码| 久久精品视频99| 丁香六月天婷婷色| 色综合综合色| 五区毛片七区毛片| 超碰人人射| 97人人干视频| 大香蕉520| 婷婷射丁香| 97碰啪啪| 亚洲综合视频八| 五月天成人综合| 在线A色| 激情五月天婷婷图| av一区免费看| 天天爽天天操| 99视频只有精品| 五月丁香色婷| 99久久久久| 欧美久人人| 亚洲亚洲人成综合网络| 久热 91| 激情久久综合网| 欧美日韩一a.无| 牛牛色av| 丁香综合日产精品久久| 夜夜撸日日操| 丁香五月av| 精品无码99| 激情丁香久久| YJLZZJLZZ亚洲乱熟无码| 久99| 婷婷五月天黄色| 伊人啪啪网| 五月婷婷影视| 玖热精品综合视频| 18久久| 四LLL少妇BBBB槡BBBB| 日本综合久久| 丁香五月天婷婷中文字幕| 日日噜狠狠色综合久久| 激情文学天天| 久久婷婷综合网| 大香蕉狼人久久| 亚洲精品九九|