//--------------------------------------------------------------------------------------------------
le_result_t mqtt_Publish
(
    mqtt_SessionRef_t sessionRef,   ///< [IN] Session
    const char* topicPtr,           ///< [IN] Topic
    const uint8_t* payloadPtr,      ///< [IN] Message
    size_t payloadLen,              ///< [IN] Message length
    mqtt_Qos_t qos,                 ///< [IN] QoS mode
    bool retain                     ///< [IN] Retain flag for message
)
{
    mqtt_Session* s = le_ref_Lookup(SessionRefMap, sessionRef);
    if (s == NULL)
    {
        LE_KILL_CLIENT("Session doesn't exist");
        return LE_FAULT;
    }
    if (s->clientSession != mqtt_GetClientSessionRef())
    {
        LE_KILL_CLIENT("Session doesn't belong to this client");
        return LE_FAULT;
    }

    MQTTClient_deliveryToken* dtNotUsed = NULL;
    const int publishResult = MQTTClient_publish(
        s->client, topicPtr, payloadLen, (void*)payloadPtr, QosEnumToValue(qos), retain, dtNotUsed);
    le_result_t result = LE_OK;
    if (publishResult != MQTTCLIENT_SUCCESS)
    {
        LE_WARN("Publish failed with error code (%d)", publishResult);
        result = LE_FAULT;
    }

    return result;
}
Example #2
0
/*********************************************************************

Test: single-threaded client

*********************************************************************/
void singleThread_sendAndReceive(MQTTClient* c, int qos, char* test_topic)
{
	MQTTClient_deliveryToken dt;
	MQTTClient_message pubmsg = MQTTClient_message_initializer;
	MQTTClient_message* m = NULL;
	char* topicName = NULL;
	int topicLen;
	int i = 0;
	int iterations = 50;
	int rc;

	MyLog(LOGA_DEBUG, "%d messages at QoS %d", iterations, qos);
	pubmsg.payload = "a much longer message that we can shorten to the extent that we need to payload up to 11";
	pubmsg.payloadlen = 11;
	pubmsg.qos = qos;
	pubmsg.retained = 0;

	for (i = 0; i< iterations; ++i)
	{
		if (i % 10 == 0)
			rc = MQTTClient_publish(c, test_topic, pubmsg.payloadlen, pubmsg.payload, pubmsg.qos, pubmsg.retained, NULL);
		else
			rc = MQTTClient_publishMessage(c, test_topic, &pubmsg, &dt);
		assert("Good rc from publish", rc == MQTTCLIENT_SUCCESS, "rc was %d", rc);

		if (qos > 0)
		{
			rc = MQTTClient_waitForCompletion(c, dt, 20000L);
			assert("Good rc from waitforCompletion", rc == MQTTCLIENT_SUCCESS, "rc was %d", rc);
		}

		rc = MQTTClient_receive(c, &topicName, &topicLen, &m, 10000);
		assert("Good rc from receive", rc == MQTTCLIENT_SUCCESS, "rc was %d", rc);
		if (topicName)
		{
			MyLog(LOGA_DEBUG, "Message received on topic %s is %.*s", topicName, m->payloadlen, (char*)(m->payload));
			if (pubmsg.payloadlen != m->payloadlen ||
					memcmp(m->payload, pubmsg.payload, m->payloadlen) != 0)
			{
				failures++;
				MyLog(LOGA_INFO, "Error: wrong data - received lengths %d %d", pubmsg.payloadlen, m->payloadlen);
				break;
			}
			MQTTClient_free(topicName);
			MQTTClient_freeMessage(&m);
		}
		else
			printf("No message received within timeout period\n");
	}

	/* receive any outstanding messages */
	MQTTClient_receive(c, &topicName, &topicLen, &m, 1000);
	while (topicName)
	{
		printf("Message received on topic %s is %.*s.\n", topicName, m->payloadlen, (char*)(m->payload));
		MQTTClient_free(topicName);
		MQTTClient_freeMessage(&m);
		MQTTClient_receive(c, &topicName, &topicLen, &m, 1000);
	}
}
Example #3
0
int publisher(char *msg, int msg_len, char *msg_type)
{
    int r;
    char topic[MAX_TOPIC_LEN];
    
    strcpy(topic, mqtt_topic_pub);
    strcat(topic, msg_type);
    printf("publishing to %s\n", topic);
    printf("content: %.*s\n", msg_len, msg);
    printf("length: %d\n", msg_len);
    r = MQTTClient_publish(client, topic, msg_len -1, msg, 2, false, NULL);
    printf("publish returned %d\n", r);
    return r;
}
/*
 * Update the temperature values and send the values to IBM Bluemix
 * - blink the led to show the temperature was measured and data updated
 */
