久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4650|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

WIFI模塊開發(fā)教程之W600連云篇1:onenet三色燈項(xiàng)目mqtt篇①

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:67175 發(fā)表于 2019-9-16 18:11 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
前言

本文研究如何使用RT_Thread onenet組件將設(shè)備連接到中移onnet云平臺(tái),onenet組件提供多種方式連接云平臺(tái),本文使用mqtt方式連接,完成一個(gè)三色燈項(xiàng)目。

一、理論基礎(chǔ)

1.onenet平臺(tái)介紹

OneNET定位為PaaS服務(wù),即在物聯(lián)網(wǎng)應(yīng)用和真實(shí)設(shè)備之間搭建高效、穩(wěn)定、安全的應(yīng)用平臺(tái):面向設(shè)備,適配多種網(wǎng)絡(luò)環(huán)境和常見傳輸協(xié)議,提供各類硬件終端的快速接入方案和設(shè)備管理服務(wù);面向企業(yè)應(yīng)用,提供豐富的API和數(shù)據(jù)分發(fā)能力以滿足各類行業(yè)應(yīng)用系統(tǒng)的開發(fā)需求,使物聯(lián)網(wǎng)企業(yè)可以更加專注于自身應(yīng)用的開發(fā),而不用將工作重心放在設(shè)備接入層的環(huán)境搭建上,從而縮短物聯(lián)網(wǎng)系統(tǒng)的形成周期,降低企業(yè)研發(fā)、運(yùn)營和運(yùn)維成本。

中移OneNET是中國移動(dòng)基于物聯(lián)網(wǎng)技術(shù)和產(chǎn)業(yè)特點(diǎn)打造的開放平臺(tái)和生態(tài)環(huán)境,將面向智能家居、可穿戴設(shè)備、車聯(lián)網(wǎng)、移動(dòng)健康、智能創(chuàng)客等多個(gè)領(lǐng)域開放。

以上介紹過于官方,我來從開一個(gè)開發(fā)者的視角說下哈,目前onnet是國內(nèi)比較早的一批做云的平臺(tái),論壇十分活躍,各種技術(shù)分享資料層出不窮,非常適合希望了解物聯(lián)網(wǎng)的朋友深入學(xué)習(xí),下圖是目前onenet社區(qū)的會(huì)員和帖子總體情況:


二 、使用實(shí)例

1.云端創(chuàng)建產(chǎn)品

接下來咱們進(jìn)入正題,首先需要在云端創(chuàng)建一個(gè)產(chǎn)品,步驟如下:

  • 創(chuàng)建產(chǎn)品

登錄onenet官網(wǎng),注冊一個(gè)賬號(hào),地址:https://open.iot.10086.cn,點(diǎn)進(jìn)開發(fā)者中心,創(chuàng)建產(chǎn)品,產(chǎn)品配置信息如下:

注意;操作系統(tǒng)這里使用RT_Thread,沒有此選項(xiàng),選用linux即可
  • 創(chuàng)建數(shù)據(jù)點(diǎn)

數(shù)據(jù)流模板->添加數(shù)據(jù)流模板


創(chuàng)建產(chǎn)品數(shù)據(jù)點(diǎn),此處創(chuàng)建power和color兩個(gè)數(shù)據(jù)點(diǎn),power表示總開關(guān),power為0時(shí)候,燈關(guān)閉;power不為0的時(shí)候,color數(shù)值起作用,用以選擇不同模式。
  • 創(chuàng)建后臺(tái)顯示數(shù)據(jù)面板

應(yīng)用管理->獨(dú)立應(yīng)用->添加應(yīng)用

注意:紅色、綠色、藍(lán)色按鈕和顏色顯示圖片均鏈接color數(shù)據(jù)點(diǎn),顏色顯示圖片僅顯示左右,按鈕可以下發(fā)選擇不同的燈顏色。
到此為止,我們已經(jīng)完成了產(chǎn)品的創(chuàng)建工作,接下來將要處理設(shè)備接入問題。

2.設(shè)備SDK移植

  • 下載onenet組件包

打開包管理工具,進(jìn)入RT-Thread online packages/IOT-internet of things目錄,選擇Paho MQTT、webClient、cJSON組件,如下所示:


選擇IOT Cloud --->進(jìn)入配置頁面,將創(chuàng)建的產(chǎn)品信息配置進(jìn)去,onenet配置信息如下:

注意:選擇Enable OneNET automatic register device,設(shè)備可以注冊到云端,而不需要每個(gè)設(shè)備都手動(dòng)在平臺(tái)注冊,然后把設(shè)備信息再寫入設(shè)備中,這樣一來將為工廠產(chǎn)線減少工作量,解決燒錄容易出現(xiàn)設(shè)備信息寫錯(cuò)等問題。
  • 下載fal、easyflash組件

這兩個(gè)組件主要是用來存放設(shè)備自動(dòng)注冊獲取的設(shè)備認(rèn)證信息,下次設(shè)備啟動(dòng)檢測是否含有設(shè)備信息,如果有可以直接進(jìn)行mqtt連云,否則需要重新注冊。
進(jìn)入RT-Thread online packages/system packages目錄,選擇fal組件,如下所示:


進(jìn)入RT-Thread online packages/tools packages目錄,選擇easyflash組件,如下所示:


  • 移植fal、easyflash組件

在w60x路徑下新建ports文件夾,然后在ports下創(chuàng)建兩個(gè)移植組件fal和easyflash,注意fal下SConscrip指定Group名字為fal和packages/fal-latest中對應(yīng),easyflash亦然;至于移植細(xì)節(jié),之后會(huì)另行介紹,現(xiàn)在著重開發(fā)項(xiàng)目。
  • 修改onenet組件

    a.修改函數(shù)指針:cmd_rsp_cb
    函數(shù)指針cmd_rsp_cb指向一個(gè)函數(shù),用來接收onenet下發(fā)的數(shù)據(jù),RT_Thread中的處理方式是云端下發(fā)數(shù)據(jù)后,通過調(diào)用onenet_mqtt.cmd_rsp_cb,將數(shù)據(jù)拋給應(yīng)用層的一個(gè)函數(shù),并通過參數(shù)uint8_t **resp_data獲取應(yīng)用層處理后的結(jié)果,緊接著返回給onenet;我這里所作的修改是用戶自行控制上發(fā)數(shù)據(jù),因此不需要原函數(shù)中后兩個(gè)參數(shù),此外增加了char *topic_name,字段,因?yàn)橛脩糇约嚎刂粕蠄?bào)數(shù)據(jù)時(shí)候,需要區(qū)分?jǐn)?shù)據(jù)是云端下發(fā)的相應(yīng)還是設(shè)備觸發(fā)的主動(dòng)上報(bào)。
                                                                       

    設(shè)備主動(dòng)上報(bào)topic_name是$dp,需要調(diào)用:
    send_mq_msg("$dp", send_msg.data_ptr, send_msg.data_size);

    設(shè)備應(yīng)答云端下發(fā)的topic_name通過cmd_rsp_cb對應(yīng)的回調(diào)函數(shù)可以獲得,回調(diào)函數(shù)中首先獲取數(shù)據(jù),然后調(diào)用:
