色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32L431設(shè)計(jì)的云端綠化管理系統(tǒng)

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-02-28 13:51 ? 次閱讀

?

一、環(huán)境介紹

MCU:采用意法半導(dǎo)體低功耗芯片 STM32L431RCT6

編譯軟件:Keil5 +CubeMX

云平臺:采用阿里云物聯(lián)網(wǎng)云平臺

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

二、功能與硬件介紹

2.1 功能介紹

前面的一篇文章是同樣的環(huán)境,云平臺采用的是騰訊物聯(lián)網(wǎng)云平臺(基于STM32L431設(shè)計(jì)的云端綠化管理系統(tǒng)(ESP8266+騰訊物聯(lián)網(wǎng)云平臺)_DS小龍哥的專欄-CSDN博客_stm32l431)

這篇文章將云平臺換成了阿里云物聯(lián)網(wǎng)平臺,其他硬件功能都是一樣的。

再次介紹一下功能:

這是采用STM32L431 + ES8266設(shè)計(jì)的云端綠化管理系統(tǒng),可以通過ESP8266 WIFI連接阿里云物聯(lián)網(wǎng)平臺,使用網(wǎng)頁和阿里云的APP遠(yuǎn)程進(jìn)行綠化管理,比如:實(shí)時(shí)獲取光照強(qiáng)度、溫度、濕度、遠(yuǎn)程控制水泵進(jìn)行澆水灌溉,在任何地方都可以給自己種的花花草草澆水,了解周邊環(huán)境情況。

2.2 硬件介紹

開發(fā)板采用的是小熊開發(fā)板,包括完成綠化管理系統(tǒng)的所有功能都是采用小熊派開發(fā)板的配套套件完成。

小熊開發(fā)板板載了一個(gè)stlink調(diào)試器(就是STM32F103C8T6實(shí)現(xiàn)的),程序下載非常方便。串口1用來調(diào)試打印數(shù)據(jù),ESP8266是接在串口LPUART1上的。

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

小熊派開發(fā)板本身自帶的例子程序也比較豐富,自帶例子里采用的云平臺是華為的物聯(lián)網(wǎng)云平臺,工程比較龐大使用了LiteOS操作系統(tǒng)。本文里的工程是重新編寫的代碼,使用裸機(jī)完成項(xiàng)目功能,沒有跑操作系統(tǒng),云平臺采用阿里云平臺服務(wù)器,MQTT協(xié)議和ESP8266驅(qū)動代碼都是重新編寫,框架、邏輯比較清晰,代碼量也較少,適合初學(xué)者入門學(xué)習(xí)。
相關(guān)傳感器模塊型號:(采用的是小熊開發(fā)板配套的E53_IA1擴(kuò)展板)

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

WIFI采用:ESP8266

溫濕度檢測傳感器采用:SHT30

光照強(qiáng)度檢測傳感器采用:BH1750

電機(jī)采用:微型直流電機(jī)

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

三、阿里云物聯(lián)網(wǎng)云平臺

關(guān)于阿里云物聯(lián)網(wǎng)平臺的創(chuàng)建與使用之前也介紹過一篇,只不過MCU采用的是STM32F103C8T6,這篇文章MCU采用的是STM32L431RCT6,屬于低功耗系列,更加適合物聯(lián)網(wǎng)領(lǐng)域;如果之前沒有使用過阿里云物聯(lián)網(wǎng)云平臺,先參考這里學(xué)習(xí)了解一下:STM32+ESP8266+MQTT協(xié)議連接阿里云物聯(lián)網(wǎng)平臺_DS小龍哥的專欄-CSDN博客_stm32連接阿里云

3.1 在阿里云物聯(lián)網(wǎng)平臺創(chuàng)建產(chǎn)品

官網(wǎng)地址:阿里云登錄 - 歡迎登錄阿里云,安全穩(wěn)定的云計(jì)算服務(wù)平臺

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

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

?

配置產(chǎn)品模型參數(shù)頁面最后加密方式這些選擇默認(rèn)

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

添加設(shè)備:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

設(shè)備添加之后,可以一鍵將設(shè)備證書復(fù)制下來保存到記事本,方便后面使用;不復(fù)制也沒關(guān)系,后面也可以設(shè)備信息中查看的:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

