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

ARTICLE DETAIL

資訊詳情

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

中科藍(lán)訊藍(lán)牙耳機(jī)SDK開發(fā)實(shí)戰(zhàn):消息處理框架與目錄結(jié)構(gòu)全解析

中科藍(lán)訊藍(lán)牙耳機(jī)SDK開發(fā)實(shí)戰(zhàn):消息處理框架與目錄結(jié)構(gòu)全解析 做藍(lán)牙音頻方案的人應(yīng)該都有體會(huì)這兩年國產(chǎn)芯片在TWS耳機(jī)市場(chǎng)里已經(jīng)占了絕對(duì)主力。今天聊的中科藍(lán)訊BluetrumSDK在電商爆款、白牌走量、品牌中低端機(jī)型里用得非常多。很多朋友第一次拿到這套SDK的時(shí)候都會(huì)對(duì)著解壓出來的幾十個(gè)文件夾發(fā)愁——入口在哪、哪些文件能改、哪些不能碰、按鍵消息到底是怎么一路傳到應(yīng)用層的完全摸不著頭腦。這篇文章就從一個(gè)實(shí)際項(xiàng)目開發(fā)者的角度把中科藍(lán)訊藍(lán)牙耳機(jī)SDK從目錄結(jié)構(gòu)到消息處理框架完整拆一遍帶你看懂這套代碼的設(shè)計(jì)邏輯也順便聊聊我在實(shí)際開發(fā)里踩過的坑。文章更適合這兩類人看一是剛拿到中科藍(lán)訊SDK、準(zhǔn)備在AB56xx之類芯片上做產(chǎn)品的新人二是做過其他藍(lán)牙方案比如杰理、恒玄但被中科藍(lán)訊處理消息的方式繞暈的工程師。內(nèi)容不吹不黑全部基于我實(shí)際寫代碼、調(diào)功能、修Bug的經(jīng)驗(yàn)。1. 中科藍(lán)訊SDK的整體定位與開發(fā)前準(zhǔn)備1.1 這套SDK到底在藍(lán)牙耳機(jī)生態(tài)里處于什么位置中科藍(lán)訊的芯片在國產(chǎn)藍(lán)牙音頻SoC里出貨量一直排在前列主打性價(jià)比和集成度。一顆芯片同時(shí)承擔(dān)藍(lán)牙射頻、音頻編解碼、電源管理、觸摸檢測(cè)這些功能外圍器件很少PCB成本能壓到很低。這也是為什么市面上大量幾十塊錢到一百多塊錢的TWS耳機(jī)、頭戴耳機(jī)用的都是這套方案。但芯片便宜不等于開發(fā)省事。中科藍(lán)訊的SDK跟手機(jī)SoC廠商的SDK風(fēng)格不太一樣——它大量使用回調(diào)函數(shù)、消息隊(duì)列和自定義的輕量級(jí)調(diào)度機(jī)制而不是傳統(tǒng)裸機(jī)的前后臺(tái)大循環(huán)。初次接觸會(huì)覺得繞但只要理解了消息處理框架后續(xù)加功能、改行為就順了。我個(gè)人的看法是這套SDK的定位是“讓廠商在大批量出貨的前提下快速做產(chǎn)品”所以它把藍(lán)牙協(xié)議棧、底層驅(qū)動(dòng)做了封裝同時(shí)保留足夠多的鉤子讓應(yīng)用層去改產(chǎn)品行為。說白了它希望你快又不希望你把底層改壞。這個(gè)設(shè)計(jì)思路直接決定了目錄結(jié)構(gòu)長(zhǎng)什么樣。1.2 開發(fā)環(huán)境搭建拿到SDK以后先干什么中科藍(lán)訊官方提供的開發(fā)環(huán)境通常是Keil工程。不同系列芯片對(duì)應(yīng)的SDK版本不一樣比如AB5636A、AB5686A、AB5688這類拿到手的SDK包名和編譯器版本可能都有差異。我建議第一步不是看代碼而是先把編譯環(huán)境跑通確保官方demo能燒錄進(jìn)芯片。整個(gè)環(huán)境搭建分三步安裝Keil確認(rèn)版本老SDK在Keil 5上編譯很常見個(gè)別老工程需要補(bǔ)ARM Compiler 5編譯器因?yàn)樾掳鍷eil默認(rèn)裝的是AC6AC6對(duì)老代碼的兼容性并不好。確認(rèn)燒錄工具。中科藍(lán)訊有自己的燒錄器和上位機(jī)工具串口燒錄和SWD調(diào)試都可能用到。早期很多開發(fā)板用的是專用下載器新一些的可以用串口ISP。這一步務(wù)必按文檔來燒錄配置不對(duì)會(huì)直接導(dǎo)致連不上芯片。打開SDK里的工程文件先編譯一遍確保0 error 0 warning或者至少?zèng)]error。如果這一步過不去后面看再多代碼都沒用。這里特別提醒一點(diǎn)中科藍(lán)訊SDK不同客戶拿到的版本很可能不一樣文件名、目錄名、API命名都存在差異。我下面講的目錄和函數(shù)名是基于我接觸過的常見版本具體到你的SDK包要以實(shí)際代碼為準(zhǔn)。結(jié)構(gòu)會(huì)大同小異但函數(shù)名千萬別照抄。1.3 定位自己的角色你是“應(yīng)用層開發(fā)”還是“底層移植”拿到SDK后先想清楚一個(gè)問題你這次開發(fā)是要改產(chǎn)品行為還是要改底層協(xié)議中科藍(lán)訊SDK的分工大致是這樣藍(lán)牙協(xié)議棧、射頻校準(zhǔn)、底層音頻鏈路這些都以庫或封裝代碼的形式提供不建議普通工程師去改而產(chǎn)品邏輯、按鍵定義、LED燈效、提示音、EQ調(diào)節(jié)這些全部在應(yīng)用層代碼里。絕大多數(shù)做整機(jī)方案的人工作重心都在應(yīng)用層也就是消息處理框架覆蓋的范圍。所以這篇文章后面講的內(nèi)容也主要集中在應(yīng)用層怎么理解和修改不涉及射頻、基帶那些深水區(qū)。2. 從目錄看SDK的設(shè)計(jì)邏輯一份代碼的骨架解剖2.1 頂層目錄隱藏的“分層思想”中科藍(lán)訊SDK解壓以后頂層目錄非常多乍看很嚇人。我歸納下來其實(shí)就是三個(gè)層次硬件相關(guān)、系統(tǒng)服務(wù)、應(yīng)用業(yè)務(wù)。很多文件夾不用天天碰甚至整個(gè)開發(fā)周期里打開的次數(shù)都不超過五次。我拿一個(gè)常見版本的目錄結(jié)構(gòu)來舉例|- app/ // 應(yīng)用層代碼改產(chǎn)品邏輯主要在這里 |- bsp/ // 板級(jí)支持包按鍵、LED、I2C等外設(shè)初始化 |- chip/ // 芯片底層啟動(dòng)、寄存器定義、硬件初始化 |- cstartup/ // 啟動(dòng)文件復(fù)位向量、棧初始化 |- doc/ // 芯片手冊(cè)、SDK說明文檔 |- libs/ // 庫文件藍(lán)牙協(xié)議棧和音頻算法的閉源實(shí)現(xiàn) |- tool/ // 燒錄工具、音頻轉(zhuǎn)換工具、配置工具 |- third_party/ // 第三方組件比如一些編解碼庫、加密庫 |- main.c // 程序入口看明白沒有它跟很多嵌入式SDK一樣把“你能改的”和“你最好不要碰的”從物理上分開了。應(yīng)用層、BSP、芯片底層各自獨(dú)立改應(yīng)用層的時(shí)候不會(huì)牽連到協(xié)議棧這是好事。2.2 核心目錄逐個(gè)拆解app目錄是這個(gè)SDK里最值得花時(shí)間的地方。它保存的是整個(gè)藍(lán)牙耳機(jī)產(chǎn)品邏輯比如連接狀態(tài)處理、音樂播放暫停、通話狀態(tài)切換、電量提示、按鍵事件分發(fā)等。很多時(shí)候你只改一個(gè)文件就能改掉一個(gè)產(chǎn)品行為比如調(diào)整LED閃爍快慢、修改按鍵組合功能。bsp目錄對(duì)應(yīng)板級(jí)配置。中科藍(lán)訊的SDK對(duì)外設(shè)做了抽象板級(jí)不同主要體現(xiàn)在bsp目錄里的差異比如按鍵接在哪個(gè)GPIO、LED是低電平點(diǎn)亮還是高電平點(diǎn)亮。換板子時(shí)優(yōu)先看這里而不是去翻芯片寄存器手冊(cè)。libs目錄存放閉源庫藍(lán)牙協(xié)議棧、SBC/AAC編解碼這些都在里面。這個(gè)目錄通常以.lib或.so形式提供反正是不能改的。調(diào)試藍(lán)牙連接類問題時(shí)經(jīng)常會(huì)用到庫里導(dǎo)出的調(diào)試接口但不用理解它內(nèi)部怎么寫。doc目錄值得重視。中科藍(lán)訊每年迭代很快SDK版本之間API有差異doc里通常有版本改動(dòng)說明、芯片寄存器手冊(cè)、原理圖參考。遇到代碼看不懂的時(shí)候先翻doc比上網(wǎng)到處搜更有效率。2.3 找到程序的入口main.c的啟動(dòng)線索入口代碼通常很精簡(jiǎn)核心邏輯就是三件事初始化硬件、初始化系統(tǒng)服務(wù)、進(jìn)入消息循環(huán)。以常見的SDK為例入口大概長(zhǎng)這樣int main(void) { sys_init(); // 時(shí)鐘、電源、內(nèi)存等基礎(chǔ)初始化 board_init(); // 板級(jí)外設(shè)初始化按鍵、LED、I2C等 app_init(); // 應(yīng)用層初始化注冊(cè)消息和回調(diào) while(1) { app_msg_deal(); // 主循環(huán)里處理消息隊(duì)列 } }別看這段代碼短整個(gè)系統(tǒng)就是靠這個(gè)東西轉(zhuǎn)起來的。sys_init負(fù)責(zé)把芯片基礎(chǔ)環(huán)境準(zhǔn)備好board_init把耳機(jī)用得上的外設(shè)打開app_init把你自己的業(yè)務(wù)邏輯掛進(jìn)去最后主循環(huán)不停地從消息隊(duì)列里取消息、分發(fā)消息。這里已經(jīng)能看出消息處理框架的影子了系統(tǒng)跑起來之后除了中斷里必須立即處理的事情其他所有事件都會(huì)轉(zhuǎn)化為消息扔進(jìn)一個(gè)隊(duì)列里由主循環(huán)慢慢處理。2.4 哪些目錄可以動(dòng)哪些不要碰很多新手喜歡在庫文件、底層驅(qū)動(dòng)里加打印、改邏輯這是大忌。我給自己定了一條規(guī)矩除了app目錄和bsp目錄其他目錄一律不手改。原因很簡(jiǎn)單中科藍(lán)訊的SDK升級(jí)很頻繁廠商會(huì)不定期出新版本修Bug、加功能。如果你把改動(dòng)埋在了底層目錄下次SDK一升級(jí)你的改動(dòng)全部失效還得一個(gè)個(gè)找回來。而改動(dòng)集中在app、bsp這種應(yīng)用層位置升級(jí)時(shí)差異對(duì)比會(huì)很清晰。另外很多底層的改動(dòng)其實(shí)沒必要。比如你想在藍(lán)牙連接成功時(shí)做點(diǎn)特殊處理正確方式是注冊(cè)連接狀態(tài)回調(diào)在回調(diào)里發(fā)應(yīng)用消息而不是去改藍(lán)牙協(xié)議棧。理解這個(gè)思路后面看消息框架就會(huì)非常順。3. 核心機(jī)制消息處理框架到底在解決什么問題3.1 為什么要設(shè)計(jì)一套消息框架而不是直接調(diào)函數(shù)藍(lán)牙耳機(jī)這個(gè)系統(tǒng)有個(gè)特點(diǎn)事件來源非常雜。用戶按鍵、藍(lán)牙連接斷開、打電話來電、電量變低、充電器插入拔出這些事件什么時(shí)候發(fā)生完全無法預(yù)測(cè)而且很多都來自中斷或者底層回調(diào)。如果每個(gè)事件一來就直接調(diào)用應(yīng)用層函數(shù)會(huì)出現(xiàn)三類問題調(diào)用時(shí)機(jī)不可控。中斷里執(zhí)行的代碼有嚴(yán)格時(shí)間限制你不可能在藍(lán)牙協(xié)議棧回調(diào)里直接去播放一個(gè)提示音那太慢了。上下文沖突。多個(gè)事件可能同時(shí)被觸發(fā)如果CPU正在處理A事件時(shí)B事件插進(jìn)來兩個(gè)函數(shù)同時(shí)修改同一個(gè)全局變量系統(tǒng)就亂了。代碼耦合嚴(yán)重。應(yīng)用層依賴底層函數(shù)底層又不能反向調(diào)用應(yīng)用這種設(shè)計(jì)到最后就會(huì)變成一坨誰都看不懂的亂麻。消息框架的解法是把事件“異步化”底層發(fā)生時(shí)只負(fù)責(zé)“打包消息、扔進(jìn)隊(duì)列”然后立刻返回主循環(huán)在自己的節(jié)奏里把消息取出來處理。這樣中斷里做的事最少應(yīng)用層又有充分的執(zhí)行時(shí)間模塊之間還能解耦??梢阅命c(diǎn)餐做類比你不是在廚房里對(duì)著廚師喊一聲就開始做飯而是先寫一張菜單消息服務(wù)員把菜單交到后廚廚師按順序做。后廚再忙也得按隊(duì)列來不會(huì)因?yàn)橛腥撕暗庙懢筒尻?duì)。3.2 消息長(zhǎng)什么樣結(jié)構(gòu)體里的每個(gè)字段都有講究中科藍(lán)訊SDK里的消息本質(zhì)就是一個(gè)自定義結(jié)構(gòu)體。我有一個(gè)常見版本的樣例如下typedef struct _app_msg { uint16_t msg_id; // 消息類型區(qū)分這是一個(gè)按鍵消息還是藍(lán)牙狀態(tài)消息 uint16_t msg_param; // 消息附帶參數(shù)比如按鍵長(zhǎng)按短按、連接斷開的原因 uint8_t *msg_data; // 指向擴(kuò)展數(shù)據(jù)的指針一般用于傳字符串或者結(jié)構(gòu)體 uint8_t msg_len; // 擴(kuò)展數(shù)據(jù)的長(zhǎng)度 } app_msg_t;msg_id是消息的身份標(biāo)識(shí)決定了這條消息會(huì)被誰處理、處理成什么結(jié)果。系統(tǒng)自帶的消息ID和用戶自定義的消息ID通常分區(qū)間排列避免撞車。msg_param是消息的“補(bǔ)充說明”同一個(gè)消息類型可以帶不同的param產(chǎn)生不同行為。比如按鍵消息里param可能是短按、長(zhǎng)按還是雙擊藍(lán)牙消息里param可能是已連接、正在斷開、還是連接失敗。msg_data和msg_len用于傳遞更多數(shù)據(jù)。比如通知類消息需要攜帶一個(gè)字符串或者一個(gè)結(jié)構(gòu)體就通過這個(gè)指針傳過去。這里要注意數(shù)據(jù)本身的內(nèi)存管理需要格外小心后面在避坑章節(jié)會(huì)展開。3.3 消息的三段旅程投遞、排隊(duì)、分發(fā)一條消息從產(chǎn)生到被處理走的是固定路線第一步是投遞。底層或者中斷通過一個(gè)發(fā)送函數(shù)把消息封裝好放進(jìn)隊(duì)列。投遞動(dòng)作要求特別輕量不允許做耗時(shí)操作否則會(huì)影響實(shí)時(shí)性。第二步是排隊(duì)。消息進(jìn)入一個(gè)先進(jìn)先出的環(huán)形隊(duì)列。隊(duì)列大小在系統(tǒng)初始化時(shí)就定好了所有消息都在這個(gè)隊(duì)列里等待主循環(huán)來取。第三步是分發(fā)。主循環(huán)每輪從隊(duì)列頭部取出一條消息根據(jù)msg_id把消息交給對(duì)應(yīng)的處理函數(shù)。分發(fā)過程通常由一個(gè)大的switch-case或者一張函數(shù)指針表完成。這個(gè)三段式設(shè)計(jì)看著簡(jiǎn)單但它保證了兩個(gè)關(guān)鍵特性一是內(nèi)核執(zhí)行時(shí)間可控二是所有消息按順序處理不互相搶占。這是后面所有業(yè)務(wù)邏輯能穩(wěn)定運(yùn)行的基礎(chǔ)。3.4 系統(tǒng)消息與用戶消息ID分區(qū)規(guī)則中科藍(lán)訊SDK里消息ID不是隨便定的。系統(tǒng)內(nèi)部消息通常占一個(gè)固定的ID區(qū)間用戶自定義消息必須從某個(gè)基礎(chǔ)值之后開始。我在實(shí)際開發(fā)中習(xí)慣用一個(gè)宏來定義自己的消息ID起點(diǎn)#define APP_MSG_USER_BASE (0x2000) #define APP_MSG_EQ_CHANGE (APP_MSG_USER_BASE 1) #define APP_MSG_VOL_MAX (APP_MSG_USER_BASE 2) #define APP_MSG_ANC_SWITCH (APP_MSG_USER_BASE 3)這樣做的目的是避免覆蓋系統(tǒng)預(yù)留的消息。如果你隨意取一個(gè)ID很容易跟系統(tǒng)的某個(gè)內(nèi)部消息撞上導(dǎo)致一個(gè)正常功能被莫名觸發(fā)或者你的消息還沒走到處理函數(shù)就被系統(tǒng)攔截了。這種Bug非常難查所以消息ID規(guī)劃一開始就要規(guī)范。4. 實(shí)操從按鍵到藍(lán)牙動(dòng)作一條完整消息鏈路拆解4.1 按鍵消息的產(chǎn)生底層掃描與去抖藍(lán)牙耳機(jī)上最常見的交互就是按鍵。以單個(gè)多功能按鍵為例底層驅(qū)動(dòng)會(huì)做三件事檢測(cè)GPIO電平變化、軟件去抖、識(shí)別事件類型短按、長(zhǎng)按、雙擊、三擊。按鍵掃描在底層一般有兩種方式一種是在定時(shí)器中斷里輪詢GPIO另一種是GPIO本身支持邊沿觸發(fā)中斷。中科藍(lán)訊SDK通常用前者因?yàn)槠湫酒С钟|摸和實(shí)體按鍵混合方案定時(shí)輪詢更通用。按鍵事件識(shí)別出來之后底層的任務(wù)就完成了。它會(huì)發(fā)送一個(gè)消息msg_id標(biāo)記為按鍵事件類型msg_param填上按鍵值比如短按、長(zhǎng)按。這部分代碼在SDK里已經(jīng)幫你寫好正常情況下不需要改你要理解的是它把什么信息傳了上來。4.2 按鍵事件怎么變成應(yīng)用層消息中科藍(lán)訊SDK在應(yīng)用層注冊(cè)了一個(gè)按鍵事件的接收回調(diào)。底層一旦產(chǎn)生按鍵事件這個(gè)回調(diào)就會(huì)被調(diào)用?;卣{(diào)里通常不建議做業(yè)務(wù)處理而是把按鍵消息重新封裝成應(yīng)用消息再投遞進(jìn)消息隊(duì)列。代碼邏輯大概長(zhǎng)這樣static void user_key_callback(key_event_t key) { app_msg_t msg; msg.msg_id APP_MSG_KEY_EVENT; msg.msg_param (uint16_t)key; msg.msg_data NULL; msg.msg_len 0; app_msg_send(msg); }這里的關(guān)鍵點(diǎn)在于回調(diào)函數(shù)本身是在底層上下文里執(zhí)行的你在這里做太多事情會(huì)拖慢底層。所以只做一件事——發(fā)消息發(fā)完立刻返回。app_msg_send這個(gè)函數(shù)往消息隊(duì)列里塞消息通常內(nèi)部還會(huì)處理隊(duì)列滿的情況比如丟棄并記錄錯(cuò)誤計(jì)數(shù)。這一層封裝把底層和應(yīng)用徹底隔開底層不需要知道應(yīng)用要拿這個(gè)按鍵去做什么。4.3 應(yīng)用層怎么消費(fèi)消息分發(fā)函數(shù)的一切消息進(jìn)入隊(duì)列之后主循環(huán)會(huì)調(diào)用分發(fā)函數(shù)把消息交給對(duì)應(yīng)的處理器。一個(gè)典型的分發(fā)函數(shù)長(zhǎng)這樣void app_msg_handle(app_msg_t *msg) { switch (msg-msg_id) { case APP_MSG_KEY_EVENT: key_event_process(msg-msg_param); break; case APP_MSG_BT_STATUS: bt_status_process(msg-msg_param); break; case APP_MSG_EQ_CHANGE: eq_change_process(msg-msg_param); break; default: break; } }每種消息類型對(duì)應(yīng)一個(gè)處理函數(shù)處理函數(shù)里寫具體的產(chǎn)品行為。這樣代碼結(jié)構(gòu)非常清晰加一個(gè)新功能只需要三步定義一個(gè)消息ID、在發(fā)送方調(diào)用發(fā)送函數(shù)、在分發(fā)函數(shù)里增加一個(gè)case。注意分發(fā)函數(shù)的執(zhí)行上下文是主循環(huán)任務(wù)不是中斷。所以在處理函數(shù)里可以放心做耗時(shí)操作比如讀寫Flash、播放提示音、更新LED狀態(tài)這些都不會(huì)影響中斷響應(yīng)。4.4 一個(gè)完整場(chǎng)景雙擊按鍵切換EQ拿一個(gè)真實(shí)需求來串一遍“雙擊耳機(jī)觸摸按鍵切換EQ模式”。第一步底層識(shí)別到觸摸雙擊動(dòng)作產(chǎn)生KEY_DOUBLE_CLICK事件調(diào)用應(yīng)用層注冊(cè)的按鍵回調(diào)。第二步回調(diào)函數(shù)里發(fā)送APP_MSG_KEY_EVENT消息msg_param KEY_DOUBLE_CLICK消息入隊(duì)。第三步主循環(huán)分發(fā)該消息調(diào)用key_event_process(KEY_DOUBLE_CLICK)。第四步key_event_process里檢測(cè)當(dāng)前EQ模式切換到下一個(gè)模式然后調(diào)用音頻接口刷新EQ參數(shù)static void key_event_process(uint16_t param) { if (param KEY_DOUBLE_CLICK) { uint8_t eq_index eq_get_current_index(); eq_index (eq_index 1) % EQ_MODE_TOTAL; eq_set_index(eq_index); eq_save_to_flash(eq_index); // 記住用戶選擇重啟后恢復(fù) play_tone(TONE_EQ_SWITCH); } }這里我額外做了兩個(gè)動(dòng)作把用戶選擇的EQ索引存進(jìn)Flash切換成功后播放一個(gè)提示音。這兩個(gè)細(xì)節(jié)在產(chǎn)品上很關(guān)鍵但很多新手第一次做完切換EQ卻覺得“沒反應(yīng)”“重啟后變回去了”就是因?yàn)闆]做狀態(tài)保存和用戶反饋。這個(gè)場(chǎng)景完整展示了消息框架的價(jià)值底層不需要知道EQ是什么應(yīng)用層不需要關(guān)心按鍵GPIO怎么掃兩邊通過一條消息就對(duì)接起來了。5. 實(shí)戰(zhàn)經(jīng)驗(yàn)寫消息處理代碼時(shí)容易踩的7個(gè)坑5.1 在消息回調(diào)里做耗時(shí)操作導(dǎo)致藍(lán)牙斷連我最早犯過的錯(cuò)誤就是在回調(diào)函數(shù)里直接做耗時(shí)操作比如讀寫外部Flash、打印超大日志結(jié)果耳機(jī)開始卡頓、斷連、甚至死機(jī)。原因很簡(jiǎn)單雖然消息處理函數(shù)在主循環(huán)里執(zhí)行時(shí)間相對(duì)寬松但主循環(huán)背后還有藍(lán)牙協(xié)議棧的實(shí)時(shí)任務(wù)在跑。如果某個(gè)消息處理函數(shù)執(zhí)行時(shí)間過長(zhǎng)會(huì)阻塞整個(gè)系統(tǒng)的調(diào)度藍(lán)牙協(xié)議的實(shí)時(shí)性就得不到保障。正確做法是把真正耗時(shí)的動(dòng)作再拆出去或者至少保證單個(gè)消息處理函數(shù)執(zhí)行時(shí)間在幾十毫秒以內(nèi)。特別是在處理藍(lán)牙連接狀態(tài)消息時(shí)務(wù)必快速返回。5.2 消息ID撞車導(dǎo)致功能錯(cuò)亂消息ID撞車是我見過最多的問題之一。很多方案商改動(dòng)時(shí)喜歡直接拿系統(tǒng)消息ID段里某個(gè)數(shù)字來用因?yàn)樗翱雌饋頉]被用到”。結(jié)果某個(gè)系統(tǒng)新版本啟用了這個(gè)ID你的功能就莫名其妙被觸發(fā)了。正確做法是嚴(yán)格按照SDK文檔里的ID分區(qū)來定義用戶消息從約定的用戶起點(diǎn)往后編排。并且建議在工程里維護(hù)一個(gè)消息ID清單每新增一個(gè)消息就登記一下防止多人協(xié)作時(shí)互相覆蓋。5.3 消息隊(duì)列溢出造成事件丟失按鍵偶爾失靈、狀態(tài)切換不響應(yīng)很多情況都是消息隊(duì)列滿了新消息被丟棄。SDK底層通常會(huì)提供一個(gè)隊(duì)列長(zhǎng)度的統(tǒng)計(jì)或溢出日志排查時(shí)要先看有沒有“msg queue full”之類的輸出。隊(duì)列大小的選擇本質(zhì)是空間與可靠性的取舍。隊(duì)列太小容易丟消息隊(duì)列太大又浪費(fèi)RAM。我的經(jīng)驗(yàn)是先按當(dāng)前產(chǎn)品事件的峰值估算隊(duì)列深度然后在壓力測(cè)試中觀察是否丟事件再適當(dāng)留余量。5.4 自定義消息里的指針數(shù)據(jù)成了野指針msg_data字段是個(gè)坑。如果你把消息發(fā)進(jìn)隊(duì)列后外部數(shù)據(jù)的內(nèi)存提前被釋放或者被改寫消息處理函數(shù)拿到的就是野指針。常見場(chǎng)景是發(fā)送一個(gè)局部變量地址作為msg_data發(fā)送函數(shù)直接入隊(duì)函數(shù)返回后局部變量銷毀消息處理時(shí)地址已經(jīng)無效了。正確處理方式是為數(shù)據(jù)單獨(dú)分配內(nèi)存整包消息在按鍵回調(diào)后統(tǒng)一釋放或者直接傳遞靜態(tài)數(shù)據(jù)區(qū)。我的建議是消息里盡量少用指針傳遞長(zhǎng)數(shù)據(jù)能用msg_param搞定就用msg_param。如果一定要用指針務(wù)必在接收端處理完成后由同一個(gè)模塊負(fù)責(zé)釋放內(nèi)存。5.5 藍(lán)牙連接狀態(tài)機(jī)與UI狀態(tài)不一致耳機(jī)產(chǎn)品最核心的狀態(tài)是藍(lán)牙連接狀態(tài)已連接、已斷開、回連中、配對(duì)中等。應(yīng)用層通常在消息處理函數(shù)里根據(jù)這些狀態(tài)切換UI行為比如LED快閃、慢閃、熄滅。最容易出Bug的地方是狀態(tài)機(jī)沒有做邊界處理。比如已經(jīng)在已連接狀態(tài)不經(jīng)意間又收到一個(gè)已連接消息按正常邏輯你可能去播放一次“連接成功”提示音結(jié)果用戶會(huì)聽到重復(fù)提示音。處理這類消息時(shí)要判斷當(dāng)前狀態(tài)跟新消息是否一致只有狀態(tài)變化時(shí)才更新UI。5.6 SDK版本升級(jí)后頭文件不匹配中科藍(lán)訊SDK升級(jí)頻率很高廠商發(fā)的版本之間結(jié)構(gòu)體和函數(shù)簽名都可能變。升級(jí)時(shí)如果沒有同步修改代碼編譯報(bào)錯(cuò)是最輕的怕的是編譯能過但行為完全變了比如一個(gè)結(jié)構(gòu)體新增了字段舊代碼初始化的結(jié)構(gòu)體沒有這個(gè)字段導(dǎo)致消息里出現(xiàn)垃圾數(shù)據(jù)。所以每次升級(jí)SDK我強(qiáng)烈建議先看doc目錄下的版本更新說明重點(diǎn)檢查頭文件里的結(jié)構(gòu)體定義、消息ID定義有沒有變化然后全局搜索自己用到的關(guān)鍵API確認(rèn)簽名是否一致。5.7 實(shí)機(jī)調(diào)試時(shí)用日志定位消息走向這套SDK里最常用的調(diào)試手段是串口日志。主控通過UART把調(diào)試信息打印到PC端串口工具。排查消息鏈路問題關(guān)鍵是要在關(guān)鍵節(jié)點(diǎn)打印精簡(jiǎn)日志消息產(chǎn)生時(shí)打一條入隊(duì)時(shí)打一條處理前打一條。通過日志時(shí)間戳可以定位消息是在哪一段被丟棄的。另外很多中科藍(lán)訊SDK支持在編譯期開關(guān)日志分級(jí)建議開發(fā)期把調(diào)試日志全打開量產(chǎn)時(shí)再裁剪成error級(jí)別避免日志本身影響系統(tǒng)性能。為了方便快速排查我整理了一份常見問題速查表現(xiàn)象可能原因快速排查方法按鍵偶爾無反應(yīng)消息隊(duì)列溢出按鍵事件被丟棄查看日志是否有queue full增大隊(duì)列深度聲音斷斷續(xù)續(xù)連電腦時(shí)更明顯系統(tǒng)藍(lán)牙與其他射頻干擾或音頻重傳丟包檢查PCB天線區(qū)域干擾源確認(rèn)A2DP鏈路穩(wěn)定性耳機(jī)被電腦識(shí)別成handsfree設(shè)備耳機(jī)端配置文件未正確聲明A2DP檢查藍(lán)牙配置文件和SDP服務(wù)聲明升級(jí)SDK后編譯告警結(jié)構(gòu)體定義變化字段未同步初始化diff新舊頭文件檢查消息結(jié)構(gòu)體提示音重復(fù)播放狀態(tài)消息重復(fù)觸發(fā)UI刷新消息處理前判斷當(dāng)前狀態(tài)是否相同自定義消息沒被處理消息ID落在系統(tǒng)保留區(qū)間被前置攔截確認(rèn)消息ID在用戶自定義區(qū)間藍(lán)牙回連失敗回連消息隊(duì)列被長(zhǎng)任務(wù)阻塞檢查是否有處理函數(shù)耗時(shí)過長(zhǎng)6. 最后說點(diǎn)實(shí)在的中科藍(lán)訊的SDK上手時(shí)確實(shí)有門檻但它一旦跑通開發(fā)效率是很高的。這套目錄和消息機(jī)制的組合本質(zhì)上就是一套簡(jiǎn)化版的嵌入式事件驅(qū)動(dòng)框架。你不需要把它想得多么高深只需要順著“底層發(fā)消息、隊(duì)列存消息、主循環(huán)分發(fā)消息、處理函數(shù)執(zhí)行動(dòng)作”這條主線去讀代碼很快就能在上面的框架里加出自己的功能。我個(gè)人實(shí)踐中最大的體會(huì)是在這套SDK里克制比聰明更重要。改產(chǎn)品邏輯時(shí)盡量只動(dòng)app層發(fā)消息的地方和處理消息的地方分開絕不跳過消息隊(duì)列直接調(diào)用業(yè)務(wù)函數(shù)。這樣短期看多點(diǎn)幾下鍵盤的效率損失長(zhǎng)期換來的是代碼可維護(hù)性、可升級(jí)性以及少排一堆詭怪的Bug。最后再分享一個(gè)小技巧給每類消息的處理函數(shù)統(tǒng)一加上入口和出口日志用宏控制編譯選項(xiàng)。這招在多人協(xié)作時(shí)特別好用A改的代碼影響到了B的功能誰的消息先到、誰的處理先執(zhí)行日志一拉就清清楚楚。希望你少踩我踩過的坑。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
精品无码一区二区| 婷婷色综合欧美日韩| 黄色视频特级毛片| 懂色aV一区二区天美传媒| 乱精品一区字幕二区| 天天日天天操天天射河南省| 一级免费精品| 亚洲精品一区二区三区新线路| 人妻无一区二区三区| 78久久久| 五月天色图| 爱媛媛久久国产福利| 熟妇色99| 久草精品一区| 欧美白嫩女HD| 美女刺激久久国产欧美| 亚洲天堂无码| 国产一区二区欧美日本| 久久双插| 欧美色图电影| 亚洲综合 欧美| 2025亚洲男人天堂| 开心五月婷婷| 日韩性爱电影一区| 国产久久成人| 欧美特大AA级黄片| 欧美亚洲综合高清在线| 台湾佬大香蕉| 精品大全99999| 欧美最婬乱婬爆婬性视频 | 午夜综合在线| 国产男女无套97| 国内91熟女人妻丝袜天天精品视频在线| 免费av在线播放二区| 亚洲欧美黄| 加勒比综合a∨| 91jk色拍| 国产二区三区粉嫩在线| 18禁久极品美女久久哦哟呀!| 日本天天色| 日韩AV一起草| 日本熟妇人妻中出视频| 97干com| 丝袜美腿制服人妻二区中文字幕| 青青草国产欧美非洲黑人| 中字一区| 欧美色九九| 免费97视频| 97一区二区三区视频| 国产白领连续中出在线观看| 骚乳在线| 久久久婷| 麻豆色99999| 久久精品国产97欧美精品亚洲 | 国产无码精品高清| 一个色导综合| 岛国免费黄色网址| 无码精品一区二区三区潘金莲| 精品久久久久久中文| 日韩无码操逼片| 欧美性爱91| 天天干人人看综合| 强奸乱伦免费网站| 久久久久久久久成人av解说| 亚洲一区日韩| yazhousetuoumei| 97 亚洲 日韩 欧美 在线| 中文字幕一区av| 婷婷五月天成人| 亚洲精品aa久久伊人| 围产精品一区二区三区视频播放| 丁香五月天激情综合| 丁香五月社区| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 久久久久免费看少妇A片特黄| 99无码狠狠久久| 国产精品爽爽v| 少妇熟女1区2区3区| 91看黄片| 蜜乳AV网址| www.天天干| 亚洲中文字幕乱码无码一区二区| 久久久久久久久久久久久久久久9| 久久五月丁香| 夜夜操av亚洲一区二区| 九九精品99| 婷婷人妻激情| 人妻在线大香蕉| 丰满人妻一区二区三区| 一本久久久精品| 久久伊人网视频一区二区三区| 18禁无码永久免费无限制| 天天在线91| 东京太热久久久| 欧美成人一级免费电影| 92性色国产午夜福利在线661| 67914在线兔费成人视频| 99热婷婷| 人人操人人摸人人看人人干| 啊啊啊水好多| 日本 情色 1区2区3区| 夜夜嗷嗷一区二区| 宅男91视频在线播放| 五月丁香婷婷色| 亚洲精品1区| 人人么人人操| 日本欧美一区二区三区视频麻豆| 2021久久国产综合精品青草| 欧美国产日韩高清在线| 欧美日产国产在线成人第一区| 蜜臀久久99精品久久久| 天天影视91看看| 欧美色图天堂在线| 97久久网| 97 视频在线| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 久久久久密臀视频| 中文字幕丰满子伦无码专区在线视频最新| 国产高清免费不卡av| 久久久久久久久久久六六| 亚洲一区二区麻豆影院| 欧美日韩午夜精品一区二区三区| 好湿好紧视频| 亚洲国产精品无码AV久久| 欧美视频一区二区三区| 国产99999| 欧美日韩午夜精品一区二区三区| 九九视频黄色片| 国产精品干干干| 一级久久久久久久久久久| 国产黄色小视频网站| 人人爱人人操人人性| 99久re热视频精品98| 手机不卡视频不卡在线一二三区| 天天天天天天天天综合| 日日骚网站| 亚州熟女乱伦| 日韩av乱伦| 精品一区96| 97综合久第一页| 欧美的精品的视频| 国产女人和拘做爰视频| 99这里只有精品| 欧色网址| 天天插夜夜操| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 久久黄色性爱视频| 婷婷综合久久| 精品国产AV一区天美传媒| 日韩三A大片在线观看| 欧美在线永久天堂| 国产一区二区在线播放量| 久久东京热成人| 啊啊啊好舒服视频在线观看| 精品一区二区成人动漫| 亚洲熟女乱色一区二区三区久久久| av2014 日韩在线中文字幕| 99无码狠狠久久| 五月天精品| 青青草原伊人网| 全免费a敌肛交毛片免费| 亚洲综合影片| 性爱乱伦视频免费| 伊人久久久日韩一区| 亚洲乱码精品一区二区| 97人肏| xxx0国产在线播放| 黑人性欧美| 成人精品在线| 日韩激情无码影院| 91天堂丝袜美腿| 97超碰天天| 高跟丝袜AV专区国产| 综合熟妇一区二区三区| 亚洲狼狼干综合1| 色婷婷综合久久中文字幕雪峰| 色狠狠 - 百度| 啊啊啊啊好爽好舒服一区二区易域| 青青草精玖玖69精品| 亚洲黄网在哪免费看| 97日韩| 久久久久久裸体| 精品视频久久久久九九九九9999| 精品高清一区二区三区三州| 人妻精品视频一区二区三区| 日韩综合97p| 91丝袜熟女| 欧洲色| 久久久国产亚洲精品系列| 青娱乐91| 美女黄页网站| 97热视频在线观看| 久久超碰98| 亚洲日本男人天堂网| 国内毛片免费h片在线| 免费一级a毛片久久久久久鸭绿欲| 亚州五月| AV色图| 蜜臀久久在线视频| 中 文字幕一区二区三四 五 区日 日 骚 | 青娱乐91| 精品二区三四区五电影 | 蜜臀99999| 五月丁香色婷婷| 性爱乱伦网址| 色嗨嗨在线| 97天天弄| 91成人国产综合久久精品蜜月| 欧美|91色综合| 国产伦乱91| 人人人人插| 欧美成人四级在线播放| 色综合V| 在线a亚洲视频播放在线| 狠狠躁伊人中文字幕| 超碰97久久国| 超碰精品97| 夜色97| 超碰97在线中文| 欧美中字二区| 国产丝袜一区二区三区| 亚洲黄色电影| 亚洲在线欧美| 69视频入口| 欧美成人性爱视频在线播放| 亚洲乱色熟女一区| 国产精品激情久久久久久久| 91成人精品在线播放| 高清无码一区二区三区| 99久久久er直播网址| 国产99精品一区二区三区免费| 午夜舔阴达高潮视频免费看| 日韩欧美成人性爱在线| 亚洲综合五月天| 亚洲天堂电影精品一区| 亚洲成人一二三区| 能在线播放的国产三级| 国产AV高清AV无码| 97WW精品| surenchaopeng| 青青草久久| 久久日韩肥臀| 欧亚无码视频| 亚洲日韩美国人妻| 另类天堂| 婷婷激情一区二区三区俺也去| 久久久久久9999| 亚洲欧美综合网站| 男人的天堂网页| 天天草夜夜草高潮片| 亚洲操逼视频网站| 天天夜夜久久| 67914在线兔费成人视频| 日韩少妇无码| 国产精品久久久久久久黄无码| 综合一区中亚洲国产成人综合精品 | 久久久久久久久久久久黄色| 精品夜夜澡人妻无码AV| 亚洲精品一区二区精品| 色色婷婷五月天| 好吊色在线观看| 天天操av懂色| 九九九不卡| 欧美在线永久天堂| 亚洲精品男人的天堂| 成人精品久久久午夜福利| 免费A V在线播放| 久久天天性久久伊人| 欧美日韩婷婷中文| 狠狠色伊人亚洲综合网站色| 综合国产97| 91视频女生| 欧美日韩国产另类综合| 天天欧美色| 91n.欧美| 中国乱伦一区二区| 蜜臀久久在线视频| 国产91福利小视频在线观看| 欧美熟妇视频| 热99re69精品8在线播放| 天天弄天天操| julia在线观看久久| 日本二三四区| 天天做天天爽| 亚洲无码日韩电影| www色色com| 97精品一区| 377p欧洲日本亚洲大胆| 性性欧美| 粉嫩绯色AV一区二区在线| 北京美女一区二区| 一个国产在线综合网站| 人人爽人人精品乱人伦AV| 操逼操2| 能看的av| 超碰九区| 午夜小电影在线插入淫高潮| 青青草自拍视频在线播放| 97伦综合| 久久极品伊人| 国产无吗在线播放| 91色黑人少妇| 日韩性爱毛片操骚逼| 久久av色| 免费人成在线观看网站品爱网| 日韩紧密久久| 丁香五六月啪啪| 亚洲国产一区二区三区在线| 大香蕉乱级| 亚洲色图欧美色图制服丝袜| 1级午夜影院费免区| 天色综合网| 五月天我淫我色av| 9999亚洲精品| 五月婷婷丁香六月| 91东北熟女| 国产av白丝| 人人操人人爽人人操人人| 婷婷综合在线观看| 国产精品久久久久无码A√| 夜夜 中文视频rt| www色日本| 91天堂| 国产又黄又猛又粗又爽的网站| 97色97干| 国产人妻精品一区二区三区秋霞| 在线精品福利免费播放| 国产激情视频一区区三区| 亚洲 中文 女同| 欧美一级A片不卡视频。| 97免费视频在线观看视频| 美国日韩黄色片| 99热欧美| 麻豆性爱视频在线播放| 色婷婷丁香五月| 九色黄站| 天天综合麻豆视频| 欧美高清性猛交| 色综合天天| 欧美日韩精品久久久久东北老熟妇| 中文字幕第页| 中文字幕免费看| 加勒比大香蕉视频在线| 欧美日韩国产黄色片| 伊人九九九| 国产SV一线| 国产精品探花视频| 操屄日韩| 青草精品视频一日本久久久久网站| 亚洲有薄码区日本系列中文字幕| 久精品无码av一区二免费国产在线观看| 久久粉色| 欧美色亚洲色| 久污| 97视频在线观看高清资源| 日韩精品视频在线观看一卡二卡| Av手机版天堂网| 亚洲成成熟女人综合一区二区| 97色欧州| 久久五月份| 中文字幕亚韩| 蜜乳Av成人片网站| av亚欧| 成人国产二区三区在线,男女精品。| 内射黑人| 亚洲国产剧情少妇激情| 亚州操操穴网| 日本网色| 女人双腿搬开让男人桶| 午夜激情成人在线观看| 久久久9999| 天天欲望网| 中字一区| 亚洲国产中文字幕| 欧美性天天影院| 久久九七| 伊人伊人LD| 夜夜狼人妻| 啊啊啊啊嗯嗯嗯用力好爽| 欧亚性爱视频免费看| 人妻81p| 伊人一级免费黄片| 狠狠久久手机视频精品| 91精品国产91久久青草 | 日本一级性爱| 欧美性爱伊人| 色情五月丁香| 六月丁香网| 欧美人妻制服| 水滴偷拍| 人人性爱视频免费| 一级性爱啪啪视频| 一区操逼日比视频| 国产午夜激片Av毛片不卡| 91在线超高颜值国产| 欧美 综合| 日本精品九九九| 青青草视频导航官网| 艾草av| 免費人妻夜夜爽天天爽爽一区| 水澄无码AV| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 女人香蕉久久毛毛片精品| 熟妇一区,二区,三区。| 国产白丝网站| 日韩av在线精品观看| 欧差乱伦二三| 国产精品一区av在线| 91爆操视频| 91蜜桃婷婷狠狠久久综合9色| 夜色五月天| 色哟哟国产精品免费网址| 国产精品经典一卡久久久 | 久久久成人免费av电影| 亚洲人久久久久日| heyZO天然素人无码AⅤ专区| 两性色网| 中日无幕一二三四区| 国产精品网站免费| 欧美成人精品一区二区男人蜜臀| 97精品在线视频| 亚洲无992tv| 一级久久久久久久久久久| 操91| 欧美色图下一页| 色97综合中文字幕| a片久久久久久久久久久久| 日本三级一区二区 在线| 秋霞一级视频在线观看免费| 伊人大香蕉在线| 无码人妻系列少妇| 91视频伊人| 黄片直播三级黄片两女一男| 四虎永久在线精品免费网址| 韩日精品福利视频一区不卡在线免| 97ai亚洲| 色呦呦呦在线观看视频| 欧美中文字幕男人天堂久久精品| 99久久9| 波多野42部激情无码喷潮| 黄片不用下载在线观看| 日本午夜福利视频| 日日夜夜骑| 国内精品久久人妻性色av| 免费视频a级毛片免费视频| 欧洲中文字幕| 91精品人妻| 亚洲天堂7777| 日韩人妻精品中文字幕| 九九碰九九爱97超| 日韩在线观看中文字幕视频| 人人妻人人色| se吧提供91精品国产91久久久久久 | 五月婷婷大香蕉| 91在线超高颜值国产| 欧日韩不卡视.频| 蜜桃精品视频一区二区三区| 亚洲伊人a线观看视频| 欧美少妇一区二区三区| 伊人超碰97| 337p大胆噜噜噜噜噜91Av| 熟女91网| 亚洲成熟国产精品美女| 我爱搞逼综合网| 免费福利视频中文字幕| 国产白嫩精品久久| 人妻一区二区三区四区视频| 天天添天天干电影| 激情小说亚洲| 天天干2019| 国产久久久久久| 日本福利社| 日日夜夜骑| 亚洲日韩精品在线播放| 午夜亚洲| 综合色图区| 97视频在线免费观看| 女色视频社区| 欧美天天| 欧洲精品在线播放| 岛国视频一二三区| 999久久芭蕾| 久精品无码av一区二免费国产在线观看 | 国产高清在线观看欧美| 日日日日做夜夜夜夜做无码97| 26uuu性物| 久久是精品| 探花精品视频| 天天干嫩逼网| 国产视频一区二区在线| 黄色人人| 搡老女人老91妇女熟女| 亚洲天堂热| 亚洲国产熟妇综合色专区| 91国产精品熟女| 操逼无码操逼| 国产噜噜噜噜噜久久久久久久久| 熟女字幕| 国产传媒av天美传媒在线| 亚洲男人的天堂一区二区| 伊人专区一区二区三区| 欧美高潮| 无码99| 26uuu性物| 天天干夜夜| 校园春色综合| 国产高清无码一区三区二区| 一级AAA片一区二区三区| 2011国产精品| 操逼网站视频漫画国产| 天天综合91| 精品乱码久久久久| 91熟女熟妇视频网站| 先锋影音av先锋一区| 欧亚揄拍偷拍精品视频| 久久久蜜桃一区二区三区| 影音先锋日本乱伦| 青青草AV色| 少妇蜜汁| 国产激情片在线观看| 97在线视频观看| 天天摸天天舔天天操| 色色操| 国产精品久久久久久久AV大片| 91天天美女| 久久久久久久78| 99ri视频| 免费αⅴ在线观看| 超清中文乱码字幕| 97欧美色| 久久99草| 日韩三级在线观看mp4| 91碰碰碰| 九九综合久久| 国产精品久久久久无码A√| 另类欧美色| 超碰视97中文| 18禁久极品美女久久哦哟呀!| 丁香六月激情综合| 国产 v乱码一区二| 国产精品毛片?v一区二区三区| 96麻豆精品一区二区三区| 岛国999| 精品国产99| 精品国产乱码久久久久久久久1| 国产一级不卡在线观看| 日韩激情电影中文字幕| 99久久99久久免费精品蜜臀| 婷婷8月天青娱乐| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 在线人妻熟女一区二区三区四区五区| 日韩操人| 超碰人人色| 亚洲精品aa久久伊人 | 国产情色第一第二页在线观看| 中文字暮97| 淮穴色AV| 久久久久精| 色色色色色色色色色色色色色色综合| 丝袜美腿诱惑亚洲欧美视频在线观看 | hd成人一区二区在线| 欧美另类综合久久| 亚洲古典另类欧美在线| 亚洲精品乱码久久久久久蜜桃麻豆| 国产女人和拘做爰视频 | 欧美高清第一页| 亚欧美色| 99人妻碰碰碰久久久久禁片| www.99色| 精品中文字幕第一页| 宅男影院久久久,99| 亚洲色图尤物视频| 精品九九国产无码| 唐山老熟妇露脸啪啪叫| 韩国一级做A片免费的| 国产懂色精品国产av| 国产成人bd在线观看| 欧美亚洲日本激情在线| 综合婷婷| 欧美日韩人人精品| 日本精品免费一区二区三区四区| 精品久久九| 人妻蜜桃臀| 亚洲国产精品无石码久久| 人妻丝袜美腿中文字幕| 强被迫伦姧在线观看无码网站| 黄色免费网| 亚洲国产尤物yw在线观看| 在线观看中文av字幕| 日本久久天堂| 北京专精特新企业招聘信息| 热热热热日日漂亮永久永久国产日| 国产日韩欧美| 激情在线青青操| 久久精品国产亚洲AV清纯| 国产性爱在线视频一区二区| 激情久久av一区av二区av| 久久人妻丝袜一区二区三| 久久的网站啊啊啊啊啊| 人妻大香蕉| 啊啊啊啊啊啊在线观看| 99老司机精品视频在线观看| 亚洲一区日韩| 78久久久| 欧美高清16| 91伊人久| 密桃99999| 98精品国产乱码久久久久久| 熟妇人妻丰满久久久久久久无码| 内射夫妻三片| 久99视频| 日韩精品操少妇| a啊啊啊啊啊啊啊啊一区二区| 欧美乱伦专区| 成人国产精品三级A片| 97操97色| 久九九九九九九九热| 中文字幕日韩电影人妻| 99色在线| 色香综合天天影视综合| 日韩欧无码一区二区三区免费不卡| 国产高清无码一区三区二区| 欧美三级不卡| 91青青在线| 免费亚洲黄色视频在线观看| 欧美制服网站美腿丝袜| 韩日欧亚a级| 黄片免费久久久久久久| 人妻出轨一区二区三区| 91 综合网| 激情综合网五月婷婷五月天| 九九热视频这里只有精品| 天天看片青娱乐| 精品国产www久久| 天天α片| 超清福利精品视频在线| 97人肏| 欧美丝袜中文字幕07在线| 欧美午夜一区二区三区| 久久m| 蜜乳成人AV| 久久国产精品91| 大香蕉视频啪啪啪啪| 国产成人自拍视频在线| 毛片麻豆91糖心精品毛情片| 尤物网址| 美美91成人国产精品欧美精品久久久久久久| 亚洲激情视频| 丁香五月天社区| 啊啊啊水好多| 五月天激情小说| 性欧美999| 激情婷婷| 97精品视频| 亚洲综合色男人网| 亚洲无线观看久久| 青青草在线视频人人想人人上| 亚洲97在线观看| 97舔舔| 新亚洲无码| 天天弄欧美| 91成人高清在线观看| 91美女在线看| 色综合av男人天堂| 蜜桃久久一区| 亚洲无套久久嗯嗯| 91色人妻| 九九九九精品一区| 人人考人人摸人人干| 97伦综合| 97精彩视频网站| 国产成人精品必看| 91精品少妇搡搡搡| 热久久这里只有精品| 精品人妻一区二区免费蜜桃视频| 99热97| 亚洲AV无码翔田千里网站| 欧美 综合 亚洲| 国产在线精品偷| 天天躁日日躁狠狠躁| 操B久久| 5月婷婷6月六月丁香| 五月天伊人网| 久久亚洲熟妇在线视频| 国产精品自产拍在线观看社区 | 青青草视频久久| 51国产午夜精品视频| 久久精品夜色国产亚洲AV| 成人性爱高清视频免费看| 99re视频在线播放青草| 日韩99神马视频播放| 强奸乱伦大香蕉网| 欲香欲色| 嫩草 我啊~嗯~在线| 欧美精品四区| 手机在线视频国内精品| 日韩射精| 蜜臀无码一区二区| 江都AV在线| hd成人一区二区在线| 久久97| 日韩中文字幕精品一二三事国产精品| 麻豆人妻精品一区二区| 久操网无码在线| 日本加勒比无码专区| 亚洲国产青青| 日韩无码嘿咻黑热久| 国产久久av| 99久久国产精品免费高潮| 91色s| 精品国产91久久久久久一区黄无| 黄网色一区二区三区四区精品| 日韩肏逼视频| 99AV| 婷婷精品国产欧美精品亚洲人人爽| 曰韩欧美国产传媒麻豆第一区| 国产精品久久久久中文字幕| 一起草三级AV电影在线观看 | 青青草好吊色| 久久女女| 老女人老91妇女老热女| 人妻美腿丝袜制服诱惑综合天堂-| 欧美精品自慰系列寂寞少妇 | 亚洲色图欧美色图制服丝袜 | 97久久国产精品女不卡| 亚洲图片偷拍欧美| 天天激色| 99久热精品99re6热| 欧美在线伊人色| 天天影视综合网欧美精品| av国产无码| 熟妇操花| 亚洲色图殴美色图激情乱伦| 国产免费操逼| 岛国视频一二三区| 一区二区免费电影久久| 日韩精品中文字幕人妻| 欧美色人| 亚洲av青草久久一区二区| 美女性91| 欧美色图91| 91精品91久久久中77777| 四虎在线视频| 91爱| 97在线免费视频| 狠狠操使劲操| 中文字幕欧美日韩三级| 亚洲天堂男人网| 91丨人妻丨国产丨丝袜| 午夜精品久久久久久久久久久久久 | 久久嫩草| 欧美综合网在线| 91性色| 淫荡网址| 亚洲AV秘无码一区..| 91久久免费视频互動交流| 妇女性内射冈站HDWWWCOM| 操一操摸一摸| 亚洲美女自拍偷拍视频| 婬女免费一二三区A片| 91狠狠综合久久久| 蜜桃臀av在线观看| 亚洲免费精品一区| 污污污8888| 久久天天摸| 久久综合精品一区二区三区| 嗯嗯啊好大| 精久久久| 91综合无码| 免费成人自拍视频在线| 精品视频免费在线一区| 亚洲最大网站av| 精品超碰国产| 黄色大片一区二区密桃丝袜| 又黄又粗又硬又长又大| 欧美最婬乱婬爆婬性视频 | 91麻豆天美| 天天色,天天干,天天干| 日韩中文字幕在线视频观看| 五月综合激情| 综合激情97| 久久一二三四五六七八九区区区| 亚洲免费精品一区| 东北操逼| 亚洲欧洲激情卡通另类文学四射小说网站| 男人天堂网址| 国产操偷| 69人妻人人揉人人躁人人精品| 久超超碰| 91精品91久久久久77777| 91夜色| A 天堂在线观看视频| 草草影院在线视频| 天天天天天天天天综合| 日本亚洲嫩草影院啪啪| 亚洲另类小说卡通动漫| 在线一道啪| 小草精彩毛片| www久久精品| 亚洲国产av中文字幕久久| 午夜国产成人福利视频| 神马久久久久久久久久久久| 96国产精品| 370p日韩欧美亚洲精品| 色婷婷av在线观看| 天堂亚洲精品久久老牛| 久久久久97| www网站黄| 白丝jkav| 日本精品一区二区三区四区的功能| 精品亚洲国产成人av网站| 青青草日逼视频| 老熟妇一区二区三区| 色y情视频免费看| 99操99| 欧美日日网| 92大香蕉| 在线可观看的黄色网址| 麻豆人妻少妇在线免费观看| 很黄很污的免费网站| 91天堂丝袜美腿| 久久毛卡| 91激情网| 亚洲欧美国产va在线播放频| 亚洲天堂区| 蜜桃臀av一区二区| 亚洲精品人妻吞精av | 屁股久久久久久久| 志村玲子视频一区二区| 91久热| AAAAAAAAA黄片| 国厂麻豆77q4| 国产美女销魂在线观看不卡| 九九玖玖精品| 国内伊人久久久久久网站视频| 少妇滛荡视频| 一区二区三区四区五区久久久久久| 26UUU欧美激情一区二区| 国产伦精品免编号公布| 国产精品网址| 亚州情色j区| 大香蕉99999| 99热9| 亚洲在线91| 人人乐大香蕉| 亚洲成a人v欧美综合天堂下载| 久热免费视频| 欧亚日韩一区在线| 久久久久久亚洲精品中文字幕人妻| 精品传媒在线一区| 丁香六月综合激情| 久久精品久| 99久久无色码| 欧美夜夜草视频| 欧美狠狠弄| 性爱视频无打码在线观看| 国产女同性恋视频| 白天啪啪晚上啪啪视频| 伊人aaa| 五月天婷精品激情| 蜜臀99精品国产高清在线观看| www.狠狠| 91精片| 97免费视频网| 亚洲色图亚洲无码强奸乱伦| 淫纸中9区| 久碰视频| 黄色成人网久久久久久| 色天堂综合| 激情专区综合| 九久9精品| 国产老熟女| 草草网站影院白丝内射| 亚洲性高潮| 午夜激情床戏激情| 操迟操逼在巾线Fre看| 久久久久久免费电影| 日本91白丝| 人人操 欧美| 亚洲熟女少妇免费视频| 国产亚洲人妻综合日韩 久久| 国产91福利小视频在线观看| 欧洲乱码视频| 亚洲AV成人无码一区二区三区在线观看| 中文字幕成人乱码熟女精品国50 | 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 不卡一区视频| 少妇超碰在线| 97人人夜夜精品视频| 亚洲区小说| 亚洲一二三精品久久网| 中文字幕精品资源在线| 国产一级高清免费观看| 欧美大干日韩| 操久久久久久| 韩国黄片aaaa| 国产午夜在线观看| 欧美 日韩第一性色| 亚洲 中文 女同| 蜜乳AV色欲AVAV无码| 韩三级a视频在线观看| 天天综合网~91| 一区中文字幕二区日韩| JIZZJIZZ国产精品喷水| 欧美日韩性爱电影在线| 97在线观| 中文字幕第95页| 亚洲天堂另类小说男人| 涩五月婷婷| 国产美女mm131爽爽爽爽| 伊人网免费视频| 999久久芭蕾| 成人熟女区| 青青青操| 又大又白奶子| 偷拍综合网| 东京热免费视频| 强奸国产在线| 另类小说综合网| 男女一进一出视频久久| 欧美亚洲韩国视频十五区| 天美传媒AV国产在线| www老逼91| av中文字幕在线熟女| 欧美精品自慰系列寂寞少妇| 欧美五十路熟| 国产精品不卡一区二区三区av| 97伊人网| 欧美 亚洲精品首页| 精品十三区| 天天综合网久久ww| 男人的天堂2018.| http://qxhbdz.com| 久久久无码国精品无码三区三区| 国产极品99热在线播放69| 欧美黄色片在线播放| 日本成a人v网站在线观看| 色五月AV| 久久久啊啊啊| 人人妻人人爽| 日本不卡一二区| 精品国产乱码久久久A| 女人天堂网| 日本久久999| 欧美丝袜美女电影一二三四区| 亚洲日韩欧美一区二区| 中文幕97| 操死我了嗯嗯嗯| 久久久久久久久久久999| 久久蜜色情在线视频xxx免费观看| 国产人伦精品一区二区三区| 久久免费中文字幕在线观看| 婷婷五月丁香五月| 色97| 91麻豆天美国产| 午夜福利区| 秋霞午夜视频一区二区| 国产二区三区粉嫩在线| 国产乱青青草久久| 淫穴高潮色图| 亚洲 欧美综合| 妇女一区二区三区| 天美精品原创av片国产| 国产v亚洲v日韩v欧美v片另类| 凹凸视频在线一区二区| 黄色成年| 亚洲国产精品无石码久久| 黄片视频观看| 久久黄色性爱视频| 国产亚洲色婷婷久久99精品91葵花宝典| 在线观看亚洲专区| 伊人9| 精品久久久久9999| 自拍欧美| 亚洲在钱| 亚洲第一男人天堂| 亚洲欧美天堂| 亚洲 欧美 偷拍 唯美| 久久riav中文精品| 大香蕉五月天| 激情综合久久| 91黑丝露脚| 人妻酒店出差被中出免费在线播放| 噜噜噜久久亚洲精品色情| 亚洲欧美91√| 91精片| 日韩人妻有码免费视频| 国产精品午夜高潮呻吟久久av| 污啪啪啪视频| 久操操| 天天欧美| 亚洲国产av中文字幕久久| 嫩草影院在线观看精品| 天堂蜜桃无码视频一区二区| 国产美女激情| 夜夜夜爽www精品视频| TS人妖另类精品视频系列 | 久久精品国产亚洲妲己影视| 另类小色呦| 超91综合网| 99久久9| 丰满欧美放荡少妇在线| 精品高潮| 亚洲aV无码成人在线观看| 97超碰美国| 亚洲女人毛茸茸91| 国产精品久久久久无码Av网曝门| 久久久久久久亚洲Av无码| 亚洲日韩AV视色| 在线小视频| 欧美色人| www.99视频| 97在线资源| 插入逼91| 91超级碰碰碰| 伊人久久亚洲色欲综合网站 | 欧美大香蕉同搞| 国产视频一区二区在线观看| 插入粉嫩少妇视频| www.亚洲成人一区| 好淫网一二三视区| 老司机福利社视频在线观看| ji熟女.com| 日本加靬比网站发布页| 蜜桃天美传媒AV一区二区三区| 国产一区二区三三视频| 熟女日韩| 蜜臀AV一区二区三区| 色呦呦呦在线观看视频| a人欧美综合天堂麻豆| 一区二区视频在看| 在线性黄高清免费视频| 日本中文字幕一区| 欧美人与动性人交a| 久久99黄色卞西瓜| 欧美 色 亚洲| a级成人毛片免费视频高清| 亚洲爱爱视频一区二区| 免费αV在线视频| 精品一区二区啪啪啪| 欧美色九九| 婷婷五月成人| 素人伊尹大香蕉免费下载视频| 操逼1区| 久久人妻少妇| 精品亚洲一区在线观看| 色月天AV导航| 国产精品白领在线观看| 色婷婷综合网站| 四季av一区二区凹凸精品小说| 亚洲国产麻豆一区二区三区| 蜜臀久久99精品久久久久久久久| 97网址97| 欧美丝袜制服久久| 欧美,亚洲,日韩,v,天堂,手机在线观看| 国产亚洲精品美女久久久久久2021| 欧美精品丝袜久久久中文字幕| 91福利网在线观看| 日韩精品9999| 国产成人亚洲精品无| 大鸡巴久久久| 在线视频免费观看午夜| 大香蕉啪啪啪| 激情小说亚洲| 天天综合有色网| 欧美日韩亚洲一区二区在线观看| 91麻豆天美传媒HD| 在线国产福利网址导航| 激情四射婷婷六月天| 日韩精品永久在线观看| 熟妇人妻精品一区二区| 97视频观看| 另类亚洲一区二区三区| 中文字幕第23区| 日本午夜福利影院| 婷婷激情丁香| 毛片视频白嫩| 午夜爽爽爽在线观看永久入口姬片| 青青草国产一区二区三区| 国产农村一一级特黄毛片| 久九色| 久久、1234| 国产中文大片资源中文字幕| 精品中文一区二区| 亚洲久热| 插入逼91| 蘋果手機免費看成人Av| 综合色播| 成人五月天丁香激情综合| 97碰碰日本乱偷人妻中文的| 国产67194| 国产一区二区三区白丝| 亚洲色图第四色| 婷婷色一区| 亚州免费啪啪视频| 久久久久成人网| 日韩中文字幕av在线播放| 免费看日产一区二区三区| 亚洲欧美91√| 久久99草| 丁香五月偷拍| 欧美性爱精品七区| 久久久久久无码人妻中文字幕| 天天综合AV| 亚洲一卡2卡3卡4卡乱码网站 | 91色花堂| 色阁阁AV综合网| 91亚·色| 亚洲色 国产 欧美 日韩| 96久久久| 亚洲 中文 欧美 日韩 在线| 一区二区三区四区五区高清无码永久视频| 欧美午夜视频免费观看| 97免费在线观看| 啊啊啊在线看| 强上我不卡卡| 天天日夜夜爽| 岛国黄色大片网站| 在线综合 亚洲 欧美中文字幕| 91操熟妇| 欧美影音在线| 日本啊啊啊啊啊视频| 91超级碰| 精品视频免费在线一区| 一区二区影视| 射丝袜大香蕉| 9热9热综合网| 色色激情五月天| 综合操逼| 男人天堂黄片| 乱抡国产91| 好涩综合| 中文字幕第7页| 97超碰国产亚洲精品| 欧美亚洲se91| 久久9 9 9精品| 97国产超湿| 成人情色一区二区| 黄aaaaaaaaaaaaaaaaaa色网站| 欧美aa一级片| 久久精品日韩| 91午夜无码| 国产精品久久久久无码Av网曝门 | 欧美精品二区视频在线| 欧美在线天堂| 97精品在线视频| 亚洲a色| 亚洲男人天堂视频| 久久久精| 日韩欧美久久婷婷网站| 亚洲欧美视| 亚州大图综合色图| 国产av色网| 青青草在线视频播放器| 欧美在线大香999| 久久华人网| 男人的天堂VA| 亚洲不雅视频1区二区| 男人的天堂日韩| 欧美,日韩,中文,另类|