Most developers come to peers for its portability (100% java), its extensibility and its documentation.
Several important evolutions occurred in peers.
Peers is moving to maven. The project has split in several maven modules:
- peers-doc: documentation converted to docbook
- peers-lib: sip, sdp, rtp and media related code
- peers-gui: swing graphical user interface
- peers-jws: java web start application to start peers
Documentation is now integrated in source tree and converted to docbook standard. Documentation is not yet up-to-date in source tree, but it’s now generated dynamically.
Hackers
Here are the steps to tweak peers source code using eclipse:
svn co https://peers.svn.sourceforge.net/svnroot/peers/trunk peers cd peers mvn install mvn eclipse:eclipse
In eclipse, add a new java build path classpath variable:
Window > Preferences > Java > Build Path > Classpath Variable, click on New:
- Name: M2_REPO
- Path: /home/yohann/.m2/repository
Then, you have to import eclipse projects generated by mvn eclipse:eclipse in eclipse: File > Import… > Existing Projects into Workspace > Browse, select the root peers folder and click Finish.
Architects
To generate documentation, use:
mvn pre-site
A pdf is generated in peers/peers-doc/target/docbkx/pdf and the html version is in peers/peers-doc/target/docbkx/html/peers.html.
Developers
To create a hello world project based on peers, first install peers in your local repo, create project and provide peers dependency:
~/peers$ mvn install ~/peers$ cd .. ~$ mvn archetype:create -DgroupId=test -DartifactId=demo -Dversion=0.1-SNAPSHOT
Then edit your new pom.xml file and add the following dependency:
<dependency> <groupId>net.sourceforge.peers</groupId> <artifactId>peers-lib</artifactId> <version>0.5-SNAPSHOT</version> <scope>compile</scope> </dependency>
Copy logs, media and conf folders from peers root directory to your demo project:
cp -r peers/conf/ peers/media/ peers/logs/ demo/
Edit your peers.xml file in conf/ folder. You have to provide at least <userpart> and and <domain>:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <peers xmlns="http://peers.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://peers.sourceforge.net peers.xsd"> <network> <interfaces> <interface id="eth1"> <name>Ethernet network interface</name> <address/> </interface> </interfaces> </network> <devices> <audio/> <video/> </devices> <sip> <profile> <userpart>hello</userpart> <domain>world</domain> <password></password> <outboundProxy/> <interface ref="eth1"/> <port>0</port> </profile> </sip> <codecs> <codec> <family>audio</family> <name>PCMU</name> <payloadType>0</payloadType> </codec> <mediaMode>captureAndPlayback</mediaMode> <mediaDebug>false</mediaDebug> </codecs> <rtp> <interface ref="eth1"/> <port>8000</port> </rtp> </peers>
Generate your eclipse project using mvn eclipse:eclipse and import it in eclipse.
Edit your main App class:
package test;
import java.net.SocketException;
import net.sourceforge.peers.sip.core.useragent.SipListener;
import net.sourceforge.peers.sip.core.useragent.UserAgent;
import net.sourceforge.peers.sip.syntaxencoding.SipUriSyntaxException;
import net.sourceforge.peers.sip.transport.SipRequest;
import net.sourceforge.peers.sip.transport.SipResponse;
public class App implements SipListener
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
new App();
}
public App() {
try {
UserAgent userAgent = new UserAgent(this, null, null);
// start a new call
userAgent.getUac().invite("sip:localhost", null);
} catch (SocketException e) {
e.printStackTrace();
} catch (SipUriSyntaxException e) {
e.printStackTrace();
}
}
@Override public void registering(SipRequest sipRequest) { }
@Override public void registerSuccessful(SipResponse sipResponse) { }
@Override public void registerFailed(SipResponse sipResponse) { }
@Override public void incomingCall(SipRequest sipRequest, SipResponse provResponse) { }
@Override public void remoteHangup(SipRequest sipRequest) { }
@Override public void ringing(SipResponse sipResponse) { }
@Override public void calleePickup(SipResponse sipResponse) { }
@Override public void error(SipResponse sipResponse) { }
}
Start a wireshark capture or even better launch a sipp uas script with echo option to play the role of the callee:
sipp -sn uas -rtp_echo
Launch your application in eclipse: right-click App > Run As > Java Application
If you talk in your microphone, you should now hear your echo, thanks to sipp who is automatically picking-up the call and sending back media traffic to its origin.
For your convenience, you can find this demo project demo.
