前提・実現したいこと
現在、MQTTのC言語、mosquittoを勉強中です。
ノートPC2台を置いて、1台はWindows10でBrokerとClient。
もう1台もWindows10ですが、開発・送信は
WLS2のubuntu20.24で行っています。
ところが、Qos=0だと下記のソースでうまく動くのですが、
QoS=1だとコールバックが受信されないため、
Whileのところで止まってしまいます。
発生している問題・エラーメッセージ
QoS=1だとコールバックを受け取れません。
ちなみにブローカはPowerShellにて
.\mosquitto -c test.conf -v // test.conf listener 1883 allow_anonymous true
クライアント側もPowerShellにて
.\mosquitto_sub -h 192.168.0.116 -t TEST -d -q 1
で実行していて、
受信するとPUBACKを返しています(Brokerも同様です)。
該当のソースコード
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <mosquitto.h> #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif char *topic = "TEST"; char *message = "Hello World"; char *id = "mqtt/pub"; char *host = "192.168.0.116"; int port = 1883; int keepalive = 0; int connect_desire = TRUE; /* debug mode flag */ int is_debug = TRUE; /* Brokerとの接続成功時に実行されるcallback関数 */ void on_connect(struct mosquitto *mosq, void *obj, int result) { if(is_debug) { printf("%s(%d)\n", __FUNCTION__, __LINE__); } mosquitto_connect(mosq, host, port, keepalive); } /* Brokerとの接続を切断した時に実行されるcallback関数 */ void on_disconnect(struct mosquitto *mosq, void *obj, int rc) { if(is_debug) { printf("%s(%d)\n", __FUNCTION__, __LINE__); } } /* BrokerにMQTTメッセージ送信後に実行されるcallback関数 */ static void on_publish(struct mosquitto *mosq, void *userdata, int mid) { printf("mid %d has completed publishing\n", mid); connect_desire = FALSE; mosquitto_disconnect(mosq); } /* mqtt_pubメイン関数 */ int main(int argc, char *argv[]) { int cnt = 2; int msgLen = 11; int charLength = cnt + msgLen + 2; char *cafile = NULL; char *certfile = NULL; char *keyfile = NULL; bool clean_session = true; struct mosquitto *mosq = NULL; char msg[charLength]; int status; if(is_debug) { printf(" %s\n", host); printf(" %d\n", port); printf(" %s\n", cafile); printf(" %s\n", certfile); printf(" %s\n", keyfile); printf(" %s\n", topic); printf(" %s\n", message); } mosquitto_lib_init(); mosq = mosquitto_new(id, clean_session, NULL); if(!mosq){ fprintf(stderr, "Cannot create mosquitto object\n"); mosquitto_lib_cleanup(); return(EXIT_FAILURE); } /* ブローカに接続コールバックを設定 */ printf("Connect_Clbk\n"); mosquitto_connect_callback_set(mosq, on_connect); /* ブローカに切断コールバックを設定 */ printf("Disconnect_Clbk\n"); mosquitto_disconnect_callback_set(mosq, on_disconnect); /* ブローカにパブリッシュコールバックを設定 */ printf("Publish_Clbk\n"); mosquitto_publish_callback_set(mosq, on_publish); for(int i=0;i<20;i++){ /* ブローカに接続 */ status = mosquitto_connect_bind(mosq, host, port, keepalive, NULL); if(status){ printf("Error (%d) connecting to broker.\n", status); return 3; } /* 送信内容セット */ snprintf(msg, charLength, "%s %02d", message,i); connect_desire = TRUE; /* 内容送信 */ printf("publishing...\n"); mosquitto_publish(mosq, NULL, topic, charLength, msg, 1, false); /* CallBack待ち */ while(connect_desire != FALSE){ continue; } usleep(30000); /* 1s = 1000000μs */ /* ブローカに応答依頼 */ printf("loop_start\n"); mosquitto_loop_forever(mosq, -1, 1); } /* Destroy */ printf("Destroy\n"); mosquitto_destroy(mosq); /* Cleanup */ printf("Cleanup\n"); mosquitto_lib_cleanup(); return(EXIT_SUCCESS); }
上記ソースから何か不足しているところがあれば
ご教示いただけると嬉しいです。
以上、よろしくお願い致します。
※追記:FireWall、セキュリティソフトともにブロック解除済みです
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/11 06:41