บทช่วยสอนนี้จะอธิบายการโฮสต์ฮอตสปอตจากเครือข่าย Wi-Fi ของโรงแรมหรือการเชื่อมต่อเครือข่าย Wi-Fi สาธารณะใดๆ
คู่มือนี้จะอธิบายวิธีการโฮสต์ฮอตสปอตจากการเชื่อมต่อเครือข่าย Wi-Fi ของโรงแรม แต่กระบวนการเดียวกันนี้สามารถนำไปใช้กับเครือข่าย Wi-Fi สาธารณะใดๆ ที่ใช้พอร์ทัลแบบแคปทีฟ รวมถึงเครือข่ายสำหรับแขกในสนามบิน วิทยาเขตวิทยาลัย และร้านกาแฟ
เราจะเริ่มต้นด้วยการตั้งค่าฮอตสปอตที่บ้าน หากต้องการใช้ฮอตสปอตขณะที่คุณอยู่ที่โรงแรม โปรดดู การใช้ฮอตสปอ ต
ในการตั้งค่าการ์ด SD ของคุณในตอนแรก คุณจะต้องมี:
ยิ่ง Raspberry Pi ของคุณเร็วเท่าไหร่ ประสิทธิภาพการทำงานก็จะดีมากขึ้นเท่านั้น สำหรับบทช่วยสอนนี้ เราจะใช้ Raspberry Pi 4 2GB
คุณควรเลือก Raspberry Pi ที่มีโมดูล Wi-Fi ในตัว เพราะคุณจะต้องมีอุปกรณ์ Wi-Fi สองเครื่องเพื่อโฮสต์ฮอตสปอต Wi-Fi ของโรงแรม เครื่องหนึ่งเพื่อเชื่อมต่อกับเครือข่ายของโรงแรม และอีกเครื่องหนึ่งเพื่อกระจายเครือข่ายไปยังอุปกรณ์อื่นๆ ของคุณ
เลือกอะแดปเตอร์ USB Wi-Fi ที่เหมาะสม
อะแดปเตอร์ USB Wi-Fi ส่วนใหญ่ที่รองรับไดร์เวอร์ Linux ควรใช้งานได้
ในคู่มือนี้ เราใช้อะแดปเตอร์ 2.4 GHz 802.11 b/g/n ที่รวมอยู่ในชิปเซ็ต MediaTek MT7601U
เคล็ดลับ
หากคุณเลือก Raspberry Pi ที่ไม่มีโมดูล Wi-Fi ในตัว คุณจะต้องมีอะแดปเตอร์ Wi-Fi USB สองตัว อะแดปเตอร์ Wi-Fi ของคุณอย่างน้อยหนึ่งตัวต้องรองรับโหมด AP (จุดเชื่อมต่อ) เพื่อออกอากาศเครือข่ายฮอตสปอต
หากต้องการเริ่มต้น ให้ทำตามเอกสารการเริ่มต้นใช้งานเพื่อตั้งค่า Raspberry Pi ของ คุณ สำหรับระบบปฏิบัติการของคุณ ให้เลือก Raspberry Pi OS Lite (32 บิต) เพื่อรันโดยไม่ต้องใช้จอภาพ (ไม่ต้องใช้เมาส์และคีย์บอร์ด)
ในช่วงการปรับแต่งระบบปฏิบัติการ ให้แก้ไขการตั้งค่าดังต่อไปนี้:
ปิด Raspberry Pi โดยการถอดปลั๊กออกจากแหล่งจ่ายไฟ จากนั้นเชื่อมต่ออะแดปเตอร์ USB WiFi (หรืออะแดปเตอร์หลายๆ ตัว) เข้ากับ Raspberry Pi สุดท้าย ให้เปิดเครื่อง Raspberry Pi โดยเสียบปลั๊กกลับเข้ากับแหล่งจ่ายไฟ
SSH ช่วยให้คุณสามารถเชื่อมต่อกับ Raspberry Pi ได้จากระยะไกล โดยไม่ต้องใช้คีย์บอร์ดและเมาส์ เหมาะอย่างยิ่งหาก Raspberry Pi ของคุณอยู่ในตำแหน่งที่เข้าถึงได้ยาก เช่น ด้านหลังของจอภาพ
บันทึก
หากต้องการเชื่อมต่อผ่าน SSH เข้าสู่ Raspberry Pi คุณจะต้องใช้ชื่อโฮสต์ที่คุณตั้งค่าโดยใช้ Raspberry Pi Imager หากคุณประสบปัญหาในการเชื่อมต่อโดยใช้วิธีนี้ คุณอาจต้องการใช้ที่อยู่ IP ของ Raspberry Pi แทน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการค้นหาที่อยู่ IP และการเข้าถึง Raspberry Pi จากระยะไกล โปรดดู เอกสารการเข้าถึงระยะ ไกล
เปิดเซสชันเทอร์มินัลบนคอมพิวเตอร์ปกติของคุณ หากต้องการเข้าถึง Raspberry Pi ผ่าน SSH ให้รันคำสั่งต่อไปนี้โดยแทนที่ <ชื่อผู้ใช้> ด้วยชื่อผู้ใช้ที่คุณเลือกใน Imager:
$ ssh <username>@pi-hotspot.local
$ ssh <username>@pi-hotspot.local
The authenticity of host 'pi-hotspot.local (fd81:b8a1:261d:1:acd4:610c:b069:ac16)' can't be established.
ED25519 key fingerprint is SHA256:s6aWAEe8xrbPmJzhctei7/gEQitO9mj2ilXigelBm04.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/
[fingerprint])? yes
Warning: Permanently added 'pi-hotspot.local' (ED25519) to the list of known hosts.
เมื่อได้รับแจ้งให้ใส่รหัสผ่าน ให้ใช้รหัสผ่านที่คุณสร้างไว้ใน Raspberry Pi Imager
ตอนนี้ Raspberry Pi ของคุณพร้อมใช้งานแล้ว ถึงเวลาเปลี่ยนเป็นฮอตสปอตแล้ว
ค้นหาอะแดปเตอร์ USB Wi-Fi ของคุณ
ขั้นแรกเราต้องหาอะแดปเตอร์ USB เรียกใช้คำสั่งต่อไปนี้เพื่อระบุอุปกรณ์ Wi-Fi โดยใช้ Network Manager CLI:
$ nmcli device
คุณควรเห็นผลลัพธ์ที่คล้ายกับต่อไปนี้:
DEVICE TYPE STATE CONNECTION
wlan1 wifi connected Example Wi-Fi
lo loopback connected (externally) lo
wlan0 wifi disconnected --
p2p-dev-wlan0 wifi-p2p disconnected --
eth0 ethernet unavailable --
ในเอาต์พุตข้างต้น โมดูล USB Wi-Fi, wlan1 เชื่อมต่อกับเครือข่าย Wi-Fi ชื่อ "ตัวอย่าง Wi-Fi" อุปกรณ์ Wi-Fi ในตัว wlan0 ไม่ได้ใช้งานอยู่ในขณะนี้ ดังนั้นสถานะปัจจุบันจึงเป็น "ไม่ได้เชื่อมต่อ"
หาก Raspberry Pi ของคุณมีโมดูล Wi-Fi ในตัว ตามค่าเริ่มต้นจะแสดงเป็น wlan0 โมดูล Wi-Fi แรกที่คุณเชื่อมต่อจะแสดงเป็น wlan1 และอะแดปเตอร์ตัวถัดไปจะแสดงเป็น wlan2, wlan3 เป็นต้น ขึ้นอยู่กับการกำหนดค่าเฉพาะของคุณ Raspberry Pi ของคุณอาจเชื่อมต่อกับเครือข่ายโดยใช้ทั้งอะแดปเตอร์ USB หรือโมดูล Wi-Fi ในตัว
สร้างเครือข่ายฮอตสปอต
ต่อไปเราจะใช้โมดูล Wi-Fi ในตัวเพื่อกระจายสัญญาณเครือข่ายฮอตสปอต รันคำสั่งต่อไปนี้เพื่อสร้างฮอตสปอตโดยแทนที่ตัวแทน <ชื่อฮอตสปอต> และ <รหัสผ่านฮอตสปอต> ด้วยชื่อฮอตสปอตและรหัสผ่านที่คุณเลือก:
$ sudo nmcli device wifi hotspot ssid <hotspot name> password <hotspot password> ifname wlan0
เคล็ดลับ
ตัวเลือก ifname wlan0 ที่ส่วนท้ายของคำสั่งนี้ระบุว่าฮอตสปอตจะต้องใช้โมดูล Wi-Fi แบบบูรณาการซึ่งรองรับโหมด AP (จุดเชื่อมต่อ) ที่จำเป็นในการกระจายสัญญาณเครือข่ายฮอตสปอต หากต้องการโฮสต์ฮอตสปอตจาก Raspberry Pi โดยไม่มีโมดูล Wi-Fi ในตัว ให้ระบุอินเทอร์เฟซที่สอดคล้องกับอะแดปเตอร์ USB ที่รองรับโหมด AP
เมื่อคุณสร้างเครือข่ายฮอตสปอตแล้ว ฮอตสปอตของคุณจะทำงานโดยอัตโนมัติ
ขั้นตอนต่อไปคือการเชื่อมต่อกับฮอตสปอต Wi-Fi จากคอมพิวเตอร์ปกติของคุณ ค้นหาเครือข่ายที่มี SSID ตรงกับชื่อฮอตสปอตที่คุณเลือกในขั้นตอนก่อนหน้า ใช้รหัสผ่านที่คุณให้ไว้ในขั้นตอนนั้นเพื่อยืนยันตัวตน
จากนั้นเชื่อมต่อกับ Raspberry Pi ของคุณโดยใช้ SSH:
$ ssh <username>@pi-hotspot.local
และรันคำสั่งต่อไปนี้เพื่อดูการเชื่อมต่อปัจจุบันของคุณ:
$ nmcli connection
คุณควรเห็นผลลัพธ์ที่คล้ายกับต่อไปนี้:
NAME UUID TYPE DEVICE
Hotspot 69d77a03-1cd1-4ec7-bd78-2eb6cd5f1386 wifi wlan0
lo f0209dd9-8416-40a0-971d-860d3ff3501b loopback lo
Ethernet 4c8098c7-9f7d-4e3e-a27a-70d54235ec9a ethernet --
Example 1 f0c4fbcc-ac88-4791-98c2-e75685c70e9f wifi --
Example 2 9c6098a7-ac88-40a0-5ac2-b75695c70e9e wifi --
การเชื่อมต่อที่ชื่อ Hotspot แสดงถึงเครือข่าย Hotspot ใหม่ของคุณ การเชื่อมต่อตัวอย่างที่ 1 และตัวอย่างที่ 2 ข้างต้นแสดงถึงการเชื่อมต่อ Wi-Fi ที่บันทึกไว้แต่ไม่ทำงาน
กำหนดค่าเครือข่ายฮอตสปอต
กำหนดค่าเครือข่ายฮอตสปอตของคุณให้ออกอากาศอัตโนมัติทุกครั้งที่ Raspberry Pi ของคุณบูต เมื่อ Raspberry Pi ของคุณบูต มันจะเริ่มการเชื่อมต่อใดๆ ที่มีการเปิดใช้งานการเชื่อมต่ออัตโนมัติด้วยลำดับความสำคัญสูงสุด เพื่อให้แน่ใจว่าฮอตสปอตของคุณจะเริ่มทำงานทุกครั้งที่บูต เราจะเปิดใช้งานการเชื่อมต่ออัตโนมัติสำหรับฮอตสปอตและกำหนดค่าให้มีความสำคัญสูงกว่าการเชื่อมต่ออื่นๆ
เรียกใช้คำสั่งการเชื่อมต่อ nmcli ด้านบนอีกครั้งและคัดลอก UUID สำหรับเครือข่ายฮอตสปอตของคุณจากตาราง จากนั้นรันคำสั่งต่อไปนี้เพื่อดูคุณสมบัติการเชื่อมต่อสำหรับเครือข่ายฮอตสปอตของคุณโดยแทนที่ตัวแทน <hotspot UUID> ด้วย UUID สำหรับฮอตสปอตของคุณ:
$ nmcli connection show <hotspot UUID>
ผลลัพธ์จะประกอบด้วยคุณสมบัติหลายประการที่อธิบายเครือข่ายฮอตสปอตของคุณ แต่อย่างไรก็ตาม ในขณะนี้เราสนใจเพียงสองคุณสมบัติต่อไปนี้เท่านั้น:
connection.autoconnect: no
connection.autoconnect-priority: 0
เรียกใช้คำสั่งต่อไปนี้เพื่อเปลี่ยนลำดับความสำคัญและคุณสมบัติเชื่อมต่ออัตโนมัติสำหรับฮอตสปอตของคุณโดยแทนที่ตัวแทน <hotspot UUID> ด้วย UUID สำหรับฮอตสปอตที่คุณคัดลอกไปยังคลิปบอร์ดก่อนหน้านี้:
$ sudo nmcli connection modify <hotspot UUID> connection.autoconnect yes connection.autoconnect-priority 100
หากดำเนินการคำสั่งของคุณสำเร็จ เราควรเห็นค่าใหม่ต่อไปนี้สำหรับคุณสมบัติเหล่านั้นเมื่อเราเรียกใช้ nmcli connection show <hotspot UUID> อีกครั้ง:
connection.autoconnect: yes
connection.autoconnect-priority: 100
การกำหนดค่าพอร์ต
ต่อไปเราจะมาตั้งค่าเว็บไซต์พอร์ทัลที่ช่วยให้คุณเชื่อมต่อ Raspberry Pi กับเครือข่าย Wi-Fi ของโรงแรมจากเบราว์เซอร์ได้อย่างง่ายดาย
ติดตั้งเครื่องมือดังต่อไปนี้:
$ sudo apt install python3-flask
จากนั้นรันคำสั่งต่อไปนี้เพื่อสร้างไดเร็กทอรีที่เราสามารถสร้างพอร์ทัลที่เรียกว่า wifi-portal:
$ mkdir ~/wifi-portal
จากนั้นไปที่ไดเร็กทอรีพอร์ทัล:
$ cd ~/wifi-portal
เปิด app.py ในโฟลเดอร์พอร์ทัลซึ่งประกอบด้วยลอจิกสำหรับไซต์พอร์ทัล:
$ sudo nano app.py
คัดลอกและวางโค้ดต่อไปนี้ลงใน app.py:
from flask import Flask,request
import subprocess
app = Flask(__name__)
wifi_device = "wlan1"
@app.route('/')
def index():
result = subprocess.check_output(["nmcli", "--colors", "no", "-m", "multiline", "--get-value", "SSID", "dev", "wifi", "list", "ifname", wifi_device])
ssids_list = result.decode().split('\n')
dropdowndisplay = f"""
<!DOCTYPE html>
<html>
<head>
<title>Wifi Control</title>
</head>
<body>
<h1>Wifi Control</h1>
<form action="/submit" method="post">
<label for="ssid">Choose a WiFi network:</label>
<select name="ssid" id="ssid">
"""
for ssid in ssids_list:
only_ssid = ssid.removeprefix("SSID:")
if len(only_ssid) > 0:
dropdowndisplay += f"""
<option value="{only_ssid}">{only_ssid}</option>
"""
dropdowndisplay += f"""
</select>
<p/>
<label for="password">Password: <input type="password" name="password"/></label>
<p/>
<input type="submit" value="Connect">
</form>
</body>
</html>
"""
return dropdowndisplay
@app.route('/submit',methods=['POST'])
def submit():
if request.method == 'POST':
print(*list(request.form.keys()), sep = ", ")
ssid = request.form['ssid']
password = request.form['password']
connection_command = ["nmcli", "--colors", "no", "device", "wifi", "connect", ssid, "ifname", wifi_device]
if len(password) > 0:
connection_command.append("password")
connection_command.append(password)
result = subprocess.run(connection_command, capture_output=True)
if result.stderr:
return "Error: failed to connect to wifi network: <i>%s</i>" % result.stderr.decode()
elif result.stdout:
return "Success: <i>%s</i>" % result.stdout.decode()
return "Error: failed to connect."
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=80)
กด Ctrl+X จากนั้นกด Y และกด Enter เพื่อบันทึกไฟล์ที่แก้ไขใน nano
ขั้นตอนต่อไปคือการกำหนดค่า Raspberry Pi ของคุณให้รันเกตเวย์ Wi-Fi โดยอัตโนมัติหลังจากบูตเครื่อง เรียกใช้คำสั่งต่อไปนี้เพื่อเปิดแท็บ cron ซึ่งเป็นเครื่องมือจัดกำหนดการของ Linux:
$ crontab -e
ป้อน 1 เพื่อใช้ตัวแก้ไขข้อความนาโนในการแก้ไขกำหนดการ cron ของคุณ จากนั้นเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ โดยแทนที่ <ชื่อผู้ใช้> ด้วยชื่อผู้ใช้บัญชีผู้ดูแลระบบ Raspberry Pi ของคุณ:
@reboot sudo python3 /home/<username>/wifi-portal/app.py
กด Ctrl+X จากนั้นกด Y และกด Enter เพื่อบันทึกไฟล์ที่แก้ไขใน nano
และป้อนคำสั่งต่อไปนี้เพื่อรีบูต Raspberry Pi ของคุณ:
$ sudo reboot
ตอนนี้คุณพร้อมที่จะเชื่อมต่อกับเครือข่าย Wi-Fi ของโรงแรมใดๆ แล้ว!