我有一个mqtt函数,该函数使用char *指针订阅主题。由于我只想订阅自己的设备ID,因此需要动态创建此指针的一部分。而且我真的无法成功。
我尝试动态创建一个array [],然后将整个数组转换为指针数组*,但没有成功。仅当我以char *形式静态定义指针时,该方法才有效。
这很有效:
char* topic="/mqtt_topic/myID/";
mqtt_subscribe(module_inst, topic, 0, SubscribeHandler);
下面的代码可以编译,看起来也不错,该函数也正在订阅该主题,但它对通过mqtt发送的数据没有反应。该字符串看起来也与上面的示例相同。
char topick []="/mqtt_topic/myID/";
char* topic=topick;
mqtt_subscribe(module_inst, topic, 0, SubscribeHandler);
mqtt_subscribe函数如下所示;
int mqtt_subscribe(struct mqtt_module *module, const char *topic, uint8_t qos, messageHandler msgHandler)
{
int rc;
rc = MQTTSubscribe(module->client, topic, qos, msgHandler);
if(module->callback)
module->callback(module, MQTT_CALLBACK_SUBSCRIBED, NULL);
return rc;
}
调用以下函数。
int MQTTSubscribe(MQTTClient* c, const char* topicFilter, enum QoS qos, messageHandler msgHandler)
{
int rc = FAILURE;
Timer timer;
int len = 0;
MQTTString topic = MQTTString_initializer;
int Qoss = (int) qos;
topic.cstring = (char *)topicFilter;
#if defined(MQTT_TASK)
MutexLock(&c->mutex);
#endif
if (!c->isconnected)
goto exit;
TimerInit(&timer);
TimerCountdownMS(&timer, c->command_timeout_ms);
len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, (int*)&Qoss);
// len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, qos);
if (len <= 0)
goto exit;
if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet
goto exit; // there was a problem
if (waitfor(c, SUBACK, &timer) == SUBACK) // wait for suback
{
int count = 0, grantedQoS = -1;
unsigned short mypacketid;
if (MQTTDeserialize_suback(&mypacketid, 1, &count, &grantedQoS, c->readbuf, c->readbuf_size) == 1)
rc = grantedQoS; // 0, 1, 2 or 0x80
if (rc != 0x80)
{
int i;
for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
{
if (c->messageHandlers[i].topicFilter == 0)
{
c->messageHandlers[i].topicFilter = topicFilter;
c->messageHandlers[i].fp = msgHandler;
rc = 0;
break;
}
}
}
}
else
rc = FAILURE;
exit:
#if defined(MQTT_TASK)
MutexUnlock(&c->mutex);
#endif
return rc;
}
这是预期的结果吗?有什么办法解决这个问题?
答案 0 :(得分:5)
您给我们看的不够多。但是,我认为:
void myFunction(...)
{
char topick []="/mqtt_topic/myID/";
char* topic=topick;
mqtt_subscribe(module_inst, topic, 0, SubscribeHandler);
//...
}
或类似的内容,即topick
在函数内部声明。然后,它是一个局部变量,当函数返回时,该局部变量将不复存在。指向您传递的字符串的指针不再指向有效的字符串。
另一方面:
char* topic="/mqtt_topic/myID/";
mqtt_subscribe(module_inst, topic, 0, SubscribeHandler);
这里topic
指向一个文字,并且该文字在函数返回后仍然存在。因此mqtt_..
函数会收到一个有效的字符串,该字符串在调用者返回后也将存在。
答案 1 :(得分:0)
您的答案是完全正确的,我的确是在本地声明数组。全局声明topick[64]
可以解决此问题。
谢谢!
/ Mikael