久久久91-久久久91精品国产一区二区-久久久91精品国产一区二区三区-久久久999国产精品-久久久999久久久精品

最新廣告
關(guān)注中國(guó)自動(dòng)化產(chǎn)業(yè)發(fā)展的先行者!
工業(yè)智能邊緣計(jì)算2025年會(huì)
CAIAC 2025
2025工業(yè)安全大會(huì)
OICT公益講堂
當(dāng)前位置:首頁(yè) >> 案例 >> 案例首頁(yè)

案例頻道

基于多線程的氣象傳感器數(shù)字網(wǎng)絡(luò)化系統(tǒng)
  • 企業(yè):控制網(wǎng)     領(lǐng)域:PLC /PAC/PCC/RTU     行業(yè):建筑樓宇    
  • 點(diǎn)擊數(shù):1557     發(fā)布時(shí)間:2007-08-08 11:18:36
  • 分享到:
闡述了一種基于多線程串口通信的遠(yuǎn)程氣象監(jiān)控系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)方法,討論了在系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)時(shí)所遇到的難點(diǎn)和解決方法,并較為詳盡地分析了系統(tǒng)在實(shí)現(xiàn)中所涉及關(guān)鍵技術(shù):多線程處理技術(shù)、串行通信、數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)和socket通信技術(shù)。



1.引言

    隨著計(jì)算機(jī)技術(shù)、通信技術(shù)和數(shù)據(jù)處理技術(shù)的發(fā)展,利用計(jì)算機(jī)實(shí)現(xiàn)生成過(guò)程的自動(dòng)化成為了提高生產(chǎn)力、減輕勞動(dòng)強(qiáng)度的有效手段。其中對(duì)周?chē)h(huán)境氣象數(shù)據(jù)的實(shí)時(shí)監(jiān)控不僅與人們的生活息息相關(guān),而且對(duì)工業(yè)生產(chǎn)中設(shè)備的正常運(yùn)作也起到至關(guān)重要的作用。鑒于串行通信是計(jì)算機(jī)與其他設(shè)備進(jìn)行數(shù)據(jù)交換時(shí)經(jīng)常使用的方法之一,它具有實(shí)現(xiàn)簡(jiǎn)單,使用靈活方便,數(shù)據(jù)傳輸可靠等優(yōu)點(diǎn),因此基于串口通信技術(shù),構(gòu)建一個(gè)多線程的氣象監(jiān)控系統(tǒng)是有十分有必要的。

    本文采用串口通信的方式接收由溫度、濕度傳感器采集到當(dāng)前環(huán)境參數(shù),利用Visual C++ 6.0提供的Windows API實(shí)現(xiàn)對(duì)串口的控制,采用多線程以及雙緩沖隊(duì)列技術(shù)可以實(shí)時(shí)獲取采集數(shù)據(jù)、本地存儲(chǔ)采集處理;同時(shí)還利用Socket通信技術(shù)使采集數(shù)據(jù)傳送到遠(yuǎn)程監(jiān)控中心,進(jìn)行數(shù)據(jù)分析濾波處理以及數(shù)據(jù)庫(kù)的存儲(chǔ),并繪制出相應(yīng)的P—T曲線。

2.軟件系統(tǒng)設(shè)計(jì)方案

    本系統(tǒng)由本地采集計(jì)算和遠(yuǎn)程監(jiān)控中心構(gòu)成一個(gè)C/S結(jié)構(gòu)監(jiān)控系統(tǒng)。在環(huán)境惡劣的工業(yè)現(xiàn)場(chǎng),無(wú)法進(jìn)行人為的實(shí)時(shí)監(jiān)控,由硬件設(shè)備采集環(huán)境氣象參數(shù)首先發(fā)送給本地計(jì)算機(jī),然后傳送給遠(yuǎn)程監(jiān)控中心進(jìn)行處理。本地采集計(jì)算機(jī)利用Visual C++ 6.0提供的Windows API實(shí)現(xiàn)對(duì)串口的操作。主要包括串口通信、設(shè)備控制、數(shù)據(jù)存儲(chǔ)等模塊,操作方便,人機(jī)界面簡(jiǎn)單清晰。在應(yīng)用過(guò)程中,首先需要設(shè)定串口配置參數(shù),如波特率、數(shù)據(jù)位、奇偶校驗(yàn)等,串口初始化后,程序開(kāi)始運(yùn)行,采集到的數(shù)據(jù)同時(shí)被保存在擴(kuò)展名為.txt文件中。然后通過(guò)Socket的通信方式把采集到的數(shù)據(jù)傳送給遠(yuǎn)程監(jiān)控中心,由它來(lái)進(jìn)行數(shù)據(jù)在數(shù)據(jù)庫(kù)中的存儲(chǔ),以及數(shù)據(jù)平滑濾波處理,并繪制出P—T曲線。整個(gè)系統(tǒng)實(shí)現(xiàn)流程如圖1所示。
  
