mirror of https://github.com/sipwise/sems.git
- added text files generated from doxygen docs git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1660 8eb893ce-cfd4-0310-b710-fb5ebe64c474sayer/1.4-spce2.6
parent
1b47ae35b9
commit
37acd2e174
@ -0,0 +1,183 @@
|
||||
* [1]Main Page
|
||||
* [2]Related Pages
|
||||
* [3]Namespaces
|
||||
* [4]Data Structures
|
||||
* [5]Files
|
||||
* [6]Directories
|
||||
* [7]Examples
|
||||
|
||||
Application Modules Documentation
|
||||
|
||||
Documentation for the applications that come with SEMS. The
|
||||
applications can be found in the apps/ directory and are installed by
|
||||
default if they do not depend on special libraries (eg. liblame). A set
|
||||
of [8]Example Applications that illustrate how to make use certain
|
||||
aspects of the SEMS framework can be found in the apps/examples
|
||||
directory. These are not installed by default.
|
||||
|
||||
Announcement Applications
|
||||
|
||||
Applications that play announcements to the caller. For plain
|
||||
announcements, there is the announcement module.
|
||||
* [9]Module Documentation: announcement Application
|
||||
|
||||
Pre-call announcements can either be implemented using early media with
|
||||
the early_announce application,
|
||||
* [10]Module Documentation: early_announce Application
|
||||
|
||||
or the session is established and after the announcement SEMS acts as
|
||||
B2BUA, inviting the original r-uri, and finally reinviting the caller:
|
||||
* [11]Module Documentation: ann_b2b Application
|
||||
|
||||
Another possibility is to establish the session and then REFER the
|
||||
caller:
|
||||
* [12]Module Documentation: announce_transfer Application
|
||||
|
||||
As SEMS can also do UAC authentication for a call using the uac_auth
|
||||
component plugin ( ModuleDoc_uac_auth). An example where this is used
|
||||
is the announce_auth example application:
|
||||
* [13]Module Documentation: announce_auth Application
|
||||
|
||||
Voicemail and Mailbox
|
||||
|
||||
SEMS has a voicemail application, which send a recorded message via
|
||||
Email (voicemail2email), saves the message to the voicebox, or does
|
||||
both:
|
||||
* [14]Module Documentation: voicemail Application
|
||||
|
||||
Messages saved to voicebox can be listened to using the voicebox
|
||||
application:
|
||||
* [15]Module Documentation: voicebox Application
|
||||
|
||||
The annrecorder application can be used to record a personal greeting
|
||||
message.:
|
||||
* [16]Module Documentation: annrecorder Application
|
||||
|
||||
There is also a simpler mailbox application, which stores recorded
|
||||
messages (in an IMAP server) and users can dial in to check their
|
||||
messages:
|
||||
* [17]Module Documentation: mailbox Application
|
||||
|
||||
Conferencing
|
||||
|
||||
SEMS can be a conference bridge with the conference application:
|
||||
* [18]Module Documentation: conference Application
|
||||
|
||||
Authentication for conference rooms (PIN entry)
|
||||
|
||||
There are two possibilies how a PIN entry for conference rooms (or for
|
||||
other services) can be implemented: after the PIN is collected and
|
||||
verified against a XMLRPC authentication server, the call can be
|
||||
connected to the conference room either using B2BUA, or it can be
|
||||
transfered to the conference bridge using a (proprietary) REFER call
|
||||
flow. The b2bua solution, which also gives the possibility to limit the
|
||||
call time, is implemented in the conf_auth plugin:
|
||||
* [19]Module Documentation: conf_auth Application
|
||||
|
||||
The other call flow can be implemented using the pin_collect
|
||||
application:
|
||||
* [20]Module Documentation: pin_collect Application
|
||||
|
||||
Web controlled conference rooms
|
||||
|
||||
Using the webconference application, conference rooms can be controlled
|
||||
from e.g. a web control page, or some other external mechanism:
|
||||
* [21]Module Documentation: webconference Application
|
||||
|
||||
Prepaid
|
||||
|
||||
This is a signalling-only prepaid engine.
|
||||
* [22]Module Documentation: prepaid_sip application plugin
|
||||
|
||||
Click2Dial
|
||||
|
||||
An xmlrpc-enabled way to initiate authenticated calls:
|
||||
* [23]Module Documentation: click2dial application plugin
|
||||
|
||||
Defining and developing applications as state machine charts
|
||||
|
||||
The DSM module allows to define an application as simple, easy to read,
|
||||
self-documenting, concise state diagram. This state machine definition
|
||||
is then interpreted and executed by the DSM application.
|
||||
* [24]DSM: State machine notation for VoIP applications
|
||||
|
||||
Scripting SEMS with Python
|
||||
|
||||
There are two application modules which embed a python interpreted into
|
||||
SEMS: the ivr module and the py_sems module.
|
||||
|
||||
The ivr module plugin embeds a python interpreter into SEMS. In it,
|
||||
applications written in python can be run (mailbox, conf_auth,
|
||||
pin_collect for example) and new applications can be prototyped and
|
||||
implemented very quickly:
|
||||
* [25]Module Documentation: ivr Application
|
||||
|
||||
The ivr module has a simple to use, yet limited API, which uses
|
||||
hand-written wrappers for the python bindings.
|
||||
|
||||
py_sems uses a binding generator to make python classes from the SEMS
|
||||
core C++ classes, thus exposing a lot more functionality natively to
|
||||
python:
|
||||
* [26]Module Documentation: py_sems Application
|
||||
|
||||
Registering SEMS at a SIP registrar
|
||||
|
||||
The reg_agent module together with the registar_client module can be
|
||||
used to register at a SIP registrar.
|
||||
* [27]Module Documentation: reg_agent Application
|
||||
|
||||
* [28]Module Documentation: registrar_client Application
|
||||
|
||||
Various applications
|
||||
|
||||
xmlrpc2di ([29]Module Documentation: xmlrpc2di Application) exposes DI
|
||||
interfaces as XMLRPC server. This is very useful to connect SEMS with
|
||||
other software, that e.g. trigger click2dial calls, create
|
||||
registrations at SIP registrar, do monitoring, etc.
|
||||
* [30]Module Documentation: callback application plugin
|
||||
|
||||
* [31]Module Documentation: auth_b2b application plugin
|
||||
|
||||
Other components
|
||||
|
||||
* [32]Module Documentation: diameter_client component plugin
|
||||
__________________________________________________________________
|
||||
|
||||
|
||||
Generated on Wed Mar 17 14:15:58 2010 for SEMS by [33]doxygen 1.6.1
|
||||
|
||||
References
|
||||
|
||||
1. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/index.html
|
||||
2. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/pages.html
|
||||
3. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/namespaces.html
|
||||
4. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/annotated.html
|
||||
5. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/files.html
|
||||
6. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/dirs.html
|
||||
7. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/examples.html
|
||||
8. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/AppDocExample.html
|
||||
9. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_announcement.html
|
||||
10. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_early_announce.html
|
||||
11. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_ann_b2b.html
|
||||
12. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_announce_transfer.html
|
||||
13. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_announce_auth.html
|
||||
14. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_voicemail.html
|
||||
15. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_voicebox.html
|
||||
16. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_annrecorder.html
|
||||
17. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_mailbox.html
|
||||
18. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_conference.html
|
||||
19. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_conf_auth.html
|
||||
20. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_pin_collect.html
|
||||
21. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_webconference.html
|
||||
22. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_sw_prepaid_sip.html
|
||||
23. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_click2dial.html
|
||||
24. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_dsm.html
|
||||
25. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_ivr.html
|
||||
26. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_py_sems.html
|
||||
27. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_reg_agent.html
|
||||
28. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_registrar_client.html
|
||||
29. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_xmlrpc2di.html
|
||||
30. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_callback.html
|
||||
31. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_auth_b2b.html
|
||||
32. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_diameter_client.html
|
||||
33. http://www.doxygen.org/index.html
|
||||
@ -0,0 +1,34 @@
|
||||
* [1]Main Page
|
||||
* [2]Related Pages
|
||||
* [3]Namespaces
|
||||
* [4]Data Structures
|
||||
* [5]Files
|
||||
* [6]Directories
|
||||
* [7]Examples
|
||||
|
||||
Component Modules Documentation
|
||||
|
||||
SEMS is extensible with modules. Component modules are modules which
|
||||
implement functionality which can be used by other modules, e.g. by
|
||||
application modules.
|
||||
* [8]Module Documentation: registrar_client Application :
|
||||
registrar_client
|
||||
|
||||
* [9]Module Documentation: uac_auth component : uac_auth
|
||||
__________________________________________________________________
|
||||
|
||||
|
||||
Generated on Wed Mar 17 14:15:58 2010 for SEMS by [10]doxygen 1.6.1
|
||||
|
||||
References
|
||||
|
||||
1. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/index.html
|
||||
2. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/pages.html
|
||||
3. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/namespaces.html
|
||||
4. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/annotated.html
|
||||
5. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/files.html
|
||||
6. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/dirs.html
|
||||
7. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/examples.html
|
||||
8. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_registrar_client.html
|
||||
9. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_uac_auth.html
|
||||
10. http://www.doxygen.org/index.html
|
||||
@ -0,0 +1,210 @@
|
||||
* [1]Main Page
|
||||
* [2]Related Pages
|
||||
* [3]Namespaces
|
||||
* [4]Data Structures
|
||||
* [5]Files
|
||||
* [6]Directories
|
||||
* [7]Examples
|
||||
|
||||
How to try out SEMS without setting up a proxy
|
||||
|
||||
Introduction
|
||||
|
||||
This text describes how one can try out services in SEMS without
|
||||
setting up a proxy. This is the simplest way to try services in SEMS,
|
||||
or start with developing a service.
|
||||
|
||||
The way this works is that SEMS registers to a SIP server (registrar)
|
||||
with one account (bob), just like any other SIP phone, and we call SEMS
|
||||
from another account (alice). If the SIP server provides DID calling
|
||||
from the PSTN, we can use any landline or mobile phone for testing or
|
||||
using the service.
|
||||
|
||||
Note:
|
||||
What is not possible with this method is to use applications,
|
||||
which need additional information for a call, from the
|
||||
subscriber data. For example, in order to send a voicemail as
|
||||
email, the SEMS server needs the email address to send the mail
|
||||
to.
|
||||
|
||||
Requirements
|
||||
|
||||
For compiling SEMS, as a minimum a C++ compiler and make is needed. In
|
||||
debian, do
|
||||
apt-get install g++ make
|
||||
|
||||
With a public SIP server
|
||||
|
||||
Two accounts at a public SIP server are needed. We recommend to use
|
||||
iptel.org's SIP service for testing, an account can be registered for
|
||||
free at [8]http://iptel.org/service/.
|
||||
|
||||
Any SIP phone, hardphone or softphone, can be used for testing.
|
||||
Cross-platform, [9]sip-communicator is recommended, for Linux
|
||||
[10]twinkle, for Windows sip-communicator, xten eyebeam or NCH express.
|
||||
|
||||
With a PSTN DID provider
|
||||
|
||||
Alternatively a PSTN DID provider can be used. In that case, we can
|
||||
test and use the service with any phone. A list of DID providers is for
|
||||
example available at [11]voip-info . [12]Sipgate for example, provides
|
||||
free DID numbers in Germany.
|
||||
|
||||
Installing SEMS from source
|
||||
|
||||
First, the SEMS source is downloaded from iptel.org and extracted:
|
||||
$ wget ftp.iptel.org/pub/sems/sems-latest.tar.gz
|
||||
$ tar xzvf sems-latest.tar.gz
|
||||
|
||||
SEMS is compiled:
|
||||
$ cd sems-x.y.z/
|
||||
$ make
|
||||
|
||||
Note:
|
||||
Compilation may fail for some modules due to missing
|
||||
dependencies. For most modules, that can be ignored for the
|
||||
moment.
|
||||
|
||||
Then SEMS is installed:
|
||||
$ make install
|
||||
|
||||
This will install
|
||||
* configuration in /usr/local/etc/sems/
|
||||
* the sems binary in /usr/local/sbin/sems
|
||||
* modules in /usr/local/lib/sems/plug-in/
|
||||
* audio files in /usr/local/lib/sems/audio/
|
||||
|
||||
Installing SEMS from source
|
||||
|
||||
Configuring the application for SEMS
|
||||
|
||||
There are many many modules shipped with SEMS, applications like
|
||||
announcement, voicemail, conference, etc, codec modules, and some
|
||||
things like SIP registrar client.
|
||||
|
||||
Now we configure SEMS to load the conference application and execute
|
||||
the conference application for incoming calls. We also set it to have
|
||||
itself register to our SIP server.
|
||||
|
||||
In /usr/local/etc/sems/sems.conf, we set
|
||||
load_plugins=sipctrl;wav;uac_auth;registrar_client;reg_agent;conference
|
||||
|
||||
to load the modules we need; sipctrl loads the SIP stack, wav is for
|
||||
reading WAV files and for the G711 codec, uac_auth is the module which
|
||||
implements authentication, registrar_client facilitates registration at
|
||||
a SIP server, and reg_agent is the application that uses
|
||||
registrar_client to have SEMS register at a SIP server.
|
||||
|
||||
We also set
|
||||
application=conference
|
||||
|
||||
so that SEMS executes the conference application for an incoming call.
|
||||
|
||||
We want SEMS to register at a SIP server, so we need to tell it about
|
||||
the user name and the password, this is set in
|
||||
/usr/local/etc/sems/etc/reg_agent.conf (of course this user name bob
|
||||
and the password need to be set to the ones used for testing):
|
||||
domain=iptel.org
|
||||
user=bob
|
||||
display_name=bob
|
||||
auth_user=bob
|
||||
pwd=verysecret
|
||||
|
||||
Testing the setup
|
||||
|
||||
Now we can test the configuration by running SEMS from the command line
|
||||
like this:
|
||||
/usr/local/sbin/sems -f /usr/local/etc/sems/sems.conf -D 3 -E
|
||||
|
||||
-D 3 sets the debug level higher so that we see what is going on, and
|
||||
-E makes SEMS start in the foreground and go to daemon mode. It also
|
||||
makes the log appear on the terminal and not in the system log file.
|
||||
|
||||
If everything is alright, SEMS starts up with a lot of messages, and
|
||||
hopefully no ERROR. There should also be some messages appearing which
|
||||
show that SEMS registered successfully to the SIP server.
|
||||
|
||||
Now we can call bob from the other phone or our PSTN telephone. In the
|
||||
SEMS log, we see the call appearing, and on the phone we hear a message
|
||||
saying that we are the first participant in the conference.
|
||||
|
||||
If it doesnt work.... we examine the log for the ERROR that occured.
|
||||
Possibly, depending on the network setup, we need to change the
|
||||
interface that SEMS is running on; this can be changed by setting the
|
||||
media_ip and sip_ip options in sems.conf. Also, it might be that there
|
||||
is already someone using that port (default config: 5070), in that case
|
||||
sip_port needs to be set.
|
||||
|
||||
Running as daemon
|
||||
|
||||
If SEMS is started without the -E option, it will continue running as
|
||||
daemon in the background. The log can be seen in syslog (e.g. with tail
|
||||
-f /var/log/daemon.log).
|
||||
|
||||
Running other applications
|
||||
|
||||
If we want to run other applications, the load_plugins= and
|
||||
application= parameters need to be adapted. See [13]Application Modules
|
||||
Documentation for a description of the shipped applications.
|
||||
|
||||
Creating and running a simple DSM applications
|
||||
|
||||
The DSM is a service development platform, that makes it simple to
|
||||
create powerful services. The service logis is defined as a state
|
||||
machine, and the DSM application interprets this state machine for the
|
||||
calls, evaluating when to change state, and which actions to execute.
|
||||
|
||||
To use a DSM application, we set in /usr/local/etc/sems/sems.conf
|
||||
load_plugins=sipctrl;wav;uac_auth;registrar_client;reg_agent;session_timer;ds
|
||||
m
|
||||
application=mydsmapp
|
||||
|
||||
and in /usr/local/etc/sems/etc/dsm.conf :
|
||||
diag_path=/usr/local/lib/sems/dsm/
|
||||
load_diags=mydsmapp
|
||||
register_apps=mydsmapp
|
||||
|
||||
Then we paste this little script in
|
||||
/usr/local/lib/sems/dsm/mydsmapp.dsm :
|
||||
initial state BEGIN {
|
||||
playFile(/usr/local/lib/sems/audio/webconference/first_participant.wav
|
||||
};
|
||||
transition "file ends" BEGIN - noAudioTest -> TYPING;
|
||||
|
||||
state TYPING;
|
||||
transition "typed a key" BEGIN - keyTest(#key < 10) / {
|
||||
set($myfile=/usr/local/lib/sems/audio/webconference/);
|
||||
append($myfile, #key);
|
||||
append($myfile, .wav);
|
||||
playFile($myfile);
|
||||
} -> TYPING;
|
||||
|
||||
transition "BYE received" (BEGIN, TYPING) - hangup / stop(false) -> END;
|
||||
state END;
|
||||
|
||||
This little script welcomes the caller, and then plays the key that the
|
||||
caller entered. More documentation about DSM and examples are in
|
||||
apps/dsm/doc, and also [14]DSM: State machine notation for VoIP
|
||||
applications .
|
||||
__________________________________________________________________
|
||||
|
||||
|
||||
Generated on Wed Mar 17 14:15:58 2010 for SEMS by [15]doxygen 1.6.1
|
||||
|
||||
References
|
||||
|
||||
1. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/index.html
|
||||
2. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/pages.html
|
||||
3. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/namespaces.html
|
||||
4. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/annotated.html
|
||||
5. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/files.html
|
||||
6. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/dirs.html
|
||||
7. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/examples.html
|
||||
8. http://iptel.org/service/
|
||||
9. http://www.sip-communicator.org/
|
||||
10. http://twinklephone.com/
|
||||
11. http://www.voip-info.org/wiki/view/DID+Service+Providers
|
||||
12. http://sipgate.de/
|
||||
13. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/AppDoc.html
|
||||
14. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_dsm.html
|
||||
15. http://www.doxygen.org/index.html
|
||||
@ -0,0 +1,115 @@
|
||||
* [1]Main Page
|
||||
* [2]Related Pages
|
||||
* [3]Namespaces
|
||||
* [4]Data Structures
|
||||
* [5]Files
|
||||
* [6]Directories
|
||||
* [7]Examples
|
||||
|
||||
How to set up a simple proxy for trying out and using SEMS
|
||||
|
||||
Introduction
|
||||
|
||||
This text describes how one can set up a simple SIP proxy in order to
|
||||
try out services in SEMS.
|
||||
|
||||
We will use the Kamailio 3.0 default proxy installation, and add a
|
||||
route SERVICES which adds the application name, and forwards the call
|
||||
to SEMS. The same configuration can be used with the original SER
|
||||
(iptel.org/ser), sip-router (sip-router.org) or other SER derivatives,
|
||||
like OpenSIPS (opensips.org).
|
||||
|
||||
Installing Kamailio
|
||||
|
||||
To install Kamailio 3.0, there is excellent documentation on the
|
||||
[8]Kamailio website. In debain lenny, or for example in Ubuntu 9.10,
|
||||
one can install Kamailio with
|
||||
$ wget http://www.kamailio.org/pub/kamailio/latest/packages/debian-lenny/kam
|
||||
ailio_3.0.1_i386.deb
|
||||
$ dpkg -i kamailio_3.0.1_i386.deb
|
||||
|
||||
To activate kamailio, one needs to set RUN_KAMAILIO=yes in
|
||||
/etc/default/kamailio.
|
||||
|
||||
Adding a service route
|
||||
|
||||
Kamailio processes all requests according to the logic that is set in
|
||||
the route section of its configuration file, which is a very flexible
|
||||
one. In order to have services executed when some special numebrs are
|
||||
called (e.g. 200 and 300), we add another route to
|
||||
/etc/kamailio/kamailio.cfg:
|
||||
route[SERVICES] {
|
||||
if ($rU=~"^200.*") {
|
||||
remove_hf("P-App-Name");
|
||||
append_hf("P-App-Name: echo\r\n");
|
||||
$ru = "sip:" + $rU + "@" + "127.0.0.1:5070";
|
||||
route(RELAY);
|
||||
exit;
|
||||
}
|
||||
if ($rU=~"^300.*") {
|
||||
remove_hf("P-App-Name");
|
||||
append_hf("P-App-Name: conference\r\n");
|
||||
$ru = "sip:" + $rU + "@" + "127.0.0.1:5070";
|
||||
route(RELAY);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
This route block can be added anywhere, for example at the end, or
|
||||
between the PSTN and the SERVICES routes.
|
||||
|
||||
Then, in the main route section, which is the one marked with the
|
||||
comment # main request routing logic, we call our SERVICES-route,
|
||||
preferably before (or after) the PSTN route:
|
||||
...
|
||||
if ($rU==$null) {
|
||||
# request with no Username in RURI
|
||||
sl_send_reply("484","Address Incomplete");
|
||||
exit;
|
||||
}
|
||||
|
||||
route(SERVICES);
|
||||
|
||||
route(PSTN);
|
||||
|
||||
# apply DB based aliases (uncomment to enable)
|
||||
##alias_db_lookup("dbaliases");
|
||||
|
||||
if (!lookup("location")) {
|
||||
...
|
||||
|
||||
Now, if we register a phone to the server, and call the 200 or the 300
|
||||
number, the INVITE gets sent to 127.0.0.1:5070, with the application
|
||||
that is to be called, added as header to the INVITE.
|
||||
|
||||
Setting up SEMS to select the application
|
||||
|
||||
If we load several applications in SEMS, we can select which
|
||||
application to execute by the P-App-Name header. In sems.conf we set
|
||||
application= so that SEMS looks into the P-App-Name header to determine
|
||||
which application to run:
|
||||
application=$(apphdr)
|
||||
load_plugin=sipctrl;wav;gsm;ilbc;speex;session_timer;conference;echo
|
||||
sip_ip=127.0.0.1
|
||||
sip_port=5070
|
||||
media_ip=some.public.ip.here
|
||||
|
||||
Note:
|
||||
in this simple case, we could also have set application= and
|
||||
used regular expression mapping in app_mapping.conf
|
||||
__________________________________________________________________
|
||||
|
||||
|
||||
Generated on Wed Mar 17 14:15:58 2010 for SEMS by [9]doxygen 1.6.1
|
||||
|
||||
References
|
||||
|
||||
1. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/index.html
|
||||
2. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/pages.html
|
||||
3. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/namespaces.html
|
||||
4. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/annotated.html
|
||||
5. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/files.html
|
||||
6. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/dirs.html
|
||||
7. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/examples.html
|
||||
8. http://www.kamailio.org/dokuwiki/doku.php#setup
|
||||
9. http://www.doxygen.org/index.html
|
||||
@ -0,0 +1,198 @@
|
||||
* [1]Main Page
|
||||
* [2]Related Pages
|
||||
* [3]Namespaces
|
||||
* [4]Data Structures
|
||||
* [5]Files
|
||||
* [6]Directories
|
||||
* [7]Examples
|
||||
|
||||
How to set up the proxy for voicemail and voicebox in SEMS
|
||||
|
||||
Introduction
|
||||
|
||||
This text describes how one can set up a SER based home proxy SIP proxy
|
||||
with voicemail and voicebox service implemented in SEMS.
|
||||
|
||||
With minor modifications, this should work with home proxies
|
||||
implemented with SER derivatives ([8]Kamailio 1.x, [9]OpenSIPS), and
|
||||
also with [10]sip-router (e.g. Kamailio 3.0) based proxy
|
||||
configurations. For other types of proxies or SIP platforms, it should
|
||||
give an idea of what is required to use a SEMS based voicemail system.
|
||||
|
||||
Features of a voicemail system with SEMS
|
||||
|
||||
The voicemail system that comes with SEMS supports the following
|
||||
features
|
||||
* voicemail2email and/or dial-in voicebox
|
||||
* greeting only mode
|
||||
* voicebox plays message count
|
||||
* new and saved messages
|
||||
* user can record personal greeting message (as a separate service
|
||||
number)
|
||||
* multi-domain capable
|
||||
* multi-language capable (e.g. as user setting), supports
|
||||
single-digits pre and post
|
||||
* supports domain and user aliases (domain/user string or domain-ID
|
||||
(DID)/user-ID (UID) )
|
||||
* prompts per domain/language
|
||||
* default greeting message per domain/language
|
||||
* configurable key bindings for menu
|
||||
|
||||
Parameters to voicemail applications
|
||||
|
||||
Usually, when a call should be sent to the voicemail system, the home
|
||||
proxy already knows some parts or all of the user profile, for example
|
||||
the email address of a user, or the voicemail settings; for example the
|
||||
user profile is already loaded from a DB (or LDAP, RADIUS, DIAMETER
|
||||
etc). For this reason, in a SEMS based voicemail system, the proxy adds
|
||||
the relevant information as parameters to the INVITE request. Those
|
||||
parameters are set in the P-App-Param header.
|
||||
|
||||
Example:
|
||||
INVITE sip:1000@sems01.iptel.org:5080 SIP/2.0.
|
||||
|
||||
From: "sayer@iptel" <sip:sayer@iptel.org>;tag=d3olt2dqvl.
|
||||
|
||||
To: <sip:1000@iptel.org>.
|
||||
|
||||
...
|
||||
P-App-Name: voicebox.
|
||||
|
||||
P-App-Param: usr=sayer;dom=iptel.org;lng=en;uid=3ab0a114-ceff-11da-8607-000
|
||||
2b3abca3a;did=2f2091f5-ceff-11da-8220-0002b338cf3a;.
|
||||
|
||||
If the proxy does not support this, or does not have access to the user
|
||||
profile, there are two solutions:
|
||||
* add another SER-based proxy in front of SEMS that has access to
|
||||
user profile, and adds those headers
|
||||
* add the functionality for accessing the user profile to SEMS (e.g.
|
||||
access DB in SEMS)
|
||||
|
||||
For both solutions, the main complexity lies in the fact that the right
|
||||
user needs to be identified (with support for multi domain, aliases,
|
||||
call forwarding etc).
|
||||
|
||||
Features of a voicemail system with SEMS
|
||||
|
||||
There is three applications involved in a voicemail/voicebox system in
|
||||
SEMS: voicemail, voicebox and annrecorder. Voicemail is the application
|
||||
that records a message, and sends the message as email or stores it
|
||||
into the voicebox storage. Voicebox is the application that users can
|
||||
dial into, listen to their messages, delete or save them. Annrecorder
|
||||
is an application that lets users record their personal greeting
|
||||
message.
|
||||
|
||||
If only voicemail2email is to be used, the voicemail application alone
|
||||
can be employed. In that case, the mode must be set to voicemail (see
|
||||
voicemail application parameters below).
|
||||
|
||||
Storage for voice message files and greetings
|
||||
|
||||
The storage for voice messages is implemented in a separate module.
|
||||
This way for example a specialized adapter to some replicated storage
|
||||
system can be implemented and loaded without changing the other
|
||||
applications.
|
||||
|
||||
A storage module only needs to support a few very simple functions:
|
||||
Create, get and delete messages, mark a message as read, list a user's
|
||||
directory, and get the number of messages in the user's directory. The
|
||||
sender and the message record time is encoded in the message name.
|
||||
|
||||
The default storage module, msg_storage, is an implementation that just
|
||||
uses the normal file system calls (fopen(), readdir(), opendir() etc).
|
||||
As 'saved' flag, the mtime of the file is compared to the atime.
|
||||
|
||||
Note:
|
||||
If your file system does not support atime, this will not work,
|
||||
i.e. all messages will always appear as unread!
|
||||
|
||||
Domain/User text or domain ID (DID) and user ID (UID)
|
||||
|
||||
If the platform supports user and domain aliases (e.g. sip.iptel.org
|
||||
and iptel.org, or numeric aliases), there may not be a canonical user
|
||||
name available. For that case, the user ID and domain ID (canonical
|
||||
user/domain ID) may be used, by setting UID/DID application parameters.
|
||||
This overrides the user name and domain name, so that the correct user
|
||||
and domain is identified.
|
||||
|
||||
Voicemail application modes
|
||||
|
||||
The voicemail application has four modes:
|
||||
* voicemail : send email (default)
|
||||
* box : leave in voicebox (store in msg_storage)
|
||||
* both : send email and leave in voicebox
|
||||
* ann : just play greeting, don't record message.
|
||||
|
||||
For voicemail and both mode, the email address must be given as
|
||||
parameter.
|
||||
|
||||
Voicemail specific AVPs
|
||||
|
||||
The following user AVPs should be configured in SerWeb to be
|
||||
user-configurable:
|
||||
* voicemail : voicemail mode - 'voicemail', 'box', 'both', or 'ann'
|
||||
* email: email address
|
||||
* lang: language - selectable from those for which prompts are
|
||||
present
|
||||
|
||||
Proxy configuration for ser-oob.cfg
|
||||
|
||||
These route fragments could be inserted into a typical ser-oob or
|
||||
default Kamailio configuration.
|
||||
|
||||
Leaving a message
|
||||
|
||||
This should be added to native SIP destinations which are not found in
|
||||
usrloc, i.e. instead of replying 480 User temporarily not available,
|
||||
and in FAILURE_ROUTE:
|
||||
append_hf("P-App-Name: voicemail\r\n");
|
||||
append_hf("P-App-Param: mod=%$t.voicemail%|;eml='%$t.email%|';usr=%@ruri.
|
||||
user%|;snd='%@from.uri%|';dom=%@ruri.host%|;uid=%$t.uid%|;did=%$t.did%|;");
|
||||
rewritehostport("voicemail.domain.net:5080");
|
||||
route(FORWARD);
|
||||
|
||||
Calling voicebox
|
||||
|
||||
This should be added to SITE-SPECIFIC route:
|
||||
if (uri=~"^sip:1000") { # 1000 is voicebox access number
|
||||
append_hf("P-App-Name: voicebox\r\n");
|
||||
append_hf("P-App-Param: usr=%@from.uri.user%|;dom=%@from.uri.host%|;lng
|
||||
=%$f.lang%|;uid=%$f.uid%|;did=%$f.did%|;\r\n");
|
||||
rewritehostport("voicemail.domain.net:5080");
|
||||
route(FORWARD);
|
||||
}
|
||||
|
||||
Recording the greeting
|
||||
|
||||
This is very similar to the one above, and should be added to
|
||||
SITE_SPECIFIC as well:
|
||||
if (uri=~"^sip:1001") { # 1001 is recod greeting number
|
||||
append_hf("P-App-Name: annrecorder\r\n");
|
||||
append_hf("P-App-Param: usr=%@from.uri.user%|;dom=%@from.uri.host%|;lng
|
||||
=%$f.lang%|;uid=%$f.uid%|;did=%$f.did%|;typ=vm;\r\n");
|
||||
rewritehostport("voicemail.domain.net:5080");
|
||||
route(FORWARD);
|
||||
}
|
||||
|
||||
Note the type (typ) here; the annrecorder application can be used to
|
||||
record different greetings (e.g. away greeting when recording message,
|
||||
or normal away greeting). This type can be used when sending a call to
|
||||
voicemail application.
|
||||
__________________________________________________________________
|
||||
|
||||
|
||||
Generated on Wed Mar 17 14:15:58 2010 for SEMS by [11]doxygen 1.6.1
|
||||
|
||||
References
|
||||
|
||||
1. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/index.html
|
||||
2. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/pages.html
|
||||
3. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/namespaces.html
|
||||
4. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/annotated.html
|
||||
5. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/files.html
|
||||
6. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/dirs.html
|
||||
7. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/examples.html
|
||||
8. http://kamailio.org/
|
||||
9. http://opensips.org/
|
||||
10. http://sip-router.org/
|
||||
11. http://www.doxygen.org/index.html
|
||||
@ -0,0 +1,59 @@
|
||||
* [1]Main Page
|
||||
* [2]Related Pages
|
||||
* [3]Namespaces
|
||||
* [4]Data Structures
|
||||
* [5]Files
|
||||
* [6]Directories
|
||||
* [7]Examples
|
||||
|
||||
Tuning SEMS for high load
|
||||
|
||||
For high load, there are several compile and run time options to make
|
||||
SEMS run smoothly.
|
||||
|
||||
When running SEMS, make sure that you have the ulimit for open files
|
||||
(process.max-file-descriptor) set to an value which is high enough. You
|
||||
may need to adapt raise the system wide hard limit (on Linux see
|
||||
/etc/security/limits.conf), or run SEMS as super user. Note that an
|
||||
unlimited open files limit is not possible, but it is sufficient to set
|
||||
it to some very high value (e.g. ulimit -n 100000).
|
||||
|
||||
There is a compile-time variable that sets a limit on how many RTP
|
||||
sessions are supported concurrently, this is MAX_RTP_SESSIONS. You may
|
||||
either add this at compile time to your value, or edit Makefile.defs
|
||||
and adapt the value there.
|
||||
|
||||
SEMS uses one thread per session (processing of the signaling). This
|
||||
thread sleeps on a mutex (the session's event queue) most of the time
|
||||
(RTP/audio processing is handled by the [8]AmMediaProcessor threads,
|
||||
which is only a small, configurable, number), thus the scheduler should
|
||||
usually not have any performance issue with this. The advantage of
|
||||
using a thread per call/session is that if the thread blocks due to
|
||||
some blocking operation (DB, file etc), processing of other calls is
|
||||
not affected. The downside of using a thread per session is that you
|
||||
will spend memory for the stack for every thread, which can fill up
|
||||
your system memory quickly, if you have many sessions. The default for
|
||||
the stack size is 1M, which for most cases is quite a lot, so if memory
|
||||
consumption is an issue, you could adapt this in [9]AmThread, at the
|
||||
call to pthread_attr_setstacksize. Note that, at least in Linux, the
|
||||
memory is allocated, but if a page is not used, the page is not really
|
||||
consumed, which means that most of that empty memory space for the
|
||||
stack is not really consumed anyway. If you allocate more than system
|
||||
memory for stack, though, thread creation may still fail with ENOMEM.
|
||||
__________________________________________________________________
|
||||
|
||||
|
||||
Generated on Wed Mar 17 14:15:58 2010 for SEMS by [10]doxygen 1.6.1
|
||||
|
||||
References
|
||||
|
||||
1. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/index.html
|
||||
2. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/pages.html
|
||||
3. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/namespaces.html
|
||||
4. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/annotated.html
|
||||
5. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/files.html
|
||||
6. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/dirs.html
|
||||
7. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/examples.html
|
||||
8. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/classAmMediaProcessor.html
|
||||
9. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/classAmThread.html
|
||||
10. http://www.doxygen.org/index.html
|
||||
@ -0,0 +1,107 @@
|
||||
* [1]Main Page
|
||||
* [2]Related Pages
|
||||
* [3]Namespaces
|
||||
* [4]Data Structures
|
||||
* [5]Files
|
||||
* [6]Directories
|
||||
* [7]Examples
|
||||
|
||||
ZRTP encryption
|
||||
|
||||
Introduction
|
||||
|
||||
ZRTP is a key agreement protocol to negotiate the keys for encryption
|
||||
of RTP in phone calls. It is a proposed public standard: [8]ZRTP: Media
|
||||
Path Key Agreement for Secure RTP.
|
||||
|
||||
Even though it uses public key encryption, a PKI is not needed. Since
|
||||
the keys are negotiated in the media path, support for it in signaling
|
||||
is not necessary. ZRTP also offers opportunistic encryption, which
|
||||
means that calls between UAs that support it are encrypted, but calls
|
||||
to UAs not supporting it are still possible, but unencrypted. The
|
||||
actual RTP encryption is done with [9]SRTP. For more information about
|
||||
ZRTP, see the [10]Zfone project, the [11]draft and the [12]wikipedia
|
||||
article.
|
||||
|
||||
ZRTP in SEMS
|
||||
|
||||
Since the version 1.0 SEMS supports ZRTP with the use of the [13]Zfone
|
||||
SDK.
|
||||
|
||||
To build SEMS with ZRTP support, install the SDK and set WITH_ZRTP=yes
|
||||
in Makefile.defs, or build with
|
||||
$ make WITH_ZRTP=yes
|
||||
|
||||
The conference application is enabled to tell the caller the SAS phrase
|
||||
if it is compiled with WITH_SAS_TTS option, set in
|
||||
apps/conference/Makefile. For this to work, the [14]flite
|
||||
text-to-speech synthesizer version 1.2 or 1.3 is needed.
|
||||
|
||||
Online demo
|
||||
|
||||
Call
|
||||
sip:[15]secureconference@iptel.org
|
||||
|
||||
or
|
||||
sip:[16]zrtp@iptel.org
|
||||
|
||||
for a test drive of ZRTP conferencing. If you call that number with a
|
||||
ZRTP enabled phone, you should be told the SAS string that is also
|
||||
displayed in your phone. Press two times the hash (##) while in the
|
||||
call to read out the SAS string again.
|
||||
|
||||
How to use ZRTP in your application
|
||||
|
||||
Have a look at the conference application on how to add ZRTP support in
|
||||
your application. There is a void AmSession::onZRTPEvent(zrtp_event_t
|
||||
event, zrtp_stream_ctx_t *stream_ctx) event that is called with the
|
||||
appropriate ZRTP event type and the zrtp stream context, if the state
|
||||
of the ZRTP encryption changes. The zrtp_event are defined in the Zfone
|
||||
SDK, e.g. ZRTP_EVENT_IS_SECURE.
|
||||
|
||||
Licensing
|
||||
|
||||
The Zfone SDK is licensed under the Affero GPL v3. As SEMS is licensed
|
||||
under GPL 2+, you may use SEMS under GPLv3 and link with libZRTP under
|
||||
Affero GPL v3. You may use the resulting program under the restrictions
|
||||
of both GPLv3 and AGPLv3.
|
||||
|
||||
Note that due to the nature of the GPL, without written consent of the
|
||||
authors of SEMS as with any other non-free library, it is not possible
|
||||
to distribute SEMS linked to specially licensed commercial version of
|
||||
the libZRTP SDK, nor the AGPL version. If in doubt, talk to your
|
||||
lawyer.
|
||||
|
||||
Phones with ZRTP
|
||||
|
||||
* [17]Zfone turns every softphone into a secure phone by tapping into
|
||||
the RTP sent and received
|
||||
* [18]Twinkle is a very good free softphone for Linux. It can speak
|
||||
ZRTP with the use of GNU [19]libzrtpcpp.
|
||||
__________________________________________________________________
|
||||
|
||||
|
||||
Generated on Wed Mar 17 14:15:58 2010 for SEMS by [20]doxygen 1.6.1
|
||||
|
||||
References
|
||||
|
||||
1. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/index.html
|
||||
2. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/pages.html
|
||||
3. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/namespaces.html
|
||||
4. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/annotated.html
|
||||
5. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/files.html
|
||||
6. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/dirs.html
|
||||
7. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/examples.html
|
||||
8. http://tools.ietf.org/html/draft-zimmermann-avt-zrtp
|
||||
9. http://www.ietf.org/rfc/rfc3711.txt
|
||||
10. http://zfoneproject.com/
|
||||
11. http://tools.ietf.org/html/draft-zimmermann-avt-zrtp
|
||||
12. http://en.wikipedia.org/wiki/ZRTP
|
||||
13. http://zfoneproject.com/prod_sdk.html
|
||||
14. http://cmuflite.org/
|
||||
15. mailto:secureconference@iptel.org
|
||||
16. mailto:zrtp@iptel.org
|
||||
17. http://zfoneproject.com/
|
||||
18. http://twinklephone.com/
|
||||
19. http://www.gnutelephony.org/index.php/GNU_ZRTP
|
||||
20. http://www.doxygen.org/index.html
|
||||
@ -0,0 +1,84 @@
|
||||
* [1]Main Page
|
||||
* [2]Related Pages
|
||||
* [3]Namespaces
|
||||
* [4]Data Structures
|
||||
* [5]Files
|
||||
* [6]Directories
|
||||
* [7]Examples
|
||||
|
||||
SEMS Documentation
|
||||
|
||||
News & Changes
|
||||
|
||||
* [8]Changelog (from 0.10.0-rc1 onwards)
|
||||
|
||||
General
|
||||
|
||||
* [9]SEMS Readme file
|
||||
|
||||
How to get started
|
||||
|
||||
* [10]How to try out SEMS without setting up a proxy
|
||||
* [11]How to set up a simple proxy for trying out and using SEMS
|
||||
* [12]How to set up the proxy for voicemail and voicebox in SEMS
|
||||
|
||||
User's documentation
|
||||
|
||||
* [13]SEMS core configuration parameters
|
||||
* [14]Compilation instructions
|
||||
* [15]Application Modules Documentation
|
||||
* [16]DSM: State machine notation for VoIP applications
|
||||
* [17]ZRTP encryption
|
||||
* [18]Tuning SEMS for high load
|
||||
|
||||
Developer's documentation
|
||||
|
||||
* [19]SEMS Design Overview
|
||||
* [20]Application Development Tutorial
|
||||
* [21]Example Applications
|
||||
* [22]Component Modules Documentation
|
||||
|
||||
Web sites
|
||||
|
||||
* Main: SEMS website [23]http://iptel.org/sems
|
||||
* sems & semsdev Lists: List server [24]http://lists.iptel.org
|
||||
* Bugs: Bug tracker: [25]http://tracker.iptel.org/browse/SEMS
|
||||
|
||||
Outdated documentation bits
|
||||
|
||||
* [26]Changes in SEMS from 0.9 versions to 0.10
|
||||
* Configure-Sems-Ser-HOWTO
|
||||
__________________________________________________________________
|
||||
|
||||
|
||||
Generated on Wed Mar 17 14:15:58 2010 for SEMS by [27]doxygen 1.6.1
|
||||
|
||||
References
|
||||
|
||||
1. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/index.html
|
||||
2. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/pages.html
|
||||
3. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/namespaces.html
|
||||
4. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/annotated.html
|
||||
5. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/files.html
|
||||
6. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/dirs.html
|
||||
7. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/examples.html
|
||||
8. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/changelog.html
|
||||
9. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/Readme.html
|
||||
10. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/howtostart_noproxy.html
|
||||
11. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/howtostart_simpleproxy.html
|
||||
12. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/howtostart_voicemail.html
|
||||
13. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/sems.conf.sample.html
|
||||
14. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/Compiling.html
|
||||
15. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/AppDoc.html
|
||||
16. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ModuleDoc_dsm.html
|
||||
17. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ZRTP.html
|
||||
18. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/Tuning.html
|
||||
19. http://www.iptel.org/files/semsng-designoverview.pdf
|
||||
20. http://www.iptel.org/sems/sems_application_development_tutorial
|
||||
21. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/AppDocExample.html
|
||||
22. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/ComponentDoc.html
|
||||
23. http://iptel.org/sems
|
||||
24. http://lists.iptel.org/
|
||||
25. http://tracker.iptel.org/browse/SEMS
|
||||
26. file://localhost/home/stefan/devel/sems/trunk/doc/doxygen_doc/html/whatsnew_0100.html
|
||||
27. http://www.doxygen.org/index.html
|
||||
Loading…
Reference in new issue