{
  "ProductKey": "a1ukQj2EnEJ",
  "DeviceName": "GreeningManagement",
  "DeviceSecret": "a5268d71d363f1bd68e708c9097fa3d2"
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

設(shè)備添加完成:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

在設(shè)備信息的頁面也可以查看設(shè)備證書:

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

添加功能屬性字段:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

根據(jù)自己產(chǎn)品交互使用的數(shù)據(jù)類型進(jìn)行定義:(綠化管理系統(tǒng)使用了溫度、濕度、電機(jī)、光照強(qiáng)度一共4個(gè)數(shù)據(jù)字段。其中電機(jī)是讀寫類型,其他都是只讀類型)

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

自定義功能屬性添加完畢之后就發(fā)布上線:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

查看物模型數(shù)據(jù)格式:后面通過MQTT協(xié)議向服務(wù)器上報(bào)數(shù)據(jù)就是這個(gè)格式

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

可以選擇導(dǎo)出模型文件,導(dǎo)出是一個(gè)json格式文件,方便設(shè)備端開發(fā)參考。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

3.2 通過IoT Studio創(chuàng)建web可視化界面

地址:阿里云登錄 - 歡迎登錄阿里云,安全穩(wěn)定的云計(jì)算服務(wù)平臺

之前舊版本的IoT Studio 選項(xiàng)是在產(chǎn)品頁面里,現(xiàn)在移到控制臺首頁了。

新建項(xiàng)目:

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

?

新建web應(yīng)用:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

設(shè)計(jì)WEB頁面之前 先關(guān)聯(lián)產(chǎn)品和設(shè)備:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

選擇對應(yīng)的產(chǎn)品進(jìn)行關(guān)聯(lián):

?

選擇對應(yīng)的設(shè)備進(jìn)行關(guān)聯(lián):

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

關(guān)聯(lián)成功:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

下面繼續(xù)編輯web頁面:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

可以更改頁面名稱:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

添加組件,設(shè)計(jì)頁面: 阿里云的web頁面控件非常豐富,可以根據(jù)自己需求設(shè)計(jì)好看的頁面。

?

接下來就要給每個(gè)控件配置數(shù)據(jù)源:

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

調(diào)整儀表盤的屬性:刻度字號

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

配置完畢:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

有域名的可以綁定到域名:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

這里可以預(yù)覽頁面:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

四、登錄阿里云平臺測試

4.1 MQTT協(xié)議登錄的域名與端口

關(guān)于MQTT協(xié)議登錄所需要的參數(shù)官方說明文檔:使用MQTT.fx接入物聯(lián)網(wǎng)平臺 - 阿里云物聯(lián)網(wǎng)平臺 - 阿里云

MQTT登錄域名的格式:

${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

其中:
${YourProductKey}:請?zhí)鎿Q為設(shè)備所屬產(chǎn)品的ProductKey
${YourRegionId}:請?zhí)鎿Q為物聯(lián)網(wǎng)平臺設(shè)備所在地域代碼。

下面是阿里云國內(nèi)的服務(wù)器地域和可用區(qū)詳情:


地域名稱	所在城市	Region ID	可用區(qū)數(shù)量
華北 1	青島	cn-qingdao	    2
華北 2	北京	cn-beijing	    10
華北 3	張家口	cn-zhangjiakou	3
華北 5	呼和浩特	cn-huhehaote	2
華北 6	烏蘭察布	cn-wulanchabu	3
華東 1	杭州	cn-hangzhou	    8
華東 2	上海	cn-shanghai  	8
華南 1	深圳	cn-shenzhen   	6
華南 2	河源	cn-heyuan	    2
華南 3	廣州	cn-guangzhou	2
西南 1	成都	cn-chengdu	    2
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

端口號是:1883

經(jīng)過上面的格式解釋,我的阿里云服務(wù)器登錄的域名就是(選擇的是上海服務(wù)器):a1ukQj2EnEJ.iot-as-mqtt.cn-shanghai.aliyuncs.com

域名對應(yīng)的IP地址(動態(tài)解析出來的): 106.14.207.159

在線解析域名網(wǎng)站:ip地址查詢 ip查詢 查ip 公網(wǎng)ip地址歸屬地查詢 網(wǎng)站ip查詢 同ip網(wǎng)站查詢 iP反查域名 iP查域名 同ip域名

4.2 MQTT協(xié)議登錄的ID、用戶名、密碼

4.2.1MQTT_ClientID

固定格式:${ClientID}|securemode=${Mode},signmethod=${SignMethod}|。

參數(shù)說明:
${ClientId}: 設(shè)備ID,一般填設(shè)備的硬件編號。我這里就直接填當(dāng)前的設(shè)備名稱,后面的密碼里也要填這個(gè)ID,必須一樣就行。(設(shè)備名稱就是創(chuàng)建設(shè)備的時(shí)候復(fù)制出來3個(gè)參數(shù)里的設(shè)備名稱)
securemode=3:TCP直連模式,無需設(shè)置SSL/TLS信息。
securemode=2:TLS直連模式,需要設(shè)置SSL/TLS信息。
${SignMethod}:算法類型,支持hmacmd5和hmacsha1。

示例:

當(dāng)前我的綠化管理系統(tǒng)設(shè)備名稱是:GreeningManagement ,選擇TCP直連模式,選擇hmacsha1算法類型。

那么我的ClientID就是:

GreeningManagement|securemode=3,signmethod=hmacsha1|
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

4.2.2MQTT_UserName

固定格式:${DeviceName}&${ProductKey}
參數(shù)解釋:
${DeviceName} 是設(shè)備的名稱(就是創(chuàng)建設(shè)備的時(shí)候復(fù)制出來3個(gè)參數(shù)里的設(shè)備名稱)
${ProductKey} 是設(shè)備的ProductKey(就是創(chuàng)建設(shè)備的時(shí)候復(fù)制出來3個(gè)參數(shù)里的ProductKey)

示例:

當(dāng)前我的綠化管理系統(tǒng)設(shè)備名稱是:GreeningManagement ,我的ProductKey是:a1ukQj2EnEJ

