TI's mqtt.

Dependencies:   client server

Committer:
dflet
Date:
Sat Jun 06 13:37:53 2015 +0000
Revision:
1:673880ad39ad
Parent:
0:698866e331b2
TI's mqtt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:698866e331b2 1 /******************************************************************************
dflet 0:698866e331b2 2 *
dflet 0:698866e331b2 3 * Copyright (C) 2014 Texas Instruments Incorporated
dflet 0:698866e331b2 4 *
dflet 0:698866e331b2 5 * All rights reserved. Property of Texas Instruments Incorporated.
dflet 0:698866e331b2 6 * Restricted rights to use, duplicate or disclose this code are
dflet 0:698866e331b2 7 * granted through contract.
dflet 0:698866e331b2 8 *
dflet 0:698866e331b2 9 * The program may not be used without the written permission of
dflet 0:698866e331b2 10 * Texas Instruments Incorporated or against the terms and conditions
dflet 0:698866e331b2 11 * stipulated in the agreement under which this program has been supplied,
dflet 0:698866e331b2 12 * and under no circumstances can it be used with non-TI connectivity device.
dflet 0:698866e331b2 13 *
dflet 0:698866e331b2 14 ******************************************************************************/
dflet 0:698866e331b2 15 #include "mbed.h"
dflet 0:698866e331b2 16 #include "mqtt_common.h"
dflet 0:698866e331b2 17 #include "sl_mqtt_server.h"
dflet 0:698866e331b2 18 #include "server_core.h"
dflet 0:698866e331b2 19 #include "client_mgmt.h"
dflet 0:698866e331b2 20 #include "server_util.h"
dflet 0:698866e331b2 21 #include "cc31xx_sl_net.h"
dflet 0:698866e331b2 22 #include "FreeRTOS.h"
dflet 0:698866e331b2 23 #include "osi.h"
dflet 0:698866e331b2 24
dflet 0:698866e331b2 25 namespace mbed_mqtt {
dflet 0:698866e331b2 26
dflet 0:698866e331b2 27 /*-------------------------------------------------------------------------
dflet 0:698866e331b2 28 * MQTT Routines
dflet 0:698866e331b2 29 *-------------------------------------------------------------------------
dflet 0:698866e331b2 30 */
dflet 0:698866e331b2 31 OsiLockObj_t MutexLockObj;
dflet 0:698866e331b2 32
dflet 0:698866e331b2 33 // wrapper function
dflet 0:698866e331b2 34 static void mutex_lock(void* mutex_hndl)
dflet 0:698866e331b2 35 {
dflet 0:698866e331b2 36 osi_LockObjLock((OsiLockObj_t*)mutex_hndl, OSI_WAIT_FOREVER);
dflet 0:698866e331b2 37 }
dflet 0:698866e331b2 38
dflet 0:698866e331b2 39 // wrapper function
dflet 0:698866e331b2 40 static void mutex_unlock(void* mutex_hndl)
dflet 0:698866e331b2 41 {
dflet 0:698866e331b2 42 osi_LockObjUnlock((OsiLockObj_t*)mutex_hndl);
dflet 0:698866e331b2 43 }
dflet 0:698866e331b2 44
dflet 0:698866e331b2 45 struct mqtt_server_lib_cfg server_cfg = {
dflet 0:698866e331b2 46 0,
dflet 0:698866e331b2 47 0,
dflet 0:698866e331b2 48 &MutexLockObj,
dflet 0:698866e331b2 49 mutex_lock,
dflet 0:698866e331b2 50 mutex_unlock,
dflet 0:698866e331b2 51 NULL /*Debug print*/
dflet 0:698866e331b2 52 };
dflet 0:698866e331b2 53
dflet 0:698866e331b2 54 struct mqtt_server_app_cfg app_config = {
dflet 0:698866e331b2 55 NULL
dflet 0:698866e331b2 56 };
dflet 0:698866e331b2 57
dflet 0:698866e331b2 58
dflet 0:698866e331b2 59 /*Task Priority and Response Time*/
dflet 0:698866e331b2 60 uint32_t g_srvr_wait_secs,g_srvr_task_priority;
dflet 0:698866e331b2 61 struct device_net_services net_ops = {comm_open,tcp_send,tcp_recv,
dflet 0:698866e331b2 62 send_dest,recv_from,comm_close,
dflet 0:698866e331b2 63 tcp_listen,tcp_accept,tcp_select,rtc_secs};
dflet 0:698866e331b2 64 void VMqttServerRunTask(const signed char *pvParams);
dflet 0:698866e331b2 65
dflet 0:698866e331b2 66 SlMqttServerCbs_t cbs_obj,*cbs_ptr=NULL;
dflet 0:698866e331b2 67 struct ctrl_struct{
dflet 0:698866e331b2 68 const void* plugin_hndl;
dflet 0:698866e331b2 69 }app_hndl;
dflet 0:698866e331b2 70
dflet 0:698866e331b2 71
dflet 0:698866e331b2 72 uint16_t sl_server_connect_cb (const struct utf8_string *clientId,
dflet 0:698866e331b2 73 const struct utf8_string *username,
dflet 0:698866e331b2 74 const struct utf8_string *password,
dflet 0:698866e331b2 75 void **app_usr)
dflet 0:698866e331b2 76 {
dflet 0:698866e331b2 77 return( cbs_obj.sl_ExtLib_MqttConn((const char*)MQ_CONN_UTF8_BUF(clientId),
dflet 0:698866e331b2 78 MQ_CONN_UTF8_LEN(clientId), (const char*)MQ_CONN_UTF8_BUF(username),
dflet 0:698866e331b2 79 MQ_CONN_UTF8_LEN(username), (const char*)MQ_CONN_UTF8_BUF(password),
dflet 0:698866e331b2 80 MQ_CONN_UTF8_LEN(password), app_usr));
dflet 0:698866e331b2 81 }
dflet 0:698866e331b2 82
dflet 0:698866e331b2 83 void sl_server_publish_cb(const struct utf8_string *topic,
dflet 0:698866e331b2 84 const uint8_t *payload, uint32_t pay_len,
dflet 0:698866e331b2 85 bool dup, uint8_t qos, bool retain)
dflet 0:698866e331b2 86 {
dflet 0:698866e331b2 87 cbs_obj.sl_ExtLib_MqttRecv((const char*)MQ_CONN_UTF8_BUF(topic),
dflet 0:698866e331b2 88 MQ_CONN_UTF8_LEN(topic), payload, pay_len, dup, qos, retain);
dflet 0:698866e331b2 89 }
dflet 0:698866e331b2 90
dflet 0:698866e331b2 91 void sl_server_disconn_cb(const void *app_usr, bool due2err)
dflet 0:698866e331b2 92 {
dflet 0:698866e331b2 93 cbs_obj.sl_ExtLib_MqttDisconn((void*)app_usr, due2err);
dflet 0:698866e331b2 94 }
dflet 0:698866e331b2 95
dflet 0:698866e331b2 96 int32_t sl_ExtLib_MqttServerSend(const char *topic, const void *data, int32_t len,
dflet 0:698866e331b2 97 uint8_t qos, bool retain, uint32_t flags)
dflet 0:698866e331b2 98 {
dflet 0:698866e331b2 99 struct utf8_string topic_utf8={NULL};
dflet 0:698866e331b2 100 topic_utf8.buffer = (char*)topic;
dflet 0:698866e331b2 101 topic_utf8.length = strlen(topic);
dflet 0:698866e331b2 102 return( mqtt_server_app_pub_send(&topic_utf8,(const uint8_t*)data, len,
dflet 0:698866e331b2 103 (enum mqtt_qos)qos, retain));
dflet 0:698866e331b2 104 }
dflet 0:698866e331b2 105
dflet 0:698866e331b2 106 int32_t sl_ExtLib_MqttTopicEnroll(const char *topic)
dflet 0:698866e331b2 107 {
dflet 0:698866e331b2 108 struct utf8_string topic_utf8={NULL};
dflet 0:698866e331b2 109 topic_utf8.buffer = (char*)topic;
dflet 0:698866e331b2 110 topic_utf8.length = strlen(topic);
dflet 0:698866e331b2 111 return( mqtt_server_topic_enroll((void*)(app_hndl.plugin_hndl),
dflet 0:698866e331b2 112 &topic_utf8,MQTT_QOS2));
dflet 0:698866e331b2 113
dflet 0:698866e331b2 114 }
dflet 0:698866e331b2 115
dflet 0:698866e331b2 116 int32_t sl_ExtLib_MqttTopicDisenroll(const char *topic)
dflet 0:698866e331b2 117 {
dflet 0:698866e331b2 118 struct utf8_string topic_utf8={NULL};
dflet 0:698866e331b2 119 topic_utf8.buffer = (char*)topic;
dflet 0:698866e331b2 120 topic_utf8.length = strlen(topic);
dflet 0:698866e331b2 121 return( mqtt_server_topic_disenroll((void*)&(app_hndl.plugin_hndl),
dflet 0:698866e331b2 122 &topic_utf8));
dflet 0:698866e331b2 123 }
dflet 0:698866e331b2 124
dflet 0:698866e331b2 125 struct mqtt_server_app_cbs server_appcallbacks =
dflet 0:698866e331b2 126 {
dflet 0:698866e331b2 127 sl_server_connect_cb,
dflet 0:698866e331b2 128 sl_server_publish_cb,
dflet 0:698866e331b2 129 sl_server_disconn_cb
dflet 0:698866e331b2 130 };
dflet 0:698866e331b2 131
dflet 0:698866e331b2 132 int32_t sl_ExtLib_MqttServerInit(const SlMqttServerCfg_t *cfg,
dflet 0:698866e331b2 133 const SlMqttServerCbs_t *app_cbs)
dflet 0:698866e331b2 134 {
dflet 0:698866e331b2 135
dflet 0:698866e331b2 136 int32_t ret;
dflet 0:698866e331b2 137
dflet 0:698866e331b2 138 //valid loopback port has to be specified for correct operations
dflet 0:698866e331b2 139 if(cfg->loopback_port == 0)
dflet 0:698866e331b2 140 {
dflet 0:698866e331b2 141 return -1;
dflet 0:698866e331b2 142 }
dflet 0:698866e331b2 143 server_cfg.listener_port=cfg->server_info.port_number;
dflet 0:698866e331b2 144 server_cfg.debug_printf = cfg->dbg_print;
dflet 0:698866e331b2 145 cbs_ptr=&cbs_obj;
dflet 0:698866e331b2 146 memcpy(cbs_ptr,app_cbs,sizeof(SlMqttServerCbs_t ));
dflet 0:698866e331b2 147
dflet 0:698866e331b2 148 g_srvr_task_priority=(uint32_t)cfg->rx_tsk_priority;
dflet 0:698866e331b2 149 g_srvr_wait_secs=(uint32_t)cfg->resp_time;
dflet 0:698866e331b2 150 ret = osi_LockObjCreate(&MutexLockObj);
dflet 0:698866e331b2 151 if(!ret)
dflet 0:698866e331b2 152 {
dflet 0:698866e331b2 153 ret=mqtt_server_init(&server_cfg, &app_config);
dflet 0:698866e331b2 154 }
dflet 0:698866e331b2 155 else
dflet 0:698866e331b2 156 {
dflet 0:698866e331b2 157 ret = osi_LockObjDelete(&MutexLockObj);
dflet 0:698866e331b2 158 return(-1);
dflet 0:698866e331b2 159 }
dflet 0:698866e331b2 160 /* registering the device specific implementations for net operations */
dflet 0:698866e331b2 161 mqtt_server_register_net_svc(&net_ops);
dflet 0:698866e331b2 162
dflet 0:698866e331b2 163 /* registering the apps callbacks */
dflet 0:698866e331b2 164 app_hndl.plugin_hndl = mqtt_server_app_register(&server_appcallbacks, "temp");
dflet 0:698866e331b2 165
dflet 0:698866e331b2 166 /* start the Server Run task */
dflet 0:698866e331b2 167
dflet 0:698866e331b2 168 // osi_TaskCreate(VMqttServerRunTask, (const signed char *) "MQTTServerRun", 2048, NULL, g_srvr_task_priority, NULL );
dflet 0:698866e331b2 169
dflet 0:698866e331b2 170 return ret;
dflet 0:698866e331b2 171 }
dflet 0:698866e331b2 172
dflet 0:698866e331b2 173 void VMqttServerRunTask(void *pvParams)
dflet 0:698866e331b2 174 {
dflet 0:698866e331b2 175 mqtt_server_run(g_srvr_wait_secs);
dflet 0:698866e331b2 176 }
dflet 0:698866e331b2 177
dflet 0:698866e331b2 178 }//namespace mbed_mqtt
dflet 0:698866e331b2 179
dflet 0:698866e331b2 180