#include "sr_net.h"
#include "cmsis_os2.h"

#include "sr_shell.h"
#include "sr_config.h"

#include "sr_log.h"




#define SERVER_ADDR  "mqtt.xiot.senthink.com"
#define SERVER_PORT  1883


#define CLIENT_ID    "73AF9252-DEV0001"
#define USERNAME     "AUTH-762DF087-73AF9252"
#define PASSWARD     "DF66664C20EC44DE9B7377E2A2A58EC5"

#define PUBLISH_TOPIC   "/standard/pub/902028A4/AD1B3F1B/om0001/custom/uplink"
#define SUBSCRIBE_TOPIC "/standard/sub/902028A4/AD1B3F1B/om0001/custom/downlink"

static char mqttPublishPayload[] = "hello mqtt_test!!!";


// static char mqtt_will_topic[] = "test_will";				// 测试遗嘱
// static char mqtt_will_payload[] = "hello, i was dead";



static void _DownLinkCallback(SR_MQTT_CLIENT_T *mqttc, SR_MQTT_MSG_T *mqttMsg)
{
	SR_PRINTF("[TEST]mqtt recive: \r\n");	  

	SR_PRINTF("topic: %.*s\r\n",mqttMsg->topicLen,mqttMsg->topic);
	SR_PRINTF("payload: %.*s\r\n",mqttMsg->payloadLen,mqttMsg->payload);

}

//订阅列表
static SR_SUB_CB_TABLE_T gSubscribeTable[]=
{
 {"downlink",_DownLinkCallback},


};


static void _MqttEventCallback(SR_MQTT_CLIENT_T *mqttc,SR_MQTT_EVENT_E event,SR_MQTT_MSG_T *mqttMsg)
{
  switch(event)
  {
    
      case SR_MQTT_EVENT_RECV_PUBLISH:     /*!< 收到平台下行PUBLISH数据 */	  	
       
	  SR_PRINTF("mqtt event = %d\r\n",SR_MQTT_EVENT_RECV_PUBLISH);	

	  break;

  }


}




static void mqtt_thread(void *argv)
{
	int ret = -1;
	static SR_MQTT_CLIENT_T mqttc={0};
    SR_MQTT_CONN_PARAMS_T connParams = MQTT_CONNECT_DATA_INIT;

    //1、mqtt初始化

    SR_NET_ADP_T *adapter = SR_NULL; 
	SR_MQTT_INIT_PARAMS_T initParams = {0};

	//查找适配器
    adapter = SR_NetAdpFind("luat");

    //初始化参数
    initParams.serverIP = SERVER_ADDR;
	initParams.serverPort = SERVER_PORT;

    //注册事件回调
	SR_NetMqttcSetEvtCb(&mqttc,_MqttEventCallback);	
	SR_NetMqttcSetSubTable(&mqttc, gSubscribeTable,sizeof(gSubscribeTable));
		
	//初始化，内部绑定adapter和mqttc
	ret = SR_NetMqttcInit(adapter, &mqttc,&initParams);  
	
    if(ret != 0)
    {
	   SR_PRINTF("mqttc init fail,ret=%d\r\n",ret);    
       goto _INIT_FAIL;
	}
	
	SR_PRINTF("mqttc init ok\r\n");	


	//2、mqtt connect
    connParams.clientID = CLIENT_ID;
    connParams.username = USERNAME;
	connParams.password = PASSWARD;	
	ret =  SR_NetMqttcConnect(&mqttc, &connParams);

	if(ret != 0)
    {
	   SR_PRINTF("mqttc connect fail,ret=%d\r\n",ret);    
       goto _CONN_FAIL;
	}
	
	SR_PRINTF("mqttc connect ok\r\n");

  #if  0

	//3、订阅
	    
	ret =  SR_NetMqttcSubscribe(&mqttc, SUBSCRIBE_TOPIC, QOS0);
	if(ret != 0)
    {
	   SR_PRINTF("mqttc subscribe fail,ret=%d\r\n",ret);    
       goto _SUB_FAIL;
	}

	SR_PRINTF("mqtt subscribe ok\r\n");
#endif

    //4、线程循环
    while(gShellThreadRun)
	{ 
#if  0
		ret = SR_NetMqttcPublish(&mqttc, QOS0,PUBLISH_TOPIC, mqttPublishPayload,sizeof(mqttPublishPayload));
        if(ret != 0)
	    {
		   SR_PRINTF("mqttc publish fail,ret=%d\r\n",ret);    
		}
	    SR_PRINTF("mqtt publish ok\r\n");
#endif
		
		osDelay(5000);
	}

    
   SR_PRINTF("mqttc thread exit\r\n");

_SUB_FAIL:	
    SR_NetMqttcDisconnect(&mqttc);

_CONN_FAIL:
    SR_NetMqttcDeinit(&mqttc);
_INIT_FAIL:
	
	osThreadExit();

}



static int stk_mqtt2_0(int argc, char *argv[])
{
	osThreadId_t  mqttThread=SR_NULL;
	
	const osThreadAttr_t threadAttr = 
	{
	  .stack_size = 2048,						
	};

	gShellThreadRun =1;
	
	mqttThread = osThreadNew(mqtt_thread, SR_NULL, &threadAttr);

	return 0;
}
SR_SHELL_CMD_EXPORT(stk_mqtt2_0, stk_mqtt2_0);




