0

mbed フレームワークを使用して、組み込みプラットフォーム (ARM CORTEX4) 用の C++ アプリケーションを作成しています。新しい Paho Embedded C++/C クライアントライブラリを使用しています。これがライブラリのコードです。サブスクライブのコールバックを除いて、すべてが期待どおりに機能します。

これは subscribe メソッドの定義です:

 /** MQTT Subscribe - send an MQTT subscribe packet and wait for the suback
 *  @param topicFilter - a topic pattern which can include wildcards
 *  @param qos - the MQTT QoS to subscribe at
 *  @param mh - the callback function to be invoked when a message is received for this subscription
 *  @return success code -
 */
int subscribe(const char* topicFilter, enum QoS qos, messageHandler mh);

messageHandler を次のように定義します。

typedef void (*messageHandler)(MessageData&);

および MessageData として:

struct MessageData
{
    MessageData(MQTTString &aTopicName, struct Message &aMessage)  : message(aMessage), topicName(aTopicName)
    { }

    struct Message &message;
    MQTTString &topicName;
};

およびメッセージとして:

struct Message
{
    enum QoS qos;
    bool retained;
    bool dup;
    unsigned short id;
    void *payload;
    size_t payloadlen;
};

私のソフトウェアは C++ で書かれているため、コンテキスト変数をコールバックに渡す方法が見つかりません。そのため、現在、コールバック内からオブジェクトにアクセスする方法がありません。

別の MQTT クライアント ( Unix / Mac / Windows 用の Paho MQTT C クライアント) の API で、たとえば void* を受け入れてコンテキストをコールバックに渡すことを見てきました。

何か不足していますか、またはコールバックの外部にあるオブジェクトにアクセスするための最良の戦略は何ですか?

私が考えることができる唯一のことは、クラス内のいくつかの静的変数です。これも私には少し「醜い」ようです。

どんなヒントでも大歓迎です!

4

0 に答える 0