cloud/mqttdemo/commands.c

See examples/cloud/mqttdemo

/*
* ZentriOS SDK LICENSE AGREEMENT | Zentri.com, 2015.
*
* Use of source code and/or libraries contained in the ZentriOS SDK is
* subject to the Zentri Operating System SDK license agreement and
* applicable open source license agreements.
*
*/
#include "zos.h"
#include "common.h"
/*************************************************
* Default Settings
*
* These settings are stored in the 'Read-Only Memory'
* This memory does NOT get loaded into RAM and resides
* on the serial flash.
*
* To retrieve these settings, use the zn_load_ro_memory() API.
*/
RO_MEM mqtt_settings_t default_settings =
{
.magic = SETTINGS_MAGIC_NUMBER,
.host = MQTT_HOST,
.port = MQTT_PORT,
.message = MQTT_MESSAGE,
.client = MQTT_CLIENT_ID,
.user = MQTT_USER,
.password = MQTT_PASSWORD,
.qos = MQTT_QOS,
.security = MQTT_SECURITY,
.keepalive = MQTT_KEEPALIVE,
};
/*************************************************************************************************
* Getters List
*************************************************************************************************/
ZOS_ADD_GETTER("mqtt.host", mqtt_host),
ZOS_ADD_GETTER("mqtt.port", mqtt_port),
ZOS_ADD_GETTER("mqtt.message", mqtt_message),
ZOS_ADD_GETTER("mqtt.client", mqtt_client),
ZOS_ADD_GETTER("mqtt.user", mqtt_user),
ZOS_ADD_GETTER("mqtt.password", mqtt_password),
ZOS_ADD_GETTER("mqtt.qos", mqtt_qos),
ZOS_ADD_GETTER("mqtt.security", mqtt_security),
ZOS_ADD_GETTER("mqtt.keepalive", mqtt_keepalive),
/*************************************************************************************************
* Setters List
*************************************************************************************************/
ZOS_ADD_SETTER("mqtt.host", mqtt_host),
ZOS_ADD_SETTER("mqtt.port", mqtt_port),
ZOS_ADD_SETTER("mqtt.message", mqtt_message),
ZOS_ADD_SETTER("mqtt.client", mqtt_client),
ZOS_ADD_SETTER("mqtt.user", mqtt_user),
ZOS_ADD_SETTER("mqtt.password", mqtt_password),
ZOS_ADD_SETTER("mqtt.qos", mqtt_qos),
ZOS_ADD_SETTER("mqtt.security", mqtt_security),
ZOS_ADD_SETTER("mqtt.keepalive", mqtt_keepalive),
/*************************************************************************************************
* Commands List
*************************************************************************************************/
ZOS_ADD_COMMAND("mqtt_connect", 0, 0, ZOS_FALSE, mqtt_connect),
ZOS_ADD_COMMAND("mqtt_disconnect", 0, 0, ZOS_FALSE, mqtt_disconnect),
ZOS_ADD_COMMAND("mqtt_publish", 1, 1, ZOS_FALSE, mqtt_publish),
ZOS_ADD_COMMAND("mqtt_subscribe", 1, 1, ZOS_FALSE, mqtt_subscribe),
ZOS_ADD_COMMAND("mqtt_unsubscribe", 1, 1, ZOS_FALSE, mqtt_unsubscribe)
/*************************************************************************************************
* API's
*************************************************************************************************/
void commands_init(void)
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
// check that app_settings_t hasn't overflowed the NVM
// if the build fails here then app_settings_t is too large to fit into the NVM
// you need to make this struct smaller
BUILD_CHECK_NVM_SIZE(mqtt_settings_t);
// if the nvm settings haven't been initialized, do it now
if(settings->magic != SETTINGS_MAGIC_NUMBER)
{
if(zn_load_ro_memory(settings, sizeof(mqtt_settings_t), &default_settings, 0) != ZOS_SUCCESS)
{
ZOS_LOG("Failed to loaded default settings");
}
}
}
/*************************************************************************************************/
void commands_deinit(void)
{
}
/*************************************************************************************************
* Commands
*************************************************************************************************/
ZOS_DEFINE_COMMAND(mqtt_connect)
{
if((mqtt_connection == NULL) || (mqtt_connection->session_init != ZOS_TRUE))
{
ZOS_LOG("Not initialized...");
}
else if(mqtt_connection->net_init_ok == ZOS_TRUE)
{
ZOS_LOG("Already initialized. Do nothing...");
}
else
{
zn_event_issue(mqtt_app_connect, NULL, 0);
}
}
/*************************************************************************************************/
ZOS_DEFINE_COMMAND(mqtt_disconnect)
{
if((mqtt_connection == NULL) || (mqtt_connection->net_init_ok != ZOS_TRUE))
{
ZOS_LOG("Connection not opened. Cannot disconnect!");
}
else
{
zn_event_issue(mqtt_app_disconnect, NULL, 0);
}
}
/*************************************************************************************************/
ZOS_DEFINE_COMMAND(mqtt_publish)
{
if((mqtt_connection == NULL) || (mqtt_connection->net_init_ok != ZOS_TRUE))
{
ZOS_LOG("Not connected. Connect first using command 'mqtt_connect'");
}
else if(strlen(argv[0]) > MAX_TOPIC_STRING_SIZE)
{
ZOS_LOG("Failed (maximum topic length is %u)", MAX_TOPIC_STRING_SIZE);
return CMD_BAD_ARGS;
}
else
{
// ToDo: can not pass argv as argument at the moment, as argv is deallocated
// before event fires. Event will be replaced with direct function call once
// zx_ APIs replaced with zn_ (as zx_ can not be called from custom commands)
strncpy(topic, argv[0], MAX_TOPIC_STRING_SIZE);
zn_event_issue(mqtt_app_publish, NULL, 0);
}
}
/*************************************************************************************************/
ZOS_DEFINE_COMMAND(mqtt_subscribe)
{
if((mqtt_connection == NULL) || (mqtt_connection->net_init_ok != ZOS_TRUE))
{
ZOS_LOG("Not connected. Connect first using command 'mqtt_connect'");
}
else if(strlen(argv[0]) > MAX_TOPIC_STRING_SIZE)
{
ZOS_LOG("Failed (maximum topic length is %u)", MAX_TOPIC_STRING_SIZE);
return CMD_BAD_ARGS;
}
else
{
// ToDo: can not pass argv as argument at the moment, as argv is deallocated
// before event fires. Event will be replaced with direct function call once
// zx_ APIs replaced with zn_ (as zx_ can not be called from custom commands)
strncpy(topic, argv[0], MAX_TOPIC_STRING_SIZE);
zn_event_issue(mqtt_app_subscribe, NULL, 0);
}
}
/*************************************************************************************************/
ZOS_DEFINE_COMMAND(mqtt_unsubscribe)
{
if((mqtt_connection == NULL) || (mqtt_connection->net_init_ok != ZOS_TRUE))
{
ZOS_LOG("Not connected. Connect first using command 'mqtt_connect'");
}
else if(strlen(argv[0]) > MAX_TOPIC_STRING_SIZE)
{
ZOS_LOG("Failed (maximum topic length is %u)", MAX_TOPIC_STRING_SIZE);
return CMD_BAD_ARGS;
}
else
{
// ToDo: can not pass argv as argument at the moment, as argv is deallocated
// before event fires. Event will be replaced with direct function call once
// zx_ APIs replaced with zn_ (as zx_ can not be called from custom commands)
strncpy(topic, argv[0], MAX_TOPIC_STRING_SIZE);
zn_event_issue(mqtt_app_unsubscribe, NULL, 0);
}
}
/*************************************************************************************************
* Getters
*************************************************************************************************/
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
zn_cmd_format_response(CMD_SUCCESS, "%s", settings->host);
return CMD_SUCCESS;
}
/*************************************************************************************************/
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
zn_cmd_format_response(CMD_SUCCESS, "%u", settings->port);
return CMD_SUCCESS;
}
/*************************************************************************************************/
ZOS_DEFINE_GETTER(mqtt_keepalive)
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
zn_cmd_format_response(CMD_SUCCESS, "%u", settings->keepalive);
return CMD_SUCCESS;
}
/*************************************************************************************************/
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
zn_cmd_format_response(CMD_SUCCESS, "%u", settings->qos);
return CMD_SUCCESS;
}
/*************************************************************************************************/
ZOS_DEFINE_GETTER(mqtt_security)
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
zn_cmd_format_response(CMD_SUCCESS, "%u", settings->security);
return CMD_SUCCESS;
}
/*************************************************************************************************/
ZOS_DEFINE_GETTER(mqtt_password)
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
zn_cmd_format_response(CMD_SUCCESS, "%s", settings->password);
return CMD_SUCCESS;
}
/*************************************************************************************************/
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
zn_cmd_format_response(CMD_SUCCESS, "%s", settings->user);
return CMD_SUCCESS;
}
/*************************************************************************************************/
ZOS_DEFINE_GETTER(mqtt_client)
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
zn_cmd_format_response(CMD_SUCCESS, "%s", settings->client);
return CMD_SUCCESS;
}
/*************************************************************************************************/
ZOS_DEFINE_GETTER(mqtt_message)
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
zn_cmd_format_response(CMD_SUCCESS, "%s", settings->message);
return CMD_SUCCESS;
}
/*************************************************************************************************
* Setters
*************************************************************************************************/
{
mqtt_settings_t *settings;
if(strlen(argv[1]) > sizeof(settings->host))
{
ZOS_LOG("Failed (maximum length is %u)", sizeof(settings->host));
return CMD_BAD_ARGS;
}
else
{
ZOS_NVM_GET_REF(settings);
strcpy((char*)settings->host, argv[1]);
return CMD_SET_OK;
}
}
/*************************************************************************************************/
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
ZOS_CMD_PARSE_INT_ARG_WITH_VAR(uint16_t, settings->port, argv[1], 0, 65535);
return CMD_SET_OK;
}
/*************************************************************************************************/
ZOS_DEFINE_SETTER(mqtt_keepalive)
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
ZOS_CMD_PARSE_INT_ARG_WITH_VAR(uint16_t, settings->keepalive, argv[1], 0, 65535);
return CMD_SET_OK;
}
/*************************************************************************************************/
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
ZOS_CMD_PARSE_INT_ARG_WITH_VAR(uint16_t, settings->qos, argv[1], 0, 2);
return CMD_SET_OK;
}
/*************************************************************************************************/
ZOS_DEFINE_SETTER(mqtt_security)
{
mqtt_settings_t *settings;
ZOS_NVM_GET_REF(settings);
ZOS_CMD_PARSE_INT_ARG_WITH_VAR(uint16_t, settings->security, argv[1], 0, 1);
return CMD_SET_OK;
}
/*************************************************************************************************/
ZOS_DEFINE_SETTER(mqtt_password)
{
mqtt_settings_t *settings;
if(strlen(argv[1]) > sizeof(settings->password))
{
ZOS_LOG("Failed (maximum length is %u)", sizeof(settings->password));
return CMD_BAD_ARGS;
}
else
{
ZOS_NVM_GET_REF(settings);
strcpy((char*)settings->password, argv[1]);
return CMD_SET_OK;
}
}
/*************************************************************************************************/
{
mqtt_settings_t *settings;
if(strlen(argv[1]) > sizeof(settings->user))
{
ZOS_LOG("Failed (maximum length is %u)", sizeof(settings->user));
return CMD_BAD_ARGS;
}
else
{
ZOS_NVM_GET_REF(settings);
strcpy((char*)settings->user, argv[1]);
return CMD_SET_OK;
}
}
/*************************************************************************************************/
ZOS_DEFINE_SETTER(mqtt_client)
{
mqtt_settings_t *settings;
if(strlen(argv[1]) > sizeof(settings->client))
{
ZOS_LOG("Failed (maximum length is %u)", sizeof(settings->client));
return CMD_BAD_ARGS;
}
else
{
ZOS_NVM_GET_REF(settings);
strcpy((char*)settings->client, argv[1]);
return CMD_SET_OK;
}
}
/*************************************************************************************************/
ZOS_DEFINE_SETTER(mqtt_message)
{
mqtt_settings_t *settings;
if(strlen(argv[1]) > sizeof(settings->message))
{
ZOS_LOG("Failed (maximum length is %u)", sizeof(settings->message));
return CMD_BAD_ARGS;
}
else
{
ZOS_NVM_GET_REF(settings);
strcpy((char*)settings->message, argv[1]);
return CMD_SET_OK;
}
}