那么我的UserName就是:

GreeningManagement&a1ukQj2EnEJ
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

4.2.3MQTT_PassWord

下載密碼生成小工具:使用MQTT.fx接入物聯(lián)網(wǎng)平臺 - 阿里云物聯(lián)網(wǎng)平臺 - 阿里云

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

下載工具,運(yùn)行:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

根據(jù)說明填充參數(shù):

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

說明:productKey、deviceName、deviceSecret:是設(shè)備證書信息,可在控制臺設(shè)備詳情頁查看。clientID在4.2.1小節(jié)里已經(jīng)說過了。時(shí)間戳可以省略不填。

點(diǎn)擊Generate生成密碼。

經(jīng)過小工具生成后的密碼是:

9E580B36EE7E001980AF61EA09EAF85F0211C146
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

4.3 使用MQTT客戶端工具登錄阿里云服務(wù)器

MQTT客戶端工具下載地址:QT應(yīng)用編程: 編寫MQTT客戶端登錄OnetNet服務(wù)器完成主題訂閱與發(fā)布_DS小龍哥的專欄-CSDN博客_onenet topic訂閱與發(fā)布

根據(jù)前面獲取的參數(shù)填入,登錄測試: (為了保證不會斷開連接,可以勾選MQTT客戶端右下角的心跳包選項(xiàng),保活)

?

如果登錄成功,在阿里云控制臺頁面上可以看到設(shè)備已經(jīng)在線:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

如果設(shè)備能成功上線,那么就說明MQTT所需要的參數(shù)都已經(jīng)填正確了,接下來就可以正常訂閱、發(fā)布主題了。

4.4 主題訂閱、發(fā)布測試

屬性上報(bào)主題與屬性設(shè)置主題格式:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

發(fā)布主題:

/sys/a1ukQj2EnEJ/GreeningManagement/thing/event/property/post

上報(bào)屬性消息的格式(精簡格式):

{"method":"thing.event.property.post","params":{"temperature":11.1,"humidity":12.1,"illumination":13,"machine":1}}

上報(bào)屬性消息的格式詳細(xì)格式(可以帶上ID和版本號):

{"method":"thing.event.property.post","id":"1234567890","params":{"temperature":66.1,"humidity":22.1,"illumination":88,,"machine":1},"version":"1.1.1"}

訂閱主題:

/sys/a1ukQj2EnEJ/GreeningManagement/thing/service/property/set

通過MQTT客戶端訂閱主題、上報(bào)屬性數(shù)據(jù):

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

把相關(guān)的參數(shù)填正確,然后登陸,訂閱、發(fā)布測試:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

阿里云物聯(lián)網(wǎng)平臺云端收到的數(shù)據(jù):

地址:阿里云登錄 - 歡迎登錄阿里云,安全穩(wěn)定的云計(jì)算服務(wù)平臺

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

點(diǎn)擊頁面上的的按鈕,MQTT客戶端可以收到下發(fā)的消息(要先訂閱才能收到消息):

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

注意: 阿里云按鈕點(diǎn)擊下發(fā)消息之后,客戶端收到后要重新上報(bào)一次按鈕的狀態(tài)回去,不然阿里云按鈕會恢復(fù)之前的狀態(tài)。

五、STM32代碼測試

STM32的代碼主要分為以下幾個(gè)部分:

1.ESP8266底層驅(qū)動代碼:完成ESP8266模式配置、數(shù)據(jù)發(fā)送,應(yīng)答檢測等底層網(wǎng)絡(luò)接口

2.MQTT協(xié)議代碼:這是參考標(biāo)準(zhǔn)MQTT編寫C語言版本MQTT協(xié)議框架代碼,實(shí)現(xiàn)了重要的幾個(gè)接口(主題訂閱、主題發(fā)布、心跳包、登錄MQTT服務(wù)器),底層采用ESP8266發(fā)送數(shù)據(jù)。 這個(gè)MQTT協(xié)議不是使用ESP8266本身的SDK,是根據(jù)MQTT協(xié)議自己實(shí)現(xiàn)的,所以如果使用其他的網(wǎng)卡,移植也很方便,不挑網(wǎng)卡設(shè)備。

3.傳感器初始化代碼: 完成溫濕度傳感器、光照強(qiáng)度傳感器的驅(qū)動代碼編寫。

4.LCD屏代碼:LCD是SPI接口的,可以顯示溫濕度、光照強(qiáng)度數(shù)據(jù)。

5.main函數(shù):完成整個(gè)邏輯代碼編寫,檢測阿里云平臺是否有下發(fā)的指令,進(jìn)行分析,完成水泵的開關(guān)控制;當(dāng)溫室和濕度到達(dá)某個(gè)閥值,自動控制水泵澆水,并上報(bào)給阿里云平臺;主程序里1秒檢測一次溫濕度、光照強(qiáng)度、電機(jī)狀態(tài)主動上報(bào)給阿里云平臺;在設(shè)備端按下按鍵(模擬現(xiàn)場實(shí)體開關(guān))也可以控制水泵澆水或者關(guān)閉,這些狀態(tài)都會實(shí)時(shí)上報(bào)給云平臺。

