問題タブ [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 - プロトコル バッファを使用した MAC アドレスの定義
C でプロトコル バッファを使用して 8 バイトの MAC アドレス データ要素を定義しようとしています。
ただし、これにより、サイズ フィールドと 8 バイトのアドレス フィールドを持つ構造体が作成されます。8 バイトのアドレス フィールドだけを希望します。
MAC アドレスは一連のバイトであるため、fixed64 要素の使用を拒否しました。私はプロトコルバッファにかなり慣れていないので、これが簡単な質問である場合は申し訳ありません。
android - Protobuf は NanoPB と通信できますか
私の仕事は、Android デバイスから nanoPB を実行しているデバイスに Bluetooth 経由で接続することです。
NonoPB が列挙型などの特定のものをさまざまに処理することは知っています...NanoPB が渡された場合、列挙型を処理できますか? または、「Lite」などの Protobuf モードのいずれかが通信を許可することに失敗します。
c - Nanopb は pb_ostream_t から文字列を取得します
nanopbを使用しているので、小さなクロス コンパイル コードで protobuf を実装できます。私はそれが機能する基盤を持っていますが、エンコードされたprotobufメッセージをUDP経由で(別のシステムで)送信するための文字列として取得したいと考えています。通常、本格的な protobuf ライブラリでは、次のようなことを行いますmessage.serializeToString()
。Nanopb にはそれがないように見えますが、確かによくあることです。nanopb から提供された例では、pb_ostream_t 構造体とpb_ostream_from_buffer()を使用しています。
c - コールバックなしの Nanopb
Nanopbを使用して、VxWorks ベースの National Instruments Compact RIO (9025) から protobuf メッセージを送信しようとしています。私のクロス コンパイルはうまく機能し、余分なエンコーディングを必要としないデータ型を含む完全なメッセージを送信することさえできます。私が得ているのはコールバックです。私のコードはクロス コンパイルされ、LabVIEW から呼び出され、Nanopb のコールバック ベースの構造がターゲット マシンで壊れているようです (エラー、クラッシュ、ターゲットの再起動など)。コールバックなしで実行すると、うまく機能します。
問題のコードは次のとおりです。
プロトファイルは次のとおりです。
コールバックを extern "C" にしてみましたが、何も変わりませんでした。また、最大長の nanopb オプション ファイルを追加しようとしましたが、正しく理解できなかったか、機能しませんでした。
proto メッセージから文字列を削除し、コールバックを削除すると、うまく機能します。この LabVIEW -> C ライブラリ環境では、コールバック構造が機能しないようです。コールバック構造なしでメッセージをエンコードできる別の方法はありますか? または、何らかの方法でコールバックを getPacket() 関数に埋め込みますか?
更新されたコード:
更新された proto ファイル:
nanopb - Nanopb は、サブメッセージで繰り返される構成フィールドを正しくエンコードおよびデコードします
Nanopb サブメッセージで繰り返される構成フィールドをエンコード/デコードする正しい方法は何ですか? 生成された出力は、decode 操作で繰り返される構成フィールドが検出されないことを示しています。また興味深いのは、encode コールバックが 2 回呼び出されることです。これも問題です。私は何が欠けていますか?
実験として、TopMessage ではなく SubMessage1 でエンコードとデコードを開始するようにこの例を変更すると、デコードは成功します。また、この場合、エンコード コールバックは予想どおり 1 回だけ呼び出されます。
以下はプロト定義です。問題のフィールドは SubMessage1 の下の subMessage11 です。
proto 定義を使用する C++ コード コードは次のとおりです。
生成される出力は次のとおりです。