3.程序設(shè)計(jì)思想

    當(dāng)前,一般的MCU都內(nèi)置了串口的硬件控制模塊,用戶通過(guò)查詢和中斷的方法編寫(xiě)比較簡(jiǎn)單的控制程序就可以使用串口通信。但是,本系統(tǒng)要求在接收數(shù)據(jù)采集設(shè)備發(fā)送大量數(shù)據(jù)的同時(shí)完成對(duì)己接收到數(shù)據(jù)的實(shí)時(shí)存儲(chǔ),如何處理好二者之間的關(guān)系,保證不會(huì)造成數(shù)據(jù)的缺失和程序的崩潰是程序設(shè)計(jì)的一個(gè)難點(diǎn)。本文重點(diǎn)對(duì)串口通信程序進(jìn)行了改進(jìn),盡量做到不因?yàn)榇谕ㄐ庞绊懻麄€(gè)系統(tǒng)的性能。

    Window的最大特征之一是設(shè)備無(wú)關(guān)性,使得Window程序員不用對(duì)硬件直接進(jìn)行操作。利用Window的SDK提供完備的API函數(shù)和以中斷方式驅(qū)動(dòng)的通信程序,可以更加簡(jiǎn)化串口通信編程。而且Window系統(tǒng)是搶先式的多任務(wù)操作系統(tǒng),使得應(yīng)用程序能夠同時(shí)執(zhí)行多個(gè)任務(wù),即在一個(gè)進(jìn)程中可以同時(shí)運(yùn)行多個(gè)線程,系統(tǒng)可以不停的在多個(gè)線程之間切換。所以在串行通訊程序中應(yīng)用多線程就可以簡(jiǎn)化應(yīng)用程序的結(jié)構(gòu),把一些復(fù)雜的運(yùn)算放在后臺(tái)并行執(zhí)行,從而大大提高應(yīng)用程序的響應(yīng)實(shí)時(shí)能力。

    串口通信程序的輸出與輸入是兩個(gè)需要并發(fā)執(zhí)行的操作。如果由主線程獨(dú)自完成所有的工作,即在的單線程情況下,程序可能會(huì)不定期地鎖定。因此,為了具備實(shí)時(shí)響應(yīng)的能力和提高程序的效率,本文的串口通信程序程序設(shè)計(jì)如圖2所示。



 圖2 串口程序設(shè)計(jì)示意圖

    應(yīng)用程序創(chuàng)建了輸出與輸入兩個(gè)子線程共同完成通信任務(wù)。而又由于串口發(fā)送和接收的數(shù)據(jù)是相對(duì)獨(dú)立的,故可將其分開(kāi),設(shè)置兩個(gè)緩沖區(qū),一個(gè)是發(fā)送緩沖區(qū)m_TxQueue,另一個(gè)是接收緩沖區(qū)m_RxQueue,并為每個(gè)緩沖區(qū)分別設(shè)置兩個(gè)指針,一個(gè)指向輸出線程將要發(fā)送的數(shù)據(jù),另一個(gè)指向輸入線程將要從緩沖區(qū)讀取數(shù)據(jù)的起始位置。這種方式稱之為采用雙緩沖隊(duì)列的方法,保證了無(wú)關(guān)數(shù)據(jù)的順序操作。

    3.1 多線程的設(shè)計(jì)

    線程是進(jìn)程內(nèi)的一條執(zhí)行路徑.它包含獨(dú)立的堆棧和CPU寄存器。每個(gè)線程共享所有的進(jìn)程資源,包括打開(kāi)的文件、信號(hào)標(biāo)識(shí)及動(dòng)態(tài)分配的內(nèi)存等等。一個(gè)進(jìn)程內(nèi)的所有線程使用同一個(gè)32位地址空間,而這些線程的執(zhí)行由系統(tǒng)調(diào)度程序控制,調(diào)度程序決定哪個(gè)線程可執(zhí)行和什么時(shí)候執(zhí)行線程。線程有優(yōu)先級(jí)別,優(yōu)先權(quán)較低的線程必須等到優(yōu)先權(quán)較高的線程執(zhí)行完仃務(wù)后再執(zhí)行。在VC++6.0中的MFC應(yīng)用程序的線程是由CwinThread對(duì)象來(lái)表示,該線程分::用戶界面線程(GUI-Thread)和工作者線程(Worker-Thread)。用戶界面線程能夠提供界面和用戶交互,用于處理用戶輸入和響應(yīng)各種信息和事件;工作者線程沒(méi)有消息循環(huán),主要用來(lái)處理應(yīng)用程序的后臺(tái)任務(wù)。本文所采用的串口操作線程即為工作者線程。程序通過(guò)調(diào)用AfxBejinThread()函數(shù)自動(dòng)創(chuàng)建一個(gè)CwinThread對(duì)象,通過(guò)響應(yīng)己設(shè)置好的一組事件句柄來(lái)啟動(dòng)一個(gè)線程的執(zhí)行。

    3.1.1 輸出線程

    輸出線程比較簡(jiǎn)單,它只為串口的寫(xiě)操作創(chuàng)建一個(gè)OVERLAPPED結(jié)構(gòu),并設(shè)置一組事件的句柄。它可響應(yīng)的事件有刪除線程事件、寫(xiě)請(qǐng)求事件及中斷請(qǐng)求事件,然后線程進(jìn)入主循環(huán),等待三個(gè)事件之一的發(fā)生,以便采取適當(dāng)?shù)男袆?dòng)。例如當(dāng)檢測(cè)到寫(xiě)請(qǐng)求事件時(shí),表明輸出緩沖區(qū)內(nèi)有一些數(shù)據(jù)等待發(fā)送,輸出線程便會(huì)試圖發(fā)送傳送隊(duì)列中的所有數(shù)據(jù)。在寫(xiě)操作進(jìn)行時(shí),如果端口比較忙就會(huì)進(jìn)入重疊模式。此時(shí)WriteFile( )返回FALSE,用GetLastError( )可以發(fā)現(xiàn)當(dāng)前錯(cuò)誤是ERROR_ IO_ PENDING,意味著重疊I/O操作已經(jīng)開(kāi)始了。若是刪除線程消息到來(lái),輸出線程將跳出循環(huán),關(guān)閉事件句柄,最后結(jié)束線程。

    3.1.2輸入線程

    輸入線程較為復(fù)雜一些,它既要處理串口數(shù)據(jù)的讀操作,又要處理串口狀態(tài)的讀取。而且由于輸入的數(shù)據(jù)是隨機(jī)到達(dá)的,所以輸入線程必須一直讀。輸入線程首先要?jiǎng)?chuàng)建兩個(gè)OVERLAPPED結(jié)構(gòu),用于讀數(shù)據(jù)和獲得通信事件,并為它們分別創(chuàng)建兩個(gè)事件。然后輸入線程要響應(yīng)四個(gè)需要監(jiān)視的事件:刪除線程事件、讀信息事件、狀態(tài)信息事件和讀請(qǐng)求事件設(shè)置事件句柄。接著輸入線程便進(jìn)入主循環(huán),直到刪除線程的消息到來(lái)才退出。只要輸入緩沖區(qū)有空間可用,輸入線程就會(huì)一直讀發(fā)送過(guò)來(lái)的數(shù)據(jù)。與輸出一樣,如果讀操作失敗了,而且返回的錯(cuò)誤代碼是ERROR_ IO_ PENDING,意味著還在進(jìn)行讀的重疊操作。輸入線程在等待數(shù)據(jù)輸入的同時(shí),也在等待傳入的事件。在輸入線程里可以用SetCommMask( )函數(shù)建立事件掩模來(lái)監(jiān)視特定通信資源上的事件。如圖:



