เครื่องพิมพ์ฉลากให้ข้อมูล 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 บทเรียนอันล้ำค่าจากการเขียนไดรเวอร์ฮาร์ดแวร์
งานที่ "สำเร็จ" อาจไม่ผลิตอะไรออกมาเลย ไดรเวอร์จะส่งข้อมูลไปยังเครื่องพิมพ์เป็นช่วงๆ (bursts) ในบางแพลตฟอร์ม Bluetooth stack อาจข้ามการเขียนข้อมูล (write) ไปโดยไม่มีการรายงานข้อผิดพลาด ไดรเวอร์จะเข้าใจว่างานเสร็จสิ้นแล้ว แต่ฉลากที่ออกมากลับว่างเปล่าหรือขาดหาย ปัจจุบันผู้เขียนจึงใช้วิธีอ่านตัวนับหน้า (page counter) ของเครื่องพิมพ์หลังจากจบงานแต่ละครั้ง เพื่อยืนยันว่ามีการป้อนกระดาษออกมาจริงๆ
เอกสารไม่ใช่ความจริงเสมอไป การกล่าวอ้างเรื่อง 300 dpi เป็นตัวอย่างที่ชัดเจน สเปกอาจจะดูดีเกินจริง ล้าสมัย หรือแค่ผิดพลาด นักพัฒนาจำเป็นต้องวัดค่าพารามิเตอร์ที่สำคัญด้วยตัวเองเมื่อความแม่นยำของภาพเป็นเรื่องสำคัญ
การวัดจากเครื่องหมายจริงดีกว่าการทดสอบ "ความพอดี" การพิมพ์รูปภาพเพื่อดูว่ามันพอดีกับพื้นที่ฉลากหรือไม่ จะเป็นการบดบังปัญหาเรื่องความละเอียด ความกว้างของหัวพิมพ์ หรือความคลาดเคลื่อนของตำแหน่ง (offset) การพิมพ์เครื่องหมายทางเรขาคณิตที่ทราบค่าแน่นอนและวัดตำแหน่งที่แม่นยำจะช่วยเผยพฤติกรรมที่แท้จริงของอุปกรณ์ได้
โปรโตคอลอธิบายเพียงไวยากรณ์ ไม่ใช่พฤติกรรมของฮาร์ดแวร์ เครื่องพิมพ์สองเครื่องอาจใช้ชุดคำสั่งเดียวกันแต่ทำงานต่างกัน เช่น เครื่องหนึ่งรองรับการพิมพ์ซ้ำอย่างรวดเร็ว แต่อีกเครื่องกลับหยุดชะงัก ไดรเวอร์ไม่สามารถสันนิษฐานว่าประสิทธิภาพจะเหมือนกันโดยดูจากเอกสารโปรโตคอลเพียงอย่างเดียว แต่ละรุ่นจำเป็นต้องผ่านการทดสอบในโลกแห่งความเป็นจริง
ทำไมไดรเวอร์นี้ถึงสำคัญ
ไดรเวอร์นี้ไม่เคยแสร้งว่ารู้ทุกอย่าง เมื่อใดก็ตามที่มันต้องคาดเดาค่าแทนที่จะอ่านค่าโดยตรงจากเครื่องพิมพ์ มันจะทำเครื่องหมายระบุว่าฟิลด์นั้นเป็นการคาดเดา ความโปร่งใสนี้ช่วยป้องกันข้อผิดพลาดที่มองไม่เห็น (silent errors) ซึ่งหากปล่อยไว้จะทำให้ต้องเสียเวลาในการดีบั๊ก (debugging) นานหลายชั่วโมง
วิธีการใช้งานไดรเวอร์
ไดรเวอร์นี้ทำงานบน Chrome หรือ Edge โดยต้องการเพียงอุปกรณ์ที่รองรับ Bluetooth และเครื่องพิมพ์ Niimbot ที่รองรับ ลองใช้งานตัวอย่างได้ที่:
https://iscarelli.github.io/niimbot-web-bluetooth/demo/
ซอร์สโค้ดอยู่ที่ GitHub ซึ่งชุมชนสามารถช่วยเพิ่มข้อมูลรุ่นเครื่องพิมพ์ แก้ไขบั๊ก หรือปรับแต่งไดรเวอร์สำหรับเบราว์เซอร์อื่นๆ ได้ที่:
https://github.com/iscarelli/niimbot-web-bluetooth
เจ้าของเครื่อง Niimbot สามารถช่วยเพิ่มข้อมูลลงในฐานข้อมูลรุ่นเครื่องพิมพ์ได้ โดยใช้เวลาเพียงประมาณสิบนาทีและฉลากสองแผ่น
มุมมองอีกด้าน
จนกว่าบริษัทจะชี้แจงความคลาดเคลื่อนนี้ นักพัฒนาจำเป็นต้องทำงานโดยอ้างอิงจากค่าที่วัดได้จริง
บทสรุปนั้นเรียบง่าย: ฮาร์ดแวร์ที่คุณเรียกใช้งานจากหน้าเว็บอาจไม่ได้ทำงานตามที่ระบุไว้ในแผ่นสเปก จงตรวจสอบพารามิเตอร์ที่สำคัญ เตรียมใจรับมือกับความล้มเหลวที่ไม่มีการแจ้งเตือน และเลือกใช้ไดรเวอร์ที่แสดงความไม่แน่นอนออกมาแทนที่จะปกปิดมันไว้
