GB/T28181平台C++实现学习笔记3: libexosip2测试UAS与UAC.

  • Post author:
  • Post category:其他




GB/T28181平台C++实现学习笔记2:libosip2与libexosip2编译



HelloWorld

我个人接触新的第三方库时,独立测试肯定要走helloworld,引用库头文件,调用库最基础的方法。

上代码:

#include "stdio.h"
#include <eXosip2/eXosip.h>

using namespace std;

int main(void)
{
    int result;

    // 初始化
    eXosip_t *ctx = eXosip_malloc();
    result = eXosip_init(ctx);
    if (result != OSIP_SUCCESS)
    {
        printf("Can't initialize eXosip!\n");
        return -1;
    }
    else
    {
        printf("eXosip_init successfully!\n");
    }

    // 结束
    eXosip_quit(ctx);
    ctx = nullptr;

    printf("Hello World\n");
    return 0;
}

运行结果

eXosip_init successfully!
Hello World

说明库配置没有问题,可以开搞了。



UAS 与UAC

UAC用于发起请求(request),而UAS用于产生响应(response)。

这两个概念不需要纠结,大部分情况下同一端既是UAS也是UAC。

请求中,发送(request)的是UAC,回复(response)就时UAS。

下面我们就做个简单的request – response的测试。



UAS(User Agent Server)用户代理服务器

初始化后可以设置一些参数,比如

eXosip_set_user_agent(ctx, "yjkhtddx/0.0.1");

然后加个端口监听:

    int port = 15067;
    result = eXosip_listen_addr(ctx, IPPROTO_UDP, NULL, port, AF_INET, 0);
    if (result != OSIP_SUCCESS)
    {
        eXosip_quit(ctx);
        fprintf(stderr, "could not initialize transport layer\n");
        return -1;
    }

然后加个事件处理

eXosip_event_t *evt = nullptr;
    for (;;)
    {
        evt = eXosip_event_wait(ctx, 0, 50);
        if (!evt)
        {
            printf("wait...\n");
            continue;
        }

        switch (evt->type)
        {
        case EXOSIP_MESSAGE_NEW:
        {
            // if (osip_strcasecmp(minfo->sip_method, "MESSAGE") == 0)
            if (osip_strcasecmp(evt->request->sip_method, "MESSAGE") == 0)
            {
                osip_message_t *answer = NULL;
                eXosip_lock(ctx);
                result = eXosip_message_build_answer(ctx, evt->tid, 200, &answer);
                result = eXosip_message_send_answer(ctx, evt->tid, 200, answer);
                eXosip_unlock(ctx);
            }
            break;
        }
        default:
        {
            printf("Unprocessed\n");
            break;
        }
        }

        eXosip_event_free(evt);
        evt = nullptr;
    }

完成,下面搞UAC



UAC(User Agent Client)用户代理客户端

初始化后开启监听

int port = 15068;
    result = eXosip_listen_addr(ctx, IPPROTO_UDP, NULL, port, AF_INET, 0);
    if (result != OSIP_SUCCESS)
    {
        eXosip_quit(ctx);
        fprintf(stderr, "could not initialize transport layer\n");
        return -1;
    }

发送MESSAGE消息

bool quit = false;
    while (!quit)
    {
        char messageCache[1024];
        std::cout << "Please input the message: " << std::endl;
        std::cin >> messageCache;
        std::string message = std::string(messageCache);
        std::cout << "send message: " << message << std::endl;

        osip_message_t *osipMessagePtr = nullptr;
        eXosip_lock(ctx);
        char *source_call = "sip:client@127.0.0.1:15068";
        char *dest_call = "sip:server@127.0.0.1:15067";
        eXosip_message_build_request(ctx, &osipMessagePtr, "MESSAGE", dest_call, source_call, nullptr);
        osip_message_set_body(osipMessagePtr, message.data(), message.length());
        osip_message_set_content_type(osipMessagePtr, "text/plain");
        eXosip_message_send_request(ctx, osipMessagePtr);
        eXosip_unlock(ctx);

        if (message == "quit")
        {
            break;
        }
        else
        {
            waitRES(ctx);
        }
    }

发送完等待回复

void waitRES(eXosip_t *ctx)
{
    eXosip_event_t *evt = nullptr;
    for (;;)
    {
        evt = eXosip_event_wait(ctx, 0, 50);
        if (!evt)
        {
            printf("wait...\n");
            continue;
        }
        
        if(evt->type == EXOSIP_MESSAGE_ANSWERED){
            break;
        }

        eXosip_event_free(evt);
        evt = nullptr;
    }
}

完成,开始测试



测试结果

使用wireshark抓包结果

MESSAGE sip:server@127.0.0.1:15067 SIP/2.0
Via: SIP/2.0/UDP 127.0.0.1:15068;rport;branch=z9hG4bK644998637
From: <sip:client@127.0.0.1:15068>;tag=480476859
To: <sip:server@127.0.0.1:15067>
Call-ID: 1103854489
CSeq: 20 MESSAGE
Content-Type: text/plain
Max-Forwards: 70
User-Agent: yjkhtddx/0.0.1
Content-Length:     7

1234567
SIP/2.0 200 OK
Via: SIP/2.0/UDP 127.0.0.1:15068;rport=15068;branch=z9hG4bK644998637
From: <sip:client@127.0.0.1:15068>;tag=480476859
To: <sip:server@127.0.0.1:15067>;tag=1126161087
Call-ID: 1103854489
CSeq: 20 MESSAGE
User-Agent: yjkhtddx/0.0.1
Content-Length: 0



总结

实际开发中,接收应该开子线程。

微信号:yjkhtddx



版权声明:本文为yjkhtddx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。