mqttclient_module.c
Go to the documentation of this file.
1 #include <Python.h>
2 
3 #include "MQTTClient.h"
4 #include "LinkedList.h"
5 
6 static PyObject *MqttV3Error;
7 
8 static PyObject* mqttv3_create(PyObject* self, PyObject *args)
9 {
10  MQTTClient c;
11  char* serverURI;
12  char* clientId;
13  int persistence_option = MQTTCLIENT_PERSISTENCE_DEFAULT;
14  int rc;
15 
16  if (!PyArg_ParseTuple(args, "ss|i", &serverURI, &clientId,
17  &persistence_option))
18  return NULL;
19 
20  if (persistence_option != MQTTCLIENT_PERSISTENCE_DEFAULT
21  && persistence_option != MQTTCLIENT_PERSISTENCE_NONE)
22  {
23  PyErr_SetString(PyExc_TypeError, "persistence must be DEFAULT or NONE");
24  return NULL;
25  }
26 
27  rc = MQTTClient_create(&c, serverURI, clientId, persistence_option, NULL);
28 
29  printf("create MQTTClient pointer %p\n", c);
30 
31  return Py_BuildValue("ik", rc, c);
32 }
33 
34 static List* callbacks = NULL;
35 
36 typedef struct
37 {
39  PyObject *context;
40  PyObject *cl, *ma, *dc;
42 
43 int clientCompare(void* a, void* b)
44 {
45  CallbackEntry* e = (CallbackEntry*) a;
46  return e->c == (MQTTClient) b;
47 }
48 
49 void connectionLost(void* context, char* cause)
50 {
51  /* call the right Python function, using the context */
52  PyObject *arglist;
53  PyObject *result;
55  PyGILState_STATE gstate;
56 
57  gstate = PyGILState_Ensure();
58  arglist = Py_BuildValue("Os", e->context, cause);
59  result = PyEval_CallObject(e->cl, arglist);
60  Py_DECREF(arglist);
61  PyGILState_Release(gstate);
62 }
63 
64 int messageArrived(void* context, char* topicName, int topicLen,
65  MQTTClient_message* message)
66 {
67  PyObject *result = NULL;
69  int rc = -99;
70  PyGILState_STATE gstate;
71 
72  //printf("messageArrived %s %s %d %.*s\n", PyString_AsString(e->context), topicName, topicLen,
73  // message->payloadlen, (char*)message->payload);
74 
75  gstate = PyGILState_Ensure();
76  if (topicLen == 0)
77  result = PyEval_CallFunction(e->ma, "Os{ss#sisisisi}", e->context,
78  topicName, "payload", message->payload, message->payloadlen,
79  "qos", message->qos, "retained", message->retained, "dup",
80  message->dup, "msgid", message->msgid);
81  else
82  result = PyEval_CallFunction(e->ma, "Os#{ss#sisisisi}", e->context,
83  topicName, topicLen, "payload", message->payload,
84  message->payloadlen, "qos", message->qos, "retained",
85  message->retained, "dup", message->dup, "msgid",
86  message->msgid);
87  if (result)
88  {
89  if (PyInt_Check(result))
90  rc = (int) PyInt_AsLong(result);
91  Py_DECREF(result);
92  }
93  PyGILState_Release(gstate);
94  MQTTClient_free(topicName);
95  MQTTClient_freeMessage(&message);
96  return rc;
97 }
98 
100 {
101  PyObject *arglist;
102  PyObject *result;
103  CallbackEntry* e = context;
104  PyGILState_STATE gstate;
105 
106  gstate = PyGILState_Ensure();
107  arglist = Py_BuildValue("Oi", e->context, dt);
108  result = PyEval_CallObject(e->dc, arglist);
109  Py_DECREF(arglist);
110  PyGILState_Release(gstate);
111 }
112 
113 static PyObject* mqttv3_setcallbacks(PyObject* self, PyObject *args)
114 {
115  MQTTClient c;
116  CallbackEntry* e = NULL;
117  int rc;
118 
119  e = malloc(sizeof(CallbackEntry));
120 
121  if (!PyArg_ParseTuple(args, "kOOOO", &c, (PyObject**) &e->context, &e->cl,
122  &e->ma, &e->dc))
123  return NULL;
124  e->c = c;
125 
126  printf("setCallbacks MQTTClient pointer %p\n", c);
127 
128  if ((e->cl != Py_None && !PyCallable_Check(e->cl))
129  || (e->ma != Py_None && !PyCallable_Check(e->ma))
130  || (e->dc != Py_None && !PyCallable_Check(e->dc)))
131  {
132  PyErr_SetString(PyExc_TypeError,
133  "3rd, 4th and 5th parameters must be callable or None");
134  return NULL;
135  }
136 
137  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_setCallbacks(c, e, connectionLost,
139  Py_END_ALLOW_THREADS
140 
141  if (rc == MQTTCLIENT_SUCCESS)
142  {
143  ListElement* temp = NULL;
144  if ((temp = ListFindItem(callbacks, c, clientCompare)) != NULL)
145  {
146  ListDetach(callbacks, temp->content);
147  free(temp->content);
148  }
149  ListAppend(callbacks, e, sizeof(e));
150  Py_XINCREF(e->cl);
151  Py_XINCREF(e->ma);
152  Py_XINCREF(e->dc);
153  Py_XINCREF(e->context);
154  }
155 
156  return Py_BuildValue("i", rc);
157 }
158 
159 static PyObject* mqttv3_connect(PyObject* self, PyObject *args)
160 {
161  MQTTClient c;
162  PyObject *pyoptions = NULL, *temp;
165  int rc;
166 
167  if (!PyArg_ParseTuple(args, "k|O", &c, &pyoptions))
168  return NULL;
169 
170  printf("connect MQTTClient pointer %p\n", c);
171  if (!pyoptions)
172  goto skip;
173 
174  if (!PyDict_Check(pyoptions))
175  {
176  PyErr_SetString(PyExc_TypeError, "2nd parameter must be a dictionary");
177  return NULL;
178  }
179 
180  if ((temp = PyDict_GetItemString(pyoptions, "keepAliveInterval")) != NULL)
181  {
182  if (PyInt_Check(temp))
183  options.keepAliveInterval = (int) PyInt_AsLong(temp);
184  else
185  {
186  PyErr_SetString(PyExc_TypeError,
187  "keepAliveLiveInterval value must be int");
188  return NULL;
189  }
190  }
191 
192  if ((temp = PyDict_GetItemString(pyoptions, "cleansession")) != NULL)
193  {
194  if (PyInt_Check(temp))
195  options.cleansession = (int) PyInt_AsLong(temp);
196  else
197  {
198  PyErr_SetString(PyExc_TypeError, "cleansession value must be int");
199  return NULL;
200  }
201  }
202 
203  if ((temp = PyDict_GetItemString(pyoptions, "reliable")) != NULL)
204  {
205  if (PyInt_Check(temp))
206  options.reliable = (int) PyInt_AsLong(temp);
207  else
208  {
209  PyErr_SetString(PyExc_TypeError, "reliable value must be int");
210  return NULL;
211  }
212  }
213 
214  if ((temp = PyDict_GetItemString(pyoptions, "will")) != NULL)
215  {
216  if (PyDict_Check(temp))
217  {
218  PyObject *wtemp = NULL;
219  if ((wtemp = PyDict_GetItemString(temp, "topicName")) == NULL)
220  {
221  PyErr_SetString(PyExc_TypeError,
222  "will topicName value must be set");
223  return NULL;
224  }
225  else
226  {
227  if (PyString_Check(wtemp))
228  woptions.topicName = PyString_AsString(wtemp);
229  else
230  {
231  PyErr_SetString(PyExc_TypeError,
232  "will topicName value must be string");
233  return NULL;
234  }
235  }
236  if ((wtemp = PyDict_GetItemString(temp, "message")) == NULL)
237  {
238  PyErr_SetString(PyExc_TypeError,
239  "will message value must be set");
240  return NULL;
241  }
242  else
243  {
244  if (PyString_Check(wtemp))
245  woptions.message = PyString_AsString(wtemp);
246  else
247  {
248  PyErr_SetString(PyExc_TypeError,
249  "will message value must be string");
250  return NULL;
251  }
252  }
253  if ((wtemp = PyDict_GetItemString(temp, "retained")) != NULL)
254  {
255  if (PyInt_Check(wtemp))
256  woptions.retained = (int) PyInt_AsLong(wtemp);
257  else
258  {
259  PyErr_SetString(PyExc_TypeError,
260  "will retained value must be int");
261  return NULL;
262  }
263  }
264  if ((wtemp = PyDict_GetItemString(temp, "qos")) != NULL)
265  {
266  if (PyInt_Check(wtemp))
267  woptions.qos = (int) PyInt_AsLong(wtemp);
268  else
269  {
270  PyErr_SetString(PyExc_TypeError,
271  "will qos value must be int");
272  return NULL;
273  }
274  }
275  options.will = &woptions;
276  }
277  else
278  {
279  PyErr_SetString(PyExc_TypeError, "will value must be dictionary");
280  return NULL;
281  }
282  }
283 
284  if ((temp = PyDict_GetItemString(pyoptions, "username")) != NULL)
285  {
286  if (PyString_Check(temp))
287  options.username = PyString_AsString(temp);
288  else
289  {
290  PyErr_SetString(PyExc_TypeError, "username value must be string");
291  return NULL;
292  }
293  }
294 
295  if ((temp = PyDict_GetItemString(pyoptions, "password")) != NULL)
296  {
297  if (PyString_Check(temp))
298  options.username = PyString_AsString(temp);
299  else
300  {
301  PyErr_SetString(PyExc_TypeError, "password value must be string");
302  return NULL;
303  }
304  }
305 
306  skip: Py_BEGIN_ALLOW_THREADS rc = MQTTClient_connect(c, &options);
307  Py_END_ALLOW_THREADS
308  return Py_BuildValue("i", rc);
309 }
310 
311 static PyObject* mqttv3_disconnect(PyObject* self, PyObject *args)
312 {
313  MQTTClient c;
314  int timeout = 0;
315  int rc;
316 
317  if (!PyArg_ParseTuple(args, "k|i", &c, &timeout))
318  return NULL;
319  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_disconnect(c, timeout);
320  Py_END_ALLOW_THREADS
321  return Py_BuildValue("i", rc);
322 }
323 
324 static PyObject* mqttv3_isConnected(PyObject* self, PyObject *args)
325 {
326  MQTTClient c;
327  int rc;
328 
329  if (!PyArg_ParseTuple(args, "k", &c))
330  return NULL;
331  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_isConnected(c);
332  Py_END_ALLOW_THREADS
333  return Py_BuildValue("i", rc);
334 }
335 
336 static PyObject* mqttv3_subscribe(PyObject* self, PyObject *args)
337 {
338  MQTTClient c;
339  char* topic;
340  int qos = 2;
341  int rc;
342 
343  if (!PyArg_ParseTuple(args, "ks|i", &c, &topic, &qos))
344  return NULL;
345  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_subscribe(c, topic, qos);
346  Py_END_ALLOW_THREADS
347  return Py_BuildValue("i", rc);
348 }
349 
350 static PyObject* mqttv3_subscribeMany(PyObject* self, PyObject *args)
351 {
352  MQTTClient c;
353  PyObject* topicList;
354  PyObject* qosList;
355 
356  int count;
357  char** topics;
358  int* qoss;
359 
360  int i, rc = 0;
361 
362  if (!PyArg_ParseTuple(args, "kOO", &c, &topicList, &qosList))
363  return NULL;
364 
365  if (!PySequence_Check(topicList) || !PySequence_Check(qosList))
366  {
367  PyErr_SetString(PyExc_TypeError,
368  "3rd and 4th parameters must be sequences");
369  return NULL;
370  }
371 
372  if ((count = PySequence_Length(topicList)) != PySequence_Length(qosList))
373  {
374  PyErr_SetString(PyExc_TypeError,
375  "3rd and 4th parameters must be sequences of the same length");
376  return NULL;
377  }
378 
379  topics = malloc(count * sizeof(char*));
380  for (i = 0; i < count; ++i)
381  topics[i] = PyString_AsString(PySequence_GetItem(topicList, i));
382 
383  qoss = malloc(count * sizeof(int));
384  for (i = 0; i < count; ++i)
385  qoss[i] = (int) PyInt_AsLong(PySequence_GetItem(qosList, i));
386 
387  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_subscribeMany(c, count, topics,
388  qoss);
389  Py_END_ALLOW_THREADS
390 
391  for (i = 0; i < count; ++i)
392  PySequence_SetItem(qosList, i, PyInt_FromLong((long) qoss[i]));
393 
394  free(topics);
395  free(qoss);
396 
397  if (rc == MQTTCLIENT_SUCCESS)
398  return Py_BuildValue("iO", rc, qosList);
399  else
400  return Py_BuildValue("i", rc);
401 }
402 
403 static PyObject* mqttv3_unsubscribe(PyObject* self, PyObject *args)
404 {
405  MQTTClient c;
406  char* topic;
407  int rc;
408 
409  if (!PyArg_ParseTuple(args, "ks", &c, &topic))
410  return NULL;
411  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_unsubscribe(c, topic);
412  Py_END_ALLOW_THREADS
413  return Py_BuildValue("i", rc);
414 }
415 
416 static PyObject* mqttv3_unsubscribeMany(PyObject* self, PyObject *args)
417 {
418  MQTTClient c;
419  PyObject* topicList;
420 
421  int count;
422  char** topics;
423 
424  int i, rc = 0;
425 
426  if (!PyArg_ParseTuple(args, "kOO", &c, &topicList))
427  return NULL;
428 
429  if (!PySequence_Check(topicList))
430  {
431  PyErr_SetString(PyExc_TypeError, "3rd parameter must be sequences");
432  return NULL;
433  }
434 
435  count = PySequence_Length(topicList);
436  topics = malloc(count * sizeof(char*));
437  for (i = 0; i < count; ++i)
438  topics[i] = PyString_AsString(PySequence_GetItem(topicList, i));
439 
440  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_unsubscribeMany(c, count, topics);
441  Py_END_ALLOW_THREADS
442 
443  free( topics);
444 
445  return Py_BuildValue("i", rc);
446 }
447 
448 static PyObject* mqttv3_publish(PyObject* self, PyObject *args)
449 {
450  MQTTClient c;
451  char* topicName;
452  int payloadlen;
453  void* payload;
454  int qos = 0;
455  int retained = 0;
457  int rc;
458 
459  if (!PyArg_ParseTuple(args, "kss#|ii", &c, &topicName, &payload,
460  &payloadlen, &qos, &retained))
461  return NULL;
462 
463  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_publish(c, topicName, payloadlen,
464  payload, qos, retained, &dt);
465  Py_END_ALLOW_THREADS
466 
467  if (rc == MQTTCLIENT_SUCCESS && qos > 0)
468  return Py_BuildValue("ii", rc, dt);
469  else
470  return Py_BuildValue("i", rc);
471 }
472 
473 static PyObject* mqttv3_publishMessage(PyObject* self, PyObject *args)
474 {
475  MQTTClient c;
476  char* topicName;
477  PyObject *message, *temp;
480  int rc;
481 
482  if (!PyArg_ParseTuple(args, "ksO", &c, &topicName, &message))
483  return NULL;
484 
485  if (!PyDict_Check(message))
486  {
487  PyErr_SetString(PyExc_TypeError, "3rd parameter must be a dictionary");
488  return NULL;
489  }
490 
491  if ((temp = PyDict_GetItemString(message, "payload")) == NULL)
492  {
493  PyErr_SetString(PyExc_TypeError, "dictionary must have payload key");
494  return NULL;
495  }
496 
497  if (PyString_Check(temp))
498  PyString_AsStringAndSize(temp, (char**) &msg.payload,
499  (Py_ssize_t*) &msg.payloadlen);
500  else
501  {
502  PyErr_SetString(PyExc_TypeError, "payload value must be string");
503  return NULL;
504  }
505 
506  if ((temp = PyDict_GetItemString(message, "qos")) == NULL)
507  msg.qos = (int) PyInt_AsLong(temp);
508 
509  if ((temp = PyDict_GetItemString(message, "retained")) == NULL)
510  msg.retained = (int) PyInt_AsLong(temp);
511 
512  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_publishMessage(c, topicName, &msg,
513  &dt);
514  Py_END_ALLOW_THREADS
515 
516  if (rc == MQTTCLIENT_SUCCESS && msg.qos > 0)
517  return Py_BuildValue("ii", rc, dt);
518  else
519  return Py_BuildValue("i", rc);
520 }
521 
522 static PyObject* mqttv3_waitForCompletion(PyObject* self, PyObject *args)
523 {
524  MQTTClient c;
525  unsigned long timeout = 1000L;
527  int rc;
528 
529  if (!PyArg_ParseTuple(args, "ki|i", &c, &dt, &timeout))
530  return NULL;
531 
532  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_waitForCompletion(c, dt, timeout);
533  Py_END_ALLOW_THREADS
534 
535  return Py_BuildValue("i", rc);
536 }
537 
538 static PyObject* mqttv3_getPendingDeliveryTokens(PyObject* self, PyObject *args)
539 {
540  MQTTClient c;
541  MQTTClient_deliveryToken* tokens;
542  int rc;
543 
544  if (!PyArg_ParseTuple(args, "k", &c))
545  return NULL;
546 
547  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_getPendingDeliveryTokens(c, &tokens);
548  Py_END_ALLOW_THREADS
549 
550  if (rc == MQTTCLIENT_SUCCESS)
551  {
552  int i = 0;
553  PyObject* dts = PyList_New(0);
554 
555  while (tokens[i] != -1)
556  PyList_Append(dts, PyInt_FromLong((long) tokens[i]));
557 
558  return Py_BuildValue("iO", rc, dts);
559  }
560  else
561  return Py_BuildValue("i", rc);
562 }
563 
564 static PyObject* mqttv3_yield(PyObject* self, PyObject *args)
565 {
566  if (!PyArg_ParseTuple(args, ""))
567  return NULL;
568 
569  Py_BEGIN_ALLOW_THREADS
571  Py_END_ALLOW_THREADS
572 
573  Py_INCREF( Py_None);
574  return Py_None;
575 }
576 
577 static PyObject* mqttv3_receive(PyObject* self, PyObject *args)
578 {
579  MQTTClient c;
580  unsigned long timeout = 1000L;
581  int rc;
582  PyObject* temp = NULL;
583 
584  char* topicName;
585  int topicLen;
586  MQTTClient_message* message;
587 
588  if (!PyArg_ParseTuple(args, "k|k", &c, &timeout))
589  return NULL;
590  Py_BEGIN_ALLOW_THREADS rc = MQTTClient_receive(c, &topicName, &topicLen,
591  &message, timeout);
592  Py_END_ALLOW_THREADS
593  if (message)
594  {
595  temp = Py_BuildValue("is#{ss#sisisisi}", rc, topicName, topicLen,
596  "payload", message->payload, message->payloadlen, "qos",
597  message->qos, "retained", message->retained, "dup",
598  message->dup, "msgid", message->msgid);
599  free(topicName);
600  MQTTClient_freeMessage(&message);
601  }
602  else
603  temp = Py_BuildValue("iz", rc, NULL);
604 
605  return temp;
606 }
607 
608 static PyObject* mqttv3_destroy(PyObject* self, PyObject *args)
609 {
610  MQTTClient c;
611  ListElement* temp = NULL;
612 
613  if (!PyArg_ParseTuple(args, "k", &c))
614  return NULL;
615 
616  if ((temp = ListFindItem(callbacks, c, clientCompare)) != NULL)
617  {
618  ListDetach(callbacks, temp->content);
619  free(temp->content);
620  }
621 
622  MQTTClient_destroy(&c);
623 
624  Py_INCREF(Py_None);
625  return Py_None;
626 }
627 
628 static PyMethodDef MqttV3Methods[] =
629  {
630  { "create", mqttv3_create, METH_VARARGS, "Create an MQTTv3 client." },
631  { "setcallbacks", mqttv3_setcallbacks, METH_VARARGS,
632  "Sets the callback functions for a particular client." },
633  { "connect", mqttv3_connect, METH_VARARGS,
634  "Connects to a server using the specified options." },
635  { "disconnect", mqttv3_disconnect, METH_VARARGS,
636  "Disconnects from a server." },
637  { "isConnected", mqttv3_isConnected, METH_VARARGS,
638  "Determines if this client is currently connected to the server." },
639  { "subscribe", mqttv3_subscribe, METH_VARARGS,
640  "Subscribe to the given topic." },
641  { "subscribeMany", mqttv3_subscribeMany, METH_VARARGS,
642  "Subscribe to the given topics." },
643  { "unsubscribe", mqttv3_unsubscribe, METH_VARARGS,
644  "Unsubscribe from the given topic." },
645  { "unsubscribeMany", mqttv3_unsubscribeMany, METH_VARARGS,
646  "Unsubscribe from the given topics." },
647  { "publish", mqttv3_publish, METH_VARARGS,
648  "Publish a message to the given topic." },
649  { "publishMessage", mqttv3_publishMessage, METH_VARARGS,
650  "Publish a message to the given topic." },
651  { "waitForCompletion", mqttv3_waitForCompletion, METH_VARARGS,
652  "Waits for the completion of the delivery of the message represented by a delivery token." },
653  { "getPendingDeliveryTokens", mqttv3_getPendingDeliveryTokens,
654  METH_VARARGS,
655  "Returns the delivery tokens pending of completion." },
656  { "yield", mqttv3_yield, METH_VARARGS,
657  "Single-thread keep alive but don't receive message." },
658  { "receive", mqttv3_receive, METH_VARARGS,
659  "Single-thread receive message if available." },
660  { "destroy", mqttv3_destroy, METH_VARARGS,
661  "Free memory allocated to a MQTT client. It is the opposite to create." },
662  { NULL, NULL, 0, NULL } /* Sentinel */
663  };
664 
665 PyMODINIT_FUNC initpaho_mqtt3c(void)
666 {
667  PyObject *m;
668 
669  PyEval_InitThreads();
670 
671  callbacks = ListInitialize();
672 
673  m = Py_InitModule("paho_mqtt3c", MqttV3Methods);
674  if (m == NULL)
675  return;
676 
677  MqttV3Error = PyErr_NewException("paho_mqtt3c.error", NULL, NULL);
678  Py_INCREF(MqttV3Error);
679  PyModule_AddObject(m, "error", MqttV3Error);
680 
681  PyModule_AddIntConstant(m, "SUCCESS", MQTTCLIENT_SUCCESS);
682  PyModule_AddIntConstant(m, "FAILURE", MQTTCLIENT_FAILURE);
683  PyModule_AddIntConstant(m, "DISCONNECTED", MQTTCLIENT_DISCONNECTED);
684  PyModule_AddIntConstant(m, "MAX_MESSAGES_INFLIGHT", MQTTCLIENT_MAX_MESSAGES_INFLIGHT);
685  PyModule_AddIntConstant(m, "BAD_UTF8_STRING", MQTTCLIENT_BAD_UTF8_STRING);
686  PyModule_AddIntConstant(m, "BAD_NULL_PARAMETER", MQTTCLIENT_NULL_PARAMETER);
687  PyModule_AddIntConstant(m, "BAD_TOPICNAME_TRUNCATED", MQTTCLIENT_TOPICNAME_TRUNCATED);
688  PyModule_AddIntConstant(m, "PERSISTENCE_DEFAULT", MQTTCLIENT_PERSISTENCE_DEFAULT);
689  PyModule_AddIntConstant(m, "PERSISTENCE_NONE", MQTTCLIENT_PERSISTENCE_NONE);
690  PyModule_AddIntConstant(m, "PERSISTENCE_USER", MQTTCLIENT_PERSISTENCE_USER);
691  PyModule_AddIntConstant(m, "PERSISTENCE_ERROR",
693 }
int clientCompare(void *a, void *b)
int MQTTClient_waitForCompletion(MQTTClient handle, MQTTClient_deliveryToken mdt, unsigned long timeout)
Definition: MQTTClient.c:2772
#define MQTTCLIENT_FAILURE
Definition: MQTTClient.h:136
int MQTTClient_receive(MQTTClient handle, char **topicName, int *topicLen, MQTTClient_message **message, unsigned long timeout)
Definition: MQTTClient.c:2674
#define MQTTCLIENT_SUCCESS
Definition: MQTTClient.h:131
string topic
Definition: test2.py:8
static List * callbacks
int MQTTClient_isConnected(MQTTClient handle)
Definition: MQTTClient.c:1930
int MQTTClient_connect(MQTTClient handle, MQTTClient_connectOptions *options)
Definition: MQTTClient.c:1644
int MQTTClient_publish(MQTTClient handle, const char *topicName, int payloadlen, const void *payload, int qos, int retained, MQTTClient_deliveryToken *deliveryToken)
Definition: MQTTClient.c:2387
#define MQTTCLIENT_PERSISTENCE_ERROR
int MQTTClient_disconnect(MQTTClient handle, int timeout)
Definition: MQTTClient.c:1908
static PyObject * mqttv3_publishMessage(PyObject *self, PyObject *args)
#define MQTTCLIENT_PERSISTENCE_USER
#define malloc(x)
Definition: Heap.h:41
static PyObject * mqttv3_isConnected(PyObject *self, PyObject *args)
#define MQTTCLIENT_MAX_MESSAGES_INFLIGHT
Definition: MQTTClient.h:148
int ListDetach(List *aList, void *content)
Definition: LinkedList.c:245
#define MQTTClient_message_initializer
Definition: MQTTClient.h:327
#define MQTTCLIENT_BAD_UTF8_STRING
Definition: MQTTClient.h:152
#define free(x)
Definition: Heap.h:55
static PyObject * mqttv3_create(PyObject *self, PyObject *args)
#define MQTTClient_willOptions_initializer
Definition: MQTTClient.h:639
static PyObject * mqttv3_unsubscribe(PyObject *self, PyObject *args)
int MQTTClient_setCallbacks(MQTTClient handle, void *context, MQTTClient_connectionLost *cl, MQTTClient_messageArrived *ma, MQTTClient_deliveryComplete *dc)
Definition: MQTTClient.c:1032
constexpr size_t count()
Definition: core.h:960
static PyObject * mqttv3_disconnect(PyObject *self, PyObject *args)
int MQTTClient_publishMessage(MQTTClient handle, const char *topicName, MQTTClient_message *message, MQTTClient_deliveryToken *deliveryToken)
Definition: MQTTClient.c:2432
static PyObject * mqttv3_setcallbacks(PyObject *self, PyObject *args)
int MQTTClient_unsubscribe(MQTTClient handle, const char *topic)
Definition: MQTTClient.c:2239
static PyObject * mqttv3_yield(PyObject *self, PyObject *args)
static PyObject * MqttV3Error
#define MQTTCLIENT_NULL_PARAMETER
Definition: MQTTClient.h:156
int qos
Definition: test6.c:56
const char * topicName
Definition: MQTTClient.h:619
void MQTTClient_freeMessage(MQTTClient_message **message)
Definition: MQTTClient.c:601
static PyObject * mqttv3_unsubscribeMany(PyObject *self, PyObject *args)
ListElement * ListAppend(List *aList, void *content, size_t size)
Definition: LinkedList.c:90
void * MQTTClient
Definition: MQTTClient.h:246
void MQTTClient_yield(void)
Definition: MQTTClient.c:2730
static PyObject * mqttv3_receive(PyObject *self, PyObject *args)
void MQTTClient_destroy(MQTTClient *handle)
Definition: MQTTClient.c:556
void connectionLost(void *context, char *cause)
#define MQTTCLIENT_PERSISTENCE_DEFAULT
static PyObject * mqttv3_waitForCompletion(PyObject *self, PyObject *args)
static PyObject * mqttv3_publish(PyObject *self, PyObject *args)
int MQTTClient_subscribe(MQTTClient handle, const char *topic, int qos)
Definition: MQTTClient.c:2104
static PyObject * mqttv3_connect(PyObject *self, PyObject *args)
static PyObject * mqttv3_subscribeMany(PyObject *self, PyObject *args)
MQTTClient c
Definition: test10.c:1656
int retained
Definition: test6.c:57
dictionary context
Definition: test2.py:57
PyObject * context
void deliveryComplete(void *context, MQTTClient_deliveryToken dt)
static PyMethodDef MqttV3Methods[]
void MQTTClient_free(void *memory)
Definition: MQTTClient.c:612
static PyObject * mqttv3_destroy(PyObject *self, PyObject *args)
#define MQTTCLIENT_PERSISTENCE_NONE
#define MQTTCLIENT_DISCONNECTED
Definition: MQTTClient.h:143
#define MQTTClient_connectOptions_initializer
Definition: MQTTClient.h:953
int MQTTClient_subscribeMany(MQTTClient handle, int count, char *const *topic, int *qos)
Definition: MQTTClient.c:2075
int MQTTClient_deliveryToken
Definition: MQTTClient.h:257
int MQTTClient_getPendingDeliveryTokens(MQTTClient handle, MQTTClient_deliveryToken **tokens)
Definition: MQTTClient.c:2814
List * ListInitialize(void)
Definition: LinkedList.c:52
static PyObject * mqttv3_getPendingDeliveryTokens(PyObject *self, PyObject *args)
int MQTTClient_unsubscribeMany(MQTTClient handle, int count, char *const *topic)
Definition: MQTTClient.c:2222
#define MQTTCLIENT_TOPICNAME_TRUNCATED
Definition: MQTTClient.h:162
ListElement * ListFindItem(List *aList, void *content, int(*callback)(void *, void *))
Definition: LinkedList.c:154
PyMODINIT_FUNC initpaho_mqtt3c(void)
char * topics[]
const char * message
Definition: MQTTClient.h:621
enum MQTTReasonCodes rc
Definition: test10.c:1112
int MQTTClient_create(MQTTClient *handle, const char *serverURI, const char *clientId, int persistence_type, void *persistence_context)
Definition: MQTTClient.c:507
MQTTClient_willOptions * will
Definition: MQTTClient.h:866
int messageArrived(void *context, char *topicName, int topicLen, MQTTClient_message *message)
struct Options options
static PyObject * mqttv3_subscribe(PyObject *self, PyObject *args)


plotjuggler
Author(s): Davide Faconti
autogenerated on Sun Dec 6 2020 03:48:09