// ><免责声明 ><  Copyright (c) 2024-2024 by wwwllg All Rights Reserved
// ><文件     ><  DevAppSDK.h
// ><隶属工程><   FastUdx.model.UdxP2pFram
// ><当前用户 ><  86186
// ><作者     ><  李良刚
// ><目的     >< 【P2p接入框架头文件】


#ifndef _dev_app_sdk_h
#define _dev_app_sdk_h


#ifdef __cplusplus
extern "C" {
#endif

#ifdef  BUILD_DEVAPP_DLL
#define DEV_EXPORT  extern "C" __declspec(dllexport)
#else
#define DEV_EXPORT /* extern "C" __declspec(dllimport)*/
#endif

#ifdef WIN32
#pragma pack( push, 1 )
#ifndef DEVPACKED
#define DEVPACKED 
#endif
#else
#ifndef DEVPACKED
#define DEVPACKED	__attribute__((packed, aligned(1)))
#endif
#endif

	//硬件设备
#define P2P_DEVICE	1
	//APP,PC端
#define P2P_APP		2

	//事件类型
	typedef enum
	{
		// 与平台联接成功
		DevAppEvent_ConnectPlantformOK	= 0,

		// 与平台联接断开
		DevAppEvent_BrokenWithPlantform,

		// 与设备建立P2P联接
		DevAppEvent_P2pOK	,

		//由中转转变成P2P
		DevAppEvent_TS2P2P	,

		//	与设备P2P失败
		DevAppEvent_P2pFailed,

		// p2p读事件，有数据到来
		DevAppEvent_P2pStreamRead,

		// p2p联接断开事件
		DevAppEvent_P2pStreamBroken,

		//设备直联成功
		DevAppEvent_DirectConnectOK,

		//设备直联失败
		DevAppEvent_DirectConnectFailed,

		//直联断开
		DevAppEvent_DirectBroken,

		//发送数据快结束
		DevAppEvent_OnLastLeftSendData,
	}DevAppEventType;

	//P2P错误码
	typedef enum
	{
		// 超时
		DevAppEvent_ERRO_P2P_TIMEOUT	= 0,
		
		//平台断开
		DevAppEvent_ERRO_Plantform_BROKEN	= 0,

		// 找不到设备
		DevAppEvent_ERRO_P2P_NOT_FOUND,

		// 正常断开成功的P2P请求
		DevAppEvent_ERRO_P2P_CLOSE,

		// 没找到好的TS服务
		DevAppEvent_ERRO_P2P_NOTS,
		// 没权限
		DevAppEvent_ERRO_P2P_NOPERMISSION,
	}DevAppP2pErroType;



	//初始化设备参数
	struct DevApp_Param
	{	
		//设备类型，P2P_DEVICE/P2P_APP
		unsigned char devtype;
		//设备唯一标识
		char sn[128];

		//云平台域名或IP+端口

		char domain[128];
		unsigned short domainport;

		//初始化sdk的本地IP+端口
		char localip[128];
		unsigned short localport;

		unsigned short listenmode;//0.注册到公网方式，1.内网方式，2.内网+公网混合使用
	}DEVPACKED;

	//p2p时设置的参数
	struct P2pLink_Param
	{	
		unsigned char bnofec;//1无支持fec
		unsigned int maxbp;//设置最大速度,字节秒
		unsigned int fixbp;//设置固定速度
		int linktimeout;//链接超时
	}DEVPACKED;

	//p2p时设置的参数
	struct DevApp_Con_Param
	{	
		//目标ID及链接类型
		char targetsn[128];//目标设备ID
		unsigned char connecttype;//联接方式选择。   0,auto p2p + ts. 1.only p2p. 2 only ts,3 直连
		char breconnect;//断线重联
		P2pLink_Param localp;//本地
		P2pLink_Param remotep;//远端
		char directip[128];//当直连时的对端ip
		unsigned short directport;//当直连时的对端port
		void* u1;//用户指针1//备用
		void* u2;//用户指针2//备用
	}DEVPACKED;

	struct Event_UserData
	{	
		void * usr1;
		void * usr2;
		void * usr3;
		void * usr4;
	}DEVPACKED;

	//回调事件参数
	struct Event_Param
	{	
		DevAppEventType evtype;//事件类型
		unsigned int linkdirect;//tcp的联接方向,1表示主动联接方
		unsigned short p2pindex;//大部分情况为，P2P的请求序号
		unsigned short datatype;//数据类型
		unsigned short sid;//DevAppSendData中的sid
		unsigned char p2plink;//1 p2p,0转发
		unsigned long code;//错误码，DevAppP2pErroType
		DevApp_Con_Param p2p;//发起方，发起P2P时的参数，被动P2P方，此参数无效
		Event_UserData usrdata;//初始化时携带的用户指针
	}DEVPACKED;

	struct DevApp_Link_State
	{	
		unsigned short P2pIndex;
		unsigned char online;
		unsigned char lintype;
		char targetsn[128];//目标设备ID
	}DEVPACKED;

	struct _DEV_APP_SDK_CALLBACK
	{    
		void (* _OnDevAppEvents)(Event_Param * pParam,unsigned char*pData,int len);
	}DEVPACKED;


//************************************
// Method:    DevAppSDKInit 用于函数初始化
// FullName:  DevAppSDKInit
// Access:    public 
// Returns:   DEV_EXPORT	int < 0表示失败，大于0表示初始化成功
// Qualifier:
// Parameter: DevApp_Param * pParm 输入参数
// Parameter: _DEV_APP_SDK_CALLBACK cb 回调接口
//************************************
DEV_EXPORT	int DevAppSDKInit(DevApp_Param*pParm,_DEV_APP_SDK_CALLBACK *pcb,Event_UserData *userdata);


//************************************
// Method:    DevAppP2pConnect	对目标设备发起P2P请求
// FullName:  DevAppP2pConnect
// Access:    public 
// Returns:   DEV_EXPORT	int	< 0表示失败
// Qualifier:
// Parameter: DevApp_P2p_Param * pParm	输入参数
// Parameter: unsigned short * iRetP2pIndex	当成功后返回一个随机序号，应用层需要保存，当收到回调成功或失败时可以分配/释放资源
//************************************
DEV_EXPORT	int DevAppConnectTo(DevApp_Con_Param*pParm,unsigned short * iRetP2pNumber);


// Parameter: int datatype	0 video I Frame 1 video P Frame  2 audiao 3 normal data
//发送数据类型
typedef enum
{
	// I帧
	DATA_TYPE_IFRAME	= 0,

	// P帧
	DATA_TYPE_PFRAME,

	// 音频
	DATA_TYPE_AUDIO,

	// 普通数据
	DATA_TYPE_NORMAL,
}DevDataType;


//************************************
// Method:    DevAppSendData	发送数据
// FullName:  DevAppSendData
// Access:    public 
// Returns:   DEV_EXPORT	int < 0表示失败(一般是断线),返回值>0表示成功
// Qualifier:
// Parameter: unsigned int P2pIndex 前面成功的P2P序号
// Parameter: int sid	一个链接中可以发送多个不同的流,默认从0开始
// Parameter: int datatype	0 video I Frame .1 video P Frame  .2 audio ...其他可以自己任指定私有类型
// Parameter: 发送模式
			  //sendtype = 0.实时流丢帧模式，当datatype == DevDataType时有效，P Frame是否可丢弃,主要用于发送实时流
			  //sendtype=1.不丢帧模式，则会增加延迟和内存,用于发送普通数据，可以通过DevAppGetLinkInfo，控制缓冲长度，从而减少延迟与内存
			  //sendtype=2.优先普通数据，不丢帧，可以用于云台，或其他控制命令

// Parameter: unsigned char * pData
// Parameter: int len
//************************************
DEV_EXPORT	int DevAppSendData(unsigned short P2pIndex,unsigned short sid,unsigned short datatype,int sendtype,unsigned char *pData,int len);

//************************************
// Method:    DevAppGetDataFrameInfo	获取未发送数据信息
// FullName:  DevAppGetDataFrameInfo
// Access:    public 
// Returns:   DEV_EXPORT	int < 0表示失败(一般是断线),返回值>0表示成功
// Qualifier:
// Parameter: unsigned int P2pIndex 前面成功的P2P序号
// Parameter: int* iDataCount 返回投递DevAppSendData 未发送个包
// Parameter: ,int*iDataSize  返回投递DevAppSendData 未发送数据量

DEV_EXPORT	int DevAppGetLinkRemainDataSize(unsigned short P2pIndex,int*iDataSize);


//************************************
// Method:    DevAppCloseConnection	关闭指定P2P联接
// FullName:  DevAppCloseConnection
// Access:    public 
// Returns:   DEV_EXPORT	void
// Qualifier:
// Parameter: unsigned int P2pIndex
//************************************
DEV_EXPORT	void DevAppCloseConnection(unsigned short P2pIndex);

//************************************
// Method:    DevAppIsConnectioned	指定P2P联接,是不是联接成功的状态
// FullName:  DevAppIsConnectioned
// Access:    public 
// Returns:   DEV_EXPORT	int
// Qualifier:
// Parameter: unsigned int P2pIndex
//************************************
DEV_EXPORT	int DevAppIsConnectioned(unsigned short P2pIndex);



//************************************
// Method:    DevAppCloseAllConnection 关闭所有p2p链接，但并不和平台断开
// FullName:  DevAppCloseAllConnection
// Access:    public 
// Returns:   DEV_EXPORT	void
// Qualifier:
//************************************
DEV_EXPORT	void DevAppCloseAllConnection();

//************************************
// Method:    DevAppSDKGetState	获取当前link的状态信息
// FullName:  DevAppSDKGetState
// Access:    public 
// Returns:   DEV_EXPORT	void
// Qualifier:
// Parameter: unsigned short P2pIndex
// Parameter: DevApp_SDK_State * pState
//************************************
DEV_EXPORT	int DevAppGetLinkState(unsigned short P2pIndex,DevApp_Link_State * pState);

//************************************
// Method:    DevAppSDKClose	SDK的反初始化退出
// FullName:  DevAppSDKClose
// Access:    public 
// Returns:   DEV_EXPORT	void
// Qualifier:
//************************************
DEV_EXPORT	void DevAppSDKClose();


#ifdef WIN32
#pragma pack( pop)
#endif

#ifdef __cplusplus
}

#endif

#endif