連携
MQTT でラベル印刷: ブローカーのメッセージがそのままラベルになる
工場の現場では、はかり、スキャナー、PLC、センサーなど、ほとんどすべてがすでに MQTT ブローカーにつながっています。これをラベルにするには、通常、トピックを購読してレイアウトを埋め、ZPL をプリンターに送る小さなサービスを書くことになります。そのサービスは省略できます。zplCloud 自身がトピックを購…
工場の現場では、はかり、スキャナー、PLC、センサーなど、ほとんどすべてがすでに MQTT ブローカーにつながっています。これをラベルにするには、通常、トピックを購読してレイアウトを埋め、ZPL をプリンターに送る小さなサービスを書くことになります。そのサービスは省略できます。zplCloud 自身がトピックを購読して印刷するからです。
必要なもの
| 構成要素 | 例 |
|---|---|
| ブローカー | Mosquitto、HiveMQ、EMQX、AWS IoT Core、Azure IoT Hub |
| トピックフィルター | plant/line1/labels、ワイルドカードを使うなら plant/+/labels |
| アクセス | ユーザー名とパスワード。通常は TLS 付きのポート 8883 |
| 送信先 | 接続済みの Zebra プリンター、または仮想テストプリンター |
サブスクリプションを作成する
データストリーミング → サブスクリプション → 新しいサブスクリプション で種類 MQTT を選びます。接続文字列は、キーと値を並べただけのシンプルなリストです。
Server=broker.example.com;Port=8883;Tls=true;Username=plant1;Password=…;Qos=1
トピック欄にはトピックフィルターを入力します。MQTT のワイルドカードも使えます。+ はちょうど 1 階層に、# はそれより下のすべてに一致します。したがって plant/+/labels のサブスクリプションは、plant/line1/labels と plant/line2/labels を同時に受け取ります。
ラベルにする 2 つの方法
1 つ目: データを送ると、デザインが自動で埋まる。 サブスクリプションでラベルデザインを選ぶと、JSON メッセージの 1 件 1 件がレコードになります。メッセージのキーが、デザインのバインドされた項目を埋めます。
{ "sku": "88-12345", "batch": "LOT-42", "qty": 120, "bestBefore": "2027-03-01" }
sku にバインドされた項目には 88-12345 と表示されます。JSON でないものは、message として 1 つの項目に入ります。
2 つ目: 完成した ZPL。 メッセージがすでに ZPL を含んでいる場合は、サブスクリプションのデザインを空のままにして、エンベロープを送ります。
{
"schemaVersion": 1,
"printer": "*",
"zpl": "^XA^FO50,50^A0N,40,40^FDHello^FS^XZ"
}
printer には、プリンターのシリアル番号、リモートプリンターなら rp:{id}、アカウントのすべてのプリンターなら "*" を指定します。ZPL が大きい場合は、代わりに参照先を指定します。"zplRef": { "storage": "archive", "key": "orders/4711.zpl" } と書くと、印刷時に S3 または Azure Blob からファイルを取得します。
メッセージが失われない理由
MQTT は通常、メッセージが届いた時点で確認応答を返します。zplCloud は違います。確認応答を返すのは ZPL がプリンターに届いてからです。印刷に失敗した場合、メッセージは確認応答されないまま残り、QoS 1 または 2 であればブローカーが再配信します。
だからこそ、接続文字列に Qos=1 を入れておく価値があります。QoS 0 では、プロトコル自体に再配信の仕組みがありません。印刷の失敗で失われたものは、そのまま失われます。
用紙を使う前にリハーサルする
実際のラベルを流す前に、プリンター → サンドボックス プリンター で仮想テストプリンターを作成し、サブスクリプションで選択します。仮想テストプリンターは実機と同じように ZPL を受け付け、ラベルをレンダリングして履歴に保存します。ハードウェアは不要で、レンダリング枠も消費しません。こうすれば、最初のロールを使う前に、メッセージから実際に何が出力されるかを確認できます。
サブスクリプションは テスト で一度だけ手動実行することもできます。ブローカーのメッセージはまったく必要ありません。
よくある落とし穴
- 何も届かない。 トピックフィルターを確認してください。
plant/line1ではplant/line1/labelsへのメッセージを受け取れません。plant/line1/#が必要です。 - TLS エラー。 ポート 8883 には
Tls=trueが必要です。ポート 1883 は暗号化なしで通信します。 - 再起動後にラベルが重複する。
CleanSession=falseと固定のClientIdを設定して、ブローカーがセッションを認識できるようにします。 - 項目が空のままになる。 メッセージのキーは、デザインのバインディングと一致している必要があります。サブスクリプションの「ログ」欄には、すべてのメッセージが受信したとおりに表示されます。