sample_mqtt.hsp

sample\iron\sample_mqtt.hsp » Plain Format

;============================================================
;  sample_mqtt.hsp — hspmqtt.dll MQTT 3.1.1 pub/sub デモ
;
;  前提:
;    ローカルまたは LAN 上の MQTT ブローカが必要。
;    最も手軽なのは Mosquitto:
;       winget install EclipseFoundation.Mosquitto
;       mosquitto -v        ; デフォルトで 1883/tcp を listen
;    クラウドで試すなら test.mosquitto.org (公開テスト用、誰でも読める):
;       host = "test.mosquitto.org" : port = 1883
;
;  このサンプルは 1 プロセスで subscriber + publisher を兼ねる:
;    1. broker に接続
;    2. topic "hsp/demo/#" を subscribe
;    3. 1 秒ごとに "hsp/demo/tick" に publish
;    4. 同時に recv で流れてきたメッセージを表示
;  stop で終了するまでループ。close が SIGINT に相当。
;
;  仕様上の制約 (hspmqtt.dll v1):
;    - QoS 0 のみ / TLS 非対応 / Retained/LWT 未対応
;    - recv は非ブロッキング (0 バイトなら「今は何も来てない」)
;============================================================

#include "hsp3_net_64.as"
#include "hspmqtt.as"

    title "hspmqtt demo"
    screen 0, 720, 520
    font "MS Gothic", 14

    host     = "127.0.0.1"
    port     = 1883
    clientid = "hsp-demo-" + gettime(6) + gettime(7)  ; 一意っぽく
    keepalive = 60

    mes "hspmqtt demo — MQTT 3.1.1 over TCP"
    mes "broker : " + host + ":" + port
    mes "client : " + clientid
    mes ""

    ;--------------- 接続 ---------------
    h = hspmqtt_open(host, port, clientid, keepalive)
    if h < 0 {
        color 255, 0, 0
        mes "broker に接続できません (code=" + h + ")"
        mes ""
        color 0, 0, 0
        mes "Mosquitto を起動してから再実行してください:"
        mes "  winget install EclipseFoundation.Mosquitto"
        mes "  mosquitto -v"
        mes ""
        mes "もしくはクラウドテストブローカを使う場合 (送信内容は公開)"
        mes "  host = \"test.mosquitto.org\" に書き換え"
        stop
    }
    color 0, 128, 0
    mes "[OK] 接続成功 handle=" + h
    color 0, 0, 0

    ;--------------- subscribe ---------------
    ret = 0
    hspmqtt_subscribe h, "hsp/demo/#"
    ret = stat
    if ret < 0 {
        color 255, 0, 0
        mes "subscribe 失敗 (code=" + ret + ")"
        hspmqtt_close h
        stop
    }
    mes "[OK] subscribe \"hsp/demo/#\""
    mes ""
    mes "1 秒ごとに \"hsp/demo/tick\" に publish します..."
    mes "(閉じるには ウィンドウを閉じる か Ctrl+C)"
    mes ""

    ;--------------- pub/sub ループ ---------------
    counter = 0
    last_pub = gettime(7)
    sdim topic_buf, 256
    sdim payload_buf, 1024

*mainloop
    ; 1 秒ごとに publish
    now_sec = gettime(7)
    if now_sec != last_pub {
        last_pub = now_sec
        counter++
        payload = "tick #" + counter + " at " + gettime(4) + ":" + gettime(5) + ":" + gettime(6)
        hspmqtt_publish h, "hsp/demo/tick", payload
        color 0, 0, 192
        mes "PUB > hsp/demo/tick : " + payload
    }

    ; 非ブロッキング recv (ちょっとだけ待つ)
    n = hspmqtt_recv(h, topic_buf, 256, payload_buf, 1024)
    if n > 0 {
        color 128, 0, 128
        mes "SUB < " + topic_buf + " : " + payload_buf
    }
    color 0, 0, 0

    await 100       ; 100ms 刻みでポーリング
    goto *mainloop