浏览代码

设备ID后6位修改为随机值、增加设备名称

LAPTOP-V47PCT1U\Gavin 4 月之前
父节点
当前提交
57ecb9db60
共有 8 个文件被更改,包括 249 次插入15 次删除
  1. 3 0
      .gitignore
  2. 二进制
      Win/Bin/EasyGBD_Demo.exe
  3. 二进制
      Win/Bin/GB28181Device.dll
  4. 二进制
      Win/Src/EasyGBDDemo.rc
  5. 213 12
      Win/Src/EasyGBD_DemoDlg.cpp
  6. 14 1
      Win/Src/EasyGBD_DemoDlg.h
  7. 17 2
      Win/Src/GB28181DeviceAPI.h
  8. 2 0
      Win/Src/resource.h

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+Win/Src/.vs/
+Win/Src/x64/
+Win/Bin/gb28181device-1.log

二进制
Win/Bin/EasyGBD_Demo.exe


二进制
Win/Bin/GB28181Device.dll


二进制
Win/Src/EasyGBDDemo.rc


+ 213 - 12
Win/Src/EasyGBD_DemoDlg.cpp

@@ -59,6 +59,8 @@ CEasyGBDDemoDlg::CEasyGBDDemoDlg(CWnd* pParent /*=nullptr*/)
 
 	InitMutex(&mLogMutex);
 	memset(&mGB28181Device, 0x00, sizeof(GB28181_DEVICE_T));
+
+	memset(&mGB28181DeviceList, 0x00, sizeof(GB28181_DEVICE_LIST_T));
 }
 
 void CEasyGBDDemoDlg::DoDataExchange(CDataExchange* pDX)
@@ -123,6 +125,7 @@ BOOL CEasyGBDDemoDlg::OnInitDialog()
 	pEdtPassword = (CEdit*)GetDlgItem(IDC_EDIT_PASSWORD);
 	pEdtLocalSipID = (CEdit*)GetDlgItem(IDC_EDIT_LOCAL_SIPID);
 	pEdtLocalPort = (CEdit*)GetDlgItem(IDC_EDIT_LOCAL_PORT);
+	pEdtDeviceName = (CEdit*)GetDlgItem(IDC_EDIT_DEVICE_NAME);
 	pEdtSourceURL = (CEdit*)GetDlgItem(IDC_EDIT_SOURCE_URL);
 
 	pBtnStartup = (CButton*)GetDlgItem(IDC_BUTTON_STARTUP);
@@ -130,9 +133,24 @@ BOOL CEasyGBDDemoDlg::OnInitDialog()
 	pRichEditLog = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT2_LOG);
 
 
-
 	pEdtServerSipID->SetWindowTextW(TEXT("34020000002000000001"));
-	//pEdtServerIP->SetWindowTextW(TEXT("172.81.216.155"));
+	pEdtServerIP->SetWindowTextW(TEXT("212.64.34.165"));
+	//pEdtServerIP->SetWindowTextW(TEXT("192.168.0.77"));
+	//
+	wchar_t wszDeviceName[32] = { 0 };
+
+	time_t currentTime = time(NULL);
+	unsigned int randValue = currentTime & 0xFFFFF;
+
+	wchar_t wszRandSipID[32] = { 0 };
+	wsprintf(wszRandSipID, TEXT("34020000001110%06d"), randValue);
+	wsprintf(wszDeviceName, TEXT("EasyGBD-%06d"), randValue);
+	int sipIdLen = (int)wcslen(wszRandSipID);
+	for (int i = sipIdLen; i > 20; i--)
+	{
+		wszRandSipID[i - 1] = TEXT('\0');
+	}
+
 	pEdtServerPort->SetWindowTextW(TEXT("15060"));
 	pEdtRegExpire->SetWindowTextW(TEXT("3600"));
 	pEdtHeartbeatCount->SetWindowTextW(TEXT("3"));
@@ -141,15 +159,31 @@ BOOL CEasyGBDDemoDlg::OnInitDialog()
 	pComboxProtocol->AddString(TEXT("TCP"));
 	pComboxProtocol->SetCurSel(0);
 	pEdtPassword->SetWindowTextW(TEXT("12345678"));
