一般认为,通讯设备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; }