开发环境:debian linux 硬件环境:Hi3516D 开发工具:arm+linux+gcc、Xshell等
项目描述:
基于osip2以及eXosip2的开源库,下载编译,移植调试,流封装,最后实现GB28181实时流推送功能。
工作职责:
实现GB28181实时流推送功能。
实现步骤:
1,在gun官网下载开源库osip和exosip源代码,在windows上的VS2010上建立GB28181工程,加载库和相关文件,梳理会话流程并编译。
2,在PC上下载常用GB28181服务器,并且安装,配置。
3,两台PC,一台模拟相机,作为GB28181的客户端,另外一台作为GB28181的服务端,实现SIP协议的注册及会话,同时,以H264视频文件测试推流是否成功。
4,将windows上实现的GB28181协议,移植到linux上,实现推流到服务器。
5,将GB28181工程在linux上,再一次进行交叉编译,移植到ARM平台,准备在实现推流,以视频文件进行推流测试。
6,取得实时视频流,先经过PS流格式封装、再进行RTP打包封装,最后经SIP协议,实时推送到服务器,实现GB28181的最后功能
int *gb28181_init_Sip(void *arg)
{
sleep(5);
char loacal_ip[30]={0};
int i,flag;
int flag1 = 1;
printf("jxc-------------------------gb28181 start\n");
//IPC_Client_Sent_Port(30000);
//eXosip_event_geteventsocket();
//libmath_init();
//libmath_init_2();
Get_Dst_Src_IPaddress();
get_local_ip_char("eth0",loacal_ip);
memset(eXosip_ipc_ip,0,sizeof(eXosip_ipc_ip));
memset(eXosip_media_ip,0,sizeof(eXosip_media_ip));
strcpy(eXosip_ipc_ip,loacal_ip);
strcpy(eXosip_media_ip,loacal_ip);
//printf("[jxc]:Dest_IP=%s \n",Dest_IP);
//printf("[jxc]:Src_IP=%s \n\n",Src_IP);
//memset(eXosip_server_ip,0,sizeof(eXosip_server_ip));
//memset(eXosip_ipc_ip,0,sizeof(eXosip_ipc_ip));
//memset(eXosip_media_ip,0,sizeof(eXosip_media_ip));
//strcat(eXosip_server_ip,Dest_IP);
//strcat(eXosip_ipc_ip,Src_IP);
//strcat(eXosip_media_ip,Src_IP);
device_info.server_id = eXosip_server_id;
device_info.server_ip = eXosip_server_ip;
device_info.server_port = eXosip_server_port;
device_info.ipc_id = eXosip_ipc_id;
device_info.ipc_pwd = eXosip_ipc_pwd;
device_info.ipc_ip = eXosip_ipc_ip;
device_info.ipc_media_port = eXosip_ipc_media_port;
device_info.ipc_sess_port = eXosip_ipc_sess_port;
device_info.alarm_id =eXosip_alarm_id;
device_info.media_ip =eXosip_media_ip;
device_info.media_port =eXosip_media_port;
printf("---------------------------------------\n");
printf("[jxc]:server_ip=%s \n",device_info.server_ip);
printf("[jxc]:ipc_ip=%s \n",device_info.ipc_ip);
printf("[jxc]:media_ip=%s \n\n\n",device_info.media_ip);
printf("---------------------------------------\n");
int len0=strlen(device_info.server_ip);
int len1=strlen(device_info.server_id);
int len2=strlen(device_info.server_port);
int len3=strlen(device_info.ipc_id);
printf("------0-------len=%d \n",len0);
printf("------1-------len=%d \n",len1);
printf("------2-------len=%d \n",len2);
printf("------3-------len=%d \n",len3);
//---------鍘绘帀灏惧反涓婇潪IP鍦板潃鐨勭壒娈婂瓧绗?
for(i=0;i<len0;i++)
{
if((device_info.server_ip[i]!=0X2E)&&((device_info.server_ip[i]<0X30)||(device_info.server_ip[i]>0X39)))
{
printf("device_info.server_ip[%d]=0x%x\n\n",i,device_info.server_ip[i]);
device_info.server_ip[i] = 0x00;
}
}
for(i=0;i<len1;i++)
{
if((device_info.server_id[i]<0X30)||(device_info.server_id[i]>0X39))
{
printf("device_info.server_id[%d]=0x%x\n\n",i,device_info.server_id[i]);
device_info.server_id[i] = 0x00;
}
}
for(i=0;i<len2;i++)
{
if((device_info.server_port[i]<0X30)||(device_info.server_port[i]>0X39))
{
printf("device_info.server_port[%d]=0x%x\n\n",i,device_info.server_port[i]);
device_info.server_port[i] = 0x00;
}
}
for(i=0;i<len3;i++)
{
if((device_info.ipc_id[i]<0X30)||(device_info.ipc_id[i]>0X39))
{
printf("device_info.ipc_id[%d]=0x%x\n\n",i,device_info.ipc_id[i]);
device_info.ipc_id[i] = 0x00;
}
}
//-------------------------------
//device_info.server_ip[len0-1]=0x00;
//device_info.server_ip[len0-2]=0x00;
//device_info.server_id[len1-1]=0x00;
//device_info.server_id[len1-2]=0x00;
//device_info.server_port[len2-1]=0x00;
//device_info.server_port[len2-2]=0x00;
//device_info.ipc_id[len3-1]=0x00;
//device_info.ipc_id[len3-2]=0x00;
//device_info.ipc_ip[len2-1]=0x00;
//device_info.ipc_ip[len2-2]=0x00;
//device_info.media_ip[len3-1]=0x00;
//device_info.media_ip[len3-2]=0x00;
for(i=0;i<20;i++)
{
printf("0x%x ",device_info.server_ip[i]);
}
printf("\n");
for(i=0;i<20;i++)
{
printf("0x%x ",device_info.ipc_ip[i]);
}
printf("\n");
for(i=0;i<20;i++)
{
printf("0x%x ",device_info.media_ip[i]);
}
printf("\n");
device_info.device_name = eXosip_device_name;
device_info.device_manufacturer = eXosip_device_manufacturer;
device_info.device_model = eXosip_device_model;
device_info.device_firmware = eXosip_device_firmware;
device_info.device_encode = eXosip_device_encode;
device_info.device_record = eXosip_device_record;
device_status.status_on = eXosip_status_on;
device_status.status_ok = eXosip_status_ok;
device_status.status_online = eXosip_status_online;
device_status.status_guard = eXosip_status_guard;
device_status.status_time = eXosip_status_time;
dt_eXosip_callback.dt_eXosip_deviceControl = dt_eXosip_deviceControl;
dt_eXosip_callback.dt_eXosip_getDeviceInfo = dt_eXosip_getDeviceInfo;
dt_eXosip_callback.dt_eXosip_getDeviceStatus = dt_eXosip_getDeviceStatus;
dt_eXosip_callback.dt_eXosip_getRecordTime = dt_eXosip_getRecordTime;
dt_eXosip_callback.dt_eXosip_mediaControl = dt_eXosip_mediaControl;
dt_eXosip_callback.dt_eXosip_playControl = dt_eXosip_playControl;
int cnt = 0;
while (dt_eXosip_init() == -1)
{
cnt++;
if (cnt > 10)
{
cnt = 0;
printf("[jxc]:dt_eXosip_init() 10 times failed\n");
sleep(3);
return -1;
}
}
if(dt_eXosip_register(3600) == 0)
{
printf("use timer in workthread of console application\n");
//pthread_create(&pthread_1,NULL,Pthead_handl,NULL);
//pthread_join(pthread_1,NULL);
dt_eXosip_processEvent();
}
printf("\n\njxc-------------------------end\n");
return (0);
}