-	//pEdtLocalSipID->SetWindowTextW(TEXT("34020000001110000009"));
+	pEdtLocalSipID->SetWindowTextW(wszRandSipID);// TEXT("34020000001110000009"));
 	pEdtLocalPort->SetWindowTextW(TEXT("15090"));
-	//pEdtSourceURL->SetWindowTextW(TEXT("rtsp://admin:admin12345@190.168.8.106"));
+	pEdtDeviceName->SetWindowTextW(wszDeviceName);
+	pEdtSourceURL->SetWindowTextW(TEXT("G:/VideoSamples/Alizee_La_Isla_Bonita_Mixiran_Arash.avi"));
 
 
+	wchar_t wszPath[128] = { 0 };
+	GetModuleFileName(NULL, wszPath, sizeof(wszPath));
+	int nSize = (int)wcslen(wszPath);
 
-	OnBnClickedButtonShutdown();
+	int i = nSize;
+	for (i = nSize; i > 0; i--)
+	{
+		if ((unsigned char)wszPath[i] == '\\')
+		{
+			//wszPath[i] = '\0';
+			break;
+		}
+		wszPath[i] = '\0';
+	}
 
-	
+	wcscat(wszPath, TEXT("EasyDarwin.mp4"));
+	pEdtSourceURL->SetWindowTextW(wszPath);
+
+	OnBnClickedButtonShutdown();
 
 	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
 }
@@ -284,13 +318,18 @@ void CEasyGBDDemoDlg::OnBnClickedButtonStart()
 	pEdtLocalPort->GetWindowTextW(wszLocalPort, sizeof(wszLocalPort));
 	WCharToMByte(wszLocalPort, szLocalPort, sizeof(szLocalPort) / sizeof(szLocalPort[0]));
 
+	wchar_t wszDeviceName[128] = { 0 };
+	char szDeviceName[128] = { 0 };
+	pEdtDeviceName->GetWindowTextW(wszDeviceName, sizeof(wszDeviceName));
+	WCharToMByte(wszDeviceName, szDeviceName, sizeof(szDeviceName) / sizeof(szDeviceName[0]));
+
 	wchar_t wszSourceURL[1024] = { 0 };
 	char szSourceURL[1024] = { 0 };
 	pEdtSourceURL->GetWindowTextW(wszSourceURL, sizeof(wszSourceURL));
 	WCharToMByte(wszSourceURL, szSourceURL, sizeof(szSourceURL) / sizeof(szSourceURL[0]));
 
 	Startup(szServerSipId, szServerIP, atoi(szServerPort), atoi(szRegExpire), atoi(szHeartbeatCount), atoi(szHeartbeatInterval),
-		protocol, szPassword, szLocalSipID, atoi(szLocalPort), szSourceURL);
+		protocol, szPassword, 1, szLocalSipID, atoi(szLocalPort), szDeviceName, szSourceURL);
 
 
 	pBtnStartup->EnableWindow(FALSE);
@@ -403,6 +442,19 @@ int CALLBACK __GB28181DeviceCALLBACK(void* userPtr, int channelId, int eventType
 		}
 
 	}
+	else if (GB28181_DEVICE_EVENT_SUBSCRIBE_ALARM == eventType)
+	{
+		pThis->OutputLog("GB/T28181 订阅报警:%d.\n", paramLength);
+	}
+	else if (GB28181_DEVICE_EVENT_SUBSCRIBE_CATALOG == eventType)
+	{
+		pThis->OutputLog("GB/T28181 订阅目录:%d.\n", paramLength);
+	}
+	else if (GB28181_DEVICE_EVENT_SUBSCRIBE_MOBILEPOSITION == eventType)
+	{
+		pThis->OutputLog("GB/T28181 订阅位置:%d.\n", paramLength);
+	}
+	//
 
 	return 0;
 }
