Интеграция библиотеки pjsip в Windows Phone 8

Я новичок в разработке sip и пытаюсь реализовать клиент Windows Phone 8 с помощью pjsip.

Я создал образец приложения из pjsip, который создает приложение pjsua с возможностью подключения через telnet.

Прямо сейчас я не понимаю, как я буду использовать эту библиотеку и интегрировать ее в свое приложение без telnet,

мне просто нужно поставить ручную панель набора номера и звонить оттуда, чтобы выполнить это, какова будет процедура?

pjsip для android или iphone имеет два образца приложения, csipsimple и siphon, но pjsip для windows phone 8 не имеет подобного приложения.

любая помощь относительно того, как двигаться вперед, была бы очень полезной.

Спасибо


person Shofiqul Alam    schedule 16.04.2014    source источник


Ответы (2)


Поскольку вы упомянули, что пробовали пример приложения telnet для Windows Phone, я предполагаю, что вы загрузили исходный код PJSIP winphone, как указано в их руководство по началу работы с wp8. Чтобы создать простое приложение, которое выполняет исходящий и принимает входящий вызов, как вы упомянули, вы можете просто повторно использовать этот проект winphone.

Откройте проект winphone и выполните:

  1. Создайте новый проект Windows Phone и установите его в качестве запускаемого проекта (назовем этот проект SIP_UI). Это будет служить пользовательским интерфейсом. Вы можете просто создать «Кнопку вызова», которая будет выполнять исходящий вызов позже.
  2. Следуйте существующим настройкам pjsua_wp WMAppManifest.xml для этого SIP_UI. Особенно часть возможностей. Ваше приложение не будет работать, если вы просто используете настройки по умолчанию.
  3. Создайте новый проект среды выполнения Windows Phone (назовем его SIP_WINPRT). Создайте класс и метод внутри этого класса, который позже выполнит фактический вызов.
  4. Измените настройку свойства для SIP_WINPRT (щелкните правой кнопкой мыши проект SIP_WINPRT -> свойство), следуя существующим pjsua_wp_backend. Изменения особенно касаются ссылок, дополнительных каталогов и определений препроцессора. Отрегулируйте путь соответствующим образом.
  5. Найдите simple_pjsua.c в образце winphone. И попробуйте реализовать это в классе, который вы создали в SIP_WINPRT. Образец, который я создал:

    #include "pch.h"
    #include "backend.h"
    #include "pjsua.h"
    
    #define SIP_DOMAIN  "dogdomain"
    #define SIP_USER    "dog"
    #define SIP_PASSWD  "dog"
    
    using namespace backend;
    using namespace Platform;
    
    SipletRuntimeComponent::SipletRuntimeComponent()
    {
    }
    
    /* Display error and exit application */
    static void error_exit(const char *title, pj_status_t status)
    {
        //pjsua_perror(THIS_FILE, title, status);
        pjsua_destroy();
        exit(1);
    }
    
    /* Callback called by the library upon receiving incoming call */
    static void on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id,
                     pjsip_rx_data *rdata)
    {
        pjsua_call_info ci;
    
        PJ_UNUSED_ARG(acc_id);
        PJ_UNUSED_ARG(rdata);
    
        pjsua_call_get_info(call_id, &ci);
    
        //PJ_LOG(3,(THIS_FILE, "Incoming call from %.*s!!",
        //       (int)ci.remote_info.slen,
        //       ci.remote_info.ptr));
    
        /* Automatically answer incoming calls with 200/OK */
        pjsua_call_answer(call_id, 200, NULL, NULL);
    }
    
    /* Callback called by the library when call's media state has changed */
    static void on_call_media_state(pjsua_call_id call_id)
    {
        pjsua_call_info ci;
    
        pjsua_call_get_info(call_id, &ci);
    
        if (ci.media_status == PJSUA_CALL_MEDIA_ACTIVE) {
        // When media is active, connect call to sound device.
        pjsua_conf_connect(ci.conf_slot, 0);
        pjsua_conf_connect(0, ci.conf_slot);
        }
    }
    
    /* Callback called by the library when call's state has changed */
    static void on_call_state(pjsua_call_id call_id, pjsip_event *e)
    {
        pjsua_call_info ci;
    
        PJ_UNUSED_ARG(e);
    
        pjsua_call_get_info(call_id, &ci);
        //PJ_LOG(3,(THIS_FILE, "Call %d state=%.*s", call_id,
        //       (int)ci.state_text.slen,
        //       ci.state_text.ptr));
    }
    
    
    int SipletRuntimeComponent::SipCall(int address)
    {
        /* Create pjsua */
        pj_status_t status;
        status = pjsua_create();
        if (status != PJ_SUCCESS){
            //Error in pjsua_create()
            return -1;
        }
    
        /* Validate the URL*/
        char url[50] = "sip:cat:cat@catdomain:5060";
        status = pjsua_verify_url(url);
        if (status != PJ_SUCCESS){
            //Invalid URL given
            return -1;
        }
    
        /* Init pjsua */
        {
            pjsua_config cfg;
            pjsua_logging_config log_cfg;
    
            pjsua_config_default(&cfg);
            cfg.cb.on_incoming_call = &on_incoming_call;
            cfg.cb.on_call_media_state = &on_call_media_state;
            cfg.cb.on_call_state = &on_call_state;
    
            pjsua_logging_config_default(&log_cfg);
            log_cfg.console_level = 4;
    
            status = pjsua_init(&cfg, &log_cfg, NULL);
            if (status != PJ_SUCCESS){
                //Error in pjsua_init()
                pjsua_destroy();
                return -1;
            }
        }
    
        /* Add UDP transport. */
        {
            pjsua_transport_config cfg;
    
            pjsua_transport_config_default(&cfg);
            cfg.port = 5060;
            status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &cfg, NULL);
            if (status != PJ_SUCCESS){
                //Error creating transport
                pjsua_destroy();
                return -1;
            }
        }
    
        /* Initialization is done, now start pjsua */
        status = pjsua_start();
        if (status != PJ_SUCCESS){
            //Error starting pjsua
            pjsua_destroy();
            return -1;
        }
    
        /* Register to SIP server by creating SIP account. */
        pjsua_acc_id acc_id;
        {
            pjsua_acc_config cfg;
    
            pjsua_acc_config_default(&cfg);
            cfg.id = pj_str("sip:" SIP_USER "@" SIP_DOMAIN);
            cfg.reg_uri = pj_str("sip:" SIP_DOMAIN);
            cfg.cred_count = 1;
            cfg.cred_info[0].realm = pj_str(SIP_DOMAIN);
            cfg.cred_info[0].scheme = pj_str("digest");
            cfg.cred_info[0].username = pj_str(SIP_USER);
            cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
            cfg.cred_info[0].data = pj_str(SIP_PASSWD);
    
            status = pjsua_acc_add(&cfg, PJ_TRUE, &acc_id);
    
            if (status != PJ_SUCCESS){          
                //Error adding account
                pjsua_destroy();
                return -1;
            }
        }
    
        /* make call to the URL. */
        pj_str_t uri = pj_str(url);
        status = pjsua_call_make_call(acc_id, &uri, 0, NULL, NULL, NULL);
        if (status != PJ_SUCCESS){
            //Error making call
            pjsua_destroy();
            return -1;
        }
    
        return address + 1;
    }
    
  6. Добавьте SIP_WINPRT в качестве ссылки в проект SIP_UI.

  7. Вызов SIP_WINPRT при нажатии кнопки вызова.