send_mq_msg(topic_name, (uint8_t *)res_buf, rt_strlen(res_buf));

    b.發(fā)送隊(duì)列統(tǒng)一發(fā)送數(shù)據(jù),解決高頻控制或常問題

    send_mq_msg()函數(shù)實(shí)際上是把數(shù)據(jù)扔進(jìn)發(fā)送隊(duì)列中,發(fā)送隊(duì)列在一個(gè)線程中等待,檢測到有內(nèi)容扔進(jìn)隊(duì)列的時(shí)候,則從隊(duì)列中取出數(shù)據(jù)發(fā)送給onenet,實(shí)現(xiàn)代碼如下所示:

  1. static void onenet_upload_entry(void *parameter)
  2. {
  3.     mq_send_msg_t send_msg = { 0x00 };
  4.     led_blue_on();
  5.     send_mq_msg("$dp", (uint8_t *)POST_DATA4, rt_strlen((char *)POST_DATA4));
  6.    
  7.     while (1)
  8.     {
  9.     rt_memset(&send_msg, 0x00, sizeof(send_msg));
  10.     if (RT_EOK == rt_mq_recv(mq_send, &send_msg, sizeof(send_msg), RT_WAITING_FOREVER))
  11.     {
  12.         if (onenet_mqtt_upload_data(send_msg.topic_name, (const char *)send_msg.data_ptr))
  13.         {
  14.             rt_kprintf("upload has an error, stop uploading\n");
  15.             break;
  16.         }
  17.         else
  18.        {
  19.             if (NULL==rt_strstr(send_msg.topic_name, "$dp"))  //上次上報(bào)是返回給mqtt服務(wù)器,需要更新下數(shù)據(jù)以求同步數(shù)據(jù)到onnect
  20.             {
  21.                  send_mq_msg("$dp", send_msg.data_ptr, send_msg.data_size);
  22.             }
  23.             rt_kprintf("buffer : %s\ntopic_name is:%s", send_msg.data_ptr, send_msg.topic_name);
  24.             rt_free(send_msg.data_ptr);
  25.         }
  26.     }
  27.     rt_thread_mdelay(50);
  28.     }
  29.     exit:
  30.     rt_kprintf("upload thread exit!!!");
  31. }
復(fù)制代碼

    c.發(fā)送所有狀態(tài)數(shù)據(jù)到onenet

   RT_Thread提供的是一次性發(fā)送一個(gè)數(shù)據(jù)點(diǎn)給云端,我修改后也支持一次性上報(bào)所有數(shù)據(jù),這樣APP只需要每次刷新各個(gè)狀態(tài)就行,不需要判斷是哪個(gè)數(shù)據(jù)發(fā)生了改變。

函數(shù)具體實(shí)現(xiàn)如下:

  1. rt_err_t onenet_mqtt_upload_data(const char *topic_name, const char *msg_str)
  2. {
  3.     char *send_buffer = RT_NULL;
  4.     rt_err_t result = RT_EOK;
  5.     size_t length = 0;

  6.     assert(msg_str);

  7.   send_buffer = ONENET_MALLOC(strlen(msg_str) + 4);
  8.     if (!(send_buffer))
  9.     {
  10.         log_e("ONENET mqtt upload string data failed! No memory for send buffer!");
  11.         return -RT_ENOMEM;
  12.     }
  13.   *(send_buffer + strlen(msg_str) + 3) = 0x00;

  14.     strncpy(&send_buffer[3], msg_str, strlen(msg_str));
  15.     length = strlen(msg_str);
  16.     /* mqtt head and json length */
  17.     send_buffer[0] = 0x03;
  18.     send_buffer[1] = (length & 0xff00) >> 8;
  19.     send_buffer[2] = length & 0xff;
  20.   length += 3;

  21.     result = onenet_mqtt_publish(topic_name, (uint8_t *)send_buffer, length);
  22.     if (result < 0)
  23.     {
  24.         log_e("onenet mqtt publish digit data failed!");
  25.         goto __exit;
  26.     }

  27. __exit:
  28.     if (send_buffer)
  29.     {
  30.         ONENET_FREE(send_buffer);
  31.     }

  32.     return result;
  33. }
復(fù)制代碼


3.程序分析

  • mqtt組件入口

    main()函數(shù)中注冊網(wǎng)絡(luò)狀態(tài)變化函數(shù),然后連接網(wǎng)絡(luò),連接成功后,調(diào)用
onenet_mqtt_init()開啟mqtt服務(wù):首先獲取設(shè)備信息,如果獲取不到,則進(jìn)行注冊流程,獲取設(shè)備信息后,進(jìn)行mqtt初始化設(shè)置,設(shè)置認(rèn)證參數(shù)和數(shù)據(jù)接收、連接狀態(tài)變化回調(diào)函數(shù)。
  1. int onenet_mqtt_init(void)
  2. {
  3.     int result = 0;

  4.     if (init_ok)
  5.     {
  6.         LOG_D("onenet mqtt already init!");
  7.         return 0;
  8.     }

  9.     if (onenet_get_info() < 0)
  10.     {
  11.         result = -1;
  12.         goto __exit;
  13.     }

  14.     onenet_mqtt.onenet_info = &onenet_info;
  15.     onenet_mqtt.cmd_rsp_cb = RT_NULL;

  16.     if (onenet_mqtt_entry() < 0)
  17.     {
  18.         result = -2;
  19.         goto __exit;
  20.     }

  21. __exit:
  22.     if (!result)
  23.     {
  24.         LOG_I("RT-Thread OneNET package(V%s) initialize success.", ONENET_SW_VERSION);
  25.         init_ok = RT_TRUE;
  26.     }
  27.     else
  28.     {
  29.         LOG_E("RT-Thread OneNET package(V%s) initialize failed(%d).", ONENET_SW_VERSION, result);
  30.     }

  31.     return result;
  32. }