程序的模板是使用CubeMX生成的。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

5.1 main.c代碼


/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2019 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32l4xx_hal.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"
#include "E53_IA1.h"
#include "lcd.h"
#include "spi.h"
#include "mqtt.h"
#include "esp8266.h"


/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

void SystemClock_Config(void);


#define ESP8266_WIFI_AP_SSID  "CMCC-Cqvn"   //將要連接的路由器名稱 --不要出現(xiàn)中文、空格等特殊字符
#define ESP8266_AP_PASSWORD "99pu58cb"     //將要連接的路由器密碼


//阿里云物聯(lián)網(wǎng)服務(wù)器的設(shè)備信息
#define MQTT_ClientID "GreeningManagement|securemode=3,signmethod=hmacsha1|"
#define MQTT_UserName "GreeningManagement&a1ukQj2EnEJ"
#define MQTT_PassWord "9E580B36EE7E001980AF61EA09EAF85F0211C146"
 
//訂閱與發(fā)布的主題
#define SET_TOPIC  "/sys/a1ukQj2EnEJ/GreeningManagement/thing/service/property/set"  //訂閱
#define POST_TOPIC "/sys/a1ukQj2EnEJ/GreeningManagement/thing/event/property/post"  //發(fā)布


//保存溫濕度、光照強(qiáng)度
E53_IA1_Data_TypeDef E53_IA1_Data;

//顯示文本
char lcd_text_str[50];


UART_HandleTypeDef at_usart;

//低功耗串口初始化
int32_t at_usart_init(void)
{
    at_usart.Instance = LPUART1;
    at_usart.Init.BaudRate = 115200;

    at_usart.Init.WordLength = UART_WORDLENGTH_8B;
    at_usart.Init.StopBits = UART_STOPBITS_1;
    at_usart.Init.Parity = UART_PARITY_NONE;
    at_usart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    at_usart.Init.Mode = UART_MODE_RX | UART_MODE_TX;
    
    if(HAL_UART_Init(&at_usart) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
   // __HAL_UART_CLEAR_FLAG(usart, UART_FLAG_TC);
    __HAL_UART_ENABLE_IT(&at_usart, UART_IT_IDLE);
    __HAL_UART_ENABLE_IT(&at_usart, UART_IT_RXNE);
    HAL_NVIC_EnableIRQ(LPUART1_IRQn);					//使能USART1中斷通道
    HAL_NVIC_SetPriority(LPUART1_IRQn, 3, 3);				//搶占優(yōu)先級3,子優(yōu)先級3
    return 0;
}

unsigned char ESP8266_RecvBuf[MAX_RECV_CNT];
unsigned int ESP8266_Recv_cnt=0;
unsigned int ESP8266_Recv_flag=0;
void LPUART1_IRQHandler()
{
    //接收到數(shù)據(jù)
    if(__HAL_UART_GET_FLAG(&at_usart, UART_FLAG_RXNE) != RESET)
    {
        if(ESP8266_Recv_cntRDR & 0x00FF);
        } 
        else
        {
             ESP8266_Recv_flag=1;
        }
    }  
    else if (__HAL_UART_GET_FLAG(&at_usart, UART_FLAG_IDLE) != RESET)
    {
        __HAL_UART_CLEAR_IDLEFLAG(&at_usart);
        
         ESP8266_Recv_flag=1;
    }
}


void AT_SendData(unsigned char *p,unsigned int len)
{
    int i=0;
    for(i=0;iISR & 0X40) == 0); //循環(huán)發(fā)送,直到發(fā)送完畢
        LPUART1->TDR = p[i];
    }
}


