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