在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

僅僅使用代碼,就能點(diǎn)亮樹莓派的 GPIO 世界

上海晶珩電子科技有限公司 ? 2025-03-25 09:31 ? 次閱讀

Raspberry Pi的一個(gè)流行應(yīng)用是構(gòu)建Web服務(wù)器。為此,我們可以使用不同的技術(shù),如PythonNode.JS甚至PHP。由于Raspberry Pi的絕大多數(shù)腳本都是用Python編寫的,因此使用Python創(chuàng)建REST API接口也是合情合理的。然后,我們可以調(diào)用特定的函數(shù),例如控制或讀取GPIO。這可以方便地控制LED或其他傳感器/模塊。其美妙之處在于,我們可以使迄今為止為Raspberry Pi用Python編寫的幾乎所有代碼都可以輕松通過REST API進(jìn)行調(diào)用。因此,在本教程中,我們將使用FastAPI創(chuàng)建這樣一個(gè)接口,并探討如何擴(kuò)展和保障其安全。

所需硬件部件

原則上,本教程不需要太多的配件。但是,由于我們想測試我們的設(shè)置是否有效,我建議使用以下部件:

Raspberry Pi

LED燈

330Ω電阻

面包板

雌性-雌性跳線

當(dāng)然,你可以根據(jù)自己的需求進(jìn)行擴(kuò)展,并連接傳感器(如?溫度傳感?器等),我們可以通過API對其進(jìn)行查詢。

什么是REST API?

API(應(yīng)用程序編程接口)是一種可以通過URL等調(diào)用的接口。REST(表述性狀態(tài)轉(zhuǎn)移)概括了一些原則,描述了接口應(yīng)該如何表現(xiàn),例如,GET請求應(yīng)該是只讀的,并且不應(yīng)該更改服務(wù)器上的任何內(nèi)容。另一方面,POST命令允許創(chuàng)建新實(shí)體(例如,書籍的新實(shí)例)。你可以在這里了解更多關(guān)于實(shí)現(xiàn)的信息。

Raspberry Pi上的設(shè)置

在本教程中,Raspberry Pi上的設(shè)置非常簡單,因?yàn)槲覀冎皇褂靡粋€(gè)LED和一個(gè)按鈕。當(dāng)然,你的場景可以(應(yīng)該!)與此不同,因?yàn)樗皇且粋€(gè)示例,因此也非常簡單。

d25ce8fc-0918-11f0-9434-92fbcf53809c.jpg

LED通過330Ω串聯(lián)電阻連接到GPIO 17,按鈕連接到3.3V和GPIO 21。

此外,我們在以下內(nèi)容中使用GPIO的BCM編號,而不是板載編號:

Raspberry PiGPIO引腳分配

d264fd08-0918-11f0-9434-92fbcf53809c.jpg

Python REST API 的軟件組件

現(xiàn)在,我們將逐步創(chuàng)建API。首先,我們準(zhǔn)備所需的工具。之后,我們創(chuàng)建并擴(kuò)展我們的REST API,以切換或讀取GPIO。最后但同樣重要的是,我們要保障API的安全,以免任何人都可以訪問它。

順便說一下:你也可以在Github上找到我們將逐步講解的整個(gè)代碼。

安裝庫

在開始之前,我們需要Python3和一些庫,我們通過包安裝器pip加載它們。

sudo apt-get install python3 python3-pip

之后,我們可以安裝所需的Python庫:

pip3 install fastapi uvicorn[standard] rpi.gpio

可以在各自的文檔頁面(fastapi、uvicorn、rpi.gpio)上找到更多信息。

入門:首先通過API讀取狀態(tài)

讓我們開始第一次測試。為此,我們創(chuàng)建一個(gè)簡單的Python腳本。

sudo nano main.py

腳本內(nèi)容如下:

from fastapi import FastAPIimport RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False) app = FastAPI() @app.get("/read/{gpio}")def read_root(gpio: int): GPIO.setup(gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) return {"gpio": gpio, "on": GPIO.input(gpio)}

使用CTRL+O保存文件,并使用CTRL+X關(guān)閉nano編輯器。之后,我們就可以啟動程序了。

uvicorn main:app --reload

現(xiàn)在,你可以在Raspberry Pi的瀏覽器中打開以下URL:http://127.0.0.1:8000/read/17

如果按鈕連接到不同的引腳,你可以更改GPIO編號。如果你沒有按下按鈕,結(jié)果將如下所示:

{"gpio":17,"on":false}

