なぜMQTTXでテストしているときに、トピックの購読はできるのに、再接続後にメッセージを発行できず、接続は成功しているもののメッセージ履歴が表示されないのですか?

どのプラットフォームを使っていますか?

もう少し詳しく問題を説明してください。環境、プラットフォーム、行った操作、発生した現象、目的は何ですか。

、使用しているOneNETクラウドプラットフォームで、MQTTXとクラウドプラットフォーム間のデータ通信を実現したいです。通常どおりトピックをサブスクライブした後、このMQTTXからメッセージを発行すると、正常またはエラーの応答が返されるべきです。しかし、メッセージを発行すると、すぐに「デバイスが再接続しています、接続成功」と表示されます。デバイスの接続に問題はなさそうですが、応答がないということは、サブスクリプションに問題があるのでしょうか? ただ、私は通常の手順に従って操作しています。

OneNETの物モデル通信をMQTTXでシミュレートしようとしたところ、「メッセージをパブリッシュするとすぐに再接続され、クラウド側に記録がない」という非常に典型的な問題が発生したようですね。

これは通常ネットワークの問題ではなく、OneNETサーバーが受信したメッセージがプロトコル仕様または物モデル定義に合致していないと判断し、サーバー保護のため「強制切断」を行うことが原因です。

以下の主な原因から一つずつ確認していきましょう:

1. 物モデル識別子(Identifier)の不一致

OneNETの物モデルは、JSONのparamsフィールドに対して非常に厳しいチェックを行います。

  • 確認事項: クラウド側で定義したプロパティの識別子が本当にair_CO2air_humidityでしょうか?
  • 注意: 識別子は大文字小文字を区別します。たとえばクラウド側でAir_CO2と定義しているのに、クライアント側でair_CO2を送信すると、OneNETは無効なデータとして接続を切断します。

2. JSONフォーマットとデータ型

スクリーンショットを見る限り、JSON構造自体は概ね正しいですが、一点注意点があります:

  • 数値型の扱い: valueの後に"500"のように二重引用符付きの文字列を送っています。もしOneNET側でair_CO2intfloat型として定義している場合、ここには二重引用符をつけない必要があります。
  • 修正案:
    "air_CO2": {
        "value": 500,  // 引用符を削除
        "time": 1706673129818 
    }
    

3. タイムスタンプ(Timestamp)が古すぎる

送信したメッセージのtime1706673129818(2024年1月に対応)です。

  • リスク: 一部のプラットフォームでは過去のデータ補填を許可していますが、サーバー現在時刻(2026年)との差が大きすぎると、セキュリティ検証やデータフィルタリング機構が作動する可能性があります。
  • テスト方法: timeフィールドを完全に削除するか、現在のタイムスタンプに更新してください。OneNETはデフォルトでメッセージ到着時の時刻を記録します。

4. 応答トピック(Post_reply)をサブスクライブしていない

「返信がないのはサブスクライブに問題があるのか?」とのことですが、OneNETの物モデルプロトコルでは:

  • パブリッシュするトピック:$sys/{pid}/{device-name}/thing/property/post
  • クラウドからの応答トピック: $sys/{pid}/{device-name}/thing/property/post_reply
  • 対策: MQTTXで**「New Subscription」** をクリックし、_reply付きのこのトピックを事前にサブスクライブする必要があります。これにより、クラウドがリクエストを処理した後の成功/エラーコードをMQTTX画面で確認できます。

5. OneNETプラットフォームのログを確認する

2枚目の画像では「イベント記録」が空になっています。代わりに 「操作ログ」「デバイスデバッグ」 のリアルタイムログを確認することをおすすめします。

接続は成功しているがパブリッシュ失敗している場合、OneNETの操作ログには通常具体的なエラーコード(例:データ形式解析失敗など)が記録されています。


:light_bulb: おすすめのテスト手順:

  1. メッセージを簡略化: 最もシンプルなプロパティのみ送信。タイムスタンプを削除し、数値の引用符も外す。
    {
      "id": "123",
      "version": "1.0",
      "params": {
        "air_CO2": {
          "value": 500
        }
      }
    }
    
  2. Replyトピックをサブスクライブ: パブリッシュ前に、$sys/24A1J1S6kn/dev1/thing/property/post_replyを確実にサブスクライブしておく。
  3. 切断瞬間を観察: 送信ボタンを押した直後にMQTTXの右上隅が赤くなる場合、Payload(ペイロード内容) がOneNET物モデルの要件に合っていません。100%これが原因です。

わかりました、ありがとうございます。明日もう一度試してみます。:hand_with_index_finger_and_thumb_crossed: