ห้องสมุดหนังสือต้องห้ามในหลอดไฟอัจฉริยะ Wi‑Fi
(richardosgood.com)- Banned Book Library เป็นโปรเจ็กต์ดิจิทัลเดดดรอปที่เปลี่ยนหลอดไฟอัจฉริยะ Wi‑Fi ให้เป็นจุดเชื่อมต่อแบบเปิดและเว็บเซิร์ฟเวอร์ เพื่อให้อุปกรณ์ใกล้เคียงเข้าถึงอีบุ๊กได้ขณะที่หลอดไฟเปิดอยู่
- ฮาร์ดแวร์เริ่มจากหลอดไฟที่ติดตั้ง Tasmota มาล่วงหน้าบนพื้นฐาน ESP32C3 4MB โดยข้อจำกัดหลักคือการจัดสรรพื้นที่เก็บข้อมูลให้พอสำหรับเฟิร์มแวร์ เว็บไซต์ และไฟล์หนังสือทั้งหมดภายใต้แฟลชขนาดเล็ก
- การเพิ่ม microSD ถูกยกเลิก เพราะการบัดกรีภายในหลอดจริงและการถอดบอร์ดทำได้ยาก และประกอบกลับอย่างปลอดภัยได้ยาก จึงเลือกแก้โดยปรับ partition table เพื่อขยายพื้นที่เก็บไฟล์จาก 320KB เป็น 2MB
- เนื่องจาก Arduino เพียงอย่างเดียวเข้าถึงพื้นที่แฟลชที่ถูกป้องกันไม่ได้ จึงใช้ ESP-IDF ร่วมกับ Arduino as a Component และวางเส้นทางอัปเดตผ่านเฟิร์มแวร์ safeboot แยกต่างหากกับ ElegantOTA
- เว็บแอปสุดท้ายมีรายการหนังสือ แผงผู้ดูแล ระบบกู้คืน และ captive portal แต่ด้วยข้อจำกัด 4MB ทำให้หลอดไฟหนึ่งดวงใกล้เคียงกับห้องสมุดส่วนตัวที่คัดหนังสือไม่กี่เล่ม มากกว่าจะเก็บหนังสือจำนวนมาก
ภาพรวม
- โปรเจ็กต์นี้เริ่มจากแนวคิดการดัดแปลง หลอดไฟอัจฉริยะ Wi‑Fi ให้ให้บริการทั้งจุดเชื่อมต่อ Wi‑Fi แบบเปิดและเว็บเซิร์ฟเวอร์สำหรับหนังสือต้องห้าม
- เมื่อหลอดไฟเปิดอยู่ ผู้ใช้บริเวณใกล้เคียงจะสามารถเข้าถึงข้อมูลที่เก็บอยู่ในหลอดผ่านอุปกรณ์อิเล็กทรอนิกส์ที่มี Wi‑Fi ได้
- รูปทรงแบบหลอดไฟทำให้สังเกตได้ไม่ง่าย และมีราคาค่อนข้างต่ำ จึงถูกออกแบบให้เป็นดิจิทัลเดดดรอปที่สามารถวางทิ้งไว้ตามจุดต่าง ๆ ในละแวกได้
- แนวคิดนี้ได้รับอิทธิพลจากเรื่องสั้น Library ของ Ben Brown ซึ่ง “ห้องสมุด” ในเรื่องทำหน้าที่เป็นดิจิทัลอาร์ไคฟ์สำหรับเก็บผลงานสร้างสรรค์ คู่มือการใช้งาน โมเดล 3D และข้อมูลอื่น ๆ ที่ไม่ควรหายไปจากอินเทอร์เน็ต
- เมื่อไม่กี่เดือนก่อนจึงเริ่มลงมือทำจริง และผลงานถูกเผยแพร่เป็น Banned Book Library
ฮาร์ดแวร์
- หลังจากแชร์ไอเดียนี้ในงานรวมตัว DEFCON ท้องถิ่น ก็เริ่มพิจารณา Tasmota
- Tasmota เป็นเฟิร์มแวร์โอเพนซอร์สที่สามารถติดตั้งบนอุปกรณ์อัจฉริยะหลายชนิดและเชื่อมเข้ากับระบบโฮมอัตโนมัติอย่าง HomeAssistant ได้
- เป้าหมายหลักคือให้ควบคุมอุปกรณ์จากภายในเครือข่ายเอง โดยไม่ต้องพึ่งบริการคลาวด์
- อุปกรณ์อัจฉริยะจำนวนมากพึ่งบริการคลาวด์ที่อาจเปลี่ยนแปลงหรือหายไปเมื่อเวลาผ่านไป และ Tasmota สามารถแทนที่สิ่งนั้นด้วยการโฮสต์ภายในได้
- แม้จะไม่ได้แก้ไข Tasmota โดยตรง แต่ก็พบผู้ขายหลอดไฟ Wi‑Fi ที่ติดตั้ง Tasmota มาล่วงหน้า
- หน้าสินค้าระบุว่าหลอดไฟใช้
ESP32C3 4MB - มีการเปิดเผย GPIO pin สำหรับควบคุม LED ด้วย ซึ่งช่วยงานในภายหลัง
- การแมปพินคือ
R=GPIO6,G=GPIO7,B=GPIO5,CW=GPIO3,WW=GPIO4
- หน้าสินค้าระบุว่าหลอดไฟใช้
- Tasmota มีความสามารถอัปเดตเฟิร์มแวร์แบบ OTA จึงมีความเป็นไปได้ว่าจะอัปโหลดเฟิร์มแวร์แบบกำหนดเองได้โดยไม่ต้องแกะหลอดไฟ
- ปัญหาใหญ่ที่สุดคือ แฟลช 4MB ซึ่งต้องเก็บทั้งเฟิร์มแวร์ เว็บไซต์ และไฟล์หนังสือไว้ในนั้น
- เพื่อเผื่อกรณีทำพังระหว่างทดลอง จึงซื้อหลอดไฟมาสองดวง
การถอดประกอบ
- ส่วนกระจายแสงพลาสติกสีขาวด้านบนของหลอดถูกกรีดรอบขอบสองรอบด้วยใบมีด แล้วบิดออก
- ภายในมีบอร์ดย่อยทรงกลมที่ติด LED อยู่ เชื่อมกับบอร์ดด้านล่างด้วยพินหกตัว
- มีบางส่วนของเมนบอร์ดยื่นขึ้นมาตรงรูตรงกลาง ซึ่งส่วนนั้นคือเสาอากาศของ ESP32
- ตัวเรือนหลอดไฟและบอร์ดย่อยทำจากอะลูมิเนียม ดูเหมือนเป็นการออกแบบที่คำนึงถึงการรับสัญญาณ Wi‑Fi
- เมื่อถอดบอร์ดย่อยออก ก็เห็น ESP32C3 ภายในพร้อมชิ้นส่วนที่น่าจะใช้แปลงไฟและขับ LED
- บน ESP32 มีพินที่เปิดให้เข้าถึงหลายจุด และดูเหมือนอาจต่อ microSD card reader ได้
- เนื่องจากเอาหัวแร้งบัดกรีเข้าไปภายในหลอดไม่ได้ จึงต้องนำเมนบอร์ดออกมา และต้องค่อย ๆ แคะสาร potting ลักษณะคล้ายยางออกด้วยมีดและไขควง
- การถอดเมนบอร์ดยุ่งยากมาก และหลังติดตั้งกลับแล้วก็ยากจะเชื่อมั่นเรื่องความปลอดภัย จึงไม่เหมาะจะเป็นขั้นตอนบังคับในกระบวนการติดตั้งเดดดรอปจริง
- หลอดไฟที่ถอดแล้วถูกใช้เป็นแพลตฟอร์มพัฒนา โดยบัดกรีสายเข้ากับ VCC, GND, TX, RX, IO9 เพื่อใช้โปรแกรมผ่านซีเรียล
- ใช้ภาพโมดูลเดียวกันจาก AliExpress เพื่อตรวจสอบฉลากพินและหาตำแหน่ง VCC, GND, TX, RX
- GND ต่อเข้ากับ metal shield ที่บัดกรีได้ง่าย
- การเข้าโหมดดาวน์โหลดใช้วิธีบูตขณะต่อ IO9 ลงกราวด์
- ใช้
esptoolดัมพ์เฟิร์มแวร์ทั้งหมด และไม่กี่นาทีต่อมาก็ได้tasmota_original_firmware.bin
การทดลองช่วงแรก
-
Hello World
- ตอนแรกตั้งใจจะแก้ซอร์สโค้ด Tasmota ให้กลายเป็น Banned Book Library แต่เฟิร์มแวร์ซับซ้อนกว่าที่คิด และรองรับหลายสถาปัตยกรรมกับหลายอุปกรณ์ ทำให้ขอบเขตงานใหญ่เกินไป
- เนื่องจากเป้าหมายของโปรเจ็กต์อยากลดฟีเจอร์ที่ไม่จำเป็นและเพิ่มพื้นที่เก็บข้อมูล จึงเลิกแนวทางแก้ Tasmota
- จากนั้นยืนยันได้ว่าสามารถโปรแกรม ESP32 ด้วย Arduino ได้ จึงตั้งค่า Arduino IDE
- อัปโหลดโปรแกรม Hello World พื้นฐานให้ส่งข้อความออกพอร์ตซีเรียล และยืนยันได้ว่าสามารถเขียนเฟิร์มแวร์แบบกำหนดเองลงหลอดไฟได้โดยตรง
-
เว็บเซิร์ฟเวอร์
- ขั้นถัดไปคือการตั้งค่าจุดเชื่อมต่อ Wi‑Fi แบบเปิดและเว็บเซิร์ฟเวอร์
- อ้างอิงจากทิวทอเรียลเว็บเซิร์ฟเวอร์ ESP32 แต่ปรับแก้เพราะตอนนั้นการควบคุม LED ไม่ใช่เป้าหมาย
- หลังจากนั้นเปลี่ยนไปใช้ Async Web Server และพัฒนาต่อบนพื้นฐานของทิวทอเรียลที่เกี่ยวข้อง
-
microSD การ์ด
- เพื่อขยายพื้นที่เก็บข้อมูล จึงซื้อบอร์ด Sparkfun microSD breakout
- อ้างอิง datasheet ของ ESP32C3 เพื่อดูการต่อสายของ SD card reader
- ใช้ Adafruit ItsyBitsy ESP32 แทนหลอดจริงในการทำต้นแบบ เพราะบัดกรี pin header และต่อ microSD ได้ง่ายกว่ามาก
- แม้จะโฮสต์ไฟล์เว็บเซิร์ฟเวอร์ด้วย microSD และ LittleFS ได้สำเร็จ แต่สุดท้ายก็เลิกใช้แนวทาง microSD เพราะนำไปใช้กับหลอดจริงได้ยาก
- การบัดกรีเข้ากับ ESP32C3 ของหลอดจริงจำเป็นต้องนำบอร์ดออกจากตัวเรือน ซึ่งแทบไม่ต่างจากการทำอุปกรณ์พัง
- มีการลองนำพินควบคุม LED มาใช้ใหม่ด้วย แต่ในโครงสร้างนั้น GPIO ใช้ได้เพียงเป็นเอาต์พุตเพื่อเปิดทรานซิสเตอร์ให้วงจรลงกราวด์
- ยังออกแบบแคลมป์พิมพ์ 3D สำหรับครอบบน ESP32 เพื่อให้พินสัมผัสกันได้ แต่ไม่เสถียรและเชื่อถือไม่ได้ จึงยกเลิก
การพิจารณาทางอ้อม
- มีการสำรวจหลอดไฟอัจฉริยะรุ่นอื่น ๆ เพื่อดูว่ามีรุ่นที่บัดกรีได้ง่ายกว่าหรือไม่
- พบโพสต์การแกะอุปกรณ์หลายชิ้น แต่ส่วนใหญ่มีโครงสร้างภายในคล้ายกับหลอดเดิม
- หลอดไฟบางรุ่นใช้ชิปที่ไม่ใช่ ESP32 แต่เนื่องจากได้เรียนรู้การโปรแกรม ESP32 ไปแล้ว จึงจำกัดขอบเขตไว้ที่หลอดไฟบนพื้นฐาน ESP32
- หลอดไฟที่ซื้อจากร้านฮาร์ดแวร์ท้องถิ่นรุ่นหนึ่งมีโครงสร้างคล้ายกัน แต่มีแผ่นป้องกันอะลูมิเนียมที่ทำให้ถอดเมนบอร์ดออกอย่างปลอดภัยได้ยาก
- Philips WiZ ดูมีแววเพราะเมื่อถอดเพียงส่วนกระจายแสงพลาสติกก็เห็น ESP32C3-mini-1 แต่กลับเข้าถึงพิน ESP32 ที่ต้องใช้ไม่ได้
- ยังพิจารณาวิธีใส่วงจรของตัวเองลงในหลอด LED ทั่วไป แต่แนวทางนั้นซับซ้อนและเฉพาะทางกว่าการแฟลชหลอด Tasmota มาก
- สุดท้ายจึงเลือกใช้หลอด Tasmota ต่อไปและแก้ปัญหาภายในข้อจำกัด 4MB
ปัญหาพื้นที่เก็บข้อมูล
- โดยทั่วไป partition table ของ ESP32 จะถูกเก็บที่แฟลชออฟเซ็ต
0x8000จึงดัมพ์พื้นที่นี้ออกมาแล้วแปลงเป็น CSV เพื่อดูโครงสร้าง - พาร์ทิชันเดิมมีห้าส่วนคือ
nvs,otadata,safeboot,app0,spiffsnvsใช้เป็นที่เก็บข้อมูลแบบไม่ลบหาย เช่น เครือข่าย Wi‑Fi รหัสผ่าน และการตั้งค่าสี LEDotadataเข้าใจว่าเป็นพื้นที่ที่เกี่ยวข้องกับการอัปเดต OTAsafebootคือเฟิร์มแวร์บูตแยกต่างหากที่ Tasmota ใช้ในการแฟลชเฟิร์มแวร์หลักapp0เก็บเฟิร์มแวร์หลักspiffsคือพาร์ทิชันไฟล์ซิสเต็มขนาดเล็กสำหรับเก็บไฟล์ ซึ่งในกรณีนี้อาจแทน LittleFS ได้ด้วย
- ในโครงสร้างเดิม เฟิร์มแวร์หลักกินพื้นที่เกือบ 3MB, safeboot เกือบ 1MB และเหลือพื้นที่เก็บไฟล์เพียง 320KB
- เนื่องจากเฟิร์มแวร์แบบกำหนดเองเรียบง่ายกว่า Tasmota จึงประเมินว่าสามารถลดขนาด
app0และเพิ่มspiffsได้ - โครงสร้างพาร์ทิชันใหม่กำหนด
spiffsเป็นขนาด0x200000เพื่อให้ได้ พื้นที่เก็บข้อมูล 2MB สำหรับไฟล์เว็บและหนังสือ - การแก้ partition table มีความเสี่ยงสูง และถ้าเสียหายอุปกรณ์อาจบูตไม่ขึ้น ต้องกู้คืนด้วยการโปรแกรมผ่านซีเรียลเท่านั้น
- ที่ท้ายตารางมีค่า MD5 checksum อยู่ จึงไม่สามารถเปลี่ยนแค่ออฟเซ็ตและขนาดแล้วให้บูตได้
- หากย้ายตำแหน่งพาร์ทิชัน
app0ที่กำลังรันอยู่ เฟิร์มแวร์นั้นจะไม่สามารถบูตกลับมาได้อีก ดังนั้นจึงต้องคงตำแหน่งเริ่มต้นของapp0ไว้ - มีการสร้าง CSV ของพาร์ทิชันใหม่ ใช้
gen_esp32part.pyสร้างตารางไบนารี แล้วใช้xxdแปลงเป็นอาร์เรย์ C เพื่อนำไปใส่ในpartition.h - เขียนฟังก์ชันให้ข้ามการอัปเดตหาก MD5 ของ partition table ตรงกับตารางใหม่อยู่แล้ว แต่ถ้าไม่ตรงก็ลบตารางเดิมและเขียนตารางใหม่
- ในสภาพแวดล้อม Arduino การเข้าถึงพื้นที่แฟลชที่ได้รับการป้องกันถูกบล็อกไว้ ทำให้แม้ API จะคืนค่า success ก็ยังอ่านหรือเขียน partition table จริงไม่ได้
ESP-IDF
- ESP-IDF ซึ่งเป็นเฟรมเวิร์กอย่างเป็นทางการของ ESP32 มีความซับซ้อนในการตั้งค่าและใช้งานมากกว่า แต่ควบคุมอุปกรณ์และเฟรมเวิร์กได้กว้างกว่า
- สามารถเปลี่ยนค่าการตั้งค่าเฟรมเวิร์กผ่าน
idf.py menuconfigได้ โดยเมนูนี้ทำงานคล้าย menuconfig ของ Linux kernel - เพื่ออ่านและเขียน partition table ต้องตั้งค่า
SPI_FLASH_DANGEROUS_WRITE_ALLOWEDเป็นAllowed - ยังต้องปิด
SPI_FLASH_DANGEROUS_WRITE_ABORTSจึงจะเข้าถึง partition table ได้ - การใช้ ESP-IDF โดยตรงทำให้ใช้ฟังก์ชันอำนวยความสะดวกของ Arduino แบบเดิมไม่ได้ทั้งหมด แต่การเพิ่ม Arduino as a Component ช่วยให้ใช้ทั้งความสามารถของ Arduino และการควบคุมของ ESP-IDF ร่วมกันได้
- ไลบรารีอย่าง ElegantOTA, Async_TCP, AsyncWebServer ต้องถูกคัดลอกไปไว้ในไดเรกทอรี
componentsของโปรเจ็กต์ หรือในไดเรกทอรีlibrariesของ Arduino component - ยังต้องปรับ
CMakeLists.txtบางส่วนด้วย และมีการเพิ่มสคริปต์build.shลงในรีโพซิทอรีเพื่อจัดการงานซ้ำ ๆ นี้ - การบิลด์ทำด้วย
idf.py buildและการแฟลชผ่านซีเรียลใช้esptool -p /dev/ttyUSB0 write-flash 0xe0000 build/library.bin
หน้าการตั้งค่า
- อิมเมจเฟิร์มแวร์หลักมี endpoint สำคัญของเว็บเซิร์ฟเวอร์ แต่โค้ดห้องสมุดจริงถูกเก็บแยกไว้ในพาร์ทิชัน LittleFS
- อิมเมจไฟล์ซิสเต็มต้องแฟลชแยกต่างหาก และมีการใส่ ElegantOTA ไว้เพื่อจุดประสงค์นี้
- หากบูตขึ้นมาโดยยังไม่แฟลชไฟล์ซิสเต็ม จะเห็นหน้าการตั้งค่า
- หน้านี้จะแนะนำขั้นตอนการแฟลชอิมเมจไฟล์ซิสเต็มและเฟิร์มแวร์ safeboot ผ่าน ElegantOTA
Safeboot
- เพื่อคงความสามารถ OTA update ของเฟิร์มแวร์หลัก ตอนแรกตั้งใจจะใช้ Tasmota safeboot ตามเดิม
- Tasmota safeboot ใช้การตั้งค่า Wi‑Fi ในพาร์ทิชัน
nvsเพื่อทำการอัปเดต - ตรงนี้เกิดปัญหาเพราะ SSID และรหัสผ่าน Wi‑Fi ถูกเก็บเป็นข้อความล้วนในพาร์ทิชัน
nvs - หากนำหลอดไฟไปวางทิ้งไว้ภายนอก การปล่อยให้ credential ของ Wi‑Fi คงอยู่ถือว่าไม่ดีในมุม operational security
- เฟิร์มแวร์แบบกำหนดเองจึงลบพาร์ทิชัน
nvsก่อน และลบพาร์ทิชัน SPIFFS เพิ่มเติมด้วย - เมื่อการตั้งค่า Wi‑Fi ใน
nvsหายไป Tasmota safeboot ก็เชื่อมต่อเครือข่ายไม่ได้ ทำให้เส้นทางอัปเดตเฟิร์มแวร์ตามปกติขาดหาย - เพื่อแก้ปัญหานี้จึงต้องมี เฟิร์มแวร์ safeboot แบบกำหนดเอง แยกต่างหาก
- safeboot firmware นี้สร้างขึ้นจากตัวอย่าง GitHub ที่มี access point กับเว็บเซิร์ฟเวอร์แบบมินิมัลสำหรับทำ OTA update
- มีการปิดบางตัวเลือกใน
menuconfigเพื่อลดขนาดอิมเมจให้พอดีกับพาร์ทิชัน safeboot และสุดท้ายก็ทำงานได้ - ตัวพาร์ทิชัน safeboot เองไม่มีรหัสผ่าน แต่ฟังก์ชันผู้ดูแลที่ใช้รีบูตเข้าสู่ safeboot มีการป้องกันด้วยรหัสผ่าน
เว็บแอปพลิเคชัน
-
ห้องสมุด
- หน้าจอแรกแสดงภาพตู้คอนเทนเนอร์สีเหลืองที่มีประตู
- ภาพนี้อ้างอิงถึงเรื่องสั้น Library ของ Ben Brown ที่กล่าวถึงก่อนหน้า
- แม้ภาพจะกินพื้นที่เก็บข้อมูล แต่ยังคงเก็บไว้ และหน้าแรกยังมีเอฟเฟกต์กลิตช์เพื่อให้ความรู้สึกแบบ “แฮ็กเกอร์”
- หน้าห้องสมุดหลักถูกสร้างขึ้นด้วย HTML และ CSS ที่เขียนเอง
- แผนแรกคือหน้า HTML index ธรรมดาที่มีแค่รายการไฟล์ แต่ภายหลังก็พัฒนาให้ดูดีและสนุกขึ้น
- โครงสร้างเว็บไซต์ค่อนข้างเรียบง่าย
- มีส่วนหนึ่งที่อธิบายว่าผู้ใช้กำลังดูอะไรอยู่
- ในส่วนหนังสือ จะแสดงชื่อหนังสือ ผู้เขียน และเหตุผลที่หนังสือนั้นถูกท้าทายหรือถูกแบน
- ยังมีส่วนลิงก์อ้างอิงด้วย แต่เนื่องจาก access point ของ Banned Book Library ไม่มีการเชื่อมต่ออินเทอร์เน็ต ลิงก์ภายนอกจะใช้งานไม่ได้ขณะเชื่อมต่ออยู่
-
ผู้ดูแล
- ที่เส้นทาง
/adminมี แผงผู้ดูแล ที่ป้องกันด้วยรหัสผ่าน - แผงผู้ดูแลสามารถควบคุมอุณหภูมิสีของ LED ได้
- จุดประสงค์คือเพื่อให้เวลาติดตั้งในที่สาธารณะสามารถปรับให้สีตรงกับหลอดเดิมได้มากขึ้น เพื่อลดความสังเกตเห็นว่ามีการเปลี่ยนหลอด
- เนื่องจากผู้ขายหลอดไฟเปิดเผย GPIO pin สำหรับควบคุม LED แต่ละสีไว้ จึงสามารถใช้
AnalogWrite()เพื่อตั้งค่าความเข้มของแต่ละสีได้ - การตั้งค่าสีจะถูกเก็บไว้ใน
NVSและกลับมาใช้ค่าเดิมเมื่อบูตครั้งถัดไป - ฟังก์ชันผู้ดูแลยังมีปุ่มไปยังหน้ากู้คืนด้วย
- ที่เส้นทาง
-
การกู้คืน
- ฟังก์ชันกู้คืนจะย้อน partition table กลับบางส่วนและบูตเข้าสู่ safeboot
- ในทางปฏิบัติ มันคือการรีบูตเข้าสู่ custom safeboot partition เพื่อให้สามารถแฟลชเฟิร์มแวร์อื่นทับ Banned Book Library ได้
- เฟิร์มแวร์ที่แฟลชอาจเป็นเวอร์ชันใหม่, Tasmota หรือ ESPHome ก็ได้
- ยังไม่พบวิธีที่ดีในการกู้คืนพาร์ทิชัน safeboot เอง
- หากแฟลช Tasmota กลับเข้าไป แล้วกด “Firmware Upgrade” ในอินเทอร์เฟซของ Tasmota ระบบจะบูตกลับเข้า custom safeboot อีกครั้ง
- safeboot ตัวนี้สามารถใช้กับการอัปเดตของ Tasmota ได้ แต่ไม่สอดคล้องอย่างลื่นไหลกับประสบการณ์อัปเกรดแบบปกติของ Tasmota
- เพราะปัญหานี้ การกู้คืนพาร์ทิชันจึงไม่ได้เปลี่ยน subtype ของ safeboot กลับเป็น
Factoryอย่างสมบูรณ์ แต่คงไว้เป็นOTA_1
-
captive portal
- ผู้ใช้อาจเชื่อมต่อ access point แบบเปิดแล้วเห็นแค่ว่าไม่มีอินเทอร์เน็ตก่อนจะยอมแพ้ จึงจำเป็นต้องมี captive portal
- วิธีแบบเก่าคือดัก HTTP request แล้วรีไดเรกต์ไปพอร์ทัล แต่ปัจจุบันเว็บไซต์ส่วนใหญ่ใช้ HTTPS ทำให้วิธีนี้ไม่ค่อยเหมาะ
- แนวทางสมัยใหม่รวมถึงการใช้ DHCP option เพื่อบอกว่ามี captive portal และการจัดการคำขอตรวจจับพอร์ทัลของอุปกรณ์แต่ละชนิด
- มีการหาโค้ดตัวอย่าง captive portal สำหรับ ESP32 และนำบางส่วนมาใช้ในโปรเจ็กต์
- โค้ดนั้นทำงานสองอย่าง
- DNS server จะตอบทุกคำขอด้วย IP address ของ ESP32 เอง
- และจะดัก HTTP request เฉพาะที่ใช้โดย Microsoft, Android, iOS, Firefox และอื่น ๆ เพื่อส่งรีไดเรกต์หรือการตอบกลับที่เหมาะสม
- คำขอที่ไม่รู้จักจะถูกรีไดเรกต์ไปยัง URL ภายในผ่าน
server.onNotFoundและ serial monitor จะแสดง host กับ URL ของคำขอนั้น
ความคิดส่งท้าย
-
ข้อจำกัดด้านขนาด
- พื้นที่เก็บข้อมูลทั้งหมดของอุปกรณ์ถูกจำกัดไว้ที่ 4MB
- หนังสือ epub ที่ตรวจสอบบางเล่มมีขนาดราว 350KB ต่อเล่ม ทำให้หลอดไฟหนึ่งดวงเก็บหนังสือประเภทนี้ได้เพียงไม่กี่เล่ม
- ตอนแรกข้อจำกัดนี้น่าผิดหวัง เพราะภาพที่คิดไว้คือเว็บเซิร์ฟเวอร์ที่ให้บริการหนังสือต้องห้ามจำนวนมาก
- ต่อมาข้อจำกัดด้านพื้นที่กลับถูกมองว่าเป็นข้อดี เพราะทำให้เดดดรอปแต่ละชิ้นสะท้อนการคัดเลือกของผู้สร้าง
- ผู้สร้างต้องเลือกหนังสือที่สำคัญกับตนเอง หรือคิดว่าคนอื่นควรเข้าถึง
- หากมีหลายดวงกระจายอยู่ในพื้นที่เดียวกันและแต่ละหลอดบรรจุข้อมูลต่างกัน ประสบการณ์การออกตามหาและค้นพบเนื้อหาก็อาจสนุกยิ่งขึ้น
-
ไอเดียในอนาคต
-
การควบคุมสี
- อยากเพิ่มสไลเดอร์สำหรับควบคุมสี RGB และอุณหภูมิสีขาวให้ละเอียดขึ้น
- วิธีนี้จะช่วยให้ปรับสีให้ใกล้เคียงกับแสงเดิมของสถานที่ติดตั้งได้มากขึ้น
-
mesh networking
- จากข้อจำกัดด้านพื้นที่เก็บข้อมูล จึงเกิดไอเดียให้หลอดไฟหลายดวงสร้าง mesh network ร่วมกัน
- หากใช้แนวคิดคล้าย distributed hash table ก็อาจทำให้ผู้ใช้ที่เชื่อมต่อเข้ากับอุปกรณ์ดวงใดดวงหนึ่งสามารถเข้าถึงหนังสือจากอุปกรณ์อื่นที่อยู่ในระยะได้
- ไอเดียนี้ยังคงเป็นทิศทางที่น่าสนุกและควรสำรวจต่อ
-
อื่น ๆ
- ยังมีแนวคิดอีกหลายอย่างในการนำอุปกรณ์อัจฉริยะไปดัดแปลงใช้ในทางอื่น
- ชิป ESP32 ถูกมองว่าราคาถูกมากแต่มีประสิทธิภาพเพียงพอ
- หลังจากเรียนรู้วิธีใช้ ESP32 แล้ว ก็มีความเป็นไปได้สูงว่าจะสร้างโปรเจ็กต์ ESP32 เพิ่มอีกในอนาคต
-
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เหมือนคำเตือนของทูต Pravin Lal จาก Alpha Centauri ที่ว่า คนที่พยายามควบคุมการไหลของข้อมูล สุดท้ายก็คือคนที่อยากเป็นผู้ปกครอง ยังให้ความรู้สึกว่าเข้ากับยุคนี้อยู่เสมอ
ความจริงเลยดูจะใกล้กับคำว่า “ประชาธิปไตยตายท่ามกลางเสียงปรบมือกึกก้อง” มากกว่า
เป็น เกม 4X ที่ดีที่สุดตลอดกาล และปี 2060 แบบที่เกมจินตนาการไว้ก็ดูเหมือนจะใกล้เข้ามาทุกวัน
ดูเหมือนเป็นผลงานช่วงพีกที่เกมมีทั้งความซับซ้อนและความเป็นผู้ใหญ่สูงสุด
เกมนี้และแนวคิดของมัน ไม่เคยล้าสมัย จริงๆ
เพราะเราได้เห็นแล้วว่า คำโกหกก็เป็นข้อมูล และถ้าไปกับกระแสเดียวกัน มันอาจแพร่ได้ดียิ่งกว่าด้วยซ้ำ
ตามคาด ตัวอย่างหนังสือในบทความไม่ใช่ “หนังสือต้องห้าม” จริงๆ
ปกติแล้วมันคือกรณีที่เอาหนังสือที่มี เนื้อหาโจ่งแจ้ง ออกจากคอลเล็กชันห้องสมุดโรงเรียนตามคำร้องของผู้ปกครอง
เพราะไม่ใช่ประเด็นหลัก เลยรู้สึกว่าแทบเห็นตัวอย่างหนังสืออยู่แค่สักสองเล่ม
แม้แต่ Nineteen Eighty-four ก็มีเนื้อหาทางเพศ ดังนั้นถ้ามีพวกอำนาจนิยมที่อยากลดการเข้าถึงวรรณกรรมต่อต้านเผด็จการ ก็แค่ทำให้ผู้ปกครองโกรธเรื่องเพศก็พอ
หนังสือไม่ได้จำเป็นต้องถูกแบนทั้งโลกถึงจะเรียกว่า “ถูกแบน” ได้
หนังสือแบบนั้นคงมีไม่มาก แต่ทุกวันนี้มันก็ดูเหมือนเป็นทางลัดสู่ชื่อเสียงด้านลบเหมือนกัน
เมื่อก่อนเคยมี PirateBox
เป็นการแฟลชเฟิร์มแวร์แบบกำหนดเองลงบน Wi-Fi access point ขนาดเล็กที่มีเว็บเซิร์ฟเวอร์พร้อมฟอรัม/โฮสต์ไฟล์อยู่ในตัว เว็บไซต์เดิมหายไปแล้ว แต่มีโปรเจ็กต์ลูกหลงอยู่ที่นี่: https://www.jasongriffey.net/librarybox/
แต่ถ้าเปิดให้ผู้ใช้อัปโหลดไฟล์ได้ แค่คิดว่าจะมีไฟล์อะไรถูกอัปขึ้นมาก็น่ากังวลแล้ว
คนมักกลัวการเชื่อมต่อกับ Wi-Fi แบบเปิด และเพราะมันไม่ได้ให้ “อินเทอร์เน็ตฟรี” ส่วนใหญ่เลยตัดการเชื่อมต่อทันที
น่าเสียดายที่โปรเจ็กต์ลูกอย่าง LibraryBox ก็ไม่ได้ค่อยเคลื่อนไหวแล้วเช่นกัน
อยากรู้ว่ามีรายชื่อหนังสือต้องห้ามอะไรบ้าง
พอลองกวาดดูคร่าวๆ ในสภาพที่ขาดหนึ่งในแพลตฟอร์มโซเชียลที่ใหญ่ที่สุดไป ก็ดูเหมือนไม่น่าจะมีหนังสือน่าสนใจอะไร น่าจะมีแต่หนังสือที่เห็นได้ในมุม “หนังสือต้องห้าม” ของร้านหนังสือกระแสหลัก
มันดูเหมือน ความธรรมดาของความคิด ที่ขาดความหลากหลายแบบมีนัยสำคัญ
รายการ “หนังสือต้องห้าม” สั้นมาก มีแค่ประมาณ Call of the Wild, The Adventures of Huckleberry Finn, The Adventures of Tom Sawyer, Women in Love
ช่างน่าตกใจและกล้าหาญเสียจริง
ดังนั้นจึงไม่มีรายการเดียวกลางๆ คุณอยากใส่อะไรก็ใส่ได้
ราวปี 2012 ก็เคยเห็นสิ่งนี้ถูกเรียกว่า Pirate Box
ไอเดียพื้นฐานคือทำกล่องที่เปิดเครือข่าย Wi-Fi และเว็บเซิร์ฟเวอร์โดยแยกขาดจากอินเทอร์เน็ตวงกว้าง เพื่อให้คนอัปโหลด·ดาวน์โหลดไฟล์กัน
เรียกได้ว่าเป็นห้องสมุดแบ่งปันดิจิทัลที่จำกัดตามภูมิศาสตร์
สำหรับคนที่ใส่ใจเรื่องซอฟต์แวร์ที่มีประสิทธิภาพและการใช้พลังงาน ก็สะดุดตาที่ภาพในบทความเป็น PNG ขนาด 5MB
Android ชอบตัดการเชื่อมต่ออัตโนมัติกับเครือข่าย Wi-Fi ที่ไม่ให้อินเทอร์เน็ต
ถ้าจะปิดฟีเจอร์นี้ต้องไล่เข้าไปตามเมนูหลายชั้นที่ค่อนข้างหายาก
ตอนที่เช็กครั้งล่าสุด ระบบตรวจจับพอร์ทัลของโทรศัพท์ยังไม่ได้บังคับให้ต้องมี ใบรับรอง HTTPS ที่ใช้ได้จริงด้วยซ้ำ
ถ้าผู้ใช้ถูกชวนให้กด “Sign In” แล้วพอเข้าไปก็เจอ dead drop ทันที
แต่ยังไม่เคยลองเอง เลยไม่แน่ใจว่าจะใช้ได้จริงไหม หรือจำเป็นต้องมี DNS ที่ทำงานถูกต้องหรือเปล่า
เป็นตัวอย่างที่ดีว่าถึงจะไม่มีความรู้ตั้งต้นมาก แต่ถ้ามี เป้าหมายที่ชัดเจน มีความหลงใหล และความอยากรู้อยากเห็น ก็ไปได้ไกลแค่ไหน
แม้จะเท่มาก แต่คำกล่าวที่ว่า “เพราะมันเป็นหลอดไฟเลยตรวจจับยากและไม่สะดุดตา” ก็น่าสงสัย
มันคงไม่ได้ปิดได้ยากกว่าอุปกรณ์ Wi-Fi สาธารณะอื่นๆ และน่าจะหาเจอได้ด้วยการค่อยๆ ปิดไฟหรือปิดอุปกรณ์ทีละจุด
access point ระดับองค์กรสมัยใหม่ยังมีฟังก์ชันช่วยระบุตำแหน่งอุปกรณ์จริงและแจ้งเตือน access point ที่ไม่ได้รับอนุญาตอัตโนมัติด้วย
แต่แบบหลังมักถูกเมินหรือปิดไป เพราะมันร้องเตือนทุกครั้งที่มีคนพิมพ์ผ่าน Wi-Fi Direct หรือแคสต์หน้าจอ
โดยเฉพาะถ้ามันดูเหมือนหลอดไฟธรรมดาที่ขันอยู่กับที่ ใครจะคิดว่ามันเป็น Wi-Fi access point กันล่ะ
วัสดุ potting สีน้ำตาลนั้น นอกจากหน้าที่อื่นแล้ว ก็น่าจะถูกใช้เพื่อช่วยดึงความร้อนออกจากชิ้นส่วนด้วย