這是我們在此端點(diǎn)下定義的響應(yīng)。如果你按下按鈕并再次調(diào)用URL,結(jié)果將發(fā)生變化。僅用幾行代碼,我們就編寫了第一個(gè)REST端點(diǎn)。但現(xiàn)在我們想對其進(jìn)行擴(kuò)展。

擴(kuò)展我們的Python API——設(shè)置GPIO狀態(tài)

純讀取有點(diǎn)無聊,所以我們當(dāng)然還想控制和設(shè)置GPIO。因此,我們創(chuàng)建了另一個(gè)端點(diǎn)(這次是PATCH,因?yàn)槲覀円膬?nèi)容):

from fastapi import FastAPIfrom pydantic import BaseModelimport RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False) app = FastAPI() class SetGPIO(BaseModel): on: bool @app.get("/read/{gpio}")def read_root(gpio: int): GPIO.setup(gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) return {"gpio": gpio, "on": GPIO.input(gpio)} @app.patch("/set/{gpio}")def read_item(gpio: int, value: SetGPIO): if value.on: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.HIGH) else: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.LOW) return {"gpio": gpio, "on": value.on}

如您所見,第一個(gè)參數(shù)再次是GPIO編號,

你可以使用Postman、瀏覽器擴(kuò)展或cURL(sudo apt-get install curl)。我使用了后者:

curl -X PATCH http://127.0.0.1:8000/set/21 -H "Content-Type: application/json" -d '{"on": true}'

這樣,LED就亮了!

順便說一下,你可以在http://127.0.0.1:8000/docs找到API文檔,這是使用Swagger/OpenAPI自動生成的。為了使響應(yīng)更具可讀性,我們定義了模型(response_model)。這只是一個(gè)具有屬性的類,在端點(diǎn)的定義中,我們聲明將返回此模型。

from fastapi import FastAPIfrom pydantic import BaseModelimport RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False) app = FastAPI() class GpioStatusResponse(BaseModel): gpio: int on: bool class SetGPIO(BaseModel): on: bool @app.get("/read/{gpio}", response_model=GpioStatusResponse)def read_root(gpio: int): GPIO.setup(gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) return GpioStatusResponse(gpio=gpio, on=GPIO.input(gpio)) @app.patch("/set/{gpio}", response_model=GpioStatusResponse)def read_item(gpio: int, value: SetGPIO): if value.on: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.HIGH) else: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.LOW) return GpioStatusResponse(gpio=gpio, on=value.on)

最后一項(xiàng)練習(xí):構(gòu)建一個(gè)端點(diǎn)(POST),用于在GPIO上激活PWM,以便我們能夠調(diào)節(jié)LED的亮度(點(diǎn)擊此處訪問PWM文檔)。

https://sourceforge.net/p/raspberry-gpio-python/wiki/PWM/此外,您現(xiàn)在擁有足夠的資源來構(gòu)建一個(gè)與用戶界面交互的GPIO,例如:

https://github.com/tutRPi/Raspberry-Pi-Simple-Web-GPIO-GUI

安全性——基本認(rèn)證和其他方法

如果我們開放Raspberry Pi的8000端口,任何人都可以訪問該API。我們要防止這種情況發(fā)生,并加入認(rèn)證機(jī)制。為此,我們有幾種選擇:

1.每次調(diào)用API時(shí),都會在請求頭中發(fā)送用戶名和密碼。為此,我們使用基本認(rèn)證,并在調(diào)用時(shí)驗(yàn)證數(shù)據(jù)的正確性。

2.另外,我們還可以使用帶有JWT(JSON Web Tokens)的oauth2,它們也是通過請求頭發(fā)送的。為了簡化起見,本教程中不會進(jìn)行此操作。如果您仍然想實(shí)現(xiàn)它(作為練習(xí)),可以在此處了解更多相關(guān)信息。

現(xiàn)在,我們再次打開腳本并相應(yīng)地進(jìn)行調(diào)整:

