講了這么多廢話厢汹,上一點(diǎn)干貨吧,這篇我們主要講的是Android Sip中的第三方框架?android-jain-sip-ri-1.2.224.jar曹抬,這篇將介紹android-jain-sip-ri-1.2.224.jar的使用
為什么使用這個(gè)庫(kù)特恬?
1.本地SIP堆棧的限制
Google原生的android sip堆棧是建立在JAIN SIP之上的悠砚,但是它沒有所有的功能士嚎,現(xiàn)在不支持即時(shí)消息,狀態(tài)和視頻通話师倔。Google分叉了SIP堆棧构韵,并且從未真正地更新默認(rèn)發(fā)貨的SIP API,并使用與原始JAIN SIP項(xiàng)目相同的軟件包名稱趋艘。這對(duì)于那些希望在全世界增加SIP功能的開發(fā)者來(lái)說(shuō)是一個(gè)麻煩贞绳,因?yàn)樗麄儾荒苁褂肑AIN SIP。
2.JAIN SIP是基于Java的
這是一個(gè)基于java的SIP協(xié)議棧致稀,它允許你在沒有NDK的麻煩的情況下將SIP協(xié)議棧無(wú)縫集成到你的android應(yīng)用程序中冈闭。
3.完整的SIP協(xié)議棧
JAIN SIP是RFC 3261規(guī)范的完整實(shí)現(xiàn),同時(shí)也支持多個(gè)SIP RFC抖单。
怎么使用萎攒?
1.導(dǎo)包:將android-jain-sip-ri-1.2.224.jar和log4導(dǎo)入到項(xiàng)目中,以Android Studio為例:
2.設(shè)置權(quán)限:參考Android-Sip_開發(fā)介紹(1)
Step -1: 初始化
創(chuàng)建一個(gè)單例類SipStackAndroid并初始化一個(gè)SIP堆棧矛绘。 這個(gè)類將實(shí)現(xiàn)SipListener和相應(yīng)的方法來(lái)處理SIP事件耍休。
public class SipStackAndroid implements SipListener {
private static SipStackAndroid instance = null;
public static SipStack sipStack;
public static SipProvider sipProvider;
public static HeaderFactory headerFactory;
public static AddressFactory addressFactory;
public static MessageFactory messageFactory;
public static SipFactory sipFactory;
public static ListeningPoint udpListeningPoint;
public static String localIp;
public static int localPort = 5080;
public static String localEndpoint = localIp + ":" + localPort;
public static String transport = "udp";
public static String remoteIp = "23.23.228.238";
public static int remotePort = 5080;
public static String remoteEndpoint = remoteIp + ":" + remotePort;
public static String sipUserName;
public String sipPassword;
protected SipStackAndroid() {
initialize();
}
public static SipStackAndroid getInstance() {
if (instance == null) {
instance = new SipStackAndroid();
}
return instance;
}
private static void initialize() {
localIp = getIPAddress(true);
localEndpoint = localIp + ":" + localPort;
remoteEndpoint = remoteIp + ":" + remotePort;
sipStack = null;
sipFactory = SipFactory.getInstance();
sipFactory.setPathName("android.gov.nist");
Properties properties = new Properties();
properties.setProperty("javaxx.sip.OUTBOUND_PROXY", remoteEndpoint + "/"
+ transport);
properties.setProperty("javaxx.sip.STACK_NAME", "androidSip");
try {
// Create SipStack object
sipStack = sipFactory.createSipStack(properties);
System.out.println("createSipStack " + sipStack);
} catch (PeerUnavailableException e) {
e.printStackTrace();
System.err.println(e.getMessage());
System.exit(0);
}
try {
headerFactory = sipFactory.createHeaderFactory();
addressFactory = sipFactory.createAddressFactory();
messageFactory = sipFactory.createMessageFactory();
udpListeningPoint = sipStack.createListeningPoint(localIp,
localPort, transport);
sipProvider = sipStack.createSipProvider(udpListeningPoint);
sipProvider.addSipListener(SipStackAndroid.getInstance());
// this.send_register();
} catch (PeerUnavailableException e) {
e.printStackTrace();
System.err.println(e.getMessage());
System.exit(0);
} catch (Exception e) {
System.out.println("Creating Listener Points");
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
Step-2:發(fā)送注冊(cè)
以下方法發(fā)送一個(gè)注冊(cè)包到服務(wù)器。
private void send_register() {
try {
System.out.println();
SipStackAndroid.getInstance();
AddressFactory addressFactory = SipStackAndroid.addressFactory;
SipStackAndroid.getInstance();
SipProvider sipProvider = SipStackAndroid.sipProvider;
SipStackAndroid.getInstance();
MessageFactory messageFactory = SipStackAndroid.messageFactory;
SipStackAndroid.getInstance();
HeaderFactory headerFactory = SipStackAndroid.headerFactory;
// Create addresses and via header for the request
Address fromAddress = addressFactory.createAddress("sip:"
+ SipStackAndroid.sipUserName + "@" + SipStackAndroid.remoteIp);
fromAddress.setDisplayName(SipStackAndroid.sipUserName);
Address toAddress = addressFactory.createAddress("sip:"
+ SipStackAndroid.sipUserName + "@" + SipStackAndroid.remoteIp);
toAddress.setDisplayName(SipStackAndroid.sipUserName);
Address contactAddress = createContactAddress();
ArrayList viaHeaders = createViaHeader();
URI requestURI = addressFactory.createAddress(
"sip:" + SipStackAndroid.remoteEndpoint).getURI();
// Build the request
final Request request = messageFactory.createRequest(requestURI,
Request.REGISTER, sipProvider.getNewCallId(),
headerFactory.createCSeqHeader(1l, Request.REGISTER),
headerFactory.createFromHeader(fromAddress, "c3ff411e"),
headerFactory.createToHeader(toAddress, null), viaHeaders,
headerFactory.createMaxForwardsHeader(70));
// Add the contact header
request.addHeader(headerFactory.createContactHeader(contactAddress));
ExpiresHeader eh = headerFactory.createExpiresHeader(300);
request.addHeader(eh);
// Print the request
System.out.println(request.toString());
// Send the request --- triggers an IOException
// sipProvider.sendRequest(request);
ClientTransaction transaction = sipProvider
.getNewClientTransaction(request);
// Send the request statefully, through the client transaction.
transaction.sendRequest();
} catch (Exception e) {
e.printStackTrace();
}
}
private Address createContactAddress() {
try {
SipStackAndroid.getInstance();
return SipStackAndroid.addressFactory.createAddress("sip:" + SipStackAndroid.sipUserName + "@"
+ SipStackAndroid.localEndpoint + ";transport=udp"
+ ";registering_acc=23_23_228_238");
} catch (ParseException e) {
return null;
}
}
private ArrayList createViaHeader() {
ArrayList viaHeaders = new ArrayList();
ViaHeader myViaHeader;
try {
SipStackAndroid.getInstance();
myViaHeader = SipStackAndroid.headerFactory.createViaHeader(SipStackAndroid.localIp, SipStackAndroid.localPort,
SipStackAndroid.transport, null);
myViaHeader.setRPort();
viaHeaders.add(myViaHeader);
} catch (ParseException e) {
e.printStackTrace();
} catch (InvalidArgumentException e) {
e.printStackTrace();
}
return viaHeaders;
}
Step-3:發(fā)送認(rèn)證信息
為了響應(yīng)REGISTER包货矮,服務(wù)器請(qǐng)求認(rèn)證信息(407錯(cuò)誤)羊精。 哪個(gè)會(huì)在實(shí)現(xiàn)SipListener的類的processResponse()方法中被接收。 下面的代碼片段將身份驗(yàn)證發(fā)送回服務(wù)器囚玫。
像AccountManagerImpl這樣的助手類可以在JAIN-SIP的例子中找到喧锦。
@Override
public void processResponse(ResponseEvent arg0) {
Response response = (Response) arg0.getResponse();
ClientTransaction tid = arg0.getClientTransaction();
System.out.println(response.getStatusCode());
if (response.getStatusCode() == Response.PROXY_AUTHENTICATION_REQUIRED
|| response.getStatusCode() == Response.UNAUTHORIZED) {
AuthenticationHelper authenticationHelper = ((SipStackExt) sipStack)
.getAuthenticationHelper(new AccountManagerImpl(),
headerFactory);
try {
ClientTransaction inviteTid = authenticationHelper
.handleChallenge(response, tid, sipProvider, 5);
inviteTid.sendRequest();
} catch (NullPointerException e) {
e.printStackTrace();
} catch (SipException e) {
e.printStackTrace();
}
}
發(fā)送SIP消息
看一下發(fā)送SIP消息的流程:
private void sendMessage(String to, String message) throws ParseException,
InvalidArgumentException, SipException {
SipStackAndroid.getInstance();
SipURI from = SipStackAndroid.addressFactory.createSipURI(SipStackAndroid.getInstance().sipUserName, SipStackAndroid.getInstance().localEndpoint);
SipStackAndroid.getInstance();
Address fromNameAddress = SipStackAndroid.addressFactory.createAddress(from);
SipStackAndroid.getInstance();
// fromNameAddress.setDisplayName(sipUsername);
FromHeader fromHeader = SipStackAndroid.headerFactory.createFromHeader(fromNameAddress,
"Tzt0ZEP92");
SipStackAndroid.getInstance();
URI toAddress = SipStackAndroid.addressFactory.createURI(to);
SipStackAndroid.getInstance();
Address toNameAddress = SipStackAndroid.addressFactory.createAddress(toAddress);
SipStackAndroid.getInstance();
// toNameAddress.setDisplayName(username);
ToHeader toHeader = SipStackAndroid.headerFactory.createToHeader(toNameAddress, null);
SipStackAndroid.getInstance();
URI requestURI = SipStackAndroid.addressFactory.createURI(to);
// requestURI.setTransportParam("udp");
ArrayList viaHeaders = createViaHeader();
SipStackAndroid.getInstance();
CallIdHeader callIdHeader = SipStackAndroid.sipProvider.getNewCallId();
SipStackAndroid.getInstance();
CSeqHeader cSeqHeader = SipStackAndroid.headerFactory.createCSeqHeader(50l,
Request.MESSAGE);
SipStackAndroid.getInstance();
MaxForwardsHeader maxForwards = SipStackAndroid.headerFactory
.createMaxForwardsHeader(70);
SipStackAndroid.getInstance();
Request request = SipStackAndroid.messageFactory.createRequest(requestURI,
Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
SipStackAndroid.getInstance();
SupportedHeader supportedHeader = SipStackAndroid.headerFactory
.createSupportedHeader("replaces, outbound");
request.addHeader(supportedHeader);
SipStackAndroid.getInstance();
SipURI routeUri = SipStackAndroid.addressFactory.createSipURI(null, SipStackAndroid.getInstance().remoteIp);
routeUri.setTransportParam(SipStackAndroid.transport);
routeUri.setLrParam();
routeUri.setPort(SipStackAndroid.remotePort);
SipStackAndroid.getInstance();
Address routeAddress = SipStackAndroid.addressFactory.createAddress(routeUri);
SipStackAndroid.getInstance();
RouteHeader route =SipStackAndroid.headerFactory.createRouteHeader(routeAddress);
request.addHeader(route);
SipStackAndroid.getInstance();
ContentTypeHeader contentTypeHeader = SipStackAndroid.headerFactory
.createContentTypeHeader("text", "plain");
request.setContent(message, contentTypeHeader);
System.out.println(request);
SipStackAndroid.getInstance();
ClientTransaction transaction = SipStackAndroid.sipProvider
.getNewClientTransaction(request);
// Send the request statefully, through the client transaction.
transaction.sendRequest();
}
這將發(fā)送一個(gè)消息到服務(wù)器读规,服務(wù)器將要求我們已經(jīng)覆蓋的授權(quán)。
資源:完成項(xiàng)目代碼燃少、Apk