問題タブ [nanopb]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C を使用して nanopb のバイト型内の文字列をエンコード/デコードする
次のようなファイルがあり.proto
ます。
このプロト エンコーディングを使用して、変化する構造体を送信します。この構造体には、基本的に int と文字列 (null で終了する char 配列) が含まれます。
送信者は、次のようなことを行って構造体を送信します。
次に、受信者はメッセージを取得し、nanopb を使用してデコードし、次のようにします。
その時点で、整数の値を読み取ろうとしても問題はありませんが (flow_msg->dst_addr
たとえば、)、文字列値を読み取ろうとすると、flow_msg->src_ap_name
空であるため null ポインターが取得されます。
文字列値を適切にエンコード/デコードする方法がわかりません...ここで何が欠けているのか本当にわかりません...手がかりはありますか?
c - nanopb から Proto Buffer メッセージを読み取るときの DecodeError
IoT デバイス用の小さな HttpClient を実装し、通信形式として Proto Buffer を使用したいと考えていました。プラットフォームの制約のため、nanopb を使用しています。これは、C の関連コードです。
エンドポイントを公開する小さなフラスコ サーバーを作成しました。メッセージをデコードしようとすると、次のエラーが表示されます。google.protobuf.message.DecodeError: Error parsing message with type 'pb.MEvent'
そのためのコード:
私は io.ByteStream を使用してそれを読み取ろうとしましたが、ASCII と UTF-8 でバイトをエンコードしようとしましたが、どちらのアプローチも機能しませんでした。
何が問題を引き起こしているのか、私が見つけ出すのを手伝ってくれませんか? エラーメッセージはそれほど役に立ちません。
アップデート
これは、proto ファイルの内容です。
そして、ここにいくつかのデータポイントがあります:
protocol-buffers - HTTPClient を使用する C クライアント gRPC の HTTP/2 クライアント プレフィックス文字列が見つからないか破損しています
「HTTP/2 クライアントのプリフェイス文字列が見つからないか壊れています」というメッセージが表示されます。
私の考えでは、ヘッダーが正しく設定されていないことに関係していると思います。おそらく WifiClient/WifiSecureClient の実装です。私はこれについて数週間以上考えてきましたが、行き詰まっています。何かアドバイス?
[更新: 以下の回答]
クライアントは nanopb プロトコル バッファ コンパイラを使用して生成されました。
Arduino クライアント:
サーバーは、標準の Java プロトコル バッファ コンパイラを使用して生成されました。私が変更した唯一のことは、TempEvent (以下) を追加することでした。
サンプル Java クライアントは問題なく動作します。私の問題があるのは、gRPC を使用してデータを送信している ESP8266-01 wifi モジュールで nanopb を使用する単純なクライアントです。
クライアントはサーバーにアクセスできます。
これをデバッグするために、まず grpcurl を使用できるかどうかを確認したかったのですが、次のようになりました。
実装コードで使用されている WifiClient.h の実装を調べ始めましたが、すべてを掘り下げずにこれをテストする簡単な方法について何かアイデアはありますか? これは非常に単純なはずだと思っていました...しかし、単純なクライアントを生成するには、思ったよりもはるかに複雑であることが判明しました。ここで何かが欠けているように感じます。
ここの他のフォーラムから: 「クライアントとサーバーが一致していません。通常、これは一方がプレーンテキストで、もう一方が TLS を使用しているためです。しかし、特定の環境では HTTP/1 と HTTP/2 が原因である可能性もあります。」
Go Lang の実装を見た後、WiFiClientSecure client.setInsecure(); を使用してみました。// 機能しませんでした。16 進ダンプは以下のとおりです。