圖3 輸入線程示意圖

    在應(yīng)用程序中,輸出線程只是簡(jiǎn)單的一直調(diào)用WaitForMu1tip1e0bject()等待事件的發(fā)生,并以一個(gè)Switch Case語(yǔ)句為每個(gè)已發(fā)生事件提供處理方案。輸入線程的工作繁重許多,它分別調(diào)用ReadFile()和WaitCommEvent( )接收數(shù)據(jù)和通信狀態(tài)。如果接收到的是數(shù)據(jù),輸入線程將它保存到指定位置。如果是通信狀態(tài),輸入線程將它交給其它函數(shù)判斷狀態(tài)內(nèi)容,指引程序下一步的活動(dòng)。ReadFile()和WaitCommEvent ()都是在重疊模式下工作,其步驟與輸出線程相同。

    3.1.3 線程同步
   
    在串口通信程序中,輸入緩沖區(qū)和輸出緩沖區(qū)能夠被多個(gè)線程訪問(wèn)。它們用于在程序的主線程和輸入、輸出線程之間傳送數(shù)據(jù)塊。當(dāng)端口上出現(xiàn)一些操作時(shí),主線程和輸入、輸出線程會(huì)經(jīng)常訪問(wèn)這兩個(gè)對(duì)象。如果兩個(gè)線程同時(shí)處理緩沖區(qū),就會(huì)產(chǎn)生不正確的數(shù)據(jù),這就破壞了數(shù)據(jù)的完整性。C++提供了信號(hào)量( Semaphore)、互斥對(duì)象(Mutex)、臨界區(qū)(Critical Section)等手段來(lái)保護(hù)這些數(shù)據(jù)對(duì)象,防止兩個(gè)線程在同一時(shí)間訪問(wèn)同一數(shù)據(jù)。保持在同一個(gè)進(jìn)程內(nèi)的線程工作協(xié)調(diào)一致(線程同步)。其中,臨界區(qū)是一種保證在一個(gè)時(shí)間只有一個(gè)線程訪問(wèn)數(shù)據(jù)集的非常簡(jiǎn)單的方法。當(dāng)你使用臨界區(qū),你就給了線程一個(gè)它們必須共享的對(duì)象。任何擁有臨界區(qū)對(duì)象的線程可以訪問(wèn)被保護(hù)起來(lái)的數(shù)據(jù),其它線程必須等待直到第一個(gè)線程釋放了臨界區(qū)對(duì)象。此后其它線程可以按照順序搶占臨界區(qū)對(duì)象,訪問(wèn)數(shù)據(jù)。因?yàn)榫€程只有擁有臨界區(qū)對(duì)象才能訪問(wèn)數(shù)據(jù),而且在一個(gè)時(shí)刻只有一個(gè)線程可以擁有臨界區(qū)對(duì)象,所以決不會(huì)出現(xiàn)一個(gè)時(shí)刻有多個(gè)線程訪問(wèn)數(shù)據(jù)的現(xiàn)象。

    考慮到本文所設(shè)計(jì)的通信緩沖區(qū)既不允許多個(gè)線程同時(shí)訪問(wèn),又不必供其它進(jìn)程的線程訪問(wèn)。因此,臨界區(qū)是串口通信程序多線程同步最有效的辦法。  
  
    3.2 雙緩沖隊(duì)列的設(shè)計(jì)
   
    為了提高效率,本文把緩沖區(qū)數(shù)據(jù)存儲(chǔ)在標(biāo)準(zhǔn)C++庫(kù)中的deque<char>對(duì)象中,它作為一種優(yōu)化的存儲(chǔ)容器支持元素的添加和刪除。它能高效地插入未知數(shù)量的對(duì)象,并且插入和刪除元素時(shí)系統(tǒng)的負(fù)擔(dān)很小。根據(jù)需要,本文創(chuàng)建了兩個(gè)獨(dú)立的緩沖區(qū)對(duì)象,一個(gè)是發(fā)送緩沖區(qū)m_TxQueue,另一個(gè)是接收緩沖區(qū)m_RxQueue,并將它們置于臨界區(qū)的保護(hù)下,就能確保一次只有一個(gè)線程處理緩沖區(qū)。本文所設(shè)計(jì)的類(lèi)MThreadDeque提供了對(duì)緩沖區(qū)的各種操作,如Extract(),Clear(),Insert()等,每種操作開(kāi)始和結(jié)束的時(shí)候都要調(diào)用::EnterCriticalSection( &m_Lock )和::LeaveCriticalSection( &m_Lock ),關(guān)鍵代碼如下:

