私が理解している限り、クライアントが接続したときに、セッションが永続的であることを確認し、そうでない場合は、関心のあるトピックへのサブスクライブを実行する必要があります。Mosquitto バージョン 1.5 を使用しています。
API 呼び出しを使用してこのプロパティを確認する方法は見つかりませんでしたがclean_session、struct mosquitto. しかし、この方法でアクセスしようとすると:
void my_connect_callback(struct mosquitto *mosq, void *userdata, int result)
{
log("Connected, session persistency",(int)(mosq->clean_session));
不完全な型へのポインターを逆参照するエラーが発生します。mosquitto.h内にフィールドの定義がないと、正常に表示されますstruct mosquitto。というファイルmosquitto_internal.hには含まれていますが、アプリケーション プロジェクトに含めるようには設計されていないようです。
ここで何が問題なのですか?
更新 (@hardillb コメント後):clean_session (1) mosquitto構造体が に渡すものと同じであるというドキュメントが見つかりませんでしたmosquitto_new。(2)ここのドキュメントによると
CONNACK メッセージには、次の 2 つのデータ エントリが含まれます。
- セッション存在フラグ
- 接続戻りコード
そして、「セッション存在フラグ」が接続コールバックデータまたは mosquitto 構造体自体のどこかにあることは論理的です。clean_sessionしたがって、構造体には connect 関数によって返される値があると推測しました。次に、同じソースは次のように述べています。
セッション存在フラグは、ブローカーがクライアントとの以前の対話から利用可能な永続セッションを既に持っているかどうかをクライアントに伝えます。クライアントが Clean Session を true に設定して接続すると、使用可能なセッションがないため、セッション存在フラグは常に false になります。クライアントが Clean Session を false に設定して接続する場合、次の 2 つの可能性があります。 clientId のセッション情報が利用可能な場合。ブローカがセッション情報を保存している場合、セッション存在フラグは trueです。
このフラグはどこにありsession_presentますか?アプリケーションは現在の接続が以前の接続の継続であり、同じトピックに再サブスクライブしないことを認識しますか?