关于Asterisk SIP Info和SIP MESSAGE消息问题

1. 关于Asterisk SIP INFO问题

想通过SIP INFO发送一个开锁消息,发现Asterisk服务器经常返回415 Unsupported media type,
查看源码(chan_sip.c handle_request_info函数)发现Asterisk接收以下Content-Type

    /* Need to check the media/type */
    if (!strcasecmp(c, "application/dtmf-relay") ||
        !strcasecmp(c, "application/vnd.nortelnetworks.digits") ||
        !strcasecmp(c, "application/dtmf"))

修改Content-Type,body 填入Signal=xxx, Duration=xxx后发送成功。


2. 关于Asterisk SIP MESSAGE问题

看了源码,发送消息Content-Type必须为text/plain,否则会返回415 Unsupported Media Type。

Content-Type改了之后试了好久怎么发送消息还是不行。查了下资料,好像是需要在通话状态才允许发送MESSAGE消息。

改了下,在通话中发送消息,类似 SIP INFO。

以exoSip 为例
    osip_message_t *pMsg = NULL;

    eXosip_call_build_message(dialog_id, &pMsg);
    osip_message_set_body(pMsg, "hello world\r\n", strlen("hello world\r\n"));
    osip_message_set_content_type(pMsg, "text/plain");    
    eXosip_message_send_request(pMsg);

//eXosip库里面没有这个函数,我自定义了一个,用于发送通话中的MESSAGE
int eXosip_call_build_message(int did, osip_message_t ** request)
{
    int i;

    *request = NULL;
    i = eXosip_call_build_request(did, "MESSAGE", request);
    if (i != 0)
        return i;

    return OSIP_SUCCESS;
}

测试后对端收到了MESSAGE。终于搞定了。

对端需要对 EXOSIP_CALL_MESSAGE_NEW 进行处理

MESSAGE介绍可以参考
https://tools.ietf.org/html/rfc3428

参考
https://wiki.asterisk.org/wiki/display/DIGIUM/Digium+Phones+when+used+with+DPMA

你可能感兴趣的:(个人笔记,Asterisk,Sip)