嘗試MQTT用Paho庫撰寫簡單的應用程式。我打算創建簡單的火并忘記不阻塞功能:
void send(char* data)
{
..
}
為此,我計劃使用 MQTTAsync 客戶端。但是如何將資料傳遞給連接事件。我認為char * dataToSend全域定義不是一個好風格。
void onConnect(void* context, MQTTAsync_successData* response)
{
MQTTAsync client = (MQTTAsync)context;
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
int rc;
printf("Successful connection\n");
opts.onSuccess = onSend;
opts.context = client;
pubmsg.payload = dataToSend;
pubmsg.payloadlen = strlen(dataToSend);
pubmsg.qos = QOS;
pubmsg.retained = 0;
deliveredtoken = 0;
if ((rc = MQTTAsync_sendMessage(client, TOPIC, &pubmsg, &opts)) != MQTTASYNC_SUCCESS)
{
printf("Failed to start sendMessage, return code %d\n", rc);
exit(EXIT_FAILURE);
}
}
uj5u.com熱心網友回復:
可以使用背景關系中的結構傳遞它。
就像是:
typedef MQTTContext {
MQTTAsync client;
char* dataToSend;
};
這將允許從此背景關系結構中獲取緩沖區(和 MQTTclient)。
void onConnect(void* context, MQTTAsync_successData* response)
{
MQTTContext* ctx = (MQTTContext*)context;
// retreive client
MQTTAsync client = ctx->client;
...
// retreive message to publish
pubmsg.payload = ctx->dataToSend;
...
}
在您的發送功能中,您可以在此背景關系結構中存盤訊息
void send(char* data)
{
MQTTAsync client;
// store in context structure client and message to publish
MQTTContext* ctx = (MQTTContext*)malloc(sizeof(MQTTContext));
ctx->client = client;
ctx->dataToSend = data;
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
...
conn_opts.context = ctx;
MQTTAsync_connect(client, &conn_opts);
}
uj5u.com熱心網友回復:
您可能需要為問題添加更多背景關系,但簡單的回答是您不需要。
您在啟動應用程式時連接客戶端一次,并在應用程式的生命周期中重復使用相同的客戶端物件。所以當你想發送訊息時你應該已經連接了,不需要使用onConnect回呼。
您可能要做的是使用onConnect回呼設定一個標志,以便該send函式知道客戶端已完成連接,如果它將在應用程式啟動后很快被呼叫,只是為了確保客戶端已先完成連接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/367256.html
上一篇:移位右側運算元型別
