- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Jain Sip 库,试图创建到星号服务器的连接。我一直在使用此页面中的 textclient 示例应用程序: http://www.oracle.com/technetwork/articles/entarch/introduction-jain-sip-090386.html
但这实际上并没有向服务器进行身份验证。我可以向服务器上的用户发送消息,但我通常需要在服务器上进行用户/密码身份验证。
据我所知,我必须使用“javax.sip.OUTBOUND_PROXY”属性,但我找不到任何关于如何设置用户名或密码的文档。有没有其他人在这方面取得过任何成功?
最佳答案
我在注册时找到的最好的例子是here .这是万一有一天链接干涸的要点:
REGISTER request is used to update the current location of a user on the REGISTRAR server. The application sends a REGISTER message informing the server its current location which in turn is stored in location server. When a caller calls a user the proxy server uses this information to find the location of the callee.
Register request should be sent by the client periodically. The validity of the REGISTER request is determined by the Expires header.
Flow
Sample Request
REGISTER sip:sip.linphone.org SIP/2.0
Call-ID: 0a0f14355fa76ae6435b98bfe085baf9@223.1.1.128
CSeq: 1 REGISTER
From: <sip:vkslabs@sip.linphone.org>;tag=-1427592833
To: <sip:vkslabs@sip.linphone.org>
Max-Forwards: 70
Via: SIP/2.0/TCP 223.1.1.128:5060;branch=z9hG4bK-323532-2a454f4ec2a4213f6d6928eba479521d
Contact: <sip:vkslabs@223.1.1.128;transport=tcp>
Content-Length: 0Now lets see how to construct the above request using the NIST SIP Stack.
First step is to create a class that implements the SIPListener. Make sure your SIP Stack is Initializing NIST JAIN SIP Stack.
Create Call-ID header
CallIdHeader callIdHeader = this.sipProvider.getNewCallId();
Create CSeq header
CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader(cseq, "REGISTER");
Create From header
Address fromAddress = addressFactory.createAddress("sip:" + username + '@' + server); FromHeader fromHeader = this.headerFactory.createFromHeader(fromAddress, String.valueOf(this.tag));
Create To Header
ToHeader toHeader = this.headerFactory.createToHeader(fromAddress, null);
Create Max-Forwards header
MaxForwardsHeader maxForwardsHeader = this.headerFactory.createMaxForwardsHeader(70);
Create a Via header
ArrayList viaHeaders = new ArrayList(); ViaHeader viaHeader = this.headerFactory.createViaHeader(this.ip, this.port, "tcp", null); viaHeaders.add(viaHeader);
Create contact header
this.contactAddress = this.addressFactory.createAddress("sip:" + this.username + '@' + this.ip + "transport=tcp");
// Create the contact header used for all SIP messages. this.contactHeader = this.headerFactory.createContactHeader(contactAddress);
Once all the headers are created it is time to create the request itself.
request = this.messageFactory.createRequest("REGISTER sip:" + server + "SIP/2.0\r\n\r\n");
request.addHeader(callIdHeader);
request.addHeader(cSeqHeader);
request.addHeader(fromHeader);
request.addHeader(toHeader);
request.addHeader(maxForwardsHeader);
request.addHeader(viaHeader);
request.addHeader(contactHeader);Now that the request object is created with all the necessary headers it is time to send the request.
inviteTid = sipProvider.getNewClientTransaction(request); // send the request out.
inviteTid.sendRequest();Once the request is sent successfully the response will be passed to the application using the processResponse callback in SIPListener.
public void processResponse(ResponseEvent responseEvent) {
int statusCode = responseEvent.getResponse().getStatusCode();
}Code
public void register(Response response) {
try {
cseq++;
ArrayList viaHeaders = new ArrayList();
ViaHeader viaHeader = this.headerFactory.createViaHeader(this.ip,
this.port, "tcp", null);
viaHeaders.add(viaHeader);
// The "Max-Forwards" header.
MaxForwardsHeader maxForwardsHeader = this.headerFactory
.createMaxForwardsHeader(70);
// The "Call-Id" header.
CallIdHeader callIdHeader = this.sipProvider.getNewCallId();
// The "CSeq" header.
CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader(cseq,
"REGISTER");
Address fromAddress = addressFactory.createAddress("sip:"
+ username + '@' + server);
FromHeader fromHeader = this.headerFactory.createFromHeader(
fromAddress, String.valueOf(this.tag));
// The "To" header.
ToHeader toHeader = this.headerFactory.createToHeader(fromAddress,
null);
// this.contactHeader = this.headerFactory
// .createContactHeader(contactAddress);
request = this.messageFactory.createRequest("REGISTER sip:"
+ server + " SIP/2.0\r\n\r\n");
request.addHeader(callIdHeader);
request.addHeader(cSeqHeader);
request.addHeader(fromHeader);
request.addHeader(toHeader);
request.addHeader(maxForwardsHeader);
request.addHeader(viaHeader);
request.addHeader(contactHeader);
if (response != null) {
retry = true;
AuthorizationHeader authHeader = Utils.makeAuthHeader(headerFactory, response,
request, username, password);
request.addHeader(authHeader);
}
inviteTid = sipProvider.getNewClientTransaction(request);
// send the request out.
inviteTid.sendRequest();
this.dialog = inviteTid.getDialog();
// Send the request statelessly through the SIP provider.
// this.sipProvider.sendRequest(request);
// Display the message in the text area.
logger.debug("Request sent:\n" + request.toString() + "\n\n");
} catch (Exception e) {
// If an error occurred, display the error.
e.printStackTrace();
logger.debug("Request sent failed: " + e.getMessage() + "\n");
}
}
您还可以查看有关身份验证的引用帖子here .这是万一有一天链接干涸的要点:
During a SIP request if the server responds with 401 Proxy Authentication Required or 401 Unauthorized then it means the client has to replay the same request again with MD5 challenge.
The client should use nonce value from the response header WWW-Authenticate.
WWW-Authenticate: Digest realm="sip.linphone.org", nonce="JbAO1QAAAAA3aDI0AADMobiT7toAAAAA", opaque="+GNywA==", algorithm=MD5, qop="auth"
The client should use nonce to generate the MD5 challenge and make the original request again with the Authorization header.
Steps to create the MD5 Challenge
Create first MD5 hash using username + “:” + realm + “:” + password
String a1 = username + ":" + realm + ":" + password; String ha1 = toHexString(mdigest.digest(a1.getBytes()));
Create second MD5 hash using request_method + “:” + request_uri
String a2 = request_method.toUpperCase() + ":" + request_uri; String ha2 = toHexString(mdigest.digest(a2.getBytes()));
If qop in the response header is “auth” then the final MD5 hash is calculated using step 3a else if it is undefined or empty refer step 3b.
3a. Create the final MD5 string using ha1 + “:” + nonce + “:” + nonceCount + “:” + cNonce + “:” + qop + “:” + ha2
String finalStr = ha1 + ":" + nonce + ":" + nonceCount + ":" + cNonce + ":" + qop + ":" + ha2;
String response = toHexString(mdigest.digest(finalStr.getBytes()));3b. Create the final MD5 string using ha1 + “:” + nonce + “:” + ha2
String finalStr = ha1 + ":" + nonce + ":" + ha2;
String response = toHexString(mdigest.digest(finalStr.getBytes()));
关于java - Jain-Sip 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13033116/
我目前正在使用 JAIN SIP 库 在 java 中编写应用程序,过去几天我一直在尝试使用 SUBSCRIBE 和 NOTIFY 消息。我目前有 NOTIFY 消息,其内容类型为“message/s
我正在 Mobicent Jain Slee 平台 (2.7.0) 上工作。我需要实现一个当前尚未实现的新直径应用程序(sd 接口(interface))。基于jDiameter docs It al
我需要从“From header”中获取分机号码,我已经尝试了所有方法但没有任何效果。 甚至尝试过: byte[] raw = req.getRawContent(); 然后手动查找发件人和号码,但是
我正在使用 Jain Sip 库,试图创建到星号服务器的连接。我一直在使用此页面中的 textclient 示例应用程序: http://www.oracle.com/technetwork/arti
我写了一个可以与 PBX 通信的软电话(由 SIPp 模拟)。为此,我使用 java 的 jain-sip 框架。我的问题是,jain-sip 会自动发送 sip 消息。例如,在收到 RE-INVIT
我正在 eclipse 环境中使用 JAIN SIP 库开发 SIP 客户端。 我在获得授权时遇到问题。我还实现了 MD5 质询并将授权添加到第二个注册函数。 授权凭据也是正确的,因为我使用可用的 S
我正在尝试使用 JAIN SIP API 发送 SIP 注册请求。我已经在类中实现了 javax.sip.SipListener,并且我的程序成功发送了请求,甚至我从 sip 服务器收到了 401 未
有这方面的代码示例吗?我想知道当收到 INVITE 请求时,processRequest 中的流程应该是什么。 我特别感兴趣的是如何将请求从一个 UA 转发到另一个先前注册的 UA。 最佳答案 查看h
我正在创建一个实现 SipListener 接口(interface)的类,以接收来自 JAIN-SIP 堆栈的事件(适用于 Android 设备)。为了测试它,我将 2 台设备连接到 OpenSIP
我正在尝试将 SIP 通知发送到 SIP 端点,但如果 SIP 端点在同一台机器上,则会出现错误。如果我使用两台不同的机器,它就可以工作。 sipCoreComponentService.sendCh
我正在尝试启动 Mobicents USSD 网关。现在问题如下:Jboss 正在尝试在部署其依赖项之前部署模块,因此返回错误: SLEE DUs not deployed, due to missi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
public void call(Response response) { try { cseq++; current_process = cseq + " I
我刚刚开始研究 Jain Sip,我想知道如何创建一个仅包含 IP 地址而不包含用户和 @ 符号的 SipUri。 所以目前我得到 sip:user@192.xxx.x.xxx 并且我想得到 sip:
我目前在 Android 上使用 Jain Sip,我正在尝试让 SIP 注册正常工作。 我可以将注册 SIP 消息放在一起,但在发送消息后,它似乎只是被发送回我的应用程序,并且我的应用程序 proc
我们遇到这样的情况:UAC 向服务器发送 INVITE,服务器以 3xx-6xx 进行响应。如果 UAC 未对此响应发送 ACK - 则不会重传。 根据 RFC3261 ( https://www.i
您好! 我正在开发(尝试开发)Android 的 VoIP SIP 应用程序,在与 mjsip、pjsip 和 sdk 的库争论了两周之后,我决定使用 JAIN-SIP。从理论上讲,图书馆看起来很棒。
我正在尝试使用 Jain SIP 制作一个 Android 应用程序。我已经阅读了 SIP 的基本教程,现在我正在寻找如何在 android 中实现 jain sip 的教程。我搜索但我没有看到任何如
我一直在研究在 Java 中使用 SIP( session 启动协议(protocol))的各种 API 选项。 到目前为止,我已经将范围缩小到 JAIN SIP 和 MJSIP,但我无法弄清楚两
我正在尝试在 android 上实现 JAIN sip 堆栈,但是当我尝试编译演示程序时出现此错误: trouble processing "javax/sip/ClientTransaction.c
我是一名优秀的程序员,十分优秀!