blob: f3e48de1b5f293a83c9016ae6cef259bb3505ca9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2013 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
*******************************************************************************/
/**
* Description : MQTT-SN application template
*
*/
#include <stdlib.h>
#include <stdio.h>
#include "mqttsn/mqtts_api.h"
#include "mqttsn/gp_api.h"
static mqtts_CONNECT_Parms conn_p;
static mqtts_REGISTER_Parms reg_p;
static mqtts_PUBLISH_Parms pub_p;
static mqtts_SUBSCRIBE_Parms sub_p;
static mqtts_UNSUBSCRIBE_Parms usub_p;
/* Codes and functions that are inside an (#if MQTTS_DEBUG, #endif)-block are
* optional. They could e.g. used to exchange debug information with
* the hw device via a serial port
*/
/**** function prototype */
void appInit(void);
/**
* Programming model: appRun() will be called regularly by the operating system
* (e.g. by a round-robin scheduler) of the hw device
**/
void appRun(void) {
static unsigned char initiated=0;
// init app only once
if (initiated==0) {
initiated=1;
appInit();
} else {
/* define here what app has to do regularly */
}
}
/**
* Initialization: start mqtts client and ask it to connect to a gw
*/
void appInit(void) {
/* CONNECT parameters */
conn_p.flagCleanSession=0;
conn_p.flagWill =0;
conn_p.flagWillQOS=0;
conn_p.flagWillRetain=0;
conn_p.flpProtocolID=0x01;
conn_p.flpDuration[0] = 0; /* Keep Alive Timer MostSignificantByte */
conn_p.flpDuration[1] = 15; /* Keep Alive Timer LSB = 15 sec */
conn_p.vlpClientID = (unsigned char *)"mqttsSampleAppl";
conn_p.vlpClientID_length = 15;
conn_p.vlpWillMsg = NULL;
conn_p.vlpWillMsg_length = 0;
conn_p.vlpWillTopic = NULL;
conn_p.vlpWillTopic_length = 0;
/* start mqtts and ask it to connect to a gw */
mqtts_startStack();
if (mqtts_connect(&conn_p)!= MQTTS_OK) {
#if MQTTS_DEBUG
gp_debug((unsigned char*)"connect error\r\n",15);
#endif
}
}
#if MQTTS_DEBUG
/**
* appHandleCmd() could be called e.g. when a character is typed in a terminal
* and sent to the hw device via a serial port.
* Its aim is to demonstrate the capabilities of mqtts, e.g
* requesting the sending of a REGISTER message
* requesting the sending of a PUBLISH message
* etc.
*/
void appHandleCmd(unsigned char cmd) { //cmd: character typed in terminal
switch(cmd) {
case '\r':
case '\n':
gp_debug((unsigned char*)"sample app\r\n", 12);
break;
case 'a':
gp_debug((unsigned char*)"start stack\r\n",13);
mqtts_startStack();
break;
case 't':
gp_debug((unsigned char*)"stop stack\r\n",12);
mqtts_stopStack();
break;
case 'c': /* ask mqtts to connect to a gw */
if (mqtts_connect(&conn_p)== MQTTS_OK) {
gp_debug((unsigned char*)"waiting for ready\r\n",19);
} else {
gp_debug((unsigned char*)"connect error!\r\n",16);
}
break;
case 'd':
gp_debug((unsigned char*)"sending disconnect ... \r\n",25);
if (mqtts_disconnect()!=MQTTS_OK) {
gp_debug((unsigned char*)"disc error!\r\n",13);
}
break;
case 'r':
gp_debug((unsigned char*)"send REGISTER, topic: wsn/data\r\n",32);
reg_p.vlpTopic = (unsigned char *)"wsn/data";
reg_p.vlpTopic_length = 8;
mqtts_register(&reg_p);
break;
case 'p':
gp_debug((unsigned char*)"send PUBLISH \"PUB QoS 0\" with QoS 0\r\n",37);
pub_p.flagQOS = 0;
pub_p.flagRetain = 0;
pub_p.flagTopicIdType = 0;
pub_p.vlpData = (unsigned char *)"PUB QoS 0";
pub_p.vlpData_length = 5;
mqtts_publish(&pub_p);
break;
case 'q':
gp_debug((unsigned char*)"send PUBLISH \"PUB QoS 1\" with QoS 1\r\n",37);
pub_p.flagQOS = 1;
pub_p.vlpData = (unsigned char *)"PUB QoS 1";
pub_p.vlpData_length = 5;
mqtts_publish(&pub_p);
break;
case 's':
gp_debug((unsigned char*)"send SUBSCRIBE to topic: wsn/cmd\r\n",34);
sub_p.flagQOS = 0;
sub_p.flagTopicIdType = 0;
sub_p.vlpTopic = (unsigned char *)"wsn/cmd";
sub_p.vlpTopic_length = 7;
mqtts_subscribe(&sub_p);
break;
case 'u':
gp_debug((unsigned char*)"send UNSUBSCRIBE topic: wsn/cmd\r\n",33);
usub_p.flagTopicIdType= 0;
usub_p.vlpTopic= (unsigned char *)"wsn/cmd";
usub_p.vlpTopic_length = 7;
mqtts_unsubscribe(&usub_p);
break;
default:
gp_debug((unsigned char*)"unknown cmd\r\n",13);
}
}
#endif
/*****************************************************
* mqtts callback functions
*****************************************************/
/**
* CONNECT sent to gw, client is waiting for answer from gw */
void mqttscb_connect_sent(void)
{
#if MQTTS_DEBUG
gp_debug((unsigned char*)"CONNECT sent\r\n",14);
#endif
}
/**
* client is now connected to a gw, app can now start publishing, ... */
void mqttscb_connected(void)
{
#if MQTTS_DEBUG
gp_debug((unsigned char*)"connected\r\n",11);
#endif
}
/**
* client is disconnected, app has to call mqtts_connect() again */
void mqttscb_disconnected(unsigned char returnCode)
{
#if MQTTS_DEBUG
gp_debug((unsigned char*)"disconnected\r\n",15);
#endif
}
/**
* REGACK received, app can now use topic id for publishing */
void mqttscb_regack_received(
unsigned char topicID_1,
unsigned char topicID_2,
unsigned char returnCode)
{
#if MQTTS_DEBUG
gp_debug((unsigned char*)"REGACK received\r\n",17);
#endif
pub_p.flpTopicID[0] = topicID_1;
pub_p.flpTopicID[1] = topicID_2;
}
/**
* PUBLISH received from gw/broker */
unsigned char mqttscb_publish_received(
unsigned char dup,
unsigned char qos,
unsigned char topicID_0, /* Topic ID[0] */
unsigned char topicID_1, /* Topic ID[1] */
unsigned char *data,
unsigned char data_len)
{
#if MQTTS_DEBUG
gp_debug((unsigned char*)"PUBLISH received\r\n",18);
#endif
return 0;
}
/**
* PUBACK received, only for PUBLISH with QoS 1 */
void mqttscb_puback_received(
unsigned char topicId_0,
unsigned char topicId_1,
unsigned char returnCode)
{
#if MQTTS_DEBUG
gp_debug((unsigned char*)"PUBACK received\r\n",17);
#endif
}
/**
* PUBCOMP received, only for PUBLISH with QoS 2 */
void mqttscb_pubcomp_received()
{
#if MQTTS_DEBUG
gp_debug((unsigned char*)"PUBCOMP received\r\n",18);
#endif
}
/**
* SUBACK received */
void mqttscb_suback_received(
unsigned char qos,
unsigned char topicID_1,
unsigned char topicID_2,
unsigned char returnCode)
{
#if MQTTS_DEBUG
gp_debug((unsigned char*)"SUBACK received\r\n",17);
#endif
}
/**
* UNSUBACK received */
void mqttscb_unsuback_received()
{
#if MQTTS_DEBUG
gp_debug((unsigned char*)"UNSUBACK received\r\n",19);
#endif
}
/**
* REGISTER received */
void mqttscb_register_received(
unsigned char topicID_0, /* Topic ID[0] */
unsigned char topicID_1, /* Topic ID[1] */
unsigned char *topic,
unsigned char topic_len)
{
#if MQTTS_DEBUG
gp_debug((unsigned char*)"REGISTER received\r\n",19);
#endif
}
/**
* WILLTOPICRESP received */
void mqttscb_willtopicresp_received() {
}
/**
* WILLMSGRESP received */
void mqttscb_willmsgresp_received() {
}
/***********************************************
*
* END OF FILE
*
*/