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