我使用了vs2008編譯器,下載的最新版本ReSIProcate 1.51,在windows 7下編譯
編譯
Build->Configuration Manager鉤掉basicCall,basicMessage,basicRegister,還有resip_test,接著Build Solution.
我用vs2008編譯,有一處錯誤,AresDns Line 158,WarningLog之間使用條件編譯不認識#字元
由
WarningLog (<< "Ignoring non-IPv4 additional name server "<br />#if defined(USE_CARES)<br /> "(not yet supported with c-ares)"<br />#elif defined(USE_ARES)<br /> "(IPv6 support was not enabled)"<br />#endif<br /> );
改為
#if defined(USE_CARES)<br /> WarningLog (<< "Ignoring non-IPv4 additional name server "<br /> "(not yet supported with c-ares)");</p><p>#elif defined(USE_ARES)<br /> WarningLog (<< "Ignoring non-IPv4 additional name server "<br />"(IPv6 support was not enabled)");<br />#endif
注意:在Linux下編譯,需要預先安裝些外部庫,在Ubuntu下運行參考文章中的命令:
sudo aptitude update; sudo aptitude install subversion g++ gperf libssl-dev libpopt-dev libpcre3-dev libdb4.2++-dev libboost-dev
安裝運行resiprocate的proxy
運行 /repro/WinSetup/Debug/Setup.msi,預設安裝到檔案夾C:/Program Files/ReSiprocate
vs 2008 的repro project 屬性修改:
Debugging Command 定位到repro可執行檔安裝路徑,預設設定為C:/Program Files/ReSiprocate/repro.exe
Build Events->Post-Build Event->Command Line設定為copy "$(TargetPath)" "C:/Program Files/ReproSIPProxy"
至此編譯resiprocate,copy至安裝資料夾,即可運行repro了
運行repro,在瀏覽器中輸入http://localhost:5080,點擊login並輸入使用者名稱admin和密碼admin登入。
配置resiprocate的proxy
這裡僅僅談談windows下的配置
兩種方式:一、設定檔,二、命令列參數
設定檔方式需要代碼做些稍許變動,這裡僅僅談談比較原裝的命令列參數,主要是那些影響proxy啟動並執行關鍵參數。
先談談命令列參數幾種比較簡單的實現方式
一、vs2008中repro項目屬性,參數填寫在Debugging->command Arguments
二、建立捷徑,在Targets一欄中的可執行檔後面空一格在"-"之後填寫參數
三、建立cmd檔案,同二可執行檔後面空一個在"-"之後填寫參數
具體參數解析可參考CommandLineParser類中,採用了popt外部庫解析命令列參數
struct poptOption table[] = {<br /> {"log-type", 'l', POPT_ARG_STRING| POPT_ARGFLAG_SHOW_DEFAULT, &logType, 0, "where to send logging messages", "syslog|cerr|cout"},<br /> {"log-level", 'v', POPT_ARG_STRING| POPT_ARGFLAG_SHOW_DEFAULT, &logLevel, 0, "specify the default log level", "STACK|DEBUG|INFO|WARNING|ALERT"},<br /> {"db-path", 0, POPT_ARG_STRING, &dbPath, 0, "path to databases", 0},<br /> {"record-route", 'r', POPT_ARG_STRING, &recordRouteUri, 0, "specify uri to use as Record-Route", "sip:example.com"},<br /> {"force-record-route", 0, POPT_ARG_NONE, &forceRecordRoute, 0, "force record-routing", 0},<br />#if defined(USE_MYSQL)<br /> {"mysqlServer", 'x', POPT_ARG_STRING| POPT_ARGFLAG_SHOW_DEFAULT, &mySqlServer, 0, "enable MySQL and provide name of server", "localhost"},<br />#endif<br /> {"udp", 0, POPT_ARG_INT| POPT_ARGFLAG_SHOW_DEFAULT, &udpPort, 0, "listen on UDP port", "5060"},<br /> {"tcp", 0, POPT_ARG_INT | POPT_ARGFLAG_SHOW_DEFAULT, &tcpPort, 0, "listen on TCP port", "5060"},<br />#if defined(USE_SSL)<br /> {"tls-domain", 't', POPT_ARG_STRING, &tlsDomain, 0, "act as a TLS server for specified domain", "example.com"},<br /> {"tls", 0, POPT_ARG_INT | POPT_ARGFLAG_SHOW_DEFAULT, &tlsPort, 0, "add TLS transport on specified port", "5061"},<br /> {"dtls", 0, POPT_ARG_INT | POPT_ARGFLAG_SHOW_DEFAULT, &dtlsPort, 0, "add DTLS transport on specified port", "0"},<br /> {"enable-cert-server", 0, POPT_ARG_NONE, &certServer, 0, "run a cert server", 0},<br />#ifdef WIN32<br /> {"cert-path", 'c', POPT_ARG_STRING| POPT_ARGFLAG_SHOW_DEFAULT, &certPath, 0, "path to certificates (default: c://sipCerts)", 0},<br />#else<br /> {"cert-path", 'c', POPT_ARG_STRING| POPT_ARGFLAG_SHOW_DEFAULT, &certPath, 0, "path to certificates (default: ~/.sipCerts)", 0},<br />#endif<br />#endif<br /> {"enable-v6", 0, POPT_ARG_NONE, &enableV6, 0, "enable IPV6", 0},<br /> {"disable-v4", 0, POPT_ARG_NONE, &disableV4, 0, "disable IPV4", 0},<br /> {"disable-auth", 0, POPT_ARG_NONE, &noChallenge, 0, "disable DIGEST challenges", 0},<br /> {"disable-auth-int", 0, POPT_ARG_NONE, &noAuthIntChallenge,0, "disable auth-int DIGEST challenges", 0},<br /> {"reject-bad-nonces", 0, POPT_ARG_NONE, &rejectBadNonces,0, "Send 403 if a client sends a bad nonce in their credentials (will send a new challenge otherwise)", 0},<br /> {"disable-web-auth", 0, POPT_ARG_NONE, &noWebChallenge, 0, "disable HTTP challenges", 0},<br /> {"disable-reg", 0, POPT_ARG_NONE, &noRegistrar, 0, "disable registrar", 0},<br /> {"disable-identity", 0, POPT_ARG_NONE, &noIdentityHeaders, 0, "disable adding identity headers", 0},<br /> {"interfaces", 'i', POPT_ARG_STRING, &interfaces, 0, "specify interfaces to add transports to", "sip:10.1.1.1:5065;transport=tls;tls=tlsdomain.com"},<br /> {"domains", 'd', POPT_ARG_STRING, &domains, 0, "specify domains that this proxy is authorative", "example.com,foo.com"},<br /> {"route", 'R', POPT_ARG_STRING, &routeSet, 0, "specify where to route requests that are in this proxy's domain", "sip:p1.example.com,sip:p2.example.com"},<br /> {"reqChainName", 0, POPT_ARG_STRING, &reqChainName, 0, "name of request chain (default: default)", 0},<br /> {"http", 0, POPT_ARG_INT | POPT_ARGFLAG_SHOW_DEFAULT, &httpPort, 0, "run HTTP server on specified port", "5080"},<br /> {"http-hostname", 0, POPT_ARG_STRING, &httpHostname, 0, "http hostname for this server (used in Identity headers)", 0},<br /> {"recursive-redirect",0, POPT_ARG_NONE, &recursiveRedirect, 0, "Handle 3xx responses in the proxy", 0},<br /> {"q-value", 0, POPT_ARG_NONE, &doQValue, 0, "Enable sequential q-value processing", 0},<br /> {"q-value-behavior", 0, POPT_ARG_STRING, &forkBehavior, 0, "Specify forking behavior for q-value targets: FULL_SEQUENTIAL, EQUAL_Q_PARALLEL, or FULL_PARALLEL", 0},<br /> {"q-value-cancel-btw-fork-groups",0,POPT_ARG_NONE, &cancelBetweenForkGroups, 0, "Whether to cancel groups of parallel forks after the period specified by the --q-value-ms-before-cancel parameter.", 0},<br /> {"q-value-wait-for-terminate-btw-fork-groups",0,POPT_ARG_NONE, &waitForTerminate, 0, "Whether to wait for parallel fork groups to terminate before starting new fork-groups.", 0},<br /> {"q-value-ms-between-fork-groups",0,POPT_ARG_INT, &msBetweenForkGroups, 0, "msec to wait before starting new groups of parallel forks", 0},<br /> {"q-value-ms-before-cancel",0, POPT_ARG_INT, &msBeforeCancel, 0, "msec to wait before cancelling parallel fork groups", 0},<br /> {"enum-suffix", 'e', POPT_ARG_STRING, &enumSuffix, 0, "specify enum suffix to search", "e164.arpa"},<br /> {"allow-bad-reg", 'b', POPT_ARG_NONE, &allowBadReg, 0, "allow To tag in registrations", 0},<br /> {"parallel-fork-static-routes",'p',POPT_ARG_NONE, ¶llelForkStaticRoutes, 0, "paralled fork to all matching static routes and (first batch) registrations", 0},<br /> {"timer-C", 0, POPT_ARG_INT, &timerC, 0, "specify length of timer C in sec (0 or negative will disable timer C)", "180"},<br /> {"admin-password", 'a', POPT_ARG_STRING, &adminPassword, 0, "set web administrator password", ""},<br /> {"disable-outbound",0, POPT_ARG_NONE, &outboundDisabled,0, "disable outbound support (draft-ietf-sip-outbound)", 0},<br /> {"outbound-version",0, POPT_ARG_INT | POPT_ARGFLAG_SHOW_DEFAULT, &outboundVersion, 0, "set the version of outbound to support", "11"},<br /> {"enable-flow-tokens",0, POPT_ARG_NONE, &rrTokenHackEnabled,0, "enable use of flow-tokens in non-outbound cases (This is a workaround, and it is broken. Only use it if you have to.)", 0},<br /> {"version", 'V', POPT_ARG_NONE, &showVersion, 0, "show the version number and exit", 0},<br /> POPT_AUTOHELP<br /> { NULL, 0, 0, NULL, 0 }<br /> };
[-parameter value] [-parameter value] ...
parameter為table每行第二個參數,而value參考每行最後一個參數,參數解釋參考每行倒數第二個參數
如果某值第二個參數為0的話,需要直接在代碼中設定值了
比如要設定log-type為vsdebugwindow,log-level為STACK的話,命令列參數就是
-l vsdebugwindow -v STACK
注意:ReSIProcate1.5版本,代碼需要稍作修改才可以支援vsdebugwindow
Log::Type<br />Log::toType(const Data& arg)<br />{<br /> /* if (arg == "cout" || arg == "COUT")<br /> {<br /> return Log::Cout;<br /> }<br /> else if (arg == "cerr" || arg == "CERR")<br /> {<br /> return Log::Cerr;<br /> }<br /> else if (arg == "file" || arg == "FILE")<br /> {<br /> return Log::File;<br /> }<br /> else<br /> {<br /> return Log::Syslog;<br /> }*/<br /> if (arg == "cout" || arg == "COUT")<br /> {<br /> return Log::Cout;<br /> }<br /> else if (arg == "cerr" || arg == "CERR")<br /> {<br /> return Log::Cerr;<br /> }<br /> else if (arg == "file" || arg == "FILE")<br /> {<br /> return Log::File;<br /> }<br /> else if (isEqualNoCase(arg , "VSDebugWindow") )<br />{<br />return Log::VSDebugWindow;<br />}<br />else<br /> {<br /> return Log::Syslog;<br /> }<br />}
void<br />Log::initialize(const Data& typed, const Data& leveld, const Data& appName,<br /> const char *logFileName, ExternalLogger* externalLogger)<br />{<br />/*Type type = Log::Cout;<br /> if (isEqualNoCase(typed, "cout")) type = Log::Cout;<br /> else if (isEqualNoCase(typed, "cerr")) type = Log::Cerr;<br /> else if (isEqualNoCase(typed, "file")) type = Log::File;<br /> else type = Log::Syslog;*/<br /> Type type = Log::Cout;<br /> type = toType(typed);</p><p> Level level = Log::Info;<br /> level = toLevel(leveld);<br /> Log::initialize(type, level, appName, logFileName, externalLogger);<br />}
一些參數的簡單介紹
disable-auth 設定為true的話,電話註冊可無需驗證
record-route 設定的話,會話建立之後的sip信令依然從proxy走,當然要強制啟用的話,得設定forceRecordRoute為true
測試
resiprocate的proxy
如果手邊比較方便的話,可以直接使用網關串連兩個電話分機,或者用軟電話,註冊到proxy上,互相撥打。
也可以依照參考文章中的測試方法使用ReSIProcate內建的測試程式進行測試。
參考文章
http://www.resiprocate.org/Quick_Subversion_Checkout_and_Compilation_HOWTO#Unix_Systems_.28Including_OS_X.29
簡單寫了個綱要,還沒有具體的測試