标签:
itosipexosipsip |
分类: 音视频 |
这个测试程序是从eXosip原有的测试程序改造的。原程序是tools 目录下的 sip_reg.c
本程序主要改造了这几个地方:
1) eXosip_event_wait() 函数的超时时间,从原来的1ms
修改为50ms
2) 对于初次注册时,服务器返回401的情况。
调用函数 eXosip_add_authentication_info()发送鉴权信息。
其余的内容基本没改,在我们的sipserver 上面注册成功了。
从这个例程中 我们可以看出sip鉴权的基本流程
从sip角度看, 注册过程是这样的:
其中 nonce中带有鉴权信息。形如:
Authorization: Digest username="buxiangyi", realm="Yate",
nonce="143e882c902a9c38a3286e9043c35d40.1366083396" ,
uri="sip:172.16.50.189:5060",
response="8119330abd3ff5e4e26d2fa87b563b39", algorithm=MD5
对于 eXosip, 其处理过程如下:
1)eXosip_init
(初始化)
2)eXosip_listen_addr
(监听sip端口)
3)eXosip_register_build_initial_register (构建一个register)
4)eXosip_register_send_register
(发送register)
5)eXosip_event_wait
(等待对端事件)
6)eXosip_execute
(处理事件,调整内部状态)
7)eXosip_automatic_action
(根据当前状况,发出响应消息)
之后应循环执行 5)-》 7)
主程序如下:
#if defined(__arc__)
#define LOG_PERROR 1
#include <includes_api.h>
#include <os_cfg_pub.h>
#endif
#if !defined(WIN32) &&
!defined(_WIN32_WCE)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <syslog.h>
#ifdef OSIP_MT
#include <pthread.h>
#endif
#endif
#ifdef _WIN32_WCE
#include <winsock2.h>
#endif
#include <osip2/osip_mt.h>
#include
<eXosip2/eXosip.h>
#if !defined(WIN32) &&
!defined(_WIN32_WCE) &&
!defined(__arc__)
#define _GNU_SOURCE
#include <getopt.h>
#endif
#define PROG_NAME "sipreg"
#define PROG_VER "1.0"
#define UA_STRING "SipReg v" PROG_VER
#define SYSLOG_FACILITY LOG_DAEMON
#ifdef ANDROID
#include <android/log.h>
#define LOGI(format,...)
//__android_log_print(ANDROID_LOG_INFO
,"hello_hl","file[%s] line[%d] "format"",__FILE__, __LINE__
,##__VA_ARGS__)
#define LOGE(format,...)
__android_log_print(ANDROID_LOG_ERROR,"hello_hl","file[%s]
line[%d] "format"",__FILE__, __LINE__ ,##__VA_ARGS__)
#else
#include <stdio.h>
#define LOGI(format,...) // printf("file[%s]
line[%d] "format"\n",__FILE__, __LINE__ ,##__VA_ARGS__)
#define LOGE(format,...) printf("file[%s]
line[%d] "format"\n",__FILE__, __LINE__ ,##__VA_ARGS__)
#endif
#if defined(WIN32) || defined(_WIN32_WCE)
static void syslog_wrapper(int a, const char *fmt, ...)
{
}
#define LOG_INFO 0
#define LOG_ERR 0
#define LOG_WARNING 0
#define LOG_DEBUG 0
#elif defined(LOG_PERROR)
#define syslog_wrapper
syslog
#else
#define syslog_wrapper(a,b...)
fprintf(stderr,b);fprintf(stderr,"\n")
#endif
static void usage (void);
#ifdef OSIP_MT
static void *register_proc (void *arg);
#endif
static void
usage (void)
{
}
typedef struct regparam_t
{
} regparam_t;
#ifdef OSIP_MT
static void *
register_proc (void *arg)
{
#ifdef _WIN32_WCE
#else
#endif
#ifdef _WIN32_WCE
#else
#endif
}
#endif
#ifdef _WIN32_WCE
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int
nCmdShow)
#else
int main (int argc, char *argv[])
#endif
{
#if !defined(__arc__)
#endif
#ifdef OSIP_MT
#endif
#ifdef _WIN32_WCE
#else
#define short_options "c:de:f:hl:p:r:u:U:P:"
#ifdef _GNU_SOURCE
#else
#endif
#ifdef LOG_PERROR
#endif
#if !defined(__arc__)
#else
#endif
#endif
#ifndef _WIN32_WCE
#endif
#if 0
#endif
{
osip_message_t *reg = NULL;
int i;
regparam.regid =
eXosip_register_build_initial_register(fromuser, proxy,
contact, regparam.expiry * 2, ®);
LOGE("33333 regid[%d] ",regparam.regid);
if (regparam.regid < 1) {
syslog_wrapper(LOG_ERR,
"eXosip_register_build_initial_register failed");
LOGE("66666");
exit(1);
}
i = eXosip_register_send_register(regparam.regid, reg);
if (i != 0) {
syslog_wrapper(LOG_ERR, "eXosip_register_send_register
failed");
LOGE("55555");
exit(1);
}
LOGE("44444");
}
#ifdef OSIP_MT
#endif
#ifndef OSIP_MT
#endif
#ifndef OSIP_MT
#endif
}
执行结果
写脚本reg.sh(buxiangyi是我们测试用账号):
./sip_reg \
-r sip:172.16.50.189:5060 \
-u sip:buxiangyi@172.16.50.189 \
-c sip:buxiangyi@172.16.50.189:5060 \
-U buxiangyi \
-P buxiangyi \
-p 5060 \
-e 1800 \
-d
执行脚本:
hl@hl-VirtualBox:~/linphone/test_osip_linux$
./reg.sh
file[sip_reg.c] line[274] 111111
file[sip_reg.c] line[301] up and
running
file[sip_reg.c] line[302] proxy: sip:172.16.50.189:5060
file[sip_reg.c] line[303] fromuser:
sip:buxiangyi@172.16.50.189
file[sip_reg.c] line[304] contact:
sip:buxiangyi@172.16.50.189:5060
file[sip_reg.c] line[305] expiry: 1800
file[sip_reg.c] line[306] local port: 5060
file[sip_reg.c] line[307] passwd :buxiangyi
file[sip_reg.c] line[355] 33333
regid[1]
file[sip_reg.c] line[368] 44444
file[sip_reg.c] line[388] 77777
file[sip_reg.c] line[388] 77777
file[sip_reg.c] line[400]
88888
file[sip_reg.c] line[416]
401!!!!
file[sip_reg.c] line[388]
77777
file[sip_reg.c] line[400]
88888
file[sip_reg.c] line[410] registrered
successfully
file[sip_reg.c] line[388] 77777
file[sip_reg.c] line[388] 77777
file[sip_reg.c] line[388] 77777
。。。
可以看到客户端收到401之后,
eXosip可以自动处理,向server继续发送带nonce的register,之后注册成功