class MThreadDeque
{
protected :
    const m_iMaxSize;
    deque<char> m_Queue;
    CRITICAL_SECTION m_Lock;
public :
    MThreadDeque( int max_size ) : m_iMaxSize( max_size )
    {
        ::InitializeCriticalSection( &m_Lock );
    }   
    ~ MThreadDeque ()
    {
        ::DeleteCriticalSection( &m_Lock );
    }      
    int Insert( char c )
    {
        int return_value;
        ::EnterCriticalSection( &m_Lock );
        if ( m_Queue.size() < m_iMaxSize ) {
            m_Queue.push_back( c );
            return_value = c & 0xff;
        } else
            return_value = -1;
        ::LeaveCriticalSection( &m_Lock );
        return return_value;
    }
       ……
};
  
    3.3 網(wǎng)絡(luò)通信部分的設(shè)計(jì)

    當(dāng)工業(yè)現(xiàn)場(chǎng)環(huán)境惡劣,不適合人為操作時(shí),將硬件采集的數(shù)據(jù)傳送到遠(yuǎn)程監(jiān)控中心進(jìn)行分析和處理是十分有必要的。Socket套接字是目前最流行的網(wǎng)絡(luò)通信應(yīng)用程序接口之一,利用它可以方便地實(shí)現(xiàn)局域網(wǎng)內(nèi)的數(shù)據(jù)的傳輸,是開(kāi)發(fā)客戶機(jī)/服務(wù)器網(wǎng)絡(luò)應(yīng)用程序的重要方法。當(dāng)向一個(gè)套接字寫(xiě)入時(shí),所送數(shù)據(jù)會(huì)自動(dòng)出現(xiàn)在套接宇的另一端,另一端可能是相同機(jī)器上運(yùn)行的另一個(gè)進(jìn)程,也可能是世界上任何地方互連的一臺(tái)計(jì)算機(jī)。TCP/IP傳輸層有兩個(gè)并列的協(xié)議:T C P ( Transport Contro1 Protocol)和UDP(User Datagram Protocol)其中TCP是面向連接的,UDP是無(wú)連接的,Socket同時(shí)支持這兩種通信模式,所對(duì)應(yīng)的Socket分別為數(shù)據(jù)流Socket和數(shù)據(jù)報(bào)Socket。數(shù)抓流Socket定義了一種可靠的面向連接的服務(wù),實(shí)現(xiàn)無(wú)差錯(cuò)、無(wú)重復(fù)的順序數(shù)據(jù)傳輸;數(shù)據(jù)報(bào)Socket定義了一個(gè)無(wú)連接的服務(wù),數(shù)據(jù)通過(guò)相互獨(dú)立的包進(jìn)行傳輸,包的傳輸是無(wú)序,并且不保證是否出錯(cuò)、丟失和重復(fù)。本文采用了流式Socket來(lái)實(shí)現(xiàn)遠(yuǎn)程數(shù)據(jù)傳輸,工作過(guò)程如圖4所示。
 



 圖4 Socket通信流程圖

    3.4 VC與Sql Sever數(shù)據(jù)庫(kù)的數(shù)據(jù)交換

    VC提供一些接口,可以處理數(shù)據(jù)庫(kù)操作,主要有:開(kāi)放式數(shù)據(jù)庫(kù)連接(ODBC) ,OLE DB、ActiveXDataObject( ADO )等。ADO基于通用對(duì)象組件模型(COM),操作靈活,代碼添加少,本系統(tǒng)采用ADO操作Sql server2000數(shù)據(jù)庫(kù),主要包括四個(gè)基本步驟:

    ①COM庫(kù)的初始化,用#import指令引入ADO庫(kù)定義文件;

    ② 創(chuàng)建Connection對(duì)象指針,并用其連接Sql server2000數(shù)據(jù)庫(kù),本文通過(guò)DSN數(shù)據(jù)源對(duì)數(shù)據(jù)庫(kù)進(jìn)行連接,代碼如下:

    m_pConnection->Open("Datasource=adotest;UID=sa;PWD=;","","",adModeUnknown)。

    ③利用建立好的連接,通過(guò)Connection、Command對(duì)象執(zhí)行SQL命令,進(jìn)行創(chuàng)建表、添加記錄、添加字段等操作,或利用Recordset對(duì)象取得結(jié)果記錄集進(jìn)行查詢、處理;

    ④使用完畢后關(guān)閉連接釋放對(duì)象。

    有了以上基礎(chǔ),就可以方便的把采集來(lái)的數(shù)據(jù)按照制定的順序存放在Sql Server數(shù)據(jù)中,可以完成對(duì)數(shù)據(jù)進(jìn)行快速查詢、瀏覽和刪除等工作。

