iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
自我挑戰組

WiFiBoy Python 玩學機介紹系列 第 23

23. 簡易 Web Server

  • 分享至 

  • xImage
  •  

網頁伺服器簡介

現今社會大家每天都會用手機上網,瀏覽網頁。您知不知道這些網頁都是靠著網頁瀏覽器(Web Server)來處理使用者的請求,並提供相對應的網頁內容給使用者。一般來說網頁伺服器有兩種含意:

  1. 一台負責提供網頁內容的電腦,它可以用各種程式語言來開發應用程式,通過 http 傳輸協定,提供資料給客戶端(一般來說是指網頁瀏覽器)。
  2. 一種提供網頁的伺服器程式。

也就是說,一台提供網頁服務的電腦,會執行一個或多個網頁伺服器程式。

而市面上常見的網頁伺服器有:

  1. Apache HTTP Server
  2. Microsoft 的 Internet Information Server(IIS)
  3. Nginx
    與其他種類的網頁伺服器

但上述的網頁伺服器都是設計來提供給多人同時使用的,因此往往需要一台功能強大,記憶體較多的電腦來搭配使用。但我們的物聯網應用,往往工作單純,如果要額外購買一台電腦,似乎有點浪費。那使用玩學機是否可以建構一個簡易型的網頁伺服器呢?其實是可以的,但需要注意幾個原則:

  1. 玩學機的微處理器運算速度有限(最快240Mhz),請不要短時間一直向其要求連線與傳輸內容,這樣很容易讓服務當掉。
  2. 玩學機的記憶體也不多,也不建議多個使用者同時連線請求內容。
  3. 玩學機上提供的服務最好越單純越好,例如有個簡單介面,可以檢視目前設備的狀態。
  4. 網頁內容也不宜過大。

玩學機建立一個簡易網頁伺服器

為了避免每次都要連線到無線基地台,又將連線密碼寫到程式碼當中,我們可以另外把SSID 與連線密碼存成 secrets.py,連線程式存成connect.py 兩支程式。如果您要系統一開機就執行連線,則又可以修改 boot.py ,將連線程式載入。將自動執行的部分切開,我們的簡易型網頁伺服器程式碼就會比較容易閱讀。

secrets.py 的內容:

SSID = ‘Dora1F’
PASSWORD=’12345678@’

connect.py 的內容:

def do_connect(SSID, PASSWORD):
    import network
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print('connecting to network...')
        sta_if.active(True)
        sta_if.connect(SSID,bPASSWORD)
        while not sta_if.isconnected():
            pass
    print('network config:', sta_if.ifconfig())

boot.py 內容

import network, secrets, connect
do_connect(secrets.SSID, secrets.PASSWORD)

應用範例

檢視目前 WiFiBoy 各個腳位的狀態

https://ithelp.ithome.com.tw/upload/images/20230924/20105707mhHejHHdlq.png

import machine
pins = [machine.Pin(i, machine.Pin.IN) for i in (17,27,32,33,34,35,39,23)]

html = """<!DOCTYPE html>
<html>
    <head> <title>WiFiBoy OK:ESP32 Pins</title> </head>
    <body> <h1>WiFiBoy OK:ESP32 Pins</h1>
        <table border="1"> <tr><th>Pin</th><th>Value</th></tr> %s </table>
    </body>
</html>
"""

import socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

print('listening on', addr)

while True:
    cl, addr = s.accept()
    print('client connected from', addr)
    cl_file = cl.makefile('rwb', 0)
    while True:
        line = cl_file.readline()
        if not line or line == b'\r\n':
            break
    rows = ['<tr><td>%s</td><td>%d</td></tr>' % (str(p), p.value()) for p in pins]
    response = html % '\n'.join(rows)
    cl.send(response)
    cl.close()

上一篇
22. NTP時間伺服器對時
下一篇
24. 控制TelloEdu 無人機
系列文
WiFiBoy Python 玩學機介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言