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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

僅僅使用代碼,就能點亮樹莓派的 GPIO 世界

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

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

所需硬件部件

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

Raspberry Pi

LED燈

330Ω電阻

面包板

雌性-雌性跳線

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

什么是REST API?

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

Raspberry Pi上的設置

在本教程中,Raspberry Pi上的設置非常簡單,因為我們只使用一個LED和一個按鈕。當然,你的場景可以(應該!)與此不同,因為它只是一個示例,因此也非常簡單。

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

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

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

Raspberry PiGPIO引腳分配

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

Python REST API 的軟件組件

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

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

安裝庫

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

sudo apt-get install python3 python3-pip

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

pip3 install fastapi uvicorn[standard] rpi.gpio

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

入門:首先通過API讀取狀態

讓我們開始第一次測試。為此,我們創建一個簡單的Python腳本。

sudo nano main.py

腳本內容如下:

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關閉nano編輯器。之后,我們就可以啟動程序了。

uvicorn main:app --reload

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

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

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

這是我們在此端點下定義的響應。如果你按下按鈕并再次調用URL,結果將發生變化。僅用幾行代碼,我們就編寫了第一個REST端點。但現在我們想對其進行擴展。

擴展我們的Python API——設置GPIO狀態

純讀取有點無聊,所以我們當然還想控制和設置GPIO。因此,我們創建了另一個端點(這次是PATCH,因為我們要更改內容):

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}

如您所見,第一個參數再次是GPIO編號,

你可以使用Postman、瀏覽器擴展或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自動生成的。為了使響應更具可讀性,我們定義了模型(response_model)。這只是一個具有屬性的類,在端點的定義中,我們聲明將返回此模型。

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)

最后一項練習:構建一個端點(POST),用于在GPIO上激活PWM,以便我們能夠調節LED的亮度(點擊此處訪問PWM文檔)。

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

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

安全性——基本認證和其他方法

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

1.每次調用API時,都會在請求頭中發送用戶名和密碼。為此,我們使用基本認證,并在調用時驗證數據的正確性。

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

現在,我們再次打開腳本并相應地進行調整:

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)

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

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

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

結論

使用FastAPI,我們可以非常輕松、快速地創建一個REST接口,并調用特定于Raspberry Pi的函數。通過它,我們可以控制GPIO、讀取傳感器數據等等。如果外部系統需要調用Raspberry Pi,這是一個簡單且清晰的解決方案。然而,您應該注意適當的身份驗證,以確保不是每個人都可以遠程控制Raspberry Pi。

作為Python REST API的替代方案,有諸如MQTT之類的解決方案:如果只需要傳輸/接收數據,并且沒有公共API,MQTT是一個不錯的選擇。如果我們仍然需要API,也可以使用Node.JS來切換GPIO??偟膩碚f,我覺得通過Python的解決方案更加舒適,而且它擁有最多的兼容擴展。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • GPIO
    +關注

    關注

    16

    文章

    1230

    瀏覽量

    52990
  • 樹莓派
    +關注

    關注

    118

    文章

    1882

    瀏覽量

    106257
收藏 人收藏

    評論

    相關推薦

    樹莓控制gpio

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

    為什么樹莓GPIO輸入的時候會出現錯誤?

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

    詳解樹莓gpio功能及實用方法

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

    樹莓gpio應用

    樹莓現在越來越火,網上樹莓的資料也越來越多。樹莓源自英國,國外嵌入式開源領域具有良好的分享
    發表于 11-09 15:10 ?4266次閱讀

    樹莓gpio接口及編程方法

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

    樹莓gpio有什么用_怎么用

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

    樹莓GPIO入門07-利用聲音傳感器制作聲控燈

    GPIO4LED長針 - 樹莓GPIO17LED短針 - 樹莓
    發表于 04-02 14:41 ?2284次閱讀

    用網頁控制樹莓GPIO引腳

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

    樹莓控制PWM控制電機轉速

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

    樹莓控制繼電器

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

    樹莓接繼電器的使用

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

    使用樹莓GPIO點亮雙色LED燈

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

    基于樹莓點亮RGB三基色LED燈

    上一篇實現了樹莓的第一個基礎實驗——點亮雙色LED燈,并了解了樹莓GPIO的基本用法。如果你
    的頭像 發表于 07-04 11:34 ?2425次閱讀
    基于<b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>點亮</b>RGB三基色LED燈

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

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

    GPIO樹莓中的應用

    直接控制和讀取外部硬件設備的狀態。 1. GPIO簡介 GPIO樹莓派上用于與外部世界交互的一組引腳。這些引腳可以被配置為輸入或輸出模式,從而實現對外部設備的控制和數據讀取。
    的頭像 發表于 01-09 09:41 ?499次閱讀
    主站蜘蛛池模板: 免费簧片视频 | 另类毛片 | 久久久久无码国产精品一区 | 迅雷www天堂在线资源 | 福利视频一区二区牛牛 | 国产三级香港三级人妇 | 口述他拿舌头进去我下面好爽 | 欧美大片国产在线永久播放 | 精品欧美一区二区三区 | 天天草狠狠干 | 日韩欧美一区二区三区不卡视频 | 速度与激情一 | 国产成人精品日本 | 婷婷在线免费观看 | 日日摸夜夜爽 | 天天射天天舔 | 欧美a级网站 | 天天综合网站 | 在线种子资源网 | 欧美黑人巨大xxx猛交 | 在线观看黄日本高清视频 | 中文字幕亚洲天堂 | 久久精品免费观看久久 | 日本免费色网站 | 最新日本免费一区二区三区中文 | 国产精品777 | 窝窝午夜看片免费视频 | 性xxxxhd高清 | 色图综合网| 午夜高清免费观看视频 | 欧美精品aaa久久久影院 | 亚洲高清不卡视频 | 国产三级在线观看播放 | 玖玖国产在线观看 | 在线黄视频 | 国产免费一级高清淫日本片 | 国产精品欧美激情第一页 | 中文字幕精品一区影音先锋 | 色屁屁www免费看视频影院 | 在线免费观看一级片 | 午夜黄色小视频 |