เครื่องพิมพ์ฉลากให้ข้อมูล DPI ไม่ตรงกับความเป็นจริง

ไดรเวอร์ Web Bluetooth แบบโอเพนซอร์สแสดงให้เห็นว่า เครื่องพิมพ์ฉลาก Niimbot รุ่น N1 ที่โฆษณาว่าเป็นอุปกรณ์ความละเอียด 300 dpi แท้จริงแล้วพิมพ์ที่ความละเอียดประมาณ 203 dpi เท่านั้น

นักพัฒนาได้สร้างไดรเวอร์นี้ขึ้นมาเพื่อให้สามารถสั่งพิมพ์จากหน้าเว็บได้โดยตรง แทนที่จะต้องใช้แอปพลิเคชันบนมือถือของ Niimbot เขาได้ทำการวิศวกรรมย้อนกลับ (reverse-engineered) โปรโตคอลที่เป็นกรรมสิทธิ์ และเปิดให้เบราว์เซอร์ใช้งานผ่าน Web Bluetooth API ในระหว่างนั้น เขาไม่เพียงแต่ค้นพบฟีเจอร์ที่ขาดหายไป แต่ยังพบข้อผิดพลาดในการระบุสเปกขั้นพื้นฐาน ซึ่งอาจส่งผลเสียต่อการทำบรรจุภัณฑ์จำนวนน้อย การติดป้ายสต็อกสินค้า หรือโปรเจกต์งานอดิเรกที่ต้องการความแม่นยำสูง

การตรวจพบข้อผิดพลาดในการระบุสเปก

Niimbot ทำการตลาดโดยระบุว่า N1 เป็นเครื่องพิมพ์ 300 dpi ซึ่งหมายถึง 300 จุดต่อนิ้ว นักพัฒนาได้ลองพิมพ์ภาพสเกลไม้บรรทัดและรูปแบบการทดสอบที่มีตัวเลขกำกับ จากนั้นจึงใช้ไม้บรรทัดจริงวัดระยะของเครื่องหมาย ผลการคำนวณชี้ไปที่ประมาณ 203 dpi อย่างสม่ำเสมอ ไม่ใช่ 300 dpi ตามที่กล่าวอ้าง

4 บทเรียนอันล้ำค่าจากการเขียนไดรเวอร์ฮาร์ดแวร์

  1. งานที่ "สำเร็จ" อาจไม่ผลิตอะไรออกมาเลย ไดรเวอร์จะส่งข้อมูลไปยังเครื่องพิมพ์เป็นช่วงๆ (bursts) ในบางแพลตฟอร์ม Bluetooth stack อาจข้ามการเขียนข้อมูล (write) ไปโดยไม่มีการรายงานข้อผิดพลาด ไดรเวอร์จะเข้าใจว่างานเสร็จสิ้นแล้ว แต่ฉลากที่ออกมากลับว่างเปล่าหรือขาดหาย ปัจจุบันผู้เขียนจึงใช้วิธีอ่านตัวนับหน้า (page counter) ของเครื่องพิมพ์หลังจากจบงานแต่ละครั้ง เพื่อยืนยันว่ามีการป้อนกระดาษออกมาจริงๆ

  2. เอกสารไม่ใช่ความจริงเสมอไป การกล่าวอ้างเรื่อง 300 dpi เป็นตัวอย่างที่ชัดเจน สเปกอาจจะดูดีเกินจริง ล้าสมัย หรือแค่ผิดพลาด นักพัฒนาจำเป็นต้องวัดค่าพารามิเตอร์ที่สำคัญด้วยตัวเองเมื่อความแม่นยำของภาพเป็นเรื่องสำคัญ

  3. การวัดจากเครื่องหมายจริงดีกว่าการทดสอบ "ความพอดี" การพิมพ์รูปภาพเพื่อดูว่ามันพอดีกับพื้นที่ฉลากหรือไม่ จะเป็นการบดบังปัญหาเรื่องความละเอียด ความกว้างของหัวพิมพ์ หรือความคลาดเคลื่อนของตำแหน่ง (offset) การพิมพ์เครื่องหมายทางเรขาคณิตที่ทราบค่าแน่นอนและวัดตำแหน่งที่แม่นยำจะช่วยเผยพฤติกรรมที่แท้จริงของอุปกรณ์ได้

  4. โปรโตคอลอธิบายเพียงไวยากรณ์ ไม่ใช่พฤติกรรมของฮาร์ดแวร์ เครื่องพิมพ์สองเครื่องอาจใช้ชุดคำสั่งเดียวกันแต่ทำงานต่างกัน เช่น เครื่องหนึ่งรองรับการพิมพ์ซ้ำอย่างรวดเร็ว แต่อีกเครื่องกลับหยุดชะงัก ไดรเวอร์ไม่สามารถสันนิษฐานว่าประสิทธิภาพจะเหมือนกันโดยดูจากเอกสารโปรโตคอลเพียงอย่างเดียว แต่ละรุ่นจำเป็นต้องผ่านการทดสอบในโลกแห่งความเป็นจริง

ทำไมไดรเวอร์นี้ถึงสำคัญ

ไดรเวอร์นี้ไม่เคยแสร้งว่ารู้ทุกอย่าง เมื่อใดก็ตามที่มันต้องคาดเดาค่าแทนที่จะอ่านค่าโดยตรงจากเครื่องพิมพ์ มันจะทำเครื่องหมายระบุว่าฟิลด์นั้นเป็นการคาดเดา ความโปร่งใสนี้ช่วยป้องกันข้อผิดพลาดที่มองไม่เห็น (silent errors) ซึ่งหากปล่อยไว้จะทำให้ต้องเสียเวลาในการดีบั๊ก (debugging) นานหลายชั่วโมง

วิธีการใช้งานไดรเวอร์

ไดรเวอร์นี้ทำงานบน Chrome หรือ Edge โดยต้องการเพียงอุปกรณ์ที่รองรับ Bluetooth และเครื่องพิมพ์ Niimbot ที่รองรับ ลองใช้งานตัวอย่างได้ที่:

https://iscarelli.github.io/niimbot-web-bluetooth/demo/

ซอร์สโค้ดอยู่ที่ GitHub ซึ่งชุมชนสามารถช่วยเพิ่มข้อมูลรุ่นเครื่องพิมพ์ แก้ไขบั๊ก หรือปรับแต่งไดรเวอร์สำหรับเบราว์เซอร์อื่นๆ ได้ที่:

https://github.com/iscarelli/niimbot-web-bluetooth

เจ้าของเครื่อง Niimbot สามารถช่วยเพิ่มข้อมูลลงในฐานข้อมูลรุ่นเครื่องพิมพ์ได้ โดยใช้เวลาเพียงประมาณสิบนาทีและฉลากสองแผ่น

มุมมองอีกด้าน

จนกว่าบริษัทจะชี้แจงความคลาดเคลื่อนนี้ นักพัฒนาจำเป็นต้องทำงานโดยอ้างอิงจากค่าที่วัดได้จริง

บทสรุปนั้นเรียบง่าย: ฮาร์ดแวร์ที่คุณเรียกใช้งานจากหน้าเว็บอาจไม่ได้ทำงานตามที่ระบุไว้ในแผ่นสเปก จงตรวจสอบพารามิเตอร์ที่สำคัญ เตรียมใจรับมือกับความล้มเหลวที่ไม่มีการแจ้งเตือน และเลือกใช้ไดรเวอร์ที่แสดงความไม่แน่นอนออกมาแทนที่จะปกปิดมันไว้