4.結(jié)論
   
    氣象數(shù)據(jù)能夠進(jìn)行可靠和實(shí)時(shí)的采集和通信是本系統(tǒng)實(shí)現(xiàn)的的關(guān)鍵所在。在系統(tǒng)的實(shí)現(xiàn)過(guò)程中,遇到許多技術(shù)問(wèn)題,如通信的可靠性、多線程之間的互斥與同步、突發(fā)性數(shù)據(jù)處理與計(jì)算機(jī)響應(yīng)速度之間的協(xié)調(diào)和系統(tǒng)性能問(wèn)題等,其中有些問(wèn)題只能在現(xiàn)場(chǎng)調(diào)試的過(guò)程中發(fā)現(xiàn)并加以解決。本系統(tǒng)的實(shí)現(xiàn)為氣象監(jiān)控系統(tǒng)的更進(jìn)一步發(fā)展提供了參考,同時(shí)對(duì)于實(shí)現(xiàn)工業(yè)監(jiān)控系統(tǒng)的集成化、自動(dòng)化具有極大的推進(jìn)作用。

參考文獻(xiàn):

    [1]李現(xiàn)勇. Visual C++串口通信技術(shù)與工程實(shí)踐[M].北京:人民郵電出版社,2002

    [2]汪翔,袁輝.Visual C++實(shí)踐與提高一網(wǎng)絡(luò)編程篇[M].北京:中國(guó)鐵道出版社,2001:167-186

    [3] 徐軍譯.Visual C++開(kāi)發(fā)人員指南[M],北京:機(jī)械工業(yè)出版社,1998

    [4] 潘愛(ài)民.VC++技術(shù)內(nèi)幕(第四版)[M].北京:清華人學(xué)出版社,1997.
    
   
