ラベルプリンターのDPI表記は実態と異なる
オープンソースのWeb Bluetoothドライバーにより、300 dpiのデバイスとして宣伝されているNiimbotのN1ラベルプリンターが、実際には約203 dpiで印刷されていることが明らかになりました。
開発者は、Niimbotのモバイルアプリを使用する代わりに、ウェブページから直接印刷できるようにこのドライバーを構築しました。彼は独自のプロトコルをリバースエンジニアリングし、Web Bluetooth APIを介してブラウザから利用できるようにしました。その過程で、単に機能が欠けているだけでなく、精度が求められる小規模なパッケージング、在庫タグ、あるいはホビープロジェクトにおいて致命的な問題となり得る、根本的な仕様の誤りを発見したのです。
仕様の誤りが判明した経緯
NiimbotはN1を300 dpi(1インチあたり300ドット)のプリンターとして販売しています。開発者は定規の目盛り画像と番号付きのテストパターンを印刷し、物理的な定規でその目盛りを測定しました。計算の結果、主張されている300 dpiではなく、一貫して約203 dpiであることが示されました。
ハードウェアドライバーの開発から得られた4つの教訓
「成功」したジョブが何も出力しない可能性がある。 プリンターはデータをバースト的にストリーミングします。一部のプラットフォームでは、Bluetoothスタックがエラーを報告せずに書き込みをドロップすることがあります。ドライバーはジョブが完了したと判断しますが、ラベルは白紙のままだったり、途切れたりして出てきます。著者は現在、実際に用紙が送り出されたことを確認するために、各ジョブの後にプリンターの物理的なページカウンターを読み取っています。
ドキュメントは現実とは限らない。 300 dpiの主張はその典型的な例です。仕様は楽観的であったり、古かったり、あるいは単に間違っていたりすることがあります。視覚的な忠実度が重要な場合、開発者は重要なパラメータを自分自身で測定しなければなりません。
「収まり」のテストよりも物理的な目盛りの方が確実である。 ラベル領域に収まるかどうかを確認するために画像を印刷する方法では、解像度、プリントヘッドの幅、あるいはオフセットの誤りが隠されてしまいます。既知の幾何学的な目盛りを印刷し、その正確な位置を測定することで、デバイスの真の挙動が明らかになります。
プロトコルは文法を記述するものであり、ハードウェアの気質を記述するものではない。 2つのプリンターが同じコマンドセットを共有していても、挙動が異なる場合があります。一方は連続したページ印刷を処理できても、もう一方は停止してしまうといった具合です。ドライバーはプロトコルのドキュメントのみに基づいて同一のパフォーマンスを想定することはできず、モデルごとに実機テストが必要です。
このドライバーが重要である理由
このドライバーは、すべてを知っているふりをすることはありません。プリンターから値を読み取る代わりに値を推測する場合は常に、そのフィールドを「推測(guess)」としてフラグ立てします。この透明性により、デバッグに何時間も費やすことになるようなサイレントエラーを防ぐことができます。
ドライバーの入手方法
ドライバーはChromeまたはEdgeで動作し、Bluetooth対応デバイスと対応するNiimbotプリンターのみが必要です。ライブデモはこちらからお試しください:
https://iscarelli.github.io/niimbot-web-bluetooth/demo/
ソースコードはGitHubにあり、コミュニティはモデルデータの提供、バグ修正、または他のブラウザへのドライバーの適応を行うことができます:
https://github.com/iscarelli/niimbot-web-bluetooth
Niimbotの所有者は、モデルデータベースの拡充に協力できます。このプロセスには、約10分と2枚のラベルが必要です。
現状の対応
メーカーがこの不一致を明らかにするまでは、開発者は測定された値に基づいて作業を進める必要があります。
教訓は単純です。ウェブページから呼び出すハードウェアは、仕様書が約束している通りの動作をしない可能性があります。重要なパラメータを検証し、サイレントな失敗を想定し、不確実性を隠すのではなく、それを明らかにするドライバーを選択してください。
