1 คะแนน โดย GN⁺ 2 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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, spiffs
    • nvs ใช้เป็นที่เก็บข้อมูลแบบไม่ลบหาย เช่น เครือข่าย Wi‑Fi รหัสผ่าน และการตั้งค่าสี LED
    • otadata เข้าใจว่าเป็นพื้นที่ที่เกี่ยวข้องกับการอัปเดต OTA
    • safeboot คือเฟิร์มแวร์บูตแยกต่างหากที่ 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 ความคิดเห็น

 
GN⁺ 2 시간 전
ความคิดเห็นจาก Hacker News
  • เหมือนคำเตือนของทูต Pravin Lal จาก Alpha Centauri ที่ว่า คนที่พยายามควบคุมการไหลของข้อมูล สุดท้ายก็คือคนที่อยากเป็นผู้ปกครอง ยังให้ความรู้สึกว่าเข้ากับยุคนี้อยู่เสมอ

    • ทุกวันนี้ข้อมูลก็ไหลเวียนค่อนข้างเสรีอยู่แล้ว แต่ก็ยังเห็น การเพิ่มขึ้นของทรราชย์
      ความจริงเลยดูจะใกล้กับคำว่า “ประชาธิปไตยตายท่ามกลางเสียงปรบมือกึกก้อง” มากกว่า
    • “ออกไปจากดินแดนข้า ไอ้พวกกองกำลังรักษาสันติภาพ!”
      เป็น เกม 4X ที่ดีที่สุดตลอดกาล และปี 2060 แบบที่เกมจินตนาการไว้ก็ดูเหมือนจะใกล้เข้ามาทุกวัน
    • เป็น เกมวางกลยุทธ์·ปรัชญา ที่ยิ่งใหญ่ที่สุดที่เคยเห็นมาในรอบ 30 ปี
      ดูเหมือนเป็นผลงานช่วงพีกที่เกมมีทั้งความซับซ้อนและความเป็นผู้ใหญ่สูงสุด
    • เหมือนคำพูดของ Sister Miriam Godwinson เรื่องนาโนโรบอต ความหวาดกลัวที่จะยกอุตสาหกรรมหลักให้ “ก้อนเงินกับก้อนแป้ง” แล้วพยายามสอนสติปัญญาให้มัน ก็ยังใช้ได้อยู่ในตอนนี้
      เกมนี้และแนวคิดของมัน ไม่เคยล้าสมัย จริงๆ
    • วาทกรรมเมื่อราว 30 ปีก่อนที่ว่า “ข้อมูลต้องการเป็นอิสระ” พอมองตอนนี้แล้วดูใสซื่ออย่างมีเสน่ห์
      เพราะเราได้เห็นแล้วว่า คำโกหกก็เป็นข้อมูล และถ้าไปกับกระแสเดียวกัน มันอาจแพร่ได้ดียิ่งกว่าด้วยซ้ำ
  • ตามคาด ตัวอย่างหนังสือในบทความไม่ใช่ “หนังสือต้องห้าม” จริงๆ
    ปกติแล้วมันคือกรณีที่เอาหนังสือที่มี เนื้อหาโจ่งแจ้ง ออกจากคอลเล็กชันห้องสมุดโรงเรียนตามคำร้องของผู้ปกครอง

    • เนื้อหาส่วนใหญ่ของบทความพูดถึงการเปลี่ยนหลอดไฟให้เป็น Wi-Fi hotspot/web server แต่กลับไปสรุปว่า “จริงๆ แล้ว The Color Purple ไม่ใช่หนังสือต้องห้ามในเชิงเทคนิค” มันเลยดูหลุดโฟกัส
      เพราะไม่ใช่ประเด็นหลัก เลยรู้สึกว่าแทบเห็นตัวอย่างหนังสืออยู่แค่สักสองเล่ม
    • คำว่า “แบน” นิยามว่าอย่างไร?
      แม้แต่ Nineteen Eighty-four ก็มีเนื้อหาทางเพศ ดังนั้นถ้ามีพวกอำนาจนิยมที่อยากลดการเข้าถึงวรรณกรรมต่อต้านเผด็จการ ก็แค่ทำให้ผู้ปกครองโกรธเรื่องเพศก็พอ
    • ถ้าถูกแบนใน ห้องสมุดโรงเรียน ใดห้องสมุดหนึ่ง มันก็นับว่าถูกแบนแล้ว
      หนังสือไม่ได้จำเป็นต้องถูกแบนทั้งโลกถึงจะเรียกว่า “ถูกแบน” ได้
    • บางเล่มอาจถึงขั้นจงใจให้ตัวเองถูกแบนเพื่อเอาป้าย “หนังสือต้องห้าม” ก็ได้
      หนังสือแบบนั้นคงมีไม่มาก แต่ทุกวันนี้มันก็ดูเหมือนเป็นทางลัดสู่ชื่อเสียงด้านลบเหมือนกัน
  • เมื่อก่อนเคยมี PirateBox
    เป็นการแฟลชเฟิร์มแวร์แบบกำหนดเองลงบน Wi-Fi access point ขนาดเล็กที่มีเว็บเซิร์ฟเวอร์พร้อมฟอรัม/โฮสต์ไฟล์อยู่ในตัว เว็บไซต์เดิมหายไปแล้ว แต่มีโปรเจ็กต์ลูกหลงอยู่ที่นี่: https://www.jasongriffey.net/librarybox/
    แต่ถ้าเปิดให้ผู้ใช้อัปโหลดไฟล์ได้ แค่คิดว่าจะมีไฟล์อะไรถูกอัปขึ้นมาก็น่ากังวลแล้ว

    • เคยลองทำ PirateBox ด้วย access point Asus เก่าๆ แล้วค่อนข้างผิดหวัง
      คนมักกลัวการเชื่อมต่อกับ Wi-Fi แบบเปิด และเพราะมันไม่ได้ให้ “อินเทอร์เน็ตฟรี” ส่วนใหญ่เลยตัดการเชื่อมต่อทันที
      น่าเสียดายที่โปรเจ็กต์ลูกอย่าง LibraryBox ก็ไม่ได้ค่อยเคลื่อนไหวแล้วเช่นกัน
  • อยากรู้ว่ามีรายชื่อหนังสือต้องห้ามอะไรบ้าง
    พอลองกวาดดูคร่าวๆ ในสภาพที่ขาดหนึ่งในแพลตฟอร์มโซเชียลที่ใหญ่ที่สุดไป ก็ดูเหมือนไม่น่าจะมีหนังสือน่าสนใจอะไร น่าจะมีแต่หนังสือที่เห็นได้ในมุม “หนังสือต้องห้าม” ของร้านหนังสือกระแสหลัก
    มันดูเหมือน ความธรรมดาของความคิด ที่ขาดความหลากหลายแบบมีนัยสำคัญ

    • รายการอยู่ที่นี่: https://codeberg.org/rickoooooo/BannedBookLibrary/src/branch...
      รายการ “หนังสือต้องห้าม” สั้นมาก มีแค่ประมาณ Call of the Wild, The Adventures of Huckleberry Finn, The Adventures of Tom Sawyer, Women in Love
      ช่างน่าตกใจและกล้าหาญเสียจริง
    • ตามบทความ หลอดไฟมีพื้นที่เก็บข้อมูลแค่ 4MB และแนวคิดคือห้องสมุดของแต่ละหลอดสะท้อนตัวผู้สร้าง
      ดังนั้นจึงไม่มีรายการเดียวกลางๆ คุณอยากใส่อะไรก็ใส่ได้
  • ราวปี 2012 ก็เคยเห็นสิ่งนี้ถูกเรียกว่า Pirate Box
    ไอเดียพื้นฐานคือทำกล่องที่เปิดเครือข่าย Wi-Fi และเว็บเซิร์ฟเวอร์โดยแยกขาดจากอินเทอร์เน็ตวงกว้าง เพื่อให้คนอัปโหลด·ดาวน์โหลดไฟล์กัน
    เรียกได้ว่าเป็นห้องสมุดแบ่งปันดิจิทัลที่จำกัดตามภูมิศาสตร์

  • สำหรับคนที่ใส่ใจเรื่องซอฟต์แวร์ที่มีประสิทธิภาพและการใช้พลังงาน ก็สะดุดตาที่ภาพในบทความเป็น PNG ขนาด 5MB

  • Android ชอบตัดการเชื่อมต่ออัตโนมัติกับเครือข่าย Wi-Fi ที่ไม่ให้อินเทอร์เน็ต
    ถ้าจะปิดฟีเจอร์นี้ต้องไล่เข้าไปตามเมนูหลายชั้นที่ค่อนข้างหายาก

    • เผื่อคนที่หาอยู่ เส้นทางคือ Settings, Network and Internet, Adaptive Connectivity
    • ถ้าตอบกลับ HTTP GET สำหรับ IP ใดก็ได้ ก็อาจหลอกให้คิดว่ามีอินเทอร์เน็ตได้
      ตอนที่เช็กครั้งล่าสุด ระบบตรวจจับพอร์ทัลของโทรศัพท์ยังไม่ได้บังคับให้ต้องมี ใบรับรอง HTTPS ที่ใช้ได้จริงด้วยซ้ำ
    • วิธีเลี่ยงอีกแบบอาจเป็นทำให้อุปกรณ์ดูเหมือน captive portal ที่เจอตามร้านอย่าง Starbucks
      ถ้าผู้ใช้ถูกชวนให้กด “Sign In” แล้วพอเข้าไปก็เจอ dead drop ทันที
      แต่ยังไม่เคยลองเอง เลยไม่แน่ใจว่าจะใช้ได้จริงไหม หรือจำเป็นต้องมี DNS ที่ทำงานถูกต้องหรือเปล่า
  • เป็นตัวอย่างที่ดีว่าถึงจะไม่มีความรู้ตั้งต้นมาก แต่ถ้ามี เป้าหมายที่ชัดเจน มีความหลงใหล และความอยากรู้อยากเห็น ก็ไปได้ไกลแค่ไหน

  • แม้จะเท่มาก แต่คำกล่าวที่ว่า “เพราะมันเป็นหลอดไฟเลยตรวจจับยากและไม่สะดุดตา” ก็น่าสงสัย
    มันคงไม่ได้ปิดได้ยากกว่าอุปกรณ์ Wi-Fi สาธารณะอื่นๆ และน่าจะหาเจอได้ด้วยการค่อยๆ ปิดไฟหรือปิดอุปกรณ์ทีละจุด

    • เปิด ตัววิเคราะห์ Wi-Fi บนโทรศัพท์ แล้วเดินดูว่าสัญญาณแรงขึ้นหรืออ่อนลงก็หาเจอได้
      access point ระดับองค์กรสมัยใหม่ยังมีฟังก์ชันช่วยระบุตำแหน่งอุปกรณ์จริงและแจ้งเตือน access point ที่ไม่ได้รับอนุญาตอัตโนมัติด้วย
      แต่แบบหลังมักถูกเมินหรือปิดไป เพราะมันร้องเตือนทุกครั้งที่มีคนพิมพ์ผ่าน Wi-Fi Direct หรือแคสต์หน้าจอ
    • ก็จริง แต่โอกาสที่ใครจะสงสัยว่าหลอดไฟคือสิ่งผิดปกติดูน้อยมาก
      โดยเฉพาะถ้ามันดูเหมือนหลอดไฟธรรมดาที่ขันอยู่กับที่ ใครจะคิดว่ามันเป็น Wi-Fi access point กันล่ะ
    • แบบออกแบบใหม่: ใส่ แบตเตอรี่สำรอง ให้คอมพิวเตอร์ แล้วทำให้ไฟส่องสว่างยังทำงานต่อได้ด้วยไฟภายนอก
  • วัสดุ potting สีน้ำตาลนั้น นอกจากหน้าที่อื่นแล้ว ก็น่าจะถูกใช้เพื่อช่วยดึงความร้อนออกจากชิ้นส่วนด้วย