Remote Weather Date Acquisition System 

    Based On Multi-thread Serial Communication Technology

    YAO lan1,GUI xun2

    (1.Department of Control Engineering, ChengDu University of Information Technology Sichuan ,610225,China)

    (2.School of Electrical Engineering, Southwest Jiao tong University, Sichuan, 610031,China)

    Abstract: The paper introduces one of remote weather data acquisition system which is designed and implemented based on multi-thread serial communication technology. With discussing the key problem and solution of this system at the stage in designing and implementing, the paper gives a elaborate analysis of multi-thread processing technology, serial communication, database accessing technology and Socket communication technology.
Key words: multi-thread, serial communication, database, Socket

    姚蘭1,桂勛2

    (1.成都信息工程學(xué)院控制工程系 成都 610225)

    (2.西南交通大學(xué)電氣工程學(xué)院  成都  610031)

熱點(diǎn)新聞

推薦產(chǎn)品

x
  • 在線反饋
1.我有以下需求:



2.詳細(xì)的需求:
姓名:
單位:
電話:
郵件:
主站蜘蛛池模板: 亚洲免费成人| 国产大量女主播精品视频| 国产欧美成人| 日韩中文字幕视频| 日本特黄特色高清免费视频| 国产免费黄色大片| 国产色网址| 啪啪综合| xxxx性×xx| 日韩a级毛片免费视频| 欧美高清色视频在线播放| 99久久国产综合精品麻豆| 日韩亚洲制服丝袜中文字幕| 91精品国产高清在线入口| 亚洲国产精品ⅴa在线观看| 国产美女福利视频| 国产90后美女露脸在线观看| 婷婷sese| 中国xxxxxxxxx孕交| 九九久久久2| 日本一级毛片免费| 中国一级黄色大片| 欧美yw193.c㎝在线观看| 国产亚洲精品bv在线观看| 影音先锋5566av资源网| 国产色图片| 国产在线欧美日韩精品一区二区| 欧美综合视频在线| 114一级毛片免费| 日韩黄色一级视频| 免费看a视频| 国产福利一区二区在线观看| 成人免费视频网址| 国产精品亚洲片在线va| 青青久久久国产线免观| 亚洲精品国产成人专区| 久久久久久综合成人精品| 亚洲精品欧美精品一区二区| 伊人久久综合成人亚洲| 国产a级特黄的片子视频免费| 国产免费久久精品|