char mqtt_message[200];
int main(void)
{
    int i=0;
    int cnt=0;
    int motor_state=0;
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_I2C1_Init();
    MX_SPI2_Init();
    MX_USART1_UART_Init();
    at_usart_init();
    
    //初始化硬件 STM32L431RC_BearPiBH1750_I2C1\STM32L431RC_BearPiBH1750_I2C1.axf: Error: L6218E: Undefined symbol printf (referred from main.o).
    Init_E53_IA1();

    LCD_Init();					
    LCD_Clear(BLACK);//清屏為黑色
    LCD_ShowString(20, 00, 240, 32, 32, "Init ESP8266");//顯示字符串,字體大小32*32

    if(ESP8266_Init())
   {
      printf("ESP8266硬件檢測錯誤.\n");
      LCD_Clear(BLACK);//清屏為黑色
      LCD_ShowString(0, 00, 240, 32, 32, "ESP8266 ERROR");//顯示字符串,字體大小32*32
   }
   else
   {
       LCD_Clear(BLACK);//清屏為黑色
       LCD_ShowString(20, 00, 240, 32, 32, "ESP8266 OK");//顯示字符串,字體大小32*32
       printf("準(zhǔn)備連接到指定的服務(wù)器.\n");
      //非加密端口
      printf("WIFI:%d\r\n",ESP8266_STA_TCP_Client_Mode(ESP8266_WIFI_AP_SSID,ESP8266_AP_PASSWORD,"a1ukQj2EnEJ.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1));
   }
   
    //2. MQTT協(xié)議初始化	
    MQTT_Init(); 
   
    //3. 連接阿里云IOT服務(wù)器        
    while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord))
    {
        printf("服務(wù)器連接失敗,正在重試...\n");
        HAL_Delay(500);
    }
    printf("服務(wù)器連接成功.\n");
    
    //3. 訂閱主題
    if(MQTT_SubscribeTopic(SET_TOPIC,0,1))
    {
        printf("主題訂閱失敗.\n");
    }
    else
    {
        printf("主題訂閱成功.\n");
    }        
    
      while (1)
      {
            if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)//查詢按鍵KEY1低電平
            {
                HAL_Delay(10);//消抖
                if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)//查詢按鍵KEY1低電平
                {
                    HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);//亮
                    
                    //補(bǔ)光燈亮
                    HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_SET);
                    
                    //電機(jī)轉(zhuǎn)
                    HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET);
                    
                    motor_state=1;
                }
            }
                
            if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)//查詢按鍵KEY2低電平
            {
                HAL_Delay(10);//消抖
                if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)//查詢按鍵KEY2低電平
                {
                    HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);//滅
                    
                     //補(bǔ)光燈滅
                    HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET);
                    
                     //電機(jī)停
                    HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET);
                    
                    motor_state=0;
                }
            }
     
         cnt++;
         HAL_Delay(10);   
         
         if(cnt>=100)
         {
            cnt=0;
            E53_IA1_Read_Data();
            printf("光照強(qiáng)度:%.1f %%\r\n", E53_IA1_Data.Lux);
            printf("濕度:%.1f %%\r\n",E53_IA1_Data.Humidity);
            printf("溫度:%.1f ℃\r\n", E53_IA1_Data.Temperature);


            sprintf(lcd_text_str,"L: %0.1f %%",E53_IA1_Data.Lux);
            LCD_ShowString(40, 50+10+32*1, 240, 32, 32,lcd_text_str);


            sprintf(lcd_text_str,"H: %.1f %%",E53_IA1_Data.Humidity);
            LCD_ShowString(40, 50+10+32*2, 240, 32, 32,lcd_text_str);
             

            sprintf(lcd_text_str,"T: %.1f C",E53_IA1_Data.Temperature);
            LCD_ShowString(40, 50+10+32*3, 240, 32, 32,lcd_text_str);

            //切換引腳的狀態(tài)
            HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
             
               //上傳數(shù)據(jù)
            sprintf(mqtt_message,"{"method":"thing.event.property.post","id":"1234567890","params":{"temperature":%f,"humidity":%f,"illumination":%f,"machine":%d},"version":"1.1.1"}",
            E53_IA1_Data.Temperature,E53_IA1_Data.Humidity,E53_IA1_Data.Lux,motor_state);
            
            MQTT_PublishData(POST_TOPIC,mqtt_message,0);
            
            //根據(jù)濕度自動灌溉
            if((int)E53_IA1_Data.Humidity<50)  //小于50自動灌溉
            {
                 printf("自動灌溉....\n");
                 motor_state=1; //電機(jī)狀態(tài)更新
                 //電機(jī)轉(zhuǎn)
                 HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET);
            }  
         }

          //接收到數(shù)據(jù)
          if(ESP8266_Recv_flag)
          {
               //如果是下發(fā)了屬性,判斷是開鎖還是關(guān)鎖
                if(ESP8266_Recv_cnt>5)
                {
                    ESP8266_RecvBuf[ESP8266_Recv_cnt]='\0';
             
                    //使用字符串查找函數(shù)
                    if(strstr((char*)&ESP8266_RecvBuf[5],""machine":1"))
                    {
                         motor_state=1; //電機(jī)狀態(tài)更新
                         //電機(jī)轉(zhuǎn)
                         HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET);  
                         printf("開啟電機(jī)...\n");
                    }
                    else if(strstr((char*)&ESP8266_RecvBuf[5],""machine":0"))
                    {
                        //電機(jī)停
                        HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET);
                    
                        motor_state=0;
                        printf("關(guān)閉電機(jī)...\n");
                    }
                    
                    for(i=0;i;i++)printf("%c",esp8266_recvbuf[i]);>;i++)>)>
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

5.2 mqtt.c代碼

#include "mqtt.h"

u8 *mqtt_rxbuf;
u8 *mqtt_txbuf;
u16 mqtt_rxlen;
u16 mqtt_txlen;
u8 _mqtt_txbuf[256];//發(fā)送數(shù)據(jù)緩存區(qū)
u8 _mqtt_rxbuf[256];//接收數(shù)據(jù)緩存區(qū)

