<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                > **作者介紹** > > **Liz Looney** > > ![{%}](https://box.kancloud.cn/2015-08-31_55e3fd386f57b.png) > > Liz Looney是本書的合著者之一。她是谷歌的軟件工程師,也是谷歌“機器人工作小組”(Robotics Task Force)的成員,作為App Inventor團隊的初創成員,她領導了樂高頭腦風暴機器人(LEGO MINDSTORMS)組件的開發工作。Liz Looney是一位卓越的軟件工程師,有著超過25年的從業經歷,曾先后在Borland、Oracle及Google公司工作。 本章將創建一個應用,將Android手機變成LEGO MINDSTORMS NXT 機器人的遙控器。應用中用按鈕來控制機器人前后移動、左右轉動和停止,如果機器人遇到障礙物,它還會自動停止。應用中使用具有藍牙功能的手機與機器人通信。 LEGO MINDSTORMS機器人不只是玩具,更是教具。After-school program 使用機器人來教小學和初中的孩子們掌握解決問題的能力,并引導他們了解工程和計算機編程。NXT機器人也用于FIRST LEGO League 機器人競賽,這項比賽允許9-14歲的孩子參加。 ![{%}](https://box.kancloud.cn/2015-08-31_55e3fd3e321ac.png) NXT可編程機器人套件中有一個“NXT智能積木”主單元,它可以控制三個電機及四個輸入傳感器。你可以用樂高的構造元件、齒輪、車輪、電機和傳感器來組裝機器人。該套件自帶的軟件可以對機器人進行編程,但現在我們將用App Inventor來創建Android應用,通過藍牙連接來控制NXT機器人。 應用中參與協作的機器人具有超聲波傳感器以及用于移動的車輪,如Shooterbot 機器人。圖中所示,這款機器人通常是人們利用LEGO MINDSTORMS NXT 2.0套件建造的第一個機器人。它的左車輪與輸出端口C相連,右車輪與輸出端口B相連,顏色傳感器與輸入端口3相連,超聲波傳感器與輸入端口4相連。 ## **學習要點** 本章用到了以下組件和概念: * BluetoothClient組件:用于建立Android設備與NXT機器人之間的藍牙連接; * ListPicker組件:為用戶提供機器人選擇列表,選中后開始建立機器人到Android的連接; * NxtDrive組件:用于驅動機器人的輪子; * NxtUltrasonicSensor組件:利用機器人的超聲波傳感器探測障礙物; * Notifier組件:顯示錯誤消息。 ## **準備開始** 本章的應用需要Android 2.0或以上版本。此外,出于安全原因,藍牙設備必須首先配對才能彼此連通。在開始構建應用之前,需要按以下步驟使Android設備與NXT機器人配對: 1\. 在NXT上單擊向右箭頭,直到顯示“Bluetooth”,然后按下橙色方塊; 2\. 點擊向右的箭頭,直到顯示“Visibility”,然后按下橙色方塊; 3\. 如果“Visibility”值已設定為可見,繼續步驟4;如果不可見,請單擊向左或向右箭頭設置其值為可見; 4\. 在Android設備上,進入設置→無線與網絡; 5\. 確保打開藍牙功能; 6\. 點擊“藍牙”; 7\. 在“可用設備”中查找名為“NXT”的設備; 8\. 如果機器人名字下顯示“已配對但未連接”字樣,則配對成功!否則,繼續執行步驟9; 9\. 如果機器人名字下顯示“與此設備配對”,則點擊它; 10\. 在NXT上,要求輸入密碼,按下橙色方塊接受1234為密碼; 11\. 在Android上,也會要求輸入PIN碼,輸入1234,然后按確定; 12\. 現在應該看到“已配對但未連接。”,說明配對成功! > ![](https://box.kancloud.cn/2015-08-31_55e3fd43aca5c.png) 注意:如果你曾經修改過機器人的名字,則尋找機器人現在的名字,而非“NXT”。 連接到App Inventor網站,創建新項目“NXTRemoteControl”,將設置屏幕的標題為“遙控機器人”,并連接測試手機。 ## **設計組件** 在這個應用中,我們需要分別創建可見組件及不可見組件,并分別定義它們的行為。 ### **不可見組件** 在創建用戶界面之前,先來創建表12-1中的不可見組件,如圖12-1所示,用來控制NXT。 **表12-1 NXT“機器人遙控”應用中的不可見組件** | 組件類型 |面板中分組 | 命名 | 作用 | | --- | --- | --- | --- | | BluetoothClient| Connectivity | BluetoothClient1 |建立Android與NXT的連接 | | NxtDrive | LEGO? MINDSTORMS? | NxtDrive1 |驅動機器人的輪 | | NxtUltrasonicSensor | LEGO? MINDSTORMS? |NxtUltrasonicSensor1 | 檢測障礙物 | | Notifier | User Interface | Notifier1 | 顯示錯誤信息 | ![{%}](https://box.kancloud.cn/2015-08-31_55e3fd490a4db.png) **圖 12-1 在組件設計器底部顯示的不可見組件** 按以下方式設置組件的屬性: 1\. 設置NxtDrive1及NxtUltrasonicSensor1的BluetoothClient屬性為 BluetoothClient1;(說明輪子的驅動與障礙物的偵測都需要依賴藍牙通信——譯者注) 2\. 勾選NxtUltrasonicSensor1的BelowRangeEventEnabled屬性(近距離偵測障礙物功能可用); 3\. 設置NxtDrive1的DriveMotors屬性 * 如果機器人的左輪電機與輸出端口C連接,右輪電機與輸出端口B連接,則保持默認設置“CB”; * 如果機器人的配置與上述不同,則將DriveMotors屬性設置為兩個字母的文本,其中第一個字母是連接左輪電機的輸出端口,第二個字母是連接右輪電機的輸出端口。 4\. 設置NxtUltrasonicSensor1的SensorPort屬性 * 如果機器人的超聲波傳感器與輸入端口4連接,則保持默認值“4”; * 如果機器人的配置與上述不同,則將SensorPort設置為與超聲波傳感器連接的輸入端口。 ### **可視組件** 現在創建用戶界面組件,如圖12-2所示。 ![{%}](https://box.kancloud.cn/2015-08-31_55e3fd4e979bf.png) **圖 12-2 組件設計器中的應用** 建立藍牙連接時,Android設備需要訪問NXT機器人具有唯一性的藍牙地址,但藍牙地址由8個用冒號分隔的2位數的十六進制數(二進制數的另一種表示方式)組成,輸入起來異常麻煩,而且每次運行應用都要在手機上輸入該地址。為了減少麻煩,使用ListPicker來顯示已經與手機配對的機器人列表(列表項的值為機器人的名稱及藍牙地址),并從中選擇一個。 使用按鍵來驅動機器人的前進、后退、左右轉動、停止和斷開連接,使用VerticalArrangement來放置除ListPicker以外的所有組件,用HorizontalArrangement來放置左右轉向及停車按鈕。 按照表12-2中列出的組件來創建圖12-2所示的用戶界面。 **表12-2 NXT機器人控制器應用中的可見組件** | 組件類型 | 面板中分組 | 命名 | 作用 | | --- | --- | --- | --- | | ListPicker | User Interface | ConnectListPicker |選擇要連接的機器人 | | VerticalArrangement | layout | VerticalArrangement1 |布局容器,容納除ListPicker之外的組件 | | Button | User Interface | ForwardButton | 前進 | | HorizonalArrangement | layout | HorizonalArrangement1 |布局容器,容納左轉、右轉、停止按鈕 | | Button | User Interface | LeftButton | 左轉 | | Button | User Interface | StopButton | 停止 | | Button | User Interface | RightButton | 右轉 | | Button| User Interface | BackwardButton | 后退 | | Button | User Interface | DisconnectButton| 與NXT斷開連 | 按照圖12-2所示來設置可視組件布局:將LeftButton、StopButton和RightButton放在HorizontalArrangement1中,將ForwardButton、HorizontalArrangement1、BackwardButton和DisconnectButton放在VerticalArrangement1中。 按下列方式設置組件屬性: 1\. 取消勾選Screen1的Scrollable屬性(滾屏功能); 2\. 設置ConnectListPicker和DisconnectButton的寬度為“Fill parent”; 3\. 設置VerticalArrangement1、ForwardButton、HorizontalArrangement1、LeftButton、StopButton、RightButton及BackwardButton的Width與Height為“Fill parent”; 4\. 設置ConnectListPicker的Text屬性為“連接”; 5\. 設置ForwardButton的Text屬性為“∧”; 6\. 設置LeftButton的Text屬性為“<”; 7\. 設置StopButton的Text屬性為“—”; 8\. 設置RightButton的Text屬性為“>”; 9\. 設置BackwardButton的Text屬性為“∨”; 10\. 設置DisconnectButton的Text屬性為“斷開連接”; 11\. 設置ConnectListPicker和DisconnectButton的FontSize屬性為30; 12\. 設置ForwardButton、LeftButton、StopButton、RightButton及BackwardButton的FontSize屬性為40。 在這類應用中,當手機與NXT建立藍牙連接之前,應該隱藏用戶的操作界面,為此取消勾選VerticalArrangement1的Visible屬性。不要擔心,當NXT連通后,將重新顯示用戶界面。 ## **為組件添加行為** 本節將編程來設置應用的行為,包括: * 用戶從列表中選擇機器人,并與之建立連接; * 斷開機器人與應用的連接; * 使用控制按鈕來操控機器人; * 在機器人偵測到障礙物時,讓它停下來。 ### **連接到NXT機器人** 添加第一個行為:連接到NXT。點擊 ConnectListPicker將顯示已配對的機器人列表,選中一個,將在應用與機器人之間建立藍牙連接。 ### **顯示機器人列表** 使用ConnectListPicker組件來顯示機器人列表。ListPicker的外表像按鈕,被點擊后則顯示列表項,并允許進行單選。 使用BluetoothClient1.AddressesAndNames塊來提供列表,列表項是已經與Android設備配對的藍牙設備的名稱及地址。由于NXT已經將輪驅動及超聲波組件的BluetoothClient屬性設定為BluetoothClient1,因此AddressesAndNames屬性列表中的設備會自動限定為這類機器人,其他類型的藍牙設備(如耳機)將不會出現在列表中。表12-3列出了所需要的塊。 **表12-3 在應用中添加ListPicker列表所需要的塊** |塊的類型 | 所在抽屜 | 作用 | | --- | --- | --- | | ConnectListPicker.BeforePicking | ConnectListPicker |當ConnectListPicker被點擊時,觸發該事件 | | set ConnectListPicker.Elements to | ConnectListPicker |為ConnectListPicker設置可供選擇的列表項 | #### **塊的作用** 點擊ConnectListPicker將觸發ConnectListPicker.BeforePicking事件,并顯示可選項列表。將ConnectListPicker.Elements屬性設置為 BluetoothClient1.AddressesAndNames塊,來設定可選項;ConnectListPicker將顯示已經與Android設備配對的機器人列表。 ![{%}](https://box.kancloud.cn/2015-08-31_55e3fd4f13d9d.png) **圖 12-3 顯示機器人列表** > ![](https://box.kancloud.cn/2015-08-31_55e3fd4f79e4c.png) 測試:在手機上點擊“連接”,看看會發生什么,你會看到所有已經與手機配對的機器人列表。 如果只見黑屏,說明手機尚未與任何機器人配對;如果見到其他藍牙設備,如藍牙耳機,說明 NxtDrive1與 NxtUltrasonicSensor1的BluetoothClient屬性設置有誤。 ### **建立藍牙連接** 從列表中選擇一個機器人,應用將通過藍牙與機器人連接。如果連接成功,用戶界面將發生變化:隱藏ConnectListPicker,并顯示用戶界面的其余部分。如果機器人開關沒有打開,則連接失敗,會彈出錯誤信息。 使用call BluetoothClient1.Connect塊與機器人進行連接。ConnectListPicker.Selection屬性提供了選中機器人的地址和名稱信息。 使用ifelse塊來測試連接是否成功。ifelse塊需要連接三個不同的塊:“if”、“then”及“else”。“if”與BluetoothClient1.Connect塊連接,“then”區域放置連接成功時要執行的塊;“else”區域放置連接失敗時要執行的塊。 如果連接成功,使用Visible屬性來隱藏 ConnectListPicker并顯示VerticalArrangement1(其中放置了除ConnectListPicker之外的所有組件)。如果連接失敗,則使用Notifier1.ShowAlert塊來顯示錯誤信息。表12-4列出了設置上述行為所需的塊。 **表12-4與機器人建立藍牙連接所需的塊** | 塊的類型 | 所在抽屜 | 作用 | | --- | --- | --- | | ConnectListPicker.AfterPicking | ConnectListPicker |當從ConnectListPicker選中一個機器人時觸發| | ifelse | Control | 檢驗藍牙連接是否成功 | | call BluetoothClient1.Connect | BluetoothClient1 |連接到機器人 | | ConnectListPicker.Selection | ConnectListPicker |選中的機器人的地址及名稱 | | set ConnectListPicker.Visible to | ConnectListPicker|隱藏ConnectListPicker按鈕 | | false | Logic | 插入set ConnectListPicker.Visible to塊 | | set VerticalArrangement1.Visible to | VerticalArrangement | 顯示“連接”按鈕之外的所有組件 | | true | Logic | 插入set VerticalArrangement1.Visible to塊 | | Notifier1.ShowAlert | Notifier1 | 用來彈出錯誤信息 | | “無法建立藍牙連接。” | Text | 錯誤信息。 | #### **塊的作用** 選中機器人后將觸發ConnectListPicker.AfterPicking事件,見圖12-4,BluetoothClient1.Connect塊用于建立與機器人之間的藍牙連接。如果連接成功,執行“then”塊:隱藏ConnectListPicker按鈕并顯示VerticalArrangement1內的所有組件,即,設置ConnectListPicker.Visible屬性為false,設置VerticalArrangement1.Visible屬性為true。如果連接失敗,執行“else”塊:用Notifier1.ShowAlert塊彈出錯誤信息。 ![{%}](https://box.kancloud.cn/2015-08-31_55e3fd54c9699.png) **圖 12-4 建立藍牙連接** ### **與NXT斷開連接** 讓Android設備與NXT機器人連接著實讓人興奮,不過“斷開連接”是我們下面要添加的行為,這樣便于對連接與斷開進行連續測試。 當點擊DisconnectButton時,應用將關閉藍牙連接,用戶界面將發生變化:ConnectListPicker按鈕將重新出現,而用戶界面上的其余組件將被隱藏。 表12-5列出了構建BluetoothClient1.Disconnect(斷開藍牙連接)所需的塊。設置Visible屬性來顯示 ConnectListPicker按鈕并隱藏VerticalArrangement1中包含的所有組件。 **表12-5 與機器人斷開連接所需的塊** | 塊的類型 | 所在抽屜 | 作用 | | --- | --- | --- | | DisconnectButton.Click | DisconnectButton |當點擊DisconnectButton時觸發該事件 | | BluetoothClient1.Disconnect | BluetoothClient1 |斷開與機器人的藍牙連接 | | set ConnectListPicker.Visible to | ConnectListPicker|顯示ConnectListPicker(“連接”按鈕) | | true | Logic | 插入set ConnectListPicker.Visible to塊 | | set VerticalArrangement1.Visible to | VerticalArrangement | 隱藏用戶界面上的其余組件 | | false | Logic | 插入set VerticalArrangement1.Visible to | #### **塊的作用** 點擊DisconnectButton將觸發DisconnectButton.Clicked事件,如圖12-5所示,斷開藍牙連接要用BluetoothClient1.Disconnect塊,之后設置ConnectListPicker.Visible屬性為true來顯示 ConnectListPicker,設置VerticalArrangement1.Visible屬性為false來隱藏VerticalArrangement1。 ![{%}](https://box.kancloud.cn/2015-08-31_55e3fd552a414.png) **圖 12-5 與機器人斷開連接** > ![](https://box.kancloud.cn/2015-08-31_55e3fd4f79e4c.png) 測試:請確保機器人已經打開,點擊手機上的“連接”按鈕,并選擇要連接的機器人。建立藍牙連接需要一點時間。一旦連接成功,用戶界面將顯示機器人的控制按鈕,以及“斷開連接”按鈕。 單擊“斷開連接”按鈕:控制機器人的按鈕會消失,“連接”按鈕則重新出現。 ### **操控機器人** 下面是真正有趣的部分:添加前進、后退、左右轉動及停止行為。不要忘記“停止”,否則你手中的機器人會失去控制! NxtDrive組件提供了五個塊,用來驅動機器人的電機: * MoveForwardIndefinitely塊:驅動兩個電機前進; * MoveBackwardIndefinitely塊:驅動兩個電機后退; * TurnCounterClockwiseIndefinitely塊:驅動機器人左轉:讓右側電機向前而左側電機后退; * TurnClockwiseIndefinitely塊:驅動機器人右轉:讓左側電機向前而右側電機后退; * Stop將停止電機。 每個移動及轉向塊都有一個Power參數,需要與數字塊配合使用,來設定機器人電機的輸出功率,取值范圍可以從 0到100。但如果設置的功率太小,電機會發出吱吱聲而不運轉。在本例中建議使用90(百分比)。表12-6中列出了所需的塊。 **表12-6 用于控制機器人的塊** | 塊的類型 | 所在抽屜 | 作用 | | --- | --- | --- | | ForwardButton.Clic | ForwardButton|點擊ForwardButton時觸 | | NxtDrive1.MoveForwardIndefinitely | NxtDrive1 |驅動機器人前進 | | 數字90 | Math | 功率值 | | BackwardButton.Click | BackwardButton |點擊BackwardButton時觸發 | | NxtDrive1.MoveBackwardIndefinitely | NxtDrive1 |驅動機器人后退 | | 數字90 | Math | 功率值 | | LeftButton.Click | LeftButton | 點擊LeftButton時觸發 | | NxtDrive1.TurnCounterClockwiseIndefinitely | NxtDrive1 |驅動機器人逆時針轉動 | | 數字90 | Math | 功率值 | | RightButton.Click | RightButton | 點擊RightButton時觸發 | | NxtDrive1.TurnClockwiseIndefinitely | NxtDrive1 |驅動機器人順時針轉動 | | 數字90 | Math | 功率值 | | StopButton.Click | StopButton | 點擊StopButton時觸發 | | NxtDrive1.Stop | NxtDrive1 | 讓機器人停止 | #### **塊的作用** 如圖12-6所示,點擊ForwardButton按鈕時觸發ForwardButton.Clicked事件,此時調用NxtDrive1.MoveForwardIndefinitely塊,讓機器人以90%的功率前進,其余按鈕的事件處理程序與此類似,并以相同的功率驅動機器人后退及左右轉動。點擊StopButton時觸發StopButton.Clicked事件,調用NxtDrive1.Stop塊讓機器人停止運動。 ![{%}](https://box.kancloud.cn/2015-08-31_55e3fd6ae8611.png) **圖 12-6 操控機器人** > ![](https://box.kancloud.cn/2015-08-31_55e3fd4f79e4c.png) 測試:按照此前的“測試”說明,先連接NXT機器人。不要將機器人放在桌子上,以免跌落,然后測試以下行為: > > 1\. 點擊前進按鈕,機器人應該向前移動; > > 2\. 點擊后退按鈕,機器人應該向后移動; > > 3\. 點擊左轉按鈕,機器人應逆時針轉動; > > 4\. 點擊右轉按鈕,機器人應順時針轉動; > > 5\. 點擊停止按鈕,機器人應停止。 > > 如果機器人不動并發出吱吱聲,可能需要加大電機的功率,可以用最大功率100。 ### **用超聲波傳感器探測障礙物** 使用超聲波傳感器的機器人可以偵測到30厘米范圍內的障礙物,遇到障礙物時機器人會像罪犯一樣停下來,如圖12-7所示。 ![{%}](https://box.kancloud.cn/2015-08-31_55e3fd75ab082.png) **圖 12-7 為NXT機器人設置障礙** NxtUltrasonicSensor組件用于偵測障礙物,兩個屬性BottomOfRange和TopOfRange用來定義偵測范圍(以厘米為單位)。默認設定BottomOfRange為30厘米,TopOfRange為90厘米。 NxtUltrasonicSensor組件具有三個事件BelowRange、WithinRange及boveRange,當偵測到障礙物在BottomOfRange(下限)距離以內時,會觸發BelowRange事件;當障礙物的距離在BottomOfRange與TopOfRange (上下限)之間時,會觸發WithinRange事件;當障礙物的距離超過TopOfRange(上限)時,將觸發AboveRange事件。 這里使用NxtUltrasonicSensor1.BelowRange事件塊,用來偵測30厘米以內的障礙物,如果你想嘗試偵測不同距離的障礙物,可以調整BottomOfRange屬性。當BelowRange時間發生時,使用NxtDrive1.Stop塊讓機器人停下來。表12-7中列出了所需的塊 **表12-7 使用NxtUltrasonicSensor需要的塊** | 塊的類型 | 所在抽屜 | 作用 | | --- | --- | --- | | NxtUltrasonicSensor1.BelowRange | NxtUltrasonicSensor1 |超聲波傳感器在30厘米內遇到障礙物時觸發 | | NxtDrive1.Stop | NxtDrive1 | 讓機器人停下來 | #### **塊的功能** 當機器人的超聲波傳感器偵測到30厘米以內的障礙物時,NxtUltrasonicSensor1.BelowRange事件被觸發,如圖12-8所示,此時NxtDrive1.Stop塊讓機器人停下來。 ![{%}](https://box.kancloud.cn/2015-08-31_55e3fd7bba9bd.png) **圖 12-8 偵測障礙物** > ![](https://box.kancloud.cn/2015-08-31_55e3fd4f79e4c.png) 測試:按照此前的“測試”說明,先連接NXT機器人。引導機器人朝著障礙物(如貓)的方向前進,機器人將在距離貓30厘米時停下來。如果機器人沒停下來,可能是貓已經遠離了機器人,它們之間的距離一直大于30厘米。可以換一個靜止的障礙物來進行測試。 ## **改進** 應用運行起來,想必你已經花了大量時間來操控這個機器人,不過還是想繼續其他的嘗試: * 調節驅動電機的輸出功率: * 可以修改插入到前進(MoveForwardIndefinitely)、后退(MoveBackwardIndefinitely)、左轉(TurnCounterclockwiseIndefinitely)及右轉(TurnClockwiseIndefinitely) 塊中的數字塊的值。 * 當偵測到障礙物時,使用NxtColorSensor讓紅燈閃爍: * 可以使用NxtColorSensor組件及其GenerateColor屬性; * 需要將DetectColor屬性設置為false(或在組件設計器取消勾選該屬性),因為顏色傳感器無法同時檢測和產生顏色。 * 使用Android的方向傳感器OrientationSensor來控制機器人。 * 使用樂高的構造元件建立手機與機器人之間的物理連接,創建應用實現機器人的自主性。 ## **小結** 以下是本章涵蓋的內容: * ListPicker組件:讓用戶可以從已配對的機器人列表中進行選擇; * BluetoothClient組件:使Android設備與機器人建立連接; * Notifier組件:用來顯示錯誤消息; * Visible屬性:用于隱藏或顯示用戶界面中的組件; * NxtDrive組件:可以控制機器人的移動、轉向及停止; * NxtUltrasonicSensor組件:用于偵測障礙物。 ### **外部鏈接** [LEGO MINDSTORMS EV3控制程序](http://blog.sina.com.cn/s/blog_6210c9730101jqui.html) [Android應用控制LEGO EV3(Video)](http://blog.sina.com.cn/s/blog_62218b990101k4yr.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看