用osip2协议栈,写一个C程序,实现向摄像机发送invite,并且收到相机回复的200 OK 后,向相机发送ACK
时间: 2023-10-02 09:05:14 浏览: 130
首先,需要在C程序中引入osip2头文件和库:
```c
#include <osip2/osip.h>
#include <osip2/osip_mt.h>
#pragma comment (lib, "osipparser2.lib")
#pragma comment (lib, "osip2.lib")
```
然后,可以通过以下代码片段来实现向摄像机发送invite:
```c
osip_message_t *invite;
osip_uri_t *remote_uri;
osip_from_t *from;
osip_to_t *to;
osip_contact_t *contact;
/* 初始化osip协议栈 */
osip_init();
/* 创建invite消息 */
osip_message_init(&invite);
osip_message_set_version(invite, "SIP/2.0");
osip_message_set_subject(invite, "INVITE");
/* 设置From头 */
osip_from_init(&from);
osip_from_set_url(from, "sip:yourusername@yourdomain.com");
osip_message_set_from(invite, from);
/* 设置To头 */
osip_to_init(&to);
osip_to_set_url(to, "sip:camerausername@cameradomain.com");
osip_message_set_to(invite, to);
/* 设置Contact头 */
osip_contact_init(&contact);
osip_contact_set_url(contact, "sip:yourusername@youripaddress");
osip_message_set_contact(invite, contact);
/* 设置CSeq头 */
osip_message_set_cseq(invite, 1, "INVITE");
/* 设置Call-ID头 */
osip_message_set_call_id(invite, "1234567890");
/* 设置Max-Forwards头 */
osip_message_set_max_forwards(invite, 70);
/* 设置Remote-Party-ID头 */
remote_uri = osip_uri_parse("sip:camerausername@cameradomain.com");
osip_message_set_remote_party_id(invite, "Camera", remote_uri);
/* 发送invite消息 */
osip_uri_t *dest_uri = osip_uri_parse("sip:cameraipaddress");
osip_transaction_t *transaction;
osip_udp_set_port(5060);
osip_transaction_init(&transaction);
osip_transaction_snd_request(transaction, invite, dest_uri);
osip_transaction_free(transaction);
```
当收到相机回复的200 OK后,需要向相机发送ACK,可以通过以下代码实现:
```c
/* 接收相机回复的消息 */
osip_event_t *evt;
osip_t *osip_stack;
osip_list_t *transactions;
/* 初始化osip协议栈 */
osip_init();
osip_trace_initialize();
/* 创建osip协议栈 */
osip_stack = osip_malloc(sizeof(osip_t));
osip_t_init(osip_stack);
/* 触发消息接收事件 */
evt = osip_event_new();
osip_event_set_type(evt, OSIP_TIMEOUT_EVENT);
osip_list_add(osip_stack->equeue, evt, -1);
osip_terminate(osip_stack);
/* 获取回复的消息 */
transactions = osip_stack->transactions;
osip_transaction_t *transaction = (osip_transaction_t *) osip_list_get_first(transactions);
if (osip_transaction_get_response(transaction, 200) != NULL) {
/* 创建ACK消息 */
osip_message_t *ack;
osip_message_init(&ack);
osip_message_set_version(ack, "SIP/2.0");
osip_message_set_subject(ack, "ACK");
/* 设置From头 */
osip_from_t *from;
osip_from_init(&from);
osip_from_set_url(from, "sip:yourusername@yourdomain.com");
osip_message_set_from(ack, from);
/* 设置To头 */
osip_to_t *to;
osip_to_init(&to);
osip_to_set_url(to, "sip:camerausername@cameradomain.com");
osip_message_set_to(ack, to);
/* 设置Call-ID头 */
osip_message_set_call_id(ack, "1234567890");
/* 设置CSeq头 */
osip_message_set_cseq(ack, 2, "ACK");
/* 发送ACK消息 */
osip_udp_set_port(5060);
osip_transaction_init(&transaction);
osip_transaction_snd_request(transaction, ack, dest_uri);
osip_transaction_free(transaction);
}
/* 清除osip协议栈 */
osip_t_shutdown(osip_stack);
osip_free(osip_stack);
osip_trace_deinit();
```
阅读全文
相关推荐

