typedef enum
{
	//名字 	    值 			報(bào)文流動方向 	描述
	M_RESERVED1	=0	,	//	禁止	保留
	M_CONNECT		,	//	客戶端到服務(wù)端	客戶端請求連接服務(wù)端
	M_CONNACK		,	//	服務(wù)端到客戶端	連接報(bào)文確認(rèn)
	M_PUBLISH		,	//	兩個(gè)方向都允許	發(fā)布消息
	M_PUBACK		,	//	兩個(gè)方向都允許	QoS 1消息發(fā)布收到確認(rèn)
	M_PUBREC		,	//	兩個(gè)方向都允許	發(fā)布收到(保證交付第一步)
	M_PUBREL		,	//	兩個(gè)方向都允許	發(fā)布釋放(保證交付第二步)
	M_PUBCOMP		,	//	兩個(gè)方向都允許	QoS 2消息發(fā)布完成(保證交互第三步)
	M_SUBSCRIBE		,	//	客戶端到服務(wù)端	客戶端訂閱請求
	M_SUBACK		,	//	服務(wù)端到客戶端	訂閱請求報(bào)文確認(rèn)
	M_UNSUBSCRIBE	,	//	客戶端到服務(wù)端	客戶端取消訂閱請求
	M_UNSUBACK		,	//	服務(wù)端到客戶端	取消訂閱報(bào)文確認(rèn)
	M_PINGREQ		,	//	客戶端到服務(wù)端	心跳請求
	M_PINGRESP		,	//	服務(wù)端到客戶端	心跳響應(yīng)
	M_DISCONNECT	,	//	客戶端到服務(wù)端	客戶端斷開連接
	M_RESERVED2		,	//	禁止	保留
}_typdef_mqtt_message;

//連接成功服務(wù)器回應(yīng) 20 02 00 00
//客戶端主動斷開連接 e0 00
const u8 parket_connetAck[] = {0x20,0x02,0x00,0x00};
const u8 parket_disconnet[] = {0xe0,0x00};
const u8 parket_heart[] = {0xc0,0x00};
const u8 parket_heart_reply[] = {0xc0,0x00};
const u8 parket_subAck[] = {0x90,0x03};

void MQTT_Init(void)
{
    //緩沖區(qū)賦值
	mqtt_rxbuf = _mqtt_rxbuf;
    mqtt_rxlen = sizeof(_mqtt_rxbuf);
	mqtt_txbuf = _mqtt_txbuf;
    mqtt_txlen = sizeof(_mqtt_txbuf);
	memset(mqtt_rxbuf,0,mqtt_rxlen);
	memset(mqtt_txbuf,0,mqtt_txlen);
	
//	//無條件先主動斷開
//	MQTT_Disconnect();
//    HAL_Delay(100);
//	MQTT_Disconnect();
//    HAL_Delay(100);
}

