Pjsip协议支持TCP、UDP等协议,默认情况下,PJSIP使用的是UDP协议,但是这会导致数据过长的时候会出现数据丢失的现象,很大的限制了Pjsip的通信。为此,我们要配置TCP通信。通信的时候要涉及两个阶段:登陆——发送消息;
1.登陆
public static void pjsipLogin(String sipName, String sipPassword, String sipDomain) { AccountConfig accCfg = new AccountConfig(); String acc_id = "sip:" + sipName + "@" + sipDomain + ";transport=tcp"; String registrar = "sip:" + sipDomain + ";transport=tcp" ; String proxy = ""; String username = sipName; String password = sipPassword; accCfg.setIdUri(acc_id); accCfg.getRegConfig().setRegistrarUri(registrar); AuthCredInfoVector creds = accCfg.getSipConfig().getAuthCreds(); creds.clear(); if (username.length() != 0) { creds.add(new AuthCredInfo("digest", "*", username, 0, password)); } StringVector proxies = accCfg.getSipConfig().getProxies(); proxies.clear(); if (proxy.length() != 0) { proxies.add(proxy); } accCfg.getNatConfig().setIceEnabled(true); try { account.modify(accCfg); } catch (Exception e) { e.printStackTrace(); } }
如代码所示,
String acc_id = "sip:" + sipName + "@" + sipDomain + ";transport=tcp";
String registrar = "sip:" + sipDomain + ";transport=tcp" ;
两行代码末尾都要加上";transport = tcp",这样的话才能保证我们的注册的时候选择TCP通信;
好了,登陆只是第一步,接下来是发送消息:
2.消息发送
public void pjsipSendMsg(final String content, String userId) { String buddy_uri = "<sip:" + userId + "@" + Constants.sipDomain + ";transport=tcp" + ">";
LogUtil.println(TAG + "pjsipSendMsg"," buddy_uri = " + buddy_uri); BuddyConfig bCfg = new BuddyConfig(); bCfg.setUri(buddy_uri); bCfg.setSubscribe(false); MyBuddy myBuddy = account.addBuddy(bCfg);
SendInstantMessageParam prm = new SendInstantMessageParam(); prm.setContent(content); try { // myBuddy.create(account, bCfg); myBuddy.sendInstantMessage(prm); myBuddy.delete(); } catch (Exception e) { e.printStackTrace(); return; } }
发送消息的时候,要先配置目标sip地址:+
String buddy_uri = "<sip:" + userId + "@" + Constants.sipDomain + ";transport=tcp" + ">";
在这行代码尾端也要添加";transport = tcp",这和我们登陆的时候sip账号尾端添加的是一致的哦,这样的话才能通过tcp协议将我们的消息发给目标用户哦!