国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

基于HarmonyOS控制Hi3861小車之信息通信

開發(fā) 前端 OpenHarmony
本節(jié)主要詳細(xì)講述一下通信關(guān)鍵技術(shù),考慮到TCP/UDP協(xié)議的特性,兩者間通過UDP進(jìn)行通信是一種必然的選擇,UDP一種無連接的協(xié)議。

[[422670]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

引言

在鴻蒙應(yīng)用實(shí)際開發(fā)中,經(jīng)常會(huì)遇到App與IOT設(shè)備間的通信,本節(jié)主要詳細(xì)講述一下通信關(guān)鍵技術(shù),考慮到TCP/UDP協(xié)議的特性,兩者間通過UDP進(jìn)行通信是一種必然的選擇,UDP一種無連接的協(xié)議,具有資源消耗小,處理速度快的優(yōu)點(diǎn),了解UDP是怎么通信的,這對(duì)于每一個(gè)HarmonyOS開發(fā)者也是需要了解的重點(diǎn)知識(shí)。

核心類

DatagramSocket、DatagramPacket、EventHandler,下面分別簡(jiǎn)單介紹下:

1.DatagramSocket:

構(gòu)造器DatagramSocket(int port, InetAddress laddr):創(chuàng)建一個(gè)DatagramSocket實(shí)例,并將該對(duì)象綁定到指定IP地址、指定端口。主要方法receive(DatagramPacket p):從該DatagramSocket中接收數(shù)據(jù)報(bào),send(DatagramPacket p):以該DatagramSocket對(duì)象向外發(fā)送數(shù)據(jù)報(bào)。

2.DatagramPacket:

構(gòu)造器DatagramPacket(byte[] buf, int length, InetAddress addr, int port):以一個(gè)包含數(shù)據(jù)的數(shù)組來創(chuàng)建DatagramPacket對(duì)象,創(chuàng)建該DatagramPacket對(duì)象時(shí)還指定了IP地址和端口--這就決定了該數(shù)據(jù)報(bào)的目的地。

3.EventHandler:

是HarmonyOS用于處理線程間通信的一種機(jī)制,可以通過EventRunner創(chuàng)建新線程,將耗時(shí)的操作放到新線程上執(zhí)行。這樣既不阻塞原來的線程,任務(wù)又可以得到合理的處理。比如:主線程使用EventHandler創(chuàng)建子線程,子線程做耗時(shí)的下載圖片操作,下載完成后,子線程通過EventHandler通知主線程,主線程再更新UI。

功能介紹

通過App Demo控制小車運(yùn)動(dòng)(前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、停止),主要通過UDP數(shù)據(jù)包發(fā)送命令,來說明它們間是怎么通信的,它們間控制命令以json格式發(fā)送。

如:

  1. "mode""CarControl",//控制命令分類 
  2.     "cmd""forward"//具體命令 
  3. }。 

開發(fā)指南

1、創(chuàng)建UDP協(xié)議的發(fā)送命令對(duì)象

  1. private UdpManager() { 
  2.         try { 
  3.             mGpsDatagramSocket = new DatagramSocket(); 
  4.         } catch (SocketException e) { 
  5.             e.printStackTrace(); 
  6.         } 
  7.     } 

2、將要發(fā)送的數(shù)據(jù)封裝成DatagramPacket對(duì)象發(fā)送

  1. DatagramPacket sRequest = new DatagramPacket(mInfoArray, mInfoArray.length, 
  2. InetAddress.getByName(getIp()), PORT); 
  3. // 開始發(fā)送 
  4. mGpsDatagramSocket.send(sRequest); 

3、構(gòu)造發(fā)送的命令

  1. public void sendMessage(String info) { 
  2.         Gson gson = new Gson(); 
  3.         WifiCommand messageInfo = new WifiCommand(); 
  4.         messageInfo.setCmd(info); 
  5.         //控制類型 
  6.         messageInfo.setMode(); 
  7.         //轉(zhuǎn)換成json 
  8.         String resultJson = gson.toJson(messageInfo); 
  9.         // 創(chuàng)建發(fā)送命令SendMessageRunnable對(duì)象 
  10.         mSendMessageRunnable = new SendMessageRunnable(); 
  11.         mSendMessageRunnable.setInfoArray(resultJson.getBytes(StandardCharsets.UTF_8)); 
  12.         // 啟動(dòng)發(fā)送命令線程 
  13.         mEventHandler.postTask(mSendMessageRunnable); 
  14.         if ("stop".equals(info) || "tripod_on".equals(info) || "tripod_off".equals(info)){ 
  15.             HiLog.info(label, "info = " + info); 
  16.         } else { 
  17.             // 啟動(dòng)發(fā)送Gps請(qǐng)求線程和接收信息線程 
  18.             startReceive(); 
  19.             startSendGpsMessage(); 
  20.         } 
  21.         HiLog.info(label, "sendMessage = " + resultJson); 
  22.     } 

