void PICNTRL::listenForMessages(char* topic) { this->_topic = (char*) malloc(strlen(topic) + 1); if (NULL == this->_topic) { printf("Error, failed to allocation string for topic\n"); return; } strcpy(this->_topic, topic); MQTTClient_create(&_myClient, _mqttBroker, "PICntrl", MQTTCLIENT_PERSISTENCE_NONE, (void*) this); MQTTClient_setCallbacks(_myClient, (void*) this, &(PICNTRL::connectionLost), &(PICNTRL::messageArrived), NULL); _mqttOptions.keepAliveInterval = 10; _mqttOptions.cleansession = 1; _mqttOptions.reliable = 0; int connectResult = MQTTClient_connect(_myClient, &_mqttOptions); if(MQTTCLIENT_SUCCESS != connectResult) { printf("Failed to connect to MQTT broker, exiting\n"); return; } MQTTClient_subscribe(_myClient, this->_topic, QOS_AT_MOST_ONCE_0); while(1) { usleep(1000 * 1000); MQTTClient_yield(); } }
int MQTTClient_disconnect1(MQTTClient handle, int timeout, int internal, int stop) { MQTTClients* m = handle; START_TIME_TYPE start; int rc = MQTTCLIENT_SUCCESS; int was_connected = 0; FUNC_ENTRY; Thread_lock_mutex(mqttclient_mutex); if (m == NULL || m->c == NULL) { rc = MQTTCLIENT_FAILURE; goto exit; } if (m->c->connected == 0 && m->c->connect_state == 0) { rc = MQTTCLIENT_DISCONNECTED; goto exit; } was_connected = m->c->connected; /* should be 1 */ if (m->c->connected != 0) { start = MQTTClient_start_clock(); m->c->connect_state = -2; /* indicate disconnecting */ while (m->c->inboundMsgs->count > 0 || m->c->outboundMsgs->count > 0) { /* wait for all inflight message flows to finish, up to timeout */ if (MQTTClient_elapsed(start) >= timeout) break; Thread_unlock_mutex(mqttclient_mutex); MQTTClient_yield(); Thread_lock_mutex(mqttclient_mutex); } } MQTTClient_closeSession(m->c); while (Thread_check_sem(m->connect_sem)) Thread_wait_sem(m->connect_sem, 100); while (Thread_check_sem(m->connack_sem)) Thread_wait_sem(m->connack_sem, 100); while (Thread_check_sem(m->suback_sem)) Thread_wait_sem(m->suback_sem, 100); while (Thread_check_sem(m->unsuback_sem)) Thread_wait_sem(m->unsuback_sem, 100); exit: if (stop) MQTTClient_stop(); if (internal && m->cl && was_connected) { Log(TRACE_MIN, -1, "Calling connectionLost for client %s", m->c->clientID); Thread_start(connectionLost_call, m); } Thread_unlock_mutex(mqttclient_mutex); FUNC_EXIT_RC(rc); return rc; }
static PyObject* mqttv3_yield(PyObject* self, PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; Py_BEGIN_ALLOW_THREADS MQTTClient_yield(); Py_END_ALLOW_THREADS Py_INCREF( Py_None); return Py_None; }
int MQTTClient_waitForCompletion(MQTTClient handle, MQTTClient_deliveryToken mdt, unsigned long timeout) { int rc = MQTTCLIENT_FAILURE; START_TIME_TYPE start = MQTTClient_start_clock(); unsigned long elapsed = 0L; MQTTClients* m = handle; FUNC_ENTRY; Thread_lock_mutex(mqttclient_mutex); if (m == NULL || m->c == NULL) { rc = MQTTCLIENT_FAILURE; goto exit; } if (m->c->connected == 0) { rc = MQTTCLIENT_DISCONNECTED; goto exit; } if (ListFindItem(m->c->outboundMsgs, &mdt, messageIDCompare) == NULL) { rc = MQTTCLIENT_SUCCESS; /* well we couldn't find it */ goto exit; } elapsed = MQTTClient_elapsed(start); while (elapsed < timeout) { Thread_unlock_mutex(mqttclient_mutex); MQTTClient_yield(); Thread_lock_mutex(mqttclient_mutex); if (ListFindItem(m->c->outboundMsgs, &mdt, messageIDCompare) == NULL) { rc = MQTTCLIENT_SUCCESS; /* well we couldn't find it */ goto exit; } elapsed = MQTTClient_elapsed(start); } exit: Thread_unlock_mutex(mqttclient_mutex); FUNC_EXIT_RC(rc); return rc; }
int main(int argc, char** argv) { //MQTTClient client; // MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; char topic[200] = ""; char* buffer = NULL; int rc = 0; char url[100]; char broker[100]; if (argc < 2) usage(); getopts(argc, argv); // sprintf(url, "%s:%s", opts.host, opts.port); // if (opts.verbose) // printf("URL is %s\n", url); // char a[200] = "55e6ba684a481fa955f3912e"; // char b[200] = "hello"; strcpy(topic, argv[1]); //opts.appkey = a; //topic = b; printf("Using topic %s\n", topic); int res = MQTTClient_setup_with_appkey_and_deviceid(opts.appkey, opts.deviceid, &my_reg_info); if (res < 0) { printf("can't get reg info\n"); return 0; } printf("Get reg info: client_id:%s,username:%s,password:%s, devide_id:%s\n", my_reg_info.client_id, my_reg_info.username, my_reg_info.password, my_reg_info.device_id); res = MQTTClient_get_host(opts.appkey, url); if (res < 0) { printf("can't get host info\n"); return 0; } printf("Get url info: %s\n", url); rc = MQTTClient_create(&client, url, my_reg_info.client_id, MQTTCLIENT_PERSISTENCE_NONE, NULL); MQTTClient_get_broker(&client, broker); printf("get broker:%s\n", broker); // MQTTClient_set_broker(&client, "localhost"); if (opts.authkey != NULL) { printf("set authkey\r\n"); int status; rc = MQTTClient_set_authkey(my_reg_info.client_id, opts.appkey, opts.authkey, &status); if (rc >= 0) printf("set authkey result: status:%i\r\n", status); char auth[80]; rc = MQTTClient_get_authkey(my_reg_info.client_id, opts.appkey, auth, &status); if (rc >= 0) printf("get authkey result: status:%i, authkey:%s\r\n", status, auth); } MQTTClient_get_broker(&client, broker); printf("get broker:%s\n", broker); signal(SIGINT, cfinish); signal(SIGTERM, cfinish); rc = MQTTClient_setCallbacks(client, NULL, connectionLost, messageArrived, NULL, extendedCmdArrive); conn_opts.keepAliveInterval = 300; conn_opts.reliable = 0; conn_opts.cleansession = 0; conn_opts.username = my_reg_info.username; conn_opts.password = my_reg_info.password; myconnect(&client, &conn_opts); buffer = malloc(opts.maxdatalen); rc = MQTTClient_subscribe(client, topic, 1); printf("subscribe topic:%s, %i\n", topic, rc); if (opts.alias != NULL) { printf("set alias: %s\n", opts.alias); MQTTClient_set_alias(client, opts.alias); } //MQTTClient_presence(client, topic); int ret; ret = MQTTClient_get_aliaslist(client, topic); printf("get aliaslist:%i, topic:%s\n", ret, topic); ret = MQTTClient_get_topic(client, "band1111"); printf("get topic:%i\n", ret); ret = MQTTClient_get_status(client, "band1111"); printf("get status:%i\n", ret); ret = MQTTClient_report(client, "domytest", "abc"); printf("report status:%i\n", ret); ret = MQTTClient_get_status2(client, "baidu"); printf("get status2:%i\n", ret); ret = MQTTClient_get_topiclist2(client, topic); printf("get topic list2:%i\n", ret); ret = MQTTClient_get_aliaslist2(client, topic); printf("get aliaslist2:%i\n", ret); sleep(7); cJSON *apn_json, *aps; cJSON *Opt = cJSON_CreateObject(); cJSON_AddStringToObject(Opt,"time_to_live", "120"); cJSON_AddStringToObject(Opt,"time_delay", "1100"); cJSON_AddStringToObject(Opt,"apn_json", "{\"aps\":{\"alert\":\"FENCE alarm\", \"sound\":\"alarm.mp3\"}}"); ret = MQTTClient_publish2(client, topic, strlen("test") + 1, "test", Opt); cJSON_Delete(Opt); printf("publish2 status:%i\n", ret); while (!toStop) { int data_len = 0; int delim_len = 0; delim_len = strlen(opts.delimiter); do { buffer[data_len++] = getchar(); if (data_len > delim_len) { //printf("comparing %s %s\n", opts.delimiter, &buffer[data_len - delim_len]); if (strncmp(opts.delimiter, &buffer[data_len - delim_len], delim_len) == 0) break; } } while (data_len < opts.maxdatalen); if (opts.verbose) printf("Publishing data of length %d\n", data_len); rc = MQTTClient_publish(client, topic, data_len, buffer); if (rc != 0) { myconnect(&client, &conn_opts); rc = MQTTClient_publish(client, topic, data_len, buffer); printf("reconnect %i\n", rc); } if (opts.qos > 0) MQTTClient_yield(); } printf("Stopping\n"); free(buffer); MQTTClient_disconnect(client, 0); MQTTClient_destroy(&client); return 0; }
int main(int argc, char** argv) { MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer; char* topic = NULL; char* buffer = NULL; int rc = 0; char url[100]; if (argc < 2) usage(); getopts(argc, argv); sprintf(url, "%s:%s", opts.host, opts.port); if (opts.verbose) printf("URL is %s\n", url); topic = argv[1]; printf("Using topic %s\n", topic); rc = MQTTClient_create(&client, url, opts.clientid, MQTTCLIENT_PERSISTENCE_NONE, NULL); signal(SIGINT, cfinish); signal(SIGTERM, cfinish); rc = MQTTClient_setCallbacks(client, NULL, NULL, messageArrived, NULL); conn_opts.keepAliveInterval = 10; conn_opts.reliable = 0; conn_opts.cleansession = 1; conn_opts.username = opts.username; conn_opts.password = opts.password; ssl_opts.enableServerCertAuth = 0; conn_opts.ssl = &ssl_opts; myconnect(&client, &conn_opts); buffer = malloc(opts.maxdatalen); while (!toStop) { int data_len = 0; int delim_len = 0; delim_len = strlen(opts.delimiter); do { buffer[data_len++] = getchar(); if (data_len > delim_len) { //printf("comparing %s %s\n", opts.delimiter, &buffer[data_len - delim_len]); if (strncmp(opts.delimiter, &buffer[data_len - delim_len], delim_len) == 0) break; } } while (data_len < opts.maxdatalen); if (opts.verbose) printf("Publishing data of length %d\n", data_len); rc = MQTTClient_publish(client, topic, data_len, buffer, opts.qos, opts.retained, NULL); if (rc != 0) { myconnect(&client, &conn_opts); rc = MQTTClient_publish(client, topic, data_len, buffer, opts.qos, opts.retained, NULL); } if (opts.qos > 0) MQTTClient_yield(); } printf("Stopping\n"); free(buffer); MQTTClient_disconnect(client, 0); MQTTClient_destroy(&client); return 0; }
int MQTTClient_publish(MQTTClient handle, const char* topicName, int payloadlen, void* payload, int qos, int retained, MQTTClient_deliveryToken* deliveryToken) { int rc = MQTTCLIENT_SUCCESS; MQTTClients* m = handle; Messages* msg = NULL; Publish* p = NULL; int blocked = 0; int msgid = 0; FUNC_ENTRY; Thread_lock_mutex(mqttclient_mutex); if (m == NULL || m->c == NULL) rc = MQTTCLIENT_FAILURE; else if (m->c->connected == 0) rc = MQTTCLIENT_DISCONNECTED; else if (!UTF8_validateString(topicName)) rc = MQTTCLIENT_BAD_UTF8_STRING; if (rc != MQTTCLIENT_SUCCESS) goto exit; /* If outbound queue is full, block until it is not */ while (m->c->outboundMsgs->count >= m->c->maxInflightMessages || Socket_noPendingWrites(m->c->net.socket) == 0) /* wait until the socket is free of large packets being written */ { if (blocked == 0) { blocked = 1; Log(TRACE_MIN, -1, "Blocking publish on queue full for client %s", m->c->clientID); } Thread_unlock_mutex(mqttclient_mutex); MQTTClient_yield(); Thread_lock_mutex(mqttclient_mutex); if (m->c->connected == 0) { rc = MQTTCLIENT_FAILURE; goto exit; } } if (blocked == 1) Log(TRACE_MIN, -1, "Resuming publish now queue not full for client %s", m->c->clientID); if (qos > 0 && (msgid = MQTTProtocol_assignMsgId(m->c)) == 0) { /* this should never happen as we've waited for spaces in the queue */ rc = MQTTCLIENT_MAX_MESSAGES_INFLIGHT; goto exit; } p = malloc(sizeof(Publish)); p->payload = payload; p->payloadlen = payloadlen; p->topic = (char*)topicName; p->msgId = msgid; rc = MQTTProtocol_startPublish(m->c, p, qos, retained, &msg); /* If the packet was partially written to the socket, wait for it to complete. * However, if the client is disconnected during this time and qos is not 0, still return success, as * the packet has already been written to persistence and assigned a message id so will * be sent when the client next connects. */ if (rc == TCPSOCKET_INTERRUPTED) { while (m->c->connected == 1 && SocketBuffer_getWrite(m->c->net.socket)) { Thread_unlock_mutex(mqttclient_mutex); MQTTClient_yield(); Thread_lock_mutex(mqttclient_mutex); } rc = (qos > 0 || m->c->connected == 1) ? MQTTCLIENT_SUCCESS : MQTTCLIENT_FAILURE; } if (deliveryToken && qos > 0) *deliveryToken = msg->msgid; free(p); if (rc == SOCKET_ERROR) { Thread_unlock_mutex(mqttclient_mutex); MQTTClient_disconnect_internal(handle, 0); Thread_lock_mutex(mqttclient_mutex); /* Return success for qos > 0 as the send will be retried automatically */ rc = (qos > 0) ? MQTTCLIENT_SUCCESS : MQTTCLIENT_FAILURE; } exit: Thread_unlock_mutex(mqttclient_mutex); FUNC_EXIT_RC(rc); return rc; }