5.サンプルプログラムを作成する

1.Microsoft Visual Studio Community 2017 を起動して、Visual C# の新規プロジェクトを作成します。ここでは分かりやすいコンソールアプリにします。

2.空のプロジェクトが作成されます。

3.空のプロジェクトが作成できたら、ソースファイルのある場所に移動して、前回作成した pjsua2.dll をこの中にコピーします。

4.既存の項目の追加で pjsua2.dll をプロジェクトに追加します。

5.pjsua2.dll が追加されました。

6.pjsua2.dll のプロパティを開いて、「ビルドアクション」を「コンテンツ」、「出力ディレクトリにコピー」を「常にコピーする」に設定します。

7.次にプロジェクトに新しいフォルダを作成し、名前を「pjsua2_libs」とします。(別に名前は何でもいいです。)

8.pjsua2_libsフォルダを選択した後、既存の項目の追加で、SWIGで作成したC#ファイルをすべて追加します。ファイルは、~\pjproject-2.8\pjsip-apps\src\swig\csharp にあります。

9.すべてのC#ファイルを選択して、「追加」をクリックします。

10.SWIGのすべてのC#ファイルが追加されました。

11.追加したC#ファイルのうち、pjsua_snd_dev_id.cs がエラーになるので、次のように修正します。

<修正前>

<修正後>

public enum pjsua_snd_dev_id {
PJSUA_SND_DEFAULT_CAPTURE_DEV = -1,
PJSUA_SND_DEFAULT_PLAYBACK_DEV = -2,
PJSUA_SND_NO_DEV = -3,
PJSUA_SND_NULL_DEV = -99
}

12.program.cs にサンプルプログラム(このページの最後にあります)を貼り付けます。

13.ソリューションのクリーンを実行します。

14.ソリューションのリビルド(またはビルド)を実行します。

15.実行してみます。初回のみ、セキュリティー警告が出るので「アクセスを許可する」をクリックします。

16.実行中の画面です。何かキーを押すと終了します。(SIPのレジストエラーなのは、SIP接続情報がサンプルのままだからです。)

17.実際の program.cs (サンプルプログラム)です。

【ソース元】

https://www.pjsip.org/docs/book-latest/html/intro_pjsua2.html#id1

【PJSUA2のドキュメント】

https://www.pjsip.org/docs/book-latest/html/index.html

  • 着信があると、onIncomingCall 関数が呼ばれます。
  • 引数 prm に着信情報(相手電話番号など)が受け渡されます。
  • onRegState 関数は、SIPレジスト処理の時に呼ばれます。
  • override できる関数は他にもありますので、興味がある方は試してみてください。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using pjsua2xamarin.pjsua2;

namespace pjsua2_swig_test
{
    class MyAccount : Account
    {
        public override void onIncomingCall(OnIncomingCallParam prm)
        {
            base.onIncomingCall(prm);
        }

        public override void onRegState(OnRegStateParam prm)
        {
            base.onRegState(prm);
        }
    };

    class Program
    {
        static void Main(string[] args)
        {
            Endpoint ep = new Endpoint();
            ep.libCreate();

            // Initialize endpoint
            EpConfig ep_cfg = new EpConfig();
            ep.libInit(ep_cfg);

            // Create SIP transport. Error handling sample is shown
            TransportConfig sipTpConfig = new TransportConfig();
            sipTpConfig.port = 5060;
            ep.transportCreate(pjsip_transport_type_e.PJSIP_TRANSPORT_UDP, sipTpConfig);

            // Start the library
            ep.libStart();

            AccountConfig acfg = new AccountConfig();
            acfg.idUri = "sip:05012345678@ipphone.plala.or.jp";
            acfg.regConfig.registrarUri = "sip:ipphone.plala.or.jp";
            AuthCredInfo cred = new AuthCredInfo("digest", "*", "user_name", 0, "secret");
            acfg.sipConfig.authCreds.Add(cred);

            // Create the account
            MyAccount acc = new MyAccount();
            acc.create(acfg);

            // Here we don't have anything else to do..
            //Thread.Sleep(10000);
            Console.ReadLine();

            acc.Dispose();
            ep.libDestroy();
            ep.Dispose();
        }
    }
}