復(fù)制代碼


  • 數(shù)據(jù)下發(fā)入口

    當(dāng)有平臺(tái)數(shù)據(jù)下發(fā),設(shè)備會(huì)進(jìn)入mqtt_callback()回調(diào)函數(shù),回調(diào)函數(shù)中處理數(shù)據(jù),然后拋給應(yīng)用層數(shù)據(jù)接收處理函數(shù)onenet_cmd_rsp_cb(),可通過onenet_set_cmd_rsp_cb(onenet_cmd_rsp_cb)在應(yīng)用層設(shè)置。

  1. static void onenet_cmd_rsp_cb(char *topic_name, uint8_t *recv_data, size_t recv_size)
  2. {
  3.     char res_buf[128] = { 0 };
  4.   int value = 0;

  5.     rt_kprintf("recv data is %.*s\n", recv_size, recv_data);

  6.   value = atoi((char *)recv_data);
  7.   rt_kprintf("recv int data is:%d\r\n", value);
  8.     /* match the command */
  9.     if (value == 10) //總開關(guān),默認(rèn)為紅色
  10.     {
  11.         /* led on */
  12.         led_red_on();

  13.         rt_snprintf(res_buf, sizeof(res_buf), "{\"power\":\"10\",\"color\":\"2\"}");
  14.    

  15.     }else if (value == 0)
  16.   {
  17.         /* led off */
  18.         led_off();

  19.         rt_snprintf(res_buf, sizeof(res_buf), "{\"power\":\"0\",\"color\":\"1\"}");
  20.    
  21.   }
  22.   else if (value == 2)//紅色
  23.     {
  24.         /* red led on */
  25.         led_red_on();

  26.         rt_snprintf(res_buf, sizeof(res_buf), "{\"power\":\"10\",\"color\":\"2\"}");
  27.    
  28.     }
  29.     else if (value == 3)//綠色
  30.     {
  31.         /* green led on */
  32.         led_green_on();

  33.         rt_snprintf(res_buf, sizeof(res_buf), "{\"power\":\"10\",\"color\":\"3\"}");

  34.     }
  35.     else if (value == 4)//藍(lán)色
  36.     {
  37.         /* blue led on */
  38.         led_blue_on();

  39.         rt_snprintf(res_buf, sizeof(res_buf), "{\"power\":\"10\",\"color\":\"4\"}");

  40.     }
  41.   send_mq_msg(topic_name, (uint8_t *)res_buf, rt_strlen(res_buf));
  42. }
復(fù)制代碼


  • 數(shù)據(jù)上報(bào)入口

    當(dāng)設(shè)備通過連接到onenet服務(wù)器的時(shí)候,會(huì)進(jìn)入mqtt_online_callback()回調(diào)函數(shù),數(shù)據(jù)上報(bào)入口函數(shù)就是在這里觸發(fā),創(chuàng)建一個(gè)發(fā)送線程,檢測發(fā)送隊(duì)列中的數(shù)據(jù),一旦有數(shù)據(jù)需要發(fā)送,立刻取出隊(duì)列發(fā)送給云端。

  1. static void mqtt_online_callback(MQTTClient *c)
  2. {
  3.     LOG_D("Enter mqtt_online_callback!");
  4.     onenet_upload_cycle();
  5. }
復(fù)制代碼

4.配置

