【问题标题】:JAIN SIP returns 415JAIN SIP 返回 415
【发布时间】:2017-10-25 06:43:31
【问题描述】:

我正在尝试使用 JAIN SIP 发起呼叫。 尝试执行代码时,我收到代码 415 - Unsupported Media Type 的响应。

我正在从我的 ip 地址(使用端口 5061)呼叫另一个 sip 地址。

我是否缺少标题?还是有错?

这是设置 sip 堆栈和 sip 提供者的构造函数:

public SipLayer(String username, String ip, int port) throws PeerUnavailableException,
            TransportNotSupportedException, InvalidArgumentException, ObjectInUseException, TooManyListenersException {
        sipFactory = SipFactory.getInstance();
        sipFactory.setPathName("gov.nist");
        Properties properties = new Properties();
        properties.setProperty("javax.sip.STACK_NAME", "SipInitiator");
        properties.setProperty("javax.sip.IP_ADDRESS", ip);

        sipStack = sipFactory.createSipStack(properties);
        headerFactory = sipFactory.createHeaderFactory();
        addressFactory = sipFactory.createAddressFactory();
        messageFactory = sipFactory.createMessageFactory();

        ListeningPoint udp = sipStack.createListeningPoint(ip, port, "udp");
        sipProvider = sipStack.createSipProvider(udp);
        sipProvider.addSipListener(this);
    }

这是使用工厂创建请求并发送它的函数:

    public void sendMessage(String to) throws ParseException, InvalidArgumentException, SipException {

        SipURI from = addressFactory.createSipURI(getUsername(), getHost() + ":" + getPort());
        Address fromNameAddress = addressFactory.createAddress(from);
        fromNameAddress.setDisplayName(getUsername());
        FromHeader fromHeader = headerFactory.createFromHeader(fromNameAddress, "sipinitiator");

        String username = to.substring(to.indexOf(":") + 1, to.indexOf("@"));
        String address = to.substring(to.indexOf("@") + 1);

        SipURI toAddress = addressFactory.createSipURI(username, address);
        Address toNameAddress = addressFactory.createAddress(toAddress);
        toNameAddress.setDisplayName(username);
        ToHeader toHeader = headerFactory.createToHeader(toNameAddress, null);

        SipURI requestURI = addressFactory.createSipURI(username, address);
        requestURI.setTransportParam("udp");

        ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
        ViaHeader viaHeader = headerFactory.createViaHeader(getHost(), getPort(), "udp", "branch1");
        viaHeaders.add(viaHeader);

        CallIdHeader callIdHeader = sipProvider.getNewCallId();

        CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1L, Request.MESSAGE);

        MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70);

        Request request = messageFactory.createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader,
                fromHeader, toHeader, viaHeaders, maxForwards);

        SipURI contactURI = addressFactory.createSipURI(getUsername(), getHost());
        contactURI.setPort(getPort());
        Address contactAddress = addressFactory.createAddress(contactURI);
        contactAddress.setDisplayName(getUsername());
        ContactHeader contactHeader = headerFactory.createContactHeader(contactAddress);
        request.addHeader(contactHeader);

        sipProvider.sendRequest(request);
    }

(我也有SipListener函数的实现)

【问题讨论】:

    标签: java jain-sip


    【解决方案1】:

    您缺少协商媒体设置的 SDP。 415 错误意味着远程端需要你给它一个有效的 SDP,没有它就无法工作。如果您没有准备好 RTP 堆栈,请查看此示例如何提供虚假媒体设置https://github.com/usnistgov/jsip/blob/master/src/examples/simplecallsetup/Shootist.java#L348

    如果您需要音频/媒体工作,您最终希望使用某种媒体堆栈,该堆栈将为您提供适当的有效 SDP。

    【讨论】:

    • 我添加了一个假 SDP,如您提到的示例所示(将 ip 更改为我的 ip),但仍然收到 415。知道为什么吗?
    • 确保包含 contentTypeHeader,如示例中所示。否则这很不寻常。如果它不断给出错误,您需要检查远程方的调试日志以查看他们发送错误的原因,可能它只接受某些罕见的格式。如果您的设备可以正常工作,您也可以捕获已知兼容的 SDP,只需复制并粘贴该 SDP。
    • 添加了 contentTypeHeader,现在它可以工作了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2011-01-14
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多