@@ -414,15 +466,23 @@ int Easy_APICALL __EasyStreamClientCallBack(void* _channelPtr, int _frameType, v
 
 	if (_frameType == EASY_SDK_VIDEO_FRAME_FLAG)
 	{
-		if (pChannel->videoCodec < 1)
+		if (pChannel->videoCodec < 1 && (pChannel->mediaInfo.u32AudioCodec>0 || pChannel->videoFrameNum>25))
 		{
 			pThis->OutputLog("设置视频编码格式: %s\n", _frameInfo->codec == EASY_SDK_VIDEO_CODEC_H264 ? "H264" : "H265");
 
 			libGB28181Device_SetVideoFormat(pChannel->id, _frameInfo->codec, 0, 0, 0);
-			libGB28181Device_SetAudioFormat(pChannel->id, EASY_SDK_AUDIO_CODEC_G711U, 8000, 1, 16);
-
+			libGB28181Device_SetAudioFormat(pChannel->id, pChannel->mediaInfo.u32AudioCodec,
+				pChannel->mediaInfo.u32AudioSamplerate,
+				pChannel->mediaInfo.u32AudioChannel > 2 ? 2 : pChannel->mediaInfo.u32AudioChannel,
+				pChannel->mediaInfo.u32AudioBitsPerSample);
+
+			//libGB28181Device_SetAudioFormat(pChannel->id, EASY_SDK_AUDIO_CODEC_AAC,//EASY_SDK_AUDIO_CODEC_G711U,
+			//	pChannel->mediaInfo.u32AudioSamplerate,			
+			//	pChannel->mediaInfo.u32AudioChannel > 2 ? 2 : pChannel->mediaInfo.u32AudioChannel,
+			//	pChannel->mediaInfo.u32AudioBitsPerSample);
 			pChannel->videoCodec = _frameInfo->codec;
 		}
+		pChannel->videoFrameNum++;
 
 		if (pChannel->sendStatus == 1)
 		{
@@ -446,6 +506,11 @@ int Easy_APICALL __EasyStreamClientCallBack(void* _channelPtr, int _frameType, v
 	}
 	else if (_frameType == EASY_SDK_AUDIO_FRAME_FLAG)
 	{
+		pChannel->mediaInfo.u32AudioCodec = _frameInfo->codec;
+		pChannel->mediaInfo.u32AudioSamplerate = _frameInfo->sample_rate;
+		pChannel->mediaInfo.u32AudioChannel = _frameInfo->channels;
+		pChannel->mediaInfo.u32AudioBitsPerSample = _frameInfo->bits_per_sample;
+
 		if (pChannel->sendStatus == 1)
 		{
 			libGB28181Device_AddAudioData(pChannel->id, _frameInfo->codec, (char*)pBuf, _frameInfo->length, _frameInfo->length);
@@ -524,6 +589,13 @@ int Easy_APICALL __EasyStreamClientCallBack(void* _channelPtr, int _frameType, v
 			pThis->OutputLog("当前视频源连接异常中断.\n");
 		}
 	}
+	else if (_frameType == EASY_SDK_MEDIA_INFO_FLAG)
+	{
+		EASY_MEDIA_INFO_T* pMediaInfo = (EASY_MEDIA_INFO_T*)pBuf;
+
+		//memcpy(&pChannel->mediaInfo, pMediaInfo, sizeof(EASY_MEDIA_INFO_T));// pChannel = pMediaInfo->u32AudioCodec;
+
+	}
 
 	return 0;
 }
@@ -532,10 +604,106 @@ int Easy_APICALL __EasyStreamClientCallBack(void* _channelPtr, int _frameType, v
 
 int		CEasyGBDDemoDlg::Startup(const char* serverSIPId, const char* serverIP, const int serverPort,
 								const int reg_expires, const int heartbeatCount, const int heartbeatInterval,
-								const int protocol, const char* password, const char* localSIPId, const int localPort, const char* sourceURL)
+								const int protocol, const char* password,
+								const int deviceNum, const char* localSIPId, const int localPort, 
+								const char* deviceName, const char* sourceURL)
 {
 	int ret = 0;
 
+	if (NULL == mGB28181DeviceList.pGB28181Device && deviceNum>1)
+	{
+		OutputLog("启动中...\n");
+
+		mGB28181DeviceList.nDeviceNum = deviceNum;
+		mGB28181DeviceList.pGB28181Device = new GB28181_DEVICE_T[deviceNum];
+		if (mGB28181DeviceList.pGB28181Device)
+		{
+			memset(mGB28181DeviceList.pGB28181Device, 0x00, sizeof(GB28181_DEVICE_T) * deviceNum);
+
+			for (int i = 0; i < deviceNum; i++)
+			{
+				mGB28181DeviceList.pGB28181Device[i].pChannel = new GB28181_CHANNEL_T[MAX_GB28181_CHANNEL_NUM];
+				if (mGB28181DeviceList.pGB28181Device[i].pChannel)
+				{
+					memset(mGB28181DeviceList.pGB28181Device[i].pChannel, 0x00, sizeof(GB28181_CHANNEL_T) * MAX_GB28181_CHANNEL_NUM);
+					for (int i = 0; i < MAX_GB28181_CHANNEL_NUM; i++)
+					{
+						mGB28181DeviceList.pGB28181Device[i].pChannel[i].id = i;
+						mGB28181DeviceList.pGB28181Device[i].pChannel[i].userptr = this;
+						strcpy(mGB28181DeviceList.pGB28181Device[i].pChannel[i].sourceURL, sourceURL);// "rtsp://admin:admin12345@192.168.6.41");
+
+
+						mGB28181DeviceList.pGB28181Device[i].pChannel[i].longitude = 121.29;
+						mGB28181DeviceList.pGB28181Device[i].pChannel[i].latitude = 31.14;
+					}
+
+					GB28181_DEVICE_INFO_T   gb28181DeviceInfo;
+					memset(&gb28181DeviceInfo, 0x00, sizeof(GB28181_DEVICE_INFO_T));
+					strcpy(gb28181DeviceInfo.device_name, deviceName);// "GB/T28181 Client");
+
+					gb28181DeviceInfo.version = 0;
+					strcpy(gb28181DeviceInfo.server_id, serverSIPId);
+					memcpy(gb28181DeviceInfo.server_domain, gb28181DeviceInfo.server_id, 10);
+					strcpy(gb28181DeviceInfo.server_ip, serverIP);
+					gb28181DeviceInfo.server_port = serverPort;
+					gb28181DeviceInfo.reg_expires = reg_expires;
+					gb28181DeviceInfo.heartbeat_count = heartbeatCount;
+					gb28181DeviceInfo.heartbeat_interval = heartbeatInterval;
+					gb28181DeviceInfo.protocol = protocol; //0 - udp; 1 - tcp
+					gb28181DeviceInfo.media_protocol = protocol;
+					strcpy(gb28181DeviceInfo.password, password);
+					gb28181DeviceInfo.log_enable = 1;         // log enable flag
+					gb28181DeviceInfo.log_level = 0;          // log level(0:TRACE,1:DEBUG,2:INFO,3:WARNING,4:ERROR,5:FATAL)
+
+					strcpy(gb28181DeviceInfo.device_id, localSIPId);
+					gb28181DeviceInfo.localSipPort = localPort;
+
+					gb28181DeviceInfo.channel_nums = MAX_GB28181_CHANNEL_NUM;
+					for (int i = 0; i < gb28181DeviceInfo.channel_nums; i++)
+					{
+						sprintf(gb28181DeviceInfo.channel[i].id, "%s1310%06d", gb28181DeviceInfo.server_domain, i + 1);
+						//sprintf(gb28181DeviceInfo.channel[i].name, "ch %02d", i + 1);
+						strcpy(gb28181DeviceInfo.channel[i].name, "EasyIPC");
+						strcpy(gb28181DeviceInfo.channel[i].model, "IPCamera");
+						sprintf(gb28181DeviceInfo.channel[i].owner, "Owner %02d", i + 1);
+						strcpy(gb28181DeviceInfo.channel[i].manufacturer, "Easy");
+						gb28181DeviceInfo.channel[i].longitude = (double)i + 100;
+						gb28181DeviceInfo.channel[i].latitude = (double)i + 10;
+					}
+
+					libGB28181Device_Create(&gb28181DeviceInfo/*为NULL则表示从当前目录下读取config.xml*/, __GB28181DeviceCALLBACK, (void*)&mGB28181Device);
+
+					for (int i = 0; i < MAX_GB28181_CHANNEL_NUM; i++)
+					{
+						if (0 == strcmp(mGB28181DeviceList.pGB28181Device[i].pChannel[i].sourceURL, "\0"))    continue;
+
+
+						EasyStreamClient_Init(&mGB28181DeviceList.pGB28181Device[i].pChannel[i].streamClientHandle, 0);
+						EasyStreamClient_SetCallback(mGB28181DeviceList.pGB28181Device[i].pChannel[i].streamClientHandle, __EasyStreamClientCallBack);
+						EasyStreamClient_OpenStream(mGB28181DeviceList.pGB28181Device[i].pChannel[i].streamClientHandle,
+							mGB28181DeviceList.pGB28181Device[i].pChannel[i].sourceURL, EASY_RTP_OVER_TCP, &mGB28181DeviceList.pGB28181Device[i].pChannel[i], 1000, 20, 1);
+						EasyStreamClient_SetAudioEnable(mGB28181DeviceList.pGB28181Device[i].pChannel[i].streamClientHandle, 1);
+						//EasyStreamClient_SetAudioOutFormat(mGB28181DeviceList.pGB28181Device[i].pChannel[i].streamClientHandle, EASY_SDK_AUDIO_CODEC_AAC, 8000, 1);
+						//mGB28181DeviceList.pGB28181Device[i].pChannel[i].audioOutputFormat = TRANSCODE_AUDIO_TYPE_G711U;// TRANSCODE_AUDIO_TYPE_G711U;
+
+						//libGB28181Device_SetVideoFormat(i, EASY_SDK_VIDEO_CODEC_H265, 0, 0, 0);
+						//libGB28181Device_SetAudioFormat(i, EASY_SDK_AUDIO_CODEC_AAC, 8000, 1, 16);
+					}
+
+					OutputLog("已启动..\n");
+				}
+				else
+				{
+					OutputLog("启动失败...\n");
+					ret = -1000;
+					return ret;
+				}
+			}
+		}
+
+		return 0;
+	}
+
 	if (NULL == mGB28181Device.pChannel)
 	{
 		OutputLog("启动中...\n");
@@ -557,6 +725,7 @@ int		CEasyGBDDemoDlg::Startup(const char* serverSIPId, const char* serverIP, con
 
 			GB28181_DEVICE_INFO_T   gb28181DeviceInfo;
 			memset(&gb28181DeviceInfo, 0x00, sizeof(GB28181_DEVICE_INFO_T));
+			strcpy(gb28181DeviceInfo.device_name, deviceName); //"GB/T28181 Client");
 
 			gb28181DeviceInfo.version = 0;
 			strcpy(gb28181DeviceInfo.server_id, serverSIPId);
@@ -600,7 +769,7 @@ int		CEasyGBDDemoDlg::Startup(const char* serverSIPId, const char* serverIP, con
 				EasyStreamClient_OpenStream(mGB28181Device.pChannel[i].streamClientHandle,
 					mGB28181Device.pChannel[i].sourceURL, EASY_RTP_OVER_TCP, &mGB28181Device.pChannel[i], 1000, 20, 1);
 				EasyStreamClient_SetAudioEnable(mGB28181Device.pChannel[i].streamClientHandle, 1);
-				EasyStreamClient_SetAudioOutFormat(mGB28181Device.pChannel[i].streamClientHandle, EASY_SDK_AUDIO_CODEC_G711U, 8000, 1);
+				//EasyStreamClient_SetAudioOutFormat(mGB28181Device.pChannel[i].streamClientHandle, EASY_SDK_AUDIO_CODEC_AAC, 8000, 1);
 				//mGB28181Device.pChannel[i].audioOutputFormat = TRANSCODE_AUDIO_TYPE_G711U;// TRANSCODE_AUDIO_TYPE_G711U;
 
 				//libGB28181Device_SetVideoFormat(i, EASY_SDK_VIDEO_CODEC_H265, 0, 0, 0);
@@ -622,6 +791,38 @@ int		CEasyGBDDemoDlg::Startup(const char* serverSIPId, const char* serverIP, con
 }
 void	CEasyGBDDemoDlg::Shutdown()
 {
+	if (mGB28181DeviceList.pGB28181Device)
+	{
+		for (int i = 0; i < mGB28181DeviceList.nDeviceNum; i++)
+		{
+			for (int ch = 0; ch < MAX_GB28181_CHANNEL_NUM; ch++)
+			{
+				if (0 == strcmp(mGB28181DeviceList.pGB28181Device[i].pChannel[ch].sourceURL, "\0"))    continue;
+
+				mGB28181DeviceList.pGB28181Device[i].pChannel[ch].sendStatus = 0;
+
+				EasyStreamClient_Deinit(mGB28181DeviceList.pGB28181Device[i].pChannel[ch].streamClientHandle);
+				mGB28181DeviceList.pGB28181Device[i].pChannel[ch].streamClientHandle = NULL;
+
+				//ATC_Deinit(&mGB28181Device.pChannel[i].atcHandle);
+
+				if (NULL != mGB28181DeviceList.pGB28181Device[i].pChannel[ch].fDat)
+				{
+					fclose(mGB28181DeviceList.pGB28181Device[i].pChannel[ch].fDat);
+					mGB28181DeviceList.pGB28181Device[i].pChannel[ch].fDat = NULL;
+				}
+			}
+
+			delete[]mGB28181DeviceList.pGB28181Device[i].pChannel;
+			mGB28181DeviceList.pGB28181Device[i].pChannel = NULL;
+		}
+
+		delete[]mGB28181DeviceList.pGB28181Device;
+		mGB28181DeviceList.pGB28181Device = NULL;
+	}
+
+
+
 	if (NULL == mGB28181Device.pChannel)		return;
 
 	OutputLog("停止中...\n");

+ 14 - 1
Win/Src/EasyGBD_DemoDlg.h

@@ -26,9 +26,11 @@ typedef struct __GB28181_CHANNEL_T
 	Easy_Handle  streamClientHandle;
 	//ATC_HANDLE  atcHandle;
 
+	EASY_MEDIA_INFO_T	mediaInfo;
 	int			videoCodec;
 	int         srcAudioCodec;
 	int         sendStatus;
+	int			videoFrameNum;
 
 	int         audioOutputFormat;
 
@@ -47,6 +49,14 @@ typedef struct __GB28181_DEVICE_T
 
 #define MAX_GB28181_CHANNEL_NUM		1
 
+typedef struct __GB28181_DEVICE_LIST_T
+{
+	GB28181_DEVICE_T* pGB28181Device;
+	int				nDeviceNum;
+
+	bool			shareSource;
+}GB28181_DEVICE_LIST_T;
+
 // CEasyGBDDemoDlg 对话框
 class CEasyGBDDemoDlg : public CDialogEx
 {
@@ -64,6 +74,7 @@ public:
 	CEdit* pEdtPassword;			//IDC_EDIT_PASSWORD
 	CEdit* pEdtLocalSipID;			//IDC_EDIT_LOCAL_SIPID
 	CEdit* pEdtLocalPort;			//IDC_EDIT_LOCAL_PORT
+	CEdit* pEdtDeviceName;			//IDC_EDIT_DEVICE_NAME
 	CEdit* pEdtSourceURL;			//IDC_EDIT_SOURCE_URL
 
 	CButton* pBtnStartup;			//IDC_BUTTON_STARTUP
@@ -74,10 +85,12 @@ public:
 
 	int		Startup(const char *serverSIPId, const char *serverIP, const int serverPort,
 		const int reg_expires, const int heartbeatCount, const int heartbeatInterval,
-		const int protocol, const char *password, const char *localSIPId, const int localPort, const char *sourceURL);
+		const int protocol, const char *password, const int deviceNum, const char *localSIPId, const int localPort, 
+		const char *deviceName, const char *sourceURL);
 	void	Shutdown();
 
 	GB28181_DEVICE_T	mGB28181Device;
+	GB28181_DEVICE_LIST_T	mGB28181DeviceList;
 
 	int OutputLog(char* szFormat, ...);
 	void OutputLog2UI();

+ 17 - 2
Win/Src/GB28181DeviceAPI.h

@@ -32,8 +32,22 @@ typedef enum __GB28181_DEVICE_EVENT_TYPE_ENUM_T
 	GB28181_DEVICE_EVENT_START_AUDIO_VIDEO,		//请求推送音视频
 	GB28181_DEVICE_EVENT_STOP_AUDIO_VIDEO,		//请求停止推送音视频
 	GB28181_DEVICE_EVENT_TALK_AUDIO_DATA,		//对端对讲数据
+	GB28181_DEVICE_EVENT_DISCONNECT,			//已断线
+
+	GB28181_DEVICE_EVENT_SUBSCRIBE_ALARM,		// 报警订阅
+	GB28181_DEVICE_EVENT_SUBSCRIBE_CATALOG,		// 目录订阅
+	GB28181_DEVICE_EVENT_SUBSCRIBE_MOBILEPOSITION,		// 位置订阅
+
+
+	GB28181_DEVICE_EVENT_PTZ_MOVE_LEFT,			// 云台-左
+	GB28181_DEVICE_EVENT_PTZ_MOVE_UP,			// 云台-上
+	GB28181_DEVICE_EVENT_PTZ_MOVE_RIGHT,		// 云台-右
+	GB28181_DEVICE_EVENT_PTZ_MOVE_DOWN,			// 云台-下
+	GB28181_DEVICE_EVENT_PTZ_MOVE_STOP,			// 云台-停
+	GB28181_DEVICE_EVENT_PTZ_ZOOM_IN,			// 云台-拉近
+	GB28181_DEVICE_EVENT_PTZ_ZOOM_OUT,			// 云台-拉远
+
 
-	GB28181_DEVICE_EVENT_DISCONNECT				//已断线
 }GB28181_DEVICE_EVENT_TYPE_ENUM_T;
 
 #define MAX_CH_NUMS     8
@@ -62,6 +76,7 @@ typedef struct __GB28181_DEVICE_INFO_T
 	char    server_id[32];      // server id
 	char	server_domain[64];  // server domain
 	char	device_id[32];      // device id
+	char	device_name[64];	// device name  2024.12.04
 	int		localSipPort;		//Local sip port
 	int     channel_nums;       // channel numbers
 	GB28181_CHANNEL_INFO_T channel[MAX_CH_NUMS];
@@ -87,7 +102,7 @@ userPtr:			
 int GB28181DEVICE_API	libGB28181Device_Create(GB28181_DEVICE_INFO_T *pDeviceInfo, GB28181DeviceCALLBACK callbackPtr, void *userPtr);
 
 int GB28181DEVICE_API	libGB28181Device_Create2(char* serverIP, int serverPort, char* serverId, char* serverDomain,
-													char* deviceId, int localSipPort, int channelNum,
+													char* deviceId, char* deviceName, int localSipPort, int channelNum,
 													GB28181_CHANNEL_INFO_T*pChannel,
 													char* password, int protocol, int mediaProtocol,
 													int regExpires, int heartbeatInterval, int heartbeatCount,

+ 2 - 0
Win/Src/resource.h

@@ -23,6 +23,8 @@
 #define IDC_BUTTON_BROWSE               1013
 #define IDC_RICHEDIT21                  1014
 #define IDC_RICHEDIT2_LOG               1014
+#define IDC_EDIT_LOCAL_NAME             1015
+#define IDC_EDIT_DEVICE_NAME            1015
 
 // Next default values for new objects
 //