from fastapi.security import HTTPBasic, HTTPBasicCredentialsfrom pydantic import BaseModelfrom fastapi import Depends, FastAPI, HTTPException, statusimport RPi.GPIO as GPIOimport secrets GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False) app = FastAPI()security = HTTPBasic() class GpioStatusResponse(BaseModel): gpio: int on: bool class SetGPIO(BaseModel): on: bool def get_current_username(credentials: HTTPBasicCredentials = Depends(security)): correct_username = secrets.compare_digest(credentials.username, "admin") correct_password = secrets.compare_digest(credentials.password, "passw0rd") if not (correct_username and correct_password): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect email or password", headers={"WWW-Authenticate": "Basic"}, ) return credentials.username @app.get("/read/{gpio}", response_model=GpioStatusResponse)def read_root(gpio: int, username: str = Depends(get_current_username)): GPIO.setup(gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) return GpioStatusResponse(gpio=gpio, on=GPIO.input(gpio)) @app.patch("/set/{gpio}", response_model=GpioStatusResponse)def read_item(gpio: int, value: SetGPIO, username: str = Depends(get_current_username)): if value.on: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.HIGH) else: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.LOW) return GpioStatusResponse(gpio=gpio, on=value.on)

為了使查詢能夠成功進(jìn)行,我們需要包含用戶名和密碼(第24/25行)。使用curl或Postman可以很容易地實(shí)現(xiàn)這一點(diǎn):

curl -X PATCH http://127.0.0.1:8000/set/21 -H "Content-Type: application/json" -d '{"on": false}' -u "admin:passw0rd"

最后但同樣重要的是:如果您希望通過互聯(lián)網(wǎng)訪問API(即向外部世界開放您的端口),建議使用SSL證書(如Let’s Encrypt),以確保連接加密。您可以在此頁面上了解更多相關(guān)信息。

結(jié)論

使用FastAPI,我們可以非常輕松、快速地創(chuàng)建一個(gè)REST接口,并調(diào)用特定于Raspberry Pi的函數(shù)。通過它,我們可以控制GPIO、讀取傳感器數(shù)據(jù)等等。如果外部系統(tǒng)需要調(diào)用Raspberry Pi,這是一個(gè)簡單且清晰的解決方案。然而,您應(yīng)該注意適當(dāng)?shù)纳矸蒡?yàn)證,以確保不是每個(gè)人都可以遠(yuǎn)程控制Raspberry Pi。

作為Python REST API的替代方案,有諸如MQTT之類的解決方案:如果只需要傳輸/接收數(shù)據(jù),并且沒有公共API,MQTT是一個(gè)不錯(cuò)的選擇。如果我們?nèi)匀恍枰狝PI,也可以使用Node.JS來切換GPIO。總的來說,我覺得通過Python的解決方案更加舒適,而且它擁有最多的兼容擴(kuò)展。

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

    關(guān)注

    16

    文章

    1278

    瀏覽量

    53691
  • 樹莓派
    +關(guān)注

    關(guān)注

    121

    文章

    1964

    瀏覽量

    107097