/*
函數(shù)功能: 登錄服務(wù)器
函數(shù)返回值: 0表示成功 1表示失敗
*/
u8 MQTT_Connect(char *ClientID,char *Username,char *Password)
{
    u8 i,j;
    int ClientIDLen = strlen(ClientID);
    int UsernameLen = strlen(Username);
    int PasswordLen = strlen(Password);
    int DataLen;
	mqtt_txlen=0;
	//可變報(bào)頭+Payload  每個(gè)字段包含兩個(gè)字節(jié)的長度標(biāo)識
    DataLen = 10 + (ClientIDLen+2) + (UsernameLen+2) + (PasswordLen+2);
	
	//固定報(bào)頭
	//控制報(bào)文類型
    mqtt_txbuf[mqtt_txlen++] = 0x10;		//MQTT Message Type CONNECT
	//剩余長度(不包括固定頭部)
	do
	{
		u8 encodedByte = DataLen % 128;
		DataLen = DataLen / 128;
		// if there are more data to encode, set the top bit of this byte
		if ( DataLen > 0 )
			encodedByte = encodedByte | 128;
		mqtt_txbuf[mqtt_txlen++] = encodedByte;
	}while ( DataLen > 0 );
    	
	//可變報(bào)頭
	//協(xié)議名
    mqtt_txbuf[mqtt_txlen++] = 0;        	// Protocol Name Length MSB    
    mqtt_txbuf[mqtt_txlen++] = 4;           // Protocol Name Length LSB    
    mqtt_txbuf[mqtt_txlen++] = 'M';        	// ASCII Code for M    
    mqtt_txbuf[mqtt_txlen++] = 'Q';        	// ASCII Code for Q    
    mqtt_txbuf[mqtt_txlen++] = 'T';        	// ASCII Code for T    
    mqtt_txbuf[mqtt_txlen++] = 'T';        	// ASCII Code for T    
	//協(xié)議級別
    mqtt_txbuf[mqtt_txlen++] = 4;        		// MQTT Protocol version = 4   對于 3.1.1 版協(xié)議,協(xié)議級別字段的值是 4(0x04)   
	//連接標(biāo)志
    mqtt_txbuf[mqtt_txlen++] = 0xc2;        	// conn flags 
    mqtt_txbuf[mqtt_txlen++] = 0;        		// Keep-alive Time Length MSB    
    mqtt_txbuf[mqtt_txlen++] = 100;        	// Keep-alive Time Length LSB  100S心跳包    保活時(shí)間
	
    mqtt_txbuf[mqtt_txlen++] = BYTE1(ClientIDLen);// Client ID length MSB    
    mqtt_txbuf[mqtt_txlen++] = BYTE0(ClientIDLen);// Client ID length LSB  	
	memcpy(&mqtt_txbuf[mqtt_txlen],ClientID,ClientIDLen);
    mqtt_txlen += ClientIDLen;
    
    if(UsernameLen > 0)
    {   
        mqtt_txbuf[mqtt_txlen++] = BYTE1(UsernameLen);		//username length MSB    
        mqtt_txbuf[mqtt_txlen++] = BYTE0(UsernameLen);    	//username length LSB    
		memcpy(&mqtt_txbuf[mqtt_txlen],Username,UsernameLen);
        mqtt_txlen += UsernameLen;
    }
    
    if(PasswordLen > 0)
    {    
        mqtt_txbuf[mqtt_txlen++] = BYTE1(PasswordLen);		//password length MSB    
        mqtt_txbuf[mqtt_txlen++] = BYTE0(PasswordLen);    	//password length LSB  
		memcpy(&mqtt_txbuf[mqtt_txlen],Password,PasswordLen);
        mqtt_txlen += PasswordLen; 
    }    
	
  
    memset(mqtt_rxbuf,0,mqtt_rxlen);
    
    ESP8266_Recv_flag=0;
    ESP8266_Recv_cnt=0;
    MQTT_SendBuf(mqtt_txbuf,mqtt_txlen);
    HAL_Delay(200);
    
    memcpy((char *)mqtt_rxbuf,ESP8266_RecvBuf,ESP8266_Recv_cnt);
    for(i=0;i;i++)printf("%#x>
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

5.3 設(shè)備運(yùn)行效果

串口打印調(diào)試數(shù)據(jù): 連接成功

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

六、阿里云生活物聯(lián)網(wǎng)平臺

官網(wǎng)首頁:生活物聯(lián)網(wǎng)平臺 - 幫助中心 - 阿里云

生活物聯(lián)網(wǎng)平臺是阿里云IoT針對生活領(lǐng)域推出的物聯(lián)網(wǎng)平臺,以解決家電智能化的問題。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

生活物聯(lián)網(wǎng)平臺提供了設(shè)備接入能力,有公版APP可以直接開發(fā)使用;下篇文章再講解生活物聯(lián)網(wǎng)平臺使用示例。

完整項(xiàng)目源代碼下載地址(不懂可以私信問):https://download.csdn.net/download/xiaolong1126626497/19272620

審核編輯:符乾江

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 物聯(lián)網(wǎng)
    +關(guān)注

    關(guān)注

    2909

    文章

    44736

    瀏覽量

    374487
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10906

    瀏覽量

    356563
  • STM32L431CB
    +關(guān)注

    關(guān)注

    0

    文章

    1

    瀏覽量

    473
收藏 人收藏

    評論

    相關(guān)推薦

    綠化智能灌溉控制系統(tǒng)

    綠化智能灌溉系統(tǒng)作為現(xiàn)代園藝與農(nóng)業(yè)技術(shù)的融合典范,正逐步改變著植物養(yǎng)護(hù)的傳統(tǒng)認(rèn)知。提高水資源利用效率,通過智能化管理,對植物生長環(huán)境的精準(zhǔn)調(diào)控,促進(jìn)生態(tài)環(huán)境的可持續(xù)發(fā)展。 系統(tǒng)概述
    的頭像 發(fā)表于 10-30 16:38 ?170次閱讀

    STM32L431RCT6關(guān)機(jī)模式使用Wakeup喚醒遇到的疑問求解

    根據(jù)STM32L431手冊,“具有從待機(jī)/關(guān)機(jī)喚醒能力的I/O為:PA0,PC13,PE6,PA2,PC5。” L431沒有PE端口,那么就有PA0,PC13,PA2,PC5,想把這四個(gè)腳都配置成
    發(fā)表于 07-03 07:11

    STM32L431在下載程序時(shí)模擬電壓VDDA可不可以不上電?

    STM32L431在下載程序時(shí)模擬電壓VDDA可不可以不上電?
    發(fā)表于 04-17 06:45

    請問STM32L431 STOP2模式DEBUG如何才能好用?

    STM32L431 STOP2模式 DEBUG如何才能好用?跪求幫助謝謝!! STM32L431 進(jìn)入STOP2模式,已經(jīng)開啟HAL_DBGMCU_EnableDBGStopMode(); 并且使
    發(fā)表于 04-15 08:15

    STM32L431低功耗進(jìn)入異常的原因?

    各位大佬好,小弟在使用STM32L431單片機(jī)的時(shí)候遇到一個(gè)奇怪的問題,我用的是HAL庫,當(dāng)我下載完程序后如果不完全斷電,單片機(jī)進(jìn)不了低功耗,即使通過硬件復(fù)位現(xiàn)象也是一樣,但是只要我斷開電源重新上電
    發(fā)表于 04-09 07:03

    STM32L431反向初始化TIM導(dǎo)致FLASH-&gt;SR寄存器的PGSERR位置1了,擦除失敗怎么解決?

    項(xiàng)目要求使用STM32L431內(nèi)部FLASH存儲一些調(diào)電保存參數(shù),調(diào)試發(fā)現(xiàn)第一次將參數(shù)寫入內(nèi)部FLASH沒有問題,當(dāng)時(shí)當(dāng)我再次寫入時(shí),報(bào)錯,寫入不成功,我調(diào)試發(fā)現(xiàn)在我寫入之前FLASH-&
    發(fā)表于 04-09 06:33

    STM32L431出現(xiàn)LSE CSS后RTC的ALARM無法進(jìn)入中斷是怎么回事啊?

    STM32L431的RTC配置使用LSE時(shí)鐘,配置ALARMA中斷,可以正常進(jìn)入中斷,但是出現(xiàn)LSE CSS后重新配置RTC使用LSI做為系統(tǒng)時(shí)鐘,但配置后RTC的ALARMA無法進(jìn)入中斷,這是怎么回事啊?
    發(fā)表于 04-08 06:58

    STM32L431x用usart1打印會亂碼的原因?

    STM32L431x用usart1打印會亂碼的原因?
    發(fā)表于 04-08 06:12

    STM32L431RCT6從用戶代碼區(qū)跳轉(zhuǎn)使用內(nèi)置system memory bootloader無效怎么解決?

    STM32L431RCT6 系統(tǒng)BootLoader地址也是 0x1FFF0000;也不是雙BANK芯片。麻煩是否有接觸過個(gè)芯片 從用戶代碼區(qū)直接跳轉(zhuǎn)到內(nèi)置BOOTLOADER的 成功過的 幫忙看看,謝謝
    發(fā)表于 03-26 07:54

    STM32L431 ADC to DAC時(shí)間久了時(shí)鐘不同步是哪里的問題?

    我在用STM32L431做一個(gè)音頻相關(guān)的項(xiàng)目。 我是用Timer6 設(shè)置32Khz ADC 采樣,然后把采樣點(diǎn)降采樣到4Khz后,然后輸出到DAC同步輸出。DAC用Timer7設(shè)置 4Khz
    發(fā)表于 03-26 06:32

    STM32L431 RTC時(shí)間混亂問題如何解決?

    我現(xiàn)在在用STM32L431做門鎖,5號電池供電(有紐扣電池),五百臺門鎖生產(chǎn)時(shí)寫入讀出正常(2022年),從工廠運(yùn)回公司,抽檢發(fā)現(xiàn)某臺門鎖的RTC時(shí)間混亂了,變成了2073年,斷電重啟后還是
    發(fā)表于 03-22 07:41

    STM32L431RCT6進(jìn)入STOP模式后,ADC注入通道不再觸發(fā)是為什么?

    STM32L431RCT6 ADC注入通道是通過定時(shí)器觸發(fā)的,調(diào)試發(fā)現(xiàn)定時(shí)器正常觸發(fā),但是不會觸發(fā)注入通道了
    發(fā)表于 03-15 06:32

    STM32L431主頻80MHZ,DAC輸出2V左右,一直開著ADC或者一直開著DAC誰更耗電?

    STM32L431主頻80MHZ,DAC輸出2V左右。
    發(fā)表于 03-11 07:25

    STM32L431在進(jìn)行ADC_DMA傳輸后,狀態(tài)位一直處于忙的狀態(tài)是怎么回事?

    STM32L431在進(jìn)行ADC_DMA傳輸后,狀態(tài)位一直處于忙,debug發(fā)現(xiàn)并沒有進(jìn)入ADC中斷(已開啟中斷)
    發(fā)表于 03-11 06:37

    如何用我的cy8cmbr3110或3102 capsense控制stm32

    我在想怎么用 stm32l431 控制這個(gè) cy8cmbre3110 或 3102,我找到了帶有 arduino wire.h 的代碼 庫可以用 i2c 協(xié)議控制它但我不知道如何用我的 cy8cmbr3110 或 3102 capsense 控制 stm32
    發(fā)表于 01-25 08:17
    主站蜘蛛池模板: 成人女人A级毛片免费软件| 怡春院院日本一区二区久久| 久久电影午夜| 国产野外无码理论片在线观看| 成人片在线播放| RUNAWAY韩国动漫免费网| 99国产精品久久人妻| 主播蜜汁丝袜精品自拍| 樱桃bt在线www| 在线观看成年人免费视频| 亚洲伊人久久精品| 亚洲欧美综合乱码精品成人网| 亚洲精品理论电影在线观看| 亚洲国产AV精品一区二区蜜芽 | 一品探花论坛| 一本色道久久综合亚洲精品加 | se01短视频在线观看| WWW国产精品内射熟女| xxx粗大长欧美| 俄罗斯mm| 国产精品点击进入在线影院高清| 国产成人免费a在线视频app| 国产精品视频成人| 狠狠啪在线香蕉| 久久大综合| 免费精品美女久久久久久久久| 欧美巨大xxxx做受高清| 日韩精品一区二区三区色欲AV | 伊人久久综合热青草| 中国少妇内射XXXHD免费| 99国产精品久久| 虫族bl文全肉高h| 国产日韩精品SUV| 精品国产午夜肉伦伦影院| 久久免费视频在线观看6| 男生jj插入女生jj| 日韩精品特黄毛片免费看| 小sao货水好多真紧h的视频| 亚洲免费在线| 91免费网站在线看入口黄| 成人影片大全|