Lines Matching refs:c
29 static int getNextPacketId(MQTTClient *c) { in getNextPacketId() argument
30 return c->next_packetid = (c->next_packetid == MAX_PACKET_ID) ? 1 : c->next_packetid + 1; in getNextPacketId()
34 static int sendPacket(MQTTClient* c, int length, Timer* timer) in sendPacket() argument
41 rc = c->ipstack->mqttwrite(c->ipstack, &c->buf[sent], length, TimerLeftMS(timer)); in sendPacket()
48 …TimerCountdown(&c->last_sent, c->keepAliveInterval); // record the fact that we have successfully … in sendPacket()
57 void MQTTClientInit(MQTTClient* c, Network* network, unsigned int command_timeout_ms, in MQTTClientInit() argument
61 c->ipstack = network; in MQTTClientInit()
64 c->messageHandlers[i].topicFilter = 0; in MQTTClientInit()
65 c->command_timeout_ms = command_timeout_ms; in MQTTClientInit()
66 c->buf = sendbuf; in MQTTClientInit()
67 c->buf_size = sendbuf_size; in MQTTClientInit()
68 c->readbuf = readbuf; in MQTTClientInit()
69 c->readbuf_size = readbuf_size; in MQTTClientInit()
70 c->isconnected = 0; in MQTTClientInit()
71 c->cleansession = 0; in MQTTClientInit()
72 c->ping_outstanding = 0; in MQTTClientInit()
73 c->defaultMessageHandler = NULL; in MQTTClientInit()
74 c->next_packetid = 1; in MQTTClientInit()
75 TimerInit(&c->last_sent); in MQTTClientInit()
76 TimerInit(&c->last_received); in MQTTClientInit()
78 MutexInit(&c->mutex); in MQTTClientInit()
83 static int decodePacket(MQTTClient* c, int* value, int timeout) in decodePacket() argument
100 rc = c->ipstack->mqttread(c->ipstack, &i, 1, timeout); in decodePacket()
111 static int readPacket(MQTTClient* c, Timer* timer) in readPacket() argument
118 int rc = c->ipstack->mqttread(c->ipstack, c->readbuf, 1, TimerLeftMS(timer)); in readPacket()
124 decodePacket(c, &rem_len, TimerLeftMS(timer)); in readPacket()
125 …len += MQTTPacket_encode(c->readbuf + 1, rem_len); /* put the original remaining length back into … in readPacket()
127 if (rem_len > (c->readbuf_size - len)) in readPacket()
134 …if (rem_len > 0 && (rc = c->ipstack->mqttread(c->ipstack, c->readbuf + len, rem_len, TimerLeftMS(t… in readPacket()
139 header.byte = c->readbuf[0]; in readPacket()
141 if (c->keepAliveInterval > 0) in readPacket()
142 …TimerCountdown(&c->last_received, c->keepAliveInterval); // record the fact that we have successfu… in readPacket()
179 int deliverMessage(MQTTClient* c, MQTTString* topicName, MQTTMessage* message) in deliverMessage() argument
187 …if (c->messageHandlers[i].topicFilter != 0 && (MQTTPacket_equals(topicName, (char*)c->messageHandl… in deliverMessage()
188 isTopicMatched((char*)c->messageHandlers[i].topicFilter, topicName))) in deliverMessage()
190 if (c->messageHandlers[i].fp != NULL) in deliverMessage()
194 c->messageHandlers[i].fp(&md); in deliverMessage()
200 if (rc == FAILURE && c->defaultMessageHandler != NULL) in deliverMessage()
204 c->defaultMessageHandler(&md); in deliverMessage()
212 int keepalive(MQTTClient* c) in keepalive() argument
216 if (c->keepAliveInterval == 0) in keepalive()
219 if (TimerIsExpired(&c->last_sent) || TimerIsExpired(&c->last_received)) in keepalive()
221 if (c->ping_outstanding) in keepalive()
228 int len = MQTTSerialize_pingreq(c->buf, c->buf_size); in keepalive()
229 if (len > 0 && (rc = sendPacket(c, len, &timer)) == SUCCESS) // send the ping packet in keepalive()
230 c->ping_outstanding = 1; in keepalive()
239 void MQTTCleanSession(MQTTClient* c) in MQTTCleanSession() argument
244 c->messageHandlers[i].topicFilter = NULL; in MQTTCleanSession()
248 void MQTTCloseSession(MQTTClient* c) in MQTTCloseSession() argument
250 c->ping_outstanding = 0; in MQTTCloseSession()
251 c->isconnected = 0; in MQTTCloseSession()
252 if (c->cleansession) in MQTTCloseSession()
253 MQTTCleanSession(c); in MQTTCloseSession()
257 int cycle(MQTTClient* c, Timer* timer) in cycle() argument
262 int packet_type = readPacket(c, timer); /* read the socket, see what work is due */ in cycle()
284 … (unsigned char**)&msg.payload, (int*)&msg.payloadlen, c->readbuf, c->readbuf_size) != 1) in cycle()
287 deliverMessage(c, &topicName, &msg); in cycle()
291 len = MQTTSerialize_ack(c->buf, c->buf_size, PUBACK, 0, msg.id); in cycle()
293 len = MQTTSerialize_ack(c->buf, c->buf_size, PUBREC, 0, msg.id); in cycle()
297 rc = sendPacket(c, len, timer); in cycle()
308 if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1) in cycle()
310 else if ((len = MQTTSerialize_ack(c->buf, c->buf_size, in cycle()
313 else if ((rc = sendPacket(c, len, timer)) != SUCCESS) // send the PUBREL packet in cycle()
323 c->ping_outstanding = 0; in cycle()
327 if (keepalive(c) != SUCCESS) { in cycle()
335 else if (c->isconnected) in cycle()
336 MQTTCloseSession(c); in cycle()
341 int MQTTYield(MQTTClient* c, int timeout_ms) in MQTTYield() argument
351 if (cycle(c, &timer) < 0) in MQTTYield()
369 MQTTClient* c = (MQTTClient*)parm; in MQTTRun() local
376 MutexLock(&c->mutex); in MQTTRun()
379 cycle(c, &timer); in MQTTRun()
381 MutexUnlock(&c->mutex); in MQTTRun()
395 int waitfor(MQTTClient* c, int packet_type, Timer* timer) in waitfor() argument
403 rc = cycle(c, timer); in waitfor()
413 int MQTTConnectWithResults(MQTTClient* c, MQTTPacket_connectData* options, MQTTConnackData* data) in MQTTConnectWithResults() argument
421 MutexLock(&c->mutex); in MQTTConnectWithResults()
423 if (c->isconnected) /* don't send connect packet again if we are already connected */ in MQTTConnectWithResults()
427 TimerCountdownMS(&connect_timer, c->command_timeout_ms); in MQTTConnectWithResults()
432 c->keepAliveInterval = options->keepAliveInterval; in MQTTConnectWithResults()
433 c->cleansession = options->cleansession; in MQTTConnectWithResults()
434 TimerCountdown(&c->last_received, c->keepAliveInterval); in MQTTConnectWithResults()
435 if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= 0) in MQTTConnectWithResults()
437 if ((rc = sendPacket(c, len, &connect_timer)) != SUCCESS) // send the connect packet in MQTTConnectWithResults()
441 if (waitfor(c, CONNACK, &connect_timer) == CONNACK) in MQTTConnectWithResults()
445 … if (MQTTDeserialize_connack(&data->sessionPresent, &data->rc, c->readbuf, c->readbuf_size) == 1) in MQTTConnectWithResults()
456 c->isconnected = 1; in MQTTConnectWithResults()
457 c->ping_outstanding = 0; in MQTTConnectWithResults()
461 MutexUnlock(&c->mutex); in MQTTConnectWithResults()
468 int MQTTConnect(MQTTClient* c, MQTTPacket_connectData* options) in MQTTConnect() argument
471 return MQTTConnectWithResults(c, options, &data); in MQTTConnect()
475 int MQTTSetMessageHandler(MQTTClient* c, const char* topicFilter, messageHandler messageHandler) in MQTTSetMessageHandler() argument
483 …if (c->messageHandlers[i].topicFilter != NULL && strcmp(c->messageHandlers[i].topicFilter, topicFi… in MQTTSetMessageHandler()
487 c->messageHandlers[i].topicFilter = NULL; in MQTTSetMessageHandler()
488 c->messageHandlers[i].fp = NULL; in MQTTSetMessageHandler()
500 if (c->messageHandlers[i].topicFilter == NULL) in MQTTSetMessageHandler()
509 c->messageHandlers[i].topicFilter = topicFilter; in MQTTSetMessageHandler()
510 c->messageHandlers[i].fp = messageHandler; in MQTTSetMessageHandler()
517 int MQTTSubscribeWithResults(MQTTClient* c, const char* topicFilter, enum QoS qos, in MQTTSubscribeWithResults() argument
527 MutexLock(&c->mutex); in MQTTSubscribeWithResults()
529 if (!c->isconnected) in MQTTSubscribeWithResults()
533 TimerCountdownMS(&timer, c->command_timeout_ms); in MQTTSubscribeWithResults()
535 … len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, (int*)&qos); in MQTTSubscribeWithResults()
538 if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet in MQTTSubscribeWithResults()
541 if (waitfor(c, SUBACK, &timer) == SUBACK) // wait for suback in MQTTSubscribeWithResults()
546 …if (MQTTDeserialize_suback(&mypacketid, 1, &count, (int*)&data->grantedQoS, c->readbuf, c->readbuf… in MQTTSubscribeWithResults()
549 rc = MQTTSetMessageHandler(c, topicFilter, messageHandler); in MQTTSubscribeWithResults()
557 MQTTCloseSession(c); in MQTTSubscribeWithResults()
559 MutexUnlock(&c->mutex); in MQTTSubscribeWithResults()
565 int MQTTSubscribe(MQTTClient* c, const char* topicFilter, enum QoS qos, in MQTTSubscribe() argument
569 return MQTTSubscribeWithResults(c, topicFilter, qos, messageHandler, &data); in MQTTSubscribe()
573 int MQTTUnsubscribe(MQTTClient* c, const char* topicFilter) in MQTTUnsubscribe() argument
582 MutexLock(&c->mutex); in MQTTUnsubscribe()
584 if (!c->isconnected) in MQTTUnsubscribe()
588 TimerCountdownMS(&timer, c->command_timeout_ms); in MQTTUnsubscribe()
590 … if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic)) <= 0) in MQTTUnsubscribe()
592 if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet in MQTTUnsubscribe()
595 if (waitfor(c, UNSUBACK, &timer) == UNSUBACK) in MQTTUnsubscribe()
598 if (MQTTDeserialize_unsuback(&mypacketid, c->readbuf, c->readbuf_size) == 1) in MQTTUnsubscribe()
601 MQTTSetMessageHandler(c, topicFilter, NULL); in MQTTUnsubscribe()
609 MQTTCloseSession(c); in MQTTUnsubscribe()
611 MutexUnlock(&c->mutex); in MQTTUnsubscribe()
617 int MQTTPublish(MQTTClient* c, const char* topicName, MQTTMessage* message) in MQTTPublish() argument
626 MutexLock(&c->mutex); in MQTTPublish()
628 if (!c->isconnected) in MQTTPublish()
632 TimerCountdownMS(&timer, c->command_timeout_ms); in MQTTPublish()
635 message->id = getNextPacketId(c); in MQTTPublish()
637 … len = MQTTSerialize_publish(c->buf, c->buf_size, 0, message->qos, message->retained, message->id, in MQTTPublish()
641 if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet in MQTTPublish()
646 if (waitfor(c, PUBACK, &timer) == PUBACK) in MQTTPublish()
650 if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1) in MQTTPublish()
658 if (waitfor(c, PUBCOMP, &timer) == PUBCOMP) in MQTTPublish()
662 if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1) in MQTTPublish()
671 MQTTCloseSession(c); in MQTTPublish()
673 MutexUnlock(&c->mutex); in MQTTPublish()
679 int MQTTDisconnect(MQTTClient* c) in MQTTDisconnect() argument
686 MutexLock(&c->mutex); in MQTTDisconnect()
689 TimerCountdownMS(&timer, c->command_timeout_ms); in MQTTDisconnect()
691 len = MQTTSerialize_disconnect(c->buf, c->buf_size); in MQTTDisconnect()
693 rc = sendPacket(c, len, &timer); // send the disconnect packet in MQTTDisconnect()
694 MQTTCloseSession(c); in MQTTDisconnect()
697 MutexUnlock(&c->mutex); in MQTTDisconnect()