在applications目錄下新建一個(gè)文件夾:3-cloud/1-onenet_led,然后同理需要修改aplications/SConscript腳本。
  1. Import('RTT_ROOT')
  2. Import('rtconfig')
  3. from building import *

  4. cwd = GetCurrentDir()
  5. src  = Glob('3-cloud/1-onenet_led/*.c')
  6. CPPPATH = [cwd]

  7. group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)

  8. Return('group')
復(fù)制代碼

三、下載運(yùn)行

在ENV控制臺(tái),輸入scons命令,在build/Bin目錄下生成rtthread_1M.FLS,
燒錄運(yùn)行后,設(shè)備端按照下圖所示連接電路:




設(shè)備Log如下所示:
\ | /
- RT -     Thread Operating System
/ | \     4.0.0 build Jun 30 2019
2006 - 2018 Copyright by rt-thread team
lwIP-2.0.2 initialized!
[32m[5] I/SAL_SOC: Socket Abstraction Layer initialize success.

[0m[32m[64] I/WLAN.dev: wlan init success

[0m[32m[95] I/WLAN.lwip: eth device init ok name:w0

[0m[32m[100] I/WLAN.dev: wlan init success

[0m[32m[132] I/WLAN.lwip: eth device init ok name:w1

[0m[D/FAL] (fal_flash_init:61) Flash device |                nor_flash | addr: 0x00000000 | len: 0x00100000 | blk_size: 0x00001000 |initialized finish.
[32;22m[I/FAL] ==================== FAL partition table ====================[0m
[32;22m[I/FAL] | name      | flash_dev |   offset   |    length  |[0m
[32;22m[I/FAL] -------------------------------------------------------------[0m
[32;22m[I/FAL] | app       | nor_flash | 0x00010000 | 0x00080000 |[0m
[32;22m[I/FAL] | download  | nor_flash | 0x00090000 | 0x00060000 |[0m
[32;22m[I/FAL] | fs_part   | nor_flash | 0x000f0000 | 0x0000b000 |[0m
[32;22m[I/FAL] | easyflash | nor_flash | 0x000fb000 | 0x00001000 |[0m
[32;22m[I/FAL] =============================================================[0m
[32;22m[I/FAL] RT-Thread Flash Abstraction Layer (V0.3.0) initialize success.[0m
[Flash] EasyFlash V3.3.0 is initialize success.
[Flash] You can get the latest version on https://github.com/armink/EasyFlash .
msh />[32m[4268] I/WLAN.mgnt: wifi connect success ssid:LBAGMY

[0m[D/ONENET] (onenet_mqtt_init:201) onnect mqtt init
[D/ONENET] (mqtt_connect_callback:85) Enter mqtt_connect_callback!
[36;22m[I/ONENET] RT-Thread OneNET package(V1.0.0) initialize success.[0m
[32m[5296] I/WLAN.lwip: Got IP address : 192.168.1.6

[0m[32m[5477] I/MQTT: MQTT server connect success

[0m[D/ONENET] (mqtt_online_callback:90) Enter mqtt_online_callback!
buffer : {"power":"10","color":"4"}
topic_name is:$dp[31m[30547] E/MQTT: [30547] wait Ping Response res: 0

[0m[D/ONENET] (mqtt_offline_callback:96) Enter mqtt_offline_callback!
[D/ONENET] (mqtt_connect_callback:85) Enter mqtt_connect_callback!
[32m[35662] I/MQTT: MQTT server connect success

[0m[D/ONENET] (mqtt_online_callback:90) Enter mqtt_online_callback!
buffer : {"power":"10","color":"4"}
topic_name is:$dp[D/ONENET] (mqtt_callback:60) topic $creq/a2a663b4-5b87-57ad-81d8-9e563659e540 receive a message
[D/ONENET] (mqtt_callback:62) message length is 1
recv data is 2
recv int data is:2

buffer : {"power":"10","color":"2"}
topic_name is:$crsp/a2a663b4-5b87-57ad-81d8-9e563659e540buffer : {"power":"10","color":"2"}
topic_name is:$dp[D/ONENET] (mqtt_callback:60) topic $creq/e08cd093-66ec-5e43-812c-ae7d2cd2cf5c receive a message
[D/ONENET] (mqtt_callback:62) message length is 1
recv data is 3
recv int data is:3

buffer : {"power":"10","color":"3"}
topic_name is:$crsp/e08cd093-66ec-5e43-812c-ae7d2cd2cf5cbuffer : {"power":"10","color":"3"}
topic_name is:$dp[D/ONENET] (mqtt_callback:60) topic $creq/65824a18-f17c-5286-b4b6-7f13a4d76246 receive a message
[D/ONENET] (mqtt_callback:62) message length is 1
recv data is 4
recv int data is:4

buffer : {"power":"10","color":"4"}
topic_name is:$crsp/65824a18-f17c-5286-b4b6-7f13a4d76246buffer : {"power":"10","color":"4"}
topic_name is:$dp


后臺(tái)顯示:
    紅燈模式


    綠燈模式

    藍(lán)燈模式


四、結(jié)語

1.總結(jié):

本節(jié)完,實(shí)際操作過程中需要注意的地方有如下幾點(diǎn):

(1) 組件方式調(diào)整

之前的教程都是,每篇當(dāng)作一個(gè)新的項(xiàng)目來做,每次都重新拉取組件包,但是更新本篇內(nèi)容時(shí)候,我發(fā)現(xiàn)有時(shí)候組件包和RT_Thread menuconfig控制工具沒有很好的協(xié)調(diào)一致,比如本篇中用到的W600組件包,wm_libraries,這次配置工具并沒有該選項(xiàng),于是通過RT_Thread官網(wǎng)尋找wm_libraries組件,提示可以在包管理工具中選擇,如下:

實(shí)際包管理工具如下圖所示,并沒有wm_libraries,但是有realtek的RTL8710組件,這也為之后做個(gè)鋪墊,接下來會(huì)出一些RTL8710的教程,敬請期待。


考慮到目前存在的問題,為了防止大家在使用的時(shí)候遇到和我類似的問題,從本篇開始,項(xiàng)目使用到的組件都會(huì)上傳到github,大家下載后,配置SConscript選擇需要運(yùn)行的應(yīng)用即可。

(2) 修改了RT_Thread的連接onenet連接組件包

a. 修改數(shù)據(jù)上報(bào)邏輯
    原有組件包是每次回復(fù)單個(gè)數(shù)據(jù)點(diǎn)的數(shù)據(jù),修改后支持一次性上報(bào)所有數(shù)據(jù)點(diǎn),同時(shí)調(diào)整mqtt數(shù)據(jù)上報(bào)處理邏輯。

b. 增加隊(duì)列緩沖發(fā)送機(jī)制
    解決連續(xù)兩次調(diào)用數(shù)據(jù)發(fā)送接口,僅有第一次發(fā)出去的問題。

2.后記:

如您在使用過程中有任何問題,請加QQ群進(jìn)一步交流,也可以github提Issue。

QQ交流群:906015840 (備注:物聯(lián)網(wǎng)項(xiàng)目交流)


一葉孤沙出品:一沙一世界,一葉一菩提


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国内精品免费久久久久软件老师 | 欧洲一级毛片 | 成人免费在线观看视频 | 国产婷婷综合 | 在线亚洲一区 | 国产成在线观看免费视频 | 亚洲综合精品 | 国产亚洲精品美女久久久久久久久久 | 超碰97免费在线 | 电影午夜精品一区二区三区 | 日日爱av| 欧美成人精品 | 一区二区视频 | 一区二区三区 在线 | 久久亚洲一区二区三区四区 | 欧美在线视频网站 | 91久久精品国产91久久性色tv | 一区在线视频 | 在线一级片 | 日韩美女一区二区三区在线观看 | 97碰碰碰 | 国产精品美女久久久久久久网站 | 久久久久久久久久久久久91 | 91丨国产| 中文字幕在线精品 | 国产高清在线 | 国产精品a一区二区三区网址 | 成人在线看片 | 色天堂影院 | 最近日韩中文字幕 | 91天堂网| 国产精品不卡一区 | 久久在线 | 日韩精品一区二区三区在线播放 | 天堂视频免费 | 日韩免费视频一区二区 | 久久婷婷av| av免费看在线 | 国产成人精品视频在线观看 | 艹逼网 | 玩丰满女领导对白露脸hd |