無料で始める

連携

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/labelsplant/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 を設定して、ブローカーがセッションを認識できるようにします。
  • 項目が空のままになる。 メッセージのキーは、デザインのバインディングと一致している必要があります。サブスクリプションの「ログ」欄には、すべてのメッセージが受信したとおりに表示されます。