void temperature_update(upm::GroveTemp* temperature_sensor,
		upm::GroveLed* led)
{
	// other helper variables
	int temperature; // temperature sensor value in degrees Celsius
	std::stringstream row_1; // temperature

	// update temperature values
	temperature = temperature_sensor->value();
	// convert the message into JSON format
	row_1 << "{ \"temp\": \"" << temperature << "\" }";

	// send message to IBM Bluemix
	char payload[80];
	sprintf(payload, "{ \"temp\": \"%d\" }", temperature);
	int payloadlen = strlen(payload);

	int retained = 0;
	MQTTClient_deliveryToken dt;
	int rc = MQTTClient_publish(client, const_cast<char *>(topic),
			payloadlen, const_cast<char *>(payload), MQTT_DEFAULT_QOS, retained, &dt);
	if (rc == MQTTCLIENT_SUCCESS) {
		printf("Waiting for message with token %d to be published...\n", dt);
		rc = MQTTClient_waitForCompletion(client, dt, 1000);
		if (rc == MQTTCLIENT_SUCCESS) {
			printf("Message with token %d published\n", dt);
		} else {
			std::cerr << "Failed to publish message with token " << dt << std::endl;
		}
	} else {
		std::cerr << "Failed to publish message with token " << dt << std::endl;
	}

	// blink the led for 50 ms to show the temperature was actually sampled
	led->on();
	usleep(50000);
	led->off();
}
Example #5
0
	// -------------------------------------------------------------------
	// !!!!!!!!!!!   FONCTION DEBUG  A RETRAVAILLER...
	// -------------------------------------------------------------------
	int algo_putMessage(char *topic, char *data, unsigned short lenght){
    	short j;
    	int rc;
    	unsigned short crc16=0;

		// Generation du CRC du message
		for(j=0;j < lenght;j++){
			crc16=update_crc_16(crc16, data[j]);
		}

		// Ajout du CRC dans la trame
		data[lenght++]=(crc16&0xFF00)>>8;
		data[lenght++]=(crc16&0x00FF);

		// Publication du message
		//printf("\n PUBLICATION: ");
		//for(i=0;i<lenght; i++) printf(" %x", data[i]);

		MQTTClient_publish(client, topic, lenght, data, QOS, 0, &token);
		rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);

		return (rc);
}
Example #6
0
int MQTTClient_publishMessage(MQTTClient handle, const char* topicName, MQTTClient_message* message,
															 MQTTClient_deliveryToken* deliveryToken)
{
	int rc = MQTTCLIENT_SUCCESS;

	FUNC_ENTRY;
	if (message == NULL)
	{
		rc = MQTTCLIENT_NULL_PARAMETER;
		goto exit;
	}

	if (strncmp(message->struct_id, "MQTM", 4) != 0 || message->struct_version != 0)
	{
		rc = MQTTCLIENT_BAD_STRUCTURE;
		goto exit;
	}

	rc = MQTTClient_publish(handle, topicName, message->payloadlen, message->payload,
								message->qos, message->retained, deliveryToken);
exit:
	FUNC_EXIT_RC(rc);
	return rc;
}
Example #7
0
static PyObject* mqttv3_publish(PyObject* self, PyObject *args)
{
	MQTTClient c;
	char* topicName;
	int payloadlen;
	void* payload;
	int qos = 0;
	int retained = 0;
	MQTTClient_deliveryToken dt;
	int rc;

	if (!PyArg_ParseTuple(args, "kss#|ii", &c, &topicName, &payload,
			&payloadlen, &qos, &retained))
		return NULL;

	Py_BEGIN_ALLOW_THREADS rc = MQTTClient_publish(c, topicName, payloadlen,
			payload, qos, retained, &dt);
	Py_END_ALLOW_THREADS

	if (rc == MQTTCLIENT_SUCCESS && qos > 0)
		return Py_BuildValue("ii", rc, dt);
	else
		return Py_BuildValue("i", rc);
}
Example #8
0
void multiThread_sendAndReceive(MQTTClient* c, int qos, char* test_topic)
{
	MQTTClient_deliveryToken dt;
	int i = 0;
	int iterations = 50;
	int rc = 0;
	int wait_seconds = 0;

	multiThread_deliveryCompleted = 0;
	multiThread_arrivedcount = 0;

	MyLog(LOGA_DEBUG, "%d messages at QoS %d", iterations, qos);
	multiThread_pubmsg.payload = "a much longer message that we can shorten to the extent that we need to";
	multiThread_pubmsg.payloadlen = 27;
	multiThread_pubmsg.qos = qos;
	multiThread_pubmsg.retained = 0;

	for (i = 1; i <= iterations; ++i)
	{
		if (i % 10 == 0)
			rc = MQTTClient_publish(c, test_topic, multiThread_pubmsg.payloadlen, multiThread_pubmsg.payload, 
                   multiThread_pubmsg.qos, multiThread_pubmsg.retained, NULL);
		else
			rc = MQTTClient_publishMessage(c, test_topic, &multiThread_pubmsg, &dt);
		assert("Good rc from publish", rc == MQTTCLIENT_SUCCESS, "rc was %d", rc);

		#if defined(WIN32)
			Sleep(100);
		#else
			usleep(100000L);
		#endif

		wait_seconds = 20;
		while ((multiThread_arrivedcount < i) && (wait_seconds-- > 0))
		{
			MyLog(LOGA_DEBUG, "Arrived %d count %d", multiThread_arrivedcount, i);
			#if defined(WIN32)
				Sleep(1000);
			#else
				usleep(1000000L);
			#endif
		}
		assert("Message Arrived", wait_seconds > 0, 
				"Time out waiting for message %d\n", i );
	}
	if (qos > 0)
	{
		/* MQ Telemetry can send a message to a subscriber before the server has
		   completed the QoS 2 handshake with the publisher. For QoS 1 and 2,
		   allow time for the final delivery complete callback before checking
		   that all expected callbacks have been made */ 
		wait_seconds = 10;
		while ((multiThread_deliveryCompleted < iterations) && (wait_seconds-- > 0))
		{
			MyLog(LOGA_DEBUG, "Delivery Completed %d count %d", multiThread_deliveryCompleted, i);
			#if defined(WIN32)
				Sleep(1000);
			#else
				usleep(1000000L);
			#endif
		}
		assert("All Deliveries Complete", wait_seconds > 0, 
			   "Number of deliveryCompleted callbacks was %d\n", 
			   multiThread_deliveryCompleted);
	}
}
Example #9
0
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;
}
Example #10
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;
}