實(shí)現(xiàn)效果

基于HarmonyOS控制Hi3861小車之信息通信-鴻蒙HarmonyOS技術(shù)社區(qū)

附上主要源代碼

1. MainAbilitySlice

  1. public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener{ 
  2.     private Button iTurnUp,iTurnDown,iTurnLeft,iTurnRight,iTurnRun; 
  3.  
  4.     private UdpManager udpManager; 
  5.     @Override 
  6.     public void onStart(Intent intent) { 
  7.         super.onStart(intent); 
  8.         super.setUIContent(ResourceTable.Layout_ability_main); 
  9.         initComponent(); 
  10.         // 初始化WiFi控制對(duì)象 
  11.         udpManager = UdpManager.getInstance(this); 
  12.     } 
  13.  
  14.     private void initComponent(){ 
  15.         iTurnUp = (Button) findComponentById(ResourceTable.Id_i_up); 
  16.         iTurnUp.setClickedListener(this); 
  17.  
  18.         iTurnDown = (Button) findComponentById(ResourceTable.Id_i_down); 
  19.         iTurnDown.setClickedListener(this); 
  20.  
  21.         iTurnLeft = (Button) findComponentById(ResourceTable.Id_i_left); 
  22.         iTurnLeft.setClickedListener(this); 
  23.  
  24.         iTurnRight = (Button) findComponentById(ResourceTable.Id_i_right); 
  25.         iTurnRight.setClickedListener(this); 
  26.  
  27.         iTurnRun = (Button) findComponentById(ResourceTable.Id_i_run); 
  28.         iTurnRun.setClickedListener(this); 

 2. UdpManager

  1. /** 
  2.  * UDP連接類 
  3.  */ 
  4. public class UdpManager { 
  5.     private static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x00134, "UdpManager"); 
  6.     private static final int PORT = 48100; 
  7.     private static final int GET_MESSAGE = 1; 
  8.     private static UdpManager sUdpManager; 
  9.     private static Context sContext; 
  10.     private UdpReceiveCallback mReceiveInformationCallback; 
  11.     private ReceiveMessageRunnable mReceiveMessageRunnable; 
  12.     private SendGpsMessageRunnable mSendGpsMessageRunnable; 
  13.     private SendMessageRunnable mSendMessageRunnable; 
  14.     private DatagramSocket mGpsDatagramSocket; 
  15.     private static  String ip = "192.168.0.1"
  16.  
  17.     /** 
  18.      * 控制是否還需要接收信息控制器 
  19.      */ 
  20.     private boolean flag = false
  21.  
  22.     private final EventHandler mEventHandler = new EventHandler(EventRunner.create()) { 
  23.         @Override 
  24.         protected void processEvent(InnerEvent event) { 
  25.             super.processEvent(event); 
  26.             if (event.eventId == GET_MESSAGE) { 
  27.                 if (mReceiveInformationCallback != null) { 
  28.                     mReceiveInformationCallback.getMessage(event.object); 
  29.                 } 
  30.             } 
  31.         } 
  32.     }; 
  33.  
  34.     private final EventHandler mReceiveEventHandler = new EventHandler(EventRunner.create()) { 
  35.     }; 
  36.  
  37.     private final EventHandler mSendGpsEventHandler = new EventHandler(EventRunner.create()) { 
  38.     }; 
  39.  
  40.     /** 
  41.      * UdpManager的單例 
  42.      * 
  43.      * @return UdpManager單例對(duì)象 
  44.      */ 
  45.     public static UdpManager getInstance(Context context) { 
  46.         if (sUdpManager == null) { 
  47.             sUdpManager = new UdpManager(); 
  48.             sContext = context; 
  49.         } 
  50.         return sUdpManager; 
  51.     } 
  52.  
  53.     /** 
  54.      * 構(gòu)造函數(shù) 
  55.      */ 
  56.     private UdpManager() { 
  57.         // 創(chuàng)建UDP協(xié)議的發(fā)送命令對(duì)象 
  58.         try { 
  59.             mGpsDatagramSocket = new DatagramSocket(); 
  60.         } catch (SocketException e) { 
  61.             e.printStackTrace(); 
  62.         } 
  63.     } 
  64.  
  65.     /** 
  66.      * 注冊(cè)接收信息的回調(diào)函數(shù) 
  67.      * 
  68.      * @param callback 接收信息回調(diào)函數(shù) 
  69.      */ 
  70.     public void registerCallback(UdpReceiveCallback callback) { 
  71.         mReceiveInformationCallback = callback; 
  72.     } 
  73.  
  74.     /** 
  75.      * 對(duì)外提供的發(fā)送命令方法 
  76.      * 
  77.      * @param info 需要發(fā)送的命令 
  78.      */ 
  79.     public void sendMessage(String info) { 
  80.         Gson gson = new Gson(); 
  81.         UdpCommand messageInfo = new UdpCommand(); 
  82.  
  83.         // 傳進(jìn)來的控制命令 
  84.         messageInfo.setCmd(info); 
  85.  
  86.         //控制類型 
  87.         messageInfo.setMode(); 
  88.  
  89.         //轉(zhuǎn)換成json 
  90.         String resultJson = gson.toJson(messageInfo); 
  91.  
  92.         // 創(chuàng)建發(fā)送命令SendMessageRunnable對(duì)象 
  93.         mSendMessageRunnable = new SendMessageRunnable(); 
  94.         mSendMessageRunnable.setInfoArray(resultJson.getBytes(StandardCharsets.UTF_8)); 
  95.  
  96.         // 啟動(dòng)發(fā)送命令線程 
  97.         mEventHandler.postTask(mSendMessageRunnable); 
  98.  
  99.         // 啟動(dòng)發(fā)送Gps請(qǐng)求線程和接收信息線程 
  100.         if ("stop".equals(info)) { 
  101.             HiLog.info(label, "info = " + info); 
  102.         } else { 
  103.             // 啟動(dòng)發(fā)送Gps請(qǐng)求線程和接收信息線程 
  104.             startReceive(); 
  105.             startSendGpsMessage(); 
  106.         } 
  107.         HiLog.info(label, "sendMessage = " + resultJson); 
  108.     } 
  109.  
  110.     public String getIp() { 
  111.         return ip; 
  112.     } 
  113.  
  114.  
  115.     public void setIp(String mIp) { 
  116.         this.ip = mIp; 
  117.     } 
  118.  
  119.     /** 
  120.      * 內(nèi)部類,用作發(fā)送命令 
  121.      */ 
  122.     private class SendMessageRunnable implements Runnable { 
  123.         private byte[] mInfoArray; 
  124.  
  125.         void setInfoArray(byte[] infoArray) { 
  126.             mInfoArray = infoArray; 
  127.         } 
  128.  
  129.         @Override 
  130.         public void run() { 
  131.             HiLog.info(label, "發(fā)送線程 = " + Thread.currentThread().getName()); 
  132.  
  133.             // 發(fā)送數(shù)據(jù) 
  134.             try { 
  135.                 // 延時(shí)發(fā)送50毫秒,因?yàn)槿绻谎訒r(shí)會(huì)將小車卡死 
  136.                 Thread.sleep(50); 
  137.  
  138.                 // 將要發(fā)送的數(shù)據(jù)封裝成DatagramPacket對(duì)象 
  139.                 DatagramPacket sRequest = new DatagramPacket(mInfoArray, mInfoArray.length, 
  140.                         InetAddress.getByName(getIp()), PORT); 
  141.  
  142.                 // 開始發(fā)送 
  143.                 mGpsDatagramSocket.send(sRequest); 
  144.             } catch (IOException | InterruptedException e) { 
  145.                 e.printStackTrace(); 
  146.                 HiLog.info(label, "sendMessage error"); 
  147.             } 
  148.         } 
  149.     } 
  150.  
  151.     /** 
  152.      * 內(nèi)部類,用作接收命令 
  153.      */ 
  154.     private class ReceiveMessageRunnable implements Runnable { 
  155.  
  156.         @Override 
  157.         public void run() { 
  158.             try { 
  159.                 while (flag) { 
  160.                     byte[] buf = new byte[1024]; 
  161.                     DatagramPacket receiveDatagramPacket = new DatagramPacket(buf, buf.length); 
  162.                     if (mGpsDatagramSocket != null && !mGpsDatagramSocket.isClosed()) { 
  163.                         HiLog.info(label, "接收線程開始阻塞" + Thread.currentThread().getName()); 
  164.  
  165.                         // 接收返回?cái)?shù)據(jù),會(huì)阻塞線程 
  166.                         mGpsDatagramSocket.receive(receiveDatagramPacket); 
  167.  
  168.                         // 將得到的數(shù)據(jù)轉(zhuǎn)成json 
  169.                         String json = new String(receiveDatagramPacket.getData(), StandardCharsets.UTF_8); 
  170.                         json = json.substring(json.indexOf("{"), json.lastIndexOf("}")+1); 
  171.                         HiLog.info(label, "receiveMessage json = " + json); 
  172.  
  173.                         // 將對(duì)象發(fā)送給需要接收返回值的地方 
  174.                         mEventHandler.sendEvent(InnerEvent.get(GET_MESSAGE, json)); 
  175.                     } 
  176.                 } 
  177.             } catch (IOException e) { 
  178.                 e.printStackTrace(); 
  179.                 HiLog.error(label, "receiveMessage error"); 
  180.             } 
  181.         } 
  182.     } 
  183.  
  184.     /** 
  185.      * 內(nèi)部類,用作發(fā)送請(qǐng)求Gps命令 
  186.      */ 
  187.     private class SendGpsMessageRunnable implements Runnable { 
  188.  
  189.         @Override 
  190.         public void run() { 
  191.             Gson gson = new Gson(); 
  192.             UdpCommand messageInfo = new UdpCommand(); 
  193.  
  194.             // 傳進(jìn)來的控制命令 
  195.             messageInfo.setCmd("getinfo"); 
  196.  
  197.             //控制類型 
  198.             messageInfo.setMode(); 
  199.  
  200.             //轉(zhuǎn)換成json 
  201.             String resultJson = gson.toJson(messageInfo); 
  202.  
  203.             byte[] infoArray = resultJson.getBytes(StandardCharsets.UTF_8); 
  204.  
  205.             try { 
  206.                 // 將要發(fā)送的數(shù)據(jù)封裝成DatagramPacket對(duì)象 
  207.                 DatagramPacket sRequest = new DatagramPacket(infoArray, infoArray.length, 
  208.                         InetAddress.getByName(getIp()), PORT); 
  209.  
  210.                 // 開始發(fā)送 
  211.                 mGpsDatagramSocket.send(sRequest); 
  212.  
  213.                 // 啟動(dòng)獲取Gps命令線程 
  214.                 mSendGpsEventHandler.postTask(mSendGpsMessageRunnable, 2000); 
  215.                 HiLog.info(label, "發(fā)送gps"); 
  216.             } catch (IOException e) { 
  217.                 e.printStackTrace(); 
  218.             } 
  219.         } 
  220.     } 
  221.  
  222.     /** 
  223.      * 啟動(dòng)接收消息 
  224.      */ 
  225.     private void startReceive() { 
  226.         if (!flag) { 
  227.             flag = true
  228.  
  229.             // 創(chuàng)建接收命令ReceiveMessageRunnable對(duì)象 
  230.             mReceiveMessageRunnable = new ReceiveMessageRunnable(); 
  231.  
  232.             // 啟動(dòng)接收命令線程 
  233.             mReceiveEventHandler.postTask(mReceiveMessageRunnable); 
  234.             HiLog.info(label, "開啟接收線程"); 
  235.         } 
  236.     } 
  237.  
  238.     /** 
  239.      * 開始獲取gps點(diǎn) 
  240.      */ 
  241.     private void startSendGpsMessage() { 
  242.         // 創(chuàng)建發(fā)送Gps命令SendGpsMessageRunnable對(duì)象 
  243.         if (mSendGpsMessageRunnable == null) { 
  244.             mSendGpsMessageRunnable = new SendGpsMessageRunnable(); 
  245.         } 
  246.  
  247.         // 啟動(dòng)獲取Gps命令線程 
  248.         mSendGpsEventHandler.postTask(mSendGpsMessageRunnable); 
  249.         HiLog.info(label, "開啟發(fā)送gps請(qǐng)求線程"); 
  250.     } 

 3. UdpCommand

  1. class UdpCommand { 
  2.     // 控制命令:forward,back,leftright 
  3.     private String cmd; 
  4.     // 控制類型 
  5.     private String mode; 
  6.  
  7.     public String getCmd() { 
  8.         return cmd; 
  9.     } 
  10.  
  11.     void setCmd(String cmd) { 
  12.         this.cmd = cmd; 
  13.     } 
  14.  
  15.     public String getMode() { 
  16.         return mode; 
  17.     } 
  18.  
  19.     void setMode() { 
  20.         this.mode = "CarControl"
  21.     } 

 4. UdpReceiveCallback

  1. /** 
  2.  * 接收小車返回?cái)?shù)據(jù)的回調(diào)函數(shù) 
  3.  */ 
  4. public interface UdpReceiveCallback { 
  5.     void getMessage(Object value); 

 5. xml布局文件

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     ohos:height="match_parent" 
  5.     ohos:width="match_parent" 
  6.     ohos:alignment="center" 
  7.     ohos:orientation="vertical"
  8.  
  9.     <DirectionalLayout 
  10.         ohos:height="70vp" 
  11.         ohos:width="match_parent" 
  12.         ohos:orientation="horizontal" 
  13.         ohos:layout_alignment="center" 
  14.         ohos:top_margin="10vp" > 
  15.         <Button 
  16.             ohos:id="$+id:i_up" 
  17.             ohos:height="50vp" 
  18.             ohos:width="120vp" 
  19.             ohos:background_element="#FF9F9F9F" 
  20.             ohos:left_margin="60vp" 
  21.             ohos:text_size="25fp" 
  22.             ohos:text="前進(jìn)"/> 

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2020-11-03 11:39:22

wifi小車

2020-10-30 09:41:44

鴻蒙Hi3861WiFi小車

2022-03-15 15:00:59

Hi3861Pin接口鴻蒙

2022-05-30 15:21:27

Hi3861TCP通信

2020-10-16 09:50:37

Hi3861WiFi熱點(diǎn)

2023-07-25 10:42:39

鴻蒙遙控3861小車

2022-09-07 15:35:49

設(shè)備開發(fā)鴻蒙

2020-11-02 12:07:11

鴻蒙 GPIO

2023-05-26 16:07:14

Hi3861Wifi模塊

2020-10-28 10:00:09

海思Hi3861CentOS鴻蒙LiteOS

2021-09-16 10:03:39

鴻蒙HarmonyOS應(yīng)用

2020-12-15 11:57:49

Hi3861 HarmonyOS開發(fā)板

2022-03-07 15:05:58

HTTPHi3861數(shù)據(jù)解析

2020-10-14 09:41:02

Hi3861GPIO點(diǎn)燈

2020-11-30 13:57:48

Hi3861

2020-12-17 10:02:16

鴻蒙Hi3861開發(fā)板

2021-02-02 15:52:17

鴻蒙HarmonyOS應(yīng)用開發(fā)

2020-12-31 12:22:15

鴻蒙Hi3861應(yīng)用開發(fā)

2020-11-06 10:15:16

HiBurn

2020-10-14 09:37:03

HiBurn鴻蒙.bin文件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

777av视频| 欧美日韩国产不卡在线看| 91精品国产91久久久久游泳池| 激情综合色播激情啊| 国产成人avxxxxx在线看| 色婷婷成人网| 日韩av中文字幕在线播放| caoporn国产精品免费视频| 亚洲天堂网中文字| 成人一区二区三| 久久这里只精品最新地址| 男女啪啪免费视频网站| 麻豆国产精品一区二区三区| 久久久亚洲综合网站| 一精品久久久| 国产成人91久久精品| 精品国产导航| 美女福利视频一区| 精品中文字幕一区二区三区| 色偷偷av一区二区三区| 91精品影视| 色久欧美在线视频观看| 欧美一级大黄| 最新日韩中文字幕| 欧美黄色一级| 欧美国产精品日韩| 精品少妇一区| 91精品国产综合久久香蕉| 久久福利综合| 欧美日韩国产综合在线| 亚洲精品日产aⅴ| 亚洲欧美一区二区三区在线播放| 粉嫩绯色av一区二区在线观看 | 国产成人精品福利一区二区三区| 亚洲最大成人| 中文子幕无线码一区tr| 精品视频偷偷看在线观看| 熟女视频一区二区三区| 三上悠亚亚洲一区| 一个色综合av| 国产97在线|日韩| 国产一区二区区别| 欧美少妇一区二区三区| 91麻豆精品| 欧美日韩亚洲视频| 成年人视频在线看| 亚洲黄色在线看| 人人精品久久| 国产成人97精品免费看片| 欧美涩涩网站| 这里只有精品66| 日本一区二区三区国色天香| 在线观看理论片| 亚洲国产精品成人va在线观看| 欧美激情啪啪| 成人网在线免费看| 日本成人精品| 国产精品一区二区三区免费视频| 99免费精品在线| 一区二区在线高清视频| 久久先锋资源网| 精品999视频| 亚洲欧美综合v| 亚洲盗摄视频| 成人国产精品免费观看动漫| 日韩欧美激情一区| 成人aaaa| 国产亚洲激情视频在线| 亚洲人成网www| 亚洲成人av动漫| 国产精品久久久久久久久免费相片| 色av男人的天堂免费在线| 亚洲欧洲日本专区| 日韩一区二区在线| 免费观看中文字幕| 欧美日韩国产精品一区二区三区四区 | 国产精品美女免费看| 一区二区三区国产盗摄| 欧美成人xxxxx| 欧美精品粉嫩高潮一区二区| 哺乳挤奶一区二区三区免费看| 乱一区二区三区在线播放| 国产精品丝袜久久久久久app| 黄色精品在线观看| 日本免费久久高清视频| 国内精品免费**视频| 亚洲男人都懂的网站| 久久夜色撩人精品| 日韩**一区毛片| 中文字幕在线中文字幕二区| 久热精品视频在线观看一区| 91av免费观看91av精品在线| 日韩av中文字幕一区二区| 亚洲欧美在线精品| 欧美视频一二三| 中文字幕伦理免费在线视频| 国产精品美女久久久久久免费 | 日韩视频在线视频| 天天综合网天天综合色| 99久久999| 国产精品久久成人免费观看| 午夜av区久久| 亚洲精选av| 久久久天堂国产精品| 91麻豆精品国产91| 欧美激情另类| 人人澡人一摸人人添| 色老头一区二区三区| 男女性色大片免费观看一区二区| 日韩有码电影| 国产精品三级网站| 欧美国产激情二区三区 | 日韩一卡二卡三卡四卡| 亚洲一区二区| 玖玖在线免费视频| 高清欧美性猛交| 久久久五月婷婷| 精品51国产黑色丝袜高跟鞋| 日本一区二区三区四区高清视频| 国产精品久久久久影院| 国产欧美日韩小视频| 91精品麻豆日日躁夜夜躁| 婷婷精品进入| 国产男小鲜肉同志免费| 欧美巨大黑人极品精男| 国产九区一区在线| 日韩精品在线电影| 久久这里只有精品视频网| 欧美精品少妇| 亚洲精品天天看| 麻豆一区二区三| 一级在线视频| 久久精品国产亚洲| 精品一区二区三区欧美| 青青热久免费精品视频在线18| 欧美日韩中文在线视频| 国产欧美日韩中文| 欧美日本啪啪无遮挡网站| 国产成人午夜99999| 深夜av在线| 日韩.欧美.亚洲| 亚洲精品久久视频| 国产三级一区二区| 羞羞的视频在线看| 中文字幕在线乱| 日韩www在线| 一区在线观看| 欧洲美女少妇精品| 国产精品扒开腿做爽爽爽视频| 国产精品1区2区3区| 三级视频网站在线| 国产精品av电影| 国产午夜三级一区二区三| 红杏视频成人| 大片免费播放在线视频| 欧美交换配乱吟粗大25p| 国产主播在线一区| 米奇精品一区二区三区在线观看| 青青艹视频在线| 欧美日韩精品久久久免费观看| 日韩电视剧免费观看网站| 免费在线亚洲| av电影免费在线看| 缅甸午夜性猛交xxxx| 91国内产香蕉| 色久综合一二码| 日韩成人伦理电影在线观看| 国产亚洲一区二区手机在线观看| www.亚洲天堂网| 成人国产精品久久久| 日韩欧美久久一区| av不卡一区二区三区| 国产影视一区| 免费毛片在线看片免费丝瓜视频 | av文字幕在线观看| 男人天堂成人网| 91国自产精品中文字幕亚洲| 色综合久久88色综合天天| 久久成人久久爱| 蜜桃tv一区二区三区| 超碰超碰在线| 色婷婷综合网站| 欧美日韩精品中文字幕一区二区| 久久精品国产一区二区三区| 岛国精品视频在线播放| 国产精品一区二区视频| 精品国产美女| 九色porny自拍视频在线播放| 久草在线资源网站| 狠狠色狠狠色综合日日五| 亚洲级视频在线观看免费1级| 日韩小视频在线观看| 日本一区二区三区四区视频| 国产精品88a∨| 成人av电影在线观看| 亚洲精品www久久久| 欧美亚洲国产日本| 国产在线精品播放| 亚洲欧洲午夜一线一品| 激情久久av一区av二区av三区|