Update revision to use TI's mqtt and Freertos.
Dependencies: mbed client server
Fork of cc3100_Test_mqtt_CM3 by
Diff: mqtt_V1/sl/sl_mqtt_server.cpp
- Revision:
- 3:a8c249046181
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mqtt_V1/sl/sl_mqtt_server.cpp Thu Sep 03 14:02:37 2015 +0000 @@ -0,0 +1,180 @@ +/****************************************************************************** +* +* Copyright (C) 2014 Texas Instruments Incorporated +* +* All rights reserved. Property of Texas Instruments Incorporated. +* Restricted rights to use, duplicate or disclose this code are +* granted through contract. +* +* The program may not be used without the written permission of +* Texas Instruments Incorporated or against the terms and conditions +* stipulated in the agreement under which this program has been supplied, +* and under no circumstances can it be used with non-TI connectivity device. +* +******************************************************************************/ +#include "mbed.h" +#include "mqtt_common.h" +#include "sl_mqtt_server.h" +#include "server_core.h" +#include "client_mgmt.h" +#include "server_util.h" +#include "cc31xx_sl_net.h" +#include "FreeRTOS.h" +#include "osi.h" + +namespace mbed_mqtt { + +/*------------------------------------------------------------------------- + * MQTT Routines + *------------------------------------------------------------------------- + */ +OsiLockObj_t MutexLockObj; + +// wrapper function +static void mutex_lock(void* mutex_hndl) +{ + osi_LockObjLock((OsiLockObj_t*)mutex_hndl, OSI_WAIT_FOREVER); +} + +// wrapper function +static void mutex_unlock(void* mutex_hndl) +{ + osi_LockObjUnlock((OsiLockObj_t*)mutex_hndl); +} + +struct mqtt_server_lib_cfg server_cfg = { + 0, + 0, + &MutexLockObj, + mutex_lock, + mutex_unlock, + NULL /*Debug print*/ +}; + +struct mqtt_server_app_cfg app_config = { + NULL +}; + + +/*Task Priority and Response Time*/ +uint32_t g_srvr_wait_secs,g_srvr_task_priority; +struct device_net_services net_ops = {comm_open,tcp_send,tcp_recv, + send_dest,recv_from,comm_close, + tcp_listen,tcp_accept,tcp_select,rtc_secs}; +void VMqttServerRunTask(const signed char *pvParams); + +SlMqttServerCbs_t cbs_obj,*cbs_ptr=NULL; +struct ctrl_struct{ + const void* plugin_hndl; +}app_hndl; + + +uint16_t sl_server_connect_cb (const struct utf8_string *clientId, + const struct utf8_string *username, + const struct utf8_string *password, + void **app_usr) +{ + return( cbs_obj.sl_ExtLib_MqttConn((const char*)MQ_CONN_UTF8_BUF(clientId), + MQ_CONN_UTF8_LEN(clientId), (const char*)MQ_CONN_UTF8_BUF(username), + MQ_CONN_UTF8_LEN(username), (const char*)MQ_CONN_UTF8_BUF(password), + MQ_CONN_UTF8_LEN(password), app_usr)); +} + +void sl_server_publish_cb(const struct utf8_string *topic, + const uint8_t *payload, uint32_t pay_len, + bool dup, uint8_t qos, bool retain) +{ + cbs_obj.sl_ExtLib_MqttRecv((const char*)MQ_CONN_UTF8_BUF(topic), + MQ_CONN_UTF8_LEN(topic), payload, pay_len, dup, qos, retain); +} + +void sl_server_disconn_cb(const void *app_usr, bool due2err) +{ + cbs_obj.sl_ExtLib_MqttDisconn((void*)app_usr, due2err); +} + +int32_t sl_ExtLib_MqttServerSend(const char *topic, const void *data, int32_t len, + uint8_t qos, bool retain, uint32_t flags) +{ + struct utf8_string topic_utf8={NULL}; + topic_utf8.buffer = (char*)topic; + topic_utf8.length = strlen(topic); + return( mqtt_server_app_pub_send(&topic_utf8,(const uint8_t*)data, len, + (enum mqtt_qos)qos, retain)); +} + +int32_t sl_ExtLib_MqttTopicEnroll(const char *topic) +{ + struct utf8_string topic_utf8={NULL}; + topic_utf8.buffer = (char*)topic; + topic_utf8.length = strlen(topic); + return( mqtt_server_topic_enroll((void*)(app_hndl.plugin_hndl), + &topic_utf8,MQTT_QOS2)); + +} + +int32_t sl_ExtLib_MqttTopicDisenroll(const char *topic) +{ + struct utf8_string topic_utf8={NULL}; + topic_utf8.buffer = (char*)topic; + topic_utf8.length = strlen(topic); + return( mqtt_server_topic_disenroll((void*)&(app_hndl.plugin_hndl), + &topic_utf8)); +} + +struct mqtt_server_app_cbs server_appcallbacks = +{ + sl_server_connect_cb, + sl_server_publish_cb, + sl_server_disconn_cb +}; + +int32_t sl_ExtLib_MqttServerInit(const SlMqttServerCfg_t *cfg, + const SlMqttServerCbs_t *app_cbs) +{ + + int32_t ret; + + //valid loopback port has to be specified for correct operations + if(cfg->loopback_port == 0) + { + return -1; + } + server_cfg.listener_port=cfg->server_info.port_number; + server_cfg.debug_printf = cfg->dbg_print; + cbs_ptr=&cbs_obj; + memcpy(cbs_ptr,app_cbs,sizeof(SlMqttServerCbs_t )); + + g_srvr_task_priority=(uint32_t)cfg->rx_tsk_priority; + g_srvr_wait_secs=(uint32_t)cfg->resp_time; + ret = osi_LockObjCreate(&MutexLockObj); + if(!ret) + { + ret=mqtt_server_init(&server_cfg, &app_config); + } + else + { + ret = osi_LockObjDelete(&MutexLockObj); + return(-1); + } + /* registering the device specific implementations for net operations */ + mqtt_server_register_net_svc(&net_ops); + + /* registering the apps callbacks */ + app_hndl.plugin_hndl = mqtt_server_app_register(&server_appcallbacks, "temp"); + + /* start the Server Run task */ + +// osi_TaskCreate(VMqttServerRunTask, (const signed char *) "MQTTServerRun", 2048, NULL, g_srvr_task_priority, NULL ); + + return ret; +} + +void VMqttServerRunTask(void *pvParams) +{ + mqtt_server_run(g_srvr_wait_secs); +} + +}//namespace mbed_mqtt + +