收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    樹莓控制gpio

    樹莓在哪里編寫程序控制gpio引腳
    發(fā)表于 07-23 09:05

    為什么樹莓GPIO輸入的時(shí)候會出現(xiàn)錯(cuò)誤?

    我用的python控制的樹莓 下面是代碼 import RPi.GPIO as GPIO import time
    發(fā)表于 10-29 05:55

    詳解樹莓gpio功能及實(shí)用方法

    引腳編號之間的對應(yīng)規(guī)則。對于不同的樹莓版本,編寫的腳本文件也可能是無法通用的。  你可以使用下列代碼(強(qiáng)制的)指定一種編號規(guī)則:  GPIO.setmode(
    發(fā)表于 05-23 07:00

    樹莓gpio應(yīng)用

    樹莓現(xiàn)在越來越火,網(wǎng)上樹莓的資料也越來越多。樹莓源自英國,國外嵌入式開源領(lǐng)域具有良好的分享
    發(fā)表于 11-09 15:10 ?4342次閱讀

    樹莓gpio接口及編程方法

    樹莓現(xiàn)在越來越火,網(wǎng)上樹莓的資料也越來越多。樹莓源自英國,國外嵌入式開源領(lǐng)域具有良好的分享
    發(fā)表于 11-22 11:54 ?6.6w次閱讀

    樹莓gpio有什么用_怎么用

    樹莓現(xiàn)在越來越火,網(wǎng)上樹莓的資料也越來越多。樹莓源自英國,國外嵌入式開源領(lǐng)域具有良好的分享
    發(fā)表于 12-06 09:05 ?1.6w次閱讀

    樹莓GPIO入門07-利用聲音傳感器制作聲控?zé)?/a>

    GPIO4LED長針 - 樹莓GPIO17LED短針 - 樹莓
    發(fā)表于 04-02 14:41 ?2445次閱讀

    用網(wǎng)頁控制樹莓GPIO引腳

    電子發(fā)燒友網(wǎng)站提供《用網(wǎng)頁控制樹莓GPIO引腳.zip》資料免費(fèi)下載
    發(fā)表于 11-16 14:57 ?1次下載
    用網(wǎng)頁控制<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>的<b class='flag-5'>GPIO</b>引腳

    樹莓控制PWM控制電機(jī)轉(zhuǎn)速

    python庫配置 安裝GPIO庫 sudo apt-get install python3-rpi.gpio 電機(jī)控制程序 import time import RPi.GPIO as GP
    發(fā)表于 03-31 10:59 ?3次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b>控制PWM控制電機(jī)轉(zhuǎn)速

    樹莓控制繼電器

    樹莓控制繼電器命令行輸入gpio readall查看樹莓io口屬性可以看到被分為左右兩側(cè),左側(cè)為樹莓
    發(fā)表于 04-21 11:50 ?2次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b>控制繼電器

    樹莓接繼電器的使用

    1.查看樹莓的針腳 gpio readall ?2.連線 ? ?我們需要把繼電器的VCC 連到樹莓3.3V的針腳、GND連到0V的針腳、
    發(fā)表于 04-26 11:40 ?0次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b>接繼電器的使用

    使用樹莓GPIO點(diǎn)亮雙色LED燈

    上一篇文章向大家介紹樹莓的硬件部分、安裝操作系統(tǒng)及基礎(chǔ)設(shè)置。這篇文章將介紹樹莓的強(qiáng)大的開發(fā)功能口——GPIO,以及利用
    的頭像 發(fā)表于 07-04 11:34 ?3148次閱讀
    使用<b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>GPIO</b>口<b class='flag-5'>點(diǎn)亮</b>雙色LED燈

    基于樹莓點(diǎn)亮RGB三基色LED燈

    上一篇實(shí)現(xiàn)了樹莓的第一個(gè)基礎(chǔ)實(shí)驗(yàn)——點(diǎn)亮雙色LED燈,并了解了樹莓GPIO的基本用法。如果你
    的頭像 發(fā)表于 07-04 11:34 ?2645次閱讀
    基于<b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>點(diǎn)亮</b>RGB三基色LED燈

    樹莓gpio有什么用,樹莓gpio接口及編程方法

    /Output,通用輸入/輸出)是樹莓提供的一組可編程的引腳,是樹莓與外部世界進(jìn)行交互的重要橋梁。通過
    的頭像 發(fā)表于 10-22 18:09 ?2554次閱讀

    GPIO樹莓中的應(yīng)用

    直接控制和讀取外部硬件設(shè)備的狀態(tài)。 1. GPIO簡介 GPIO樹莓派上用于與外部世界交互的一組引腳。這些引腳可以被配置為輸入或輸出模式,從而實(shí)現(xiàn)對外部設(shè)備的控制和數(shù)據(jù)讀取。
    的頭像 發(fā)表于 01-09 09:41 ?755次閱讀
    主站蜘蛛池模板: 乱码精品一区二区三区 | 一级特黄aaa免费 | 日韩三级久久 | 国产免费人成在线看视频 | 亚洲午夜日韩高清一区 | 失禁h啪肉尿出来高h健身房 | 91寡妇天天综合久久影院 | 寡妇影院首页亚洲图片 | 在线观看视频一区二区 | 午夜在线观看免费观看大全 | 青草视频在线观看国产 | 天堂网在线最新版www中文网 | 7777奇米影视| 特黄特色三级在线观看 | 国产色秀视频 | 中文字幕一区二区三区5566 | 久久久久久夜精品精品免费 | 国产精品vv在线 | 免费观看一级特黄欧美大片 | 在线亚洲成人 | 欧美色欧美亚洲高清在线观看 | 你懂的手机在线视频 | 国产精品单位女同事在线 | 狠狠丁香激情久久综合 | 性日韩精品 | 2020国产v亚洲v天堂高清 | 国产在线精品一区二区夜色 | 男人j进女人j视频 | 国产免费成人在线视频 | 国产午夜三区视频在线 | 日本最顶级丰满的aⅴ艳星 日本最好的免费影院 | 四虎永久在线精品视频免费观看 | 丁香花的视频免费观看 | 亚洲免费一级视频 | 亚洲zscs综合网站 | 四虎影视最新地址 | 国产在线精品香蕉综合网一区 | 亚洲国产成人久久 | 一级片在线免费观看 | 天堂bt资源新版在线 | 国产盗摄女子私密保健视频 |