一般认为,通讯设备A通过发送subscribe数据包订阅通讯设备B的状态信息。如果有状态更新,B会给A回复notify数据包。在eXosip协议栈中,notify数据包的发送都是对于Subscribe请求的应答。那么eXosip协议栈是否支持直接发送notify数据包呢?答案是肯定的。
eXosip协议栈中提供int eXosip_message_build_request (osip_message_t **message, const char *method, const char *to, const char *from, const char *route)函数主动上报消息。其中method可以指定消息类型为"notify"或者"message"。
消息组装完后,通过int eXosip_message_send_request (osip_message_t *message)函数主动发出。代码举例如下:
//发送Notify消息
int SendNotify(const char *source_call, char *dest_call, const char* eventvalue, const char* msg, const char* msgtype)
{
int i =0;
//初始化
i = eXosip_init();
if (i != 0)
{
printf("Can not initialize eXosip!\n");
return -1;
}
i = eXosip_listen_addr(IPPROTO_UDP, NULL, 15060, AF_INET, 0);
if (i != 0)
{
eXosip_quit ();
return -1;
}
osip_message_t *message=NULL;
char tmp[1024];
i = eXosip_message_build_request(&message, "notify", dest_call, source_call, NULL);
//内容, 方法, to , from , route
if (i != 0)
{
return -1;
}
else
{
osip_message_set_header(message, "Event", eventvalue);
if (msg != NULL)
{
_snprintf(tmp,1024,msg);
osip_message_set_body(message,tmp,strlen(tmp));
osip_message_set_content_type(message, msgtype);
}
i = eXosip_message_send_request(message);
if (i != 0)
{
return -1;
}
}
return 0;
}