person kasyauqi    schedule 01.07.2014
comment
Это очень полезно, Реза, да, это способ двигаться вперед, к сожалению, вопрос устарел, и я уже понял это. прямо сейчас я застрял в управлении входящими вызовами, когда приложение существует, есть ли способ, которым мы можем обрабатывать входящие вызовы без системы push-уведомлений? а также вам удалось направить звук на наушники, а не на динамик?? - person Shofiqul Alam; 01.07.2014
comment
Спасибо. Я также только начал работать над этим несколько недель назад, и кажется, что теперь вы намного опередили меня. Я также очень новичок в разработке Windows Phone, поэтому не могу вам сейчас помочь. Но это может быть связано с тем, что PJSIP не может использовать фоновый агент. Обратитесь к комментарию ответа здесь - person kasyauqi; 02.07.2014
comment
На самом деле у Microsoft есть пример приложения voip chatterbox с очень плохой документацией, а у pjsip есть собственный клиент, который необходимо интегрировать с приложением chatterbox. но поскольку приложение Chatterbox очень плохо документировано, сейчас невозможно интегрировать с ним pjsip. - person Shofiqul Alam; 02.07.2014
comment
Я до сих пор не понимаю этого ясно, не могли бы вы предоставить мне образец проекта, который вы создали? Я разрабатываю приложение на WP8, которое использует SIP для чата, но я не знаю, что делать с огромным проектом PJSIP T_T - person Đức Bùi; 03.07.2014
comment
Shofiqul Alam, Можете ли вы поделиться реализацией winrt, которую вы сделали с нами. Это будет очень полезно для людей, желающих разработать приложение для Windows Phone с помощью pjsip. :) - person Prateek Jaiswal; 30.07.2014
comment
Я потратил много времени на интеграцию PJSIP в приложение для болтовни. Фактически, я воссоздал приложение Chatterbox с нуля, но с учетом PJSIP. Пока работает хорошо, но у меня проблемы со звуком. Я продолжаю получать Master/sound Underflow, buf_cnt=0, будет генерировать 1 кадр в журналах. Кто-нибудь сталкивался с этой проблемой? - person Houston; 31.07.2014
comment
Чтобы другие комментаторы использовали библиотеку PJSIP и расширяли методы PJSUA, никто не собирается писать ваш код за вас. - person MattyMerrix; 25.09.2015

Ну, ваши проблемы, похоже, связаны не с PJSip, а с разработкой пользовательского интерфейса. Я предлагаю вам создать свой пользовательский интерфейс (используя XAML/C# или XAML/C++, и не забывайте, что это должен быть проект Windows Phone 8.0 Silverlight). Затем вы начинаете ссылаться на библиотеку PJSip.

Надеюсь, поможет!

person Nuno Centeio    schedule 20.06.2014