티스토리 뷰

etc

Building and Using PJSIP

keehyun2 2017. 9. 17. 17:14

네트워크 내에서 음성 및 화상 통신을 지원하는 PJSIP 대해서 소개해보겠습니다.

PJSIPSIP(Session Iniation Protocol), SDP(Session Description Protocol), RTP(Real-time Transport Protocol), STUN(Session Traversal Utilities for NAT), TURN(Traversal Using Relays around NAT) 및 ICE(Interactive Connectivity Establishment)와 같은 표준 기반 프로토콜을 구현하는 C 언어로 작성된 무료 오픈 소스 멀티미디어 통신 라이브러리 입니다.

Getting-Started 문서는 window, linux, mac os 등의 환경에서 빌드하는 방법을 안내하고 있습니다.

Visual Studio 2017 community (window 10)

  1. visulal studio 2017 comunity 다운로드 및 설치 합니다. ( 참고 - 주요 플러그인을 포함하여 설치하게되면 30GB 도 모자르게 느껴집니다. 모든 확장 tool 설치시 80GB 쯤 된다고합니다. C 드라이브에 여유공간이 많이 없다면 이슈가 발생할 수 있습니다. 이유는 설치시에 경로를 D: E: 등 으로 맞춰도 일부는 무조건 C드라이브에 설치됩니다.  )

  2. 비 메이크 파일 기반 빌드 시스템 (예 : Visual Studio)을 사용하면 config_site.h 파일을 수동으로 만들어야합니다. 공식 사이트에서 내려받은 pjproject-2.6 를 내려받습니다.

    pjproject-2.6/pjlib/include/pj/
    

    위의 경로에 config_site.h 내용이 없는 파일을 만들어줍니다.

  3. 스튜디오에서 솔루션 열기로 pjsip 안에 있는 pjproject-vs14.sln 를 엽니다. 여는 중에 sdk 설치가 필요다고 하면 예를 눌러줍니다. visual studio version 이 맞지 않아서 처음에 migration 작업을 진행하는 것 같은데 migration 작업의 오류나는 것이 있어도 일단 보류하고 진행합니다.

  4. console 창에 프로젝트 빌드를 해보면 [솔루션 대상 변경] 을 하라는 error 가 나타납니다. 상단에 [프로젝트] > [솔루션 대상 변경] 을 하고 자동으로 설정된 내용을 확인하고 예를 누릅니다.

  5. pjsua 프로젝트를 시작 프로젝트로 설정을 합니다. 이후에 이제 디버깅 시작을 누르면 빌드가 진행되면서 cli 모드가 실행됩니다.

MingGW (window 10)

생대적으로 가벼운 이 컴파일러로 빌드 및 기능 테스트하면 좋을것 같습니다. 저는 3개 pc(window 10) 에서 테스트 했는데 1개만 성공했습니다. 이유는 찾지 못했습니다. build 중에 thread.h( linux 에서 사용하는 header file), timespec 관련 이슈등이 생겨서 급한 성격때문에 보류하였습니다.

  1. MingGW 를 설치하고 환경변수를 생성해줍니다. (참고 문서)
C:\ bash
$ ./configure
$ make dep && make clean && make
$ make install

\pjsip-apps\bin 안에 실행파일이 생기면 build 성공입니다.

에러가 난 경우는 아래 같은 메세지가 나타났습니다. 해결방법은 찾지 못했습니다.

/usr/bin/sed: -e expression #1, char 1: unknown command: `C'
<built-in>: fatal error: when writing output to : Invalid argument
compilation terminated.
make[2]: *** [depend] Error 1
make[2]: Leaving directory `/c/Users/LEE/Downloads/pjproject-2.6/pjlib/build'
make[1]: *** [depend] Error 2
make[1]: Leaving directory `/c/Users/LEE/Downloads/pjproject-2.6/pjlib/build'
make: *** [dep] Error 1

gcc (ubuntu16.4 - virtual box 가상 os) - 보류

make 는 정상적으로 되었고 cli 를 실행해보지는 않았습니다. python 개발환경을 설정하는 중에 잘안되서 보류하였습니다. api 문서에는 python, java, c++ 등의 개발언어에서 사용하는 방법도 설명하고 있습니다. 아마 가상 머신에 하드웨어 audio Input(마이크), audio output(스피커) 등이 설정되어있지 않아서 cli 를 실행하였어도 sip call 이 제대로 이루어지지 않았을 것으로 생각됩니다.

gcc (Mac)

$ ./configure
$ make dep && make clean && make
$ make install

위와 같이 build 하시면 pjsip-apps/bin 폴더 아래에 실행파일이 생성됩니다.

저의 경우 pjsua-x86_64-apple-darwin16.7.0 이 생성되었습니다.

PJSIP CLI(command line interface) usage

cli 를 실행하면 다음과 같은 prompt 가 나오는걸 확인하실 수 있습니다. (mac os 에서 실행해보았습니다.)

/Users/khpark/Downloads/pjproject-2.6/pjsip-apps/bin khpark@ ./pjsua-x86_64-apple-darwin16.7.0
16:15:59.933 os_core_unix.c !pjlib 2.6 for POSIX initialized
16:15:59.936 sip_endpoint.c  .Creating endpoint instance...
16:15:59.938          pjlib  .select() I/O Queue created (0x7fdf0e821ed8)
16:15:59.938 sip_endpoint.c  .Module "mod-msg-print" registered
16:15:59.938 sip_transport.  .Transport manager created.
16:15:59.938   pjsua_core.c  .PJSUA state changed: NULL --> CREATED
16:15:59.939 sip_endpoint.c  .Module "mod-pjsua-log" registered
16:15:59.939 sip_endpoint.c  .Module "mod-tsx-layer" registered
16:15:59.939 sip_endpoint.c  .Module "mod-stateful-util" registered
16:15:59.939 sip_endpoint.c  .Module "mod-ua" registered
16:15:59.940 sip_endpoint.c  .Module "mod-100rel" registered
16:15:59.940 sip_endpoint.c  .Module "mod-pjsua" registered
16:15:59.940 sip_endpoint.c  .Module "mod-invite" registered
16:15:59.989 coreaudio_dev.  ..core audio detected 2 devices
16:15:59.994 coreaudio_dev.  .. dev_id 0: Built-in Output  (in=0, out=2) 44100Hz
16:15:59.995 coreaudio_dev.  .. dev_id 1: Built-in Microphone  (in=2, out=0) 44100Hz
16:15:59.995 coreaudio_dev.  ..core audio initialized
16:15:59.996          pjlib  ..select() I/O Queue created (0x7fdf0e82e828)
WARNING: no real random source present!
16:16:00.003    pjsua_vid.c  ..Initializing video subsystem..
16:16:00.029   darwin_dev.m  ...Darwin video initialized with 1 devices:
16:16:00.029   darwin_dev.m  ... 0: [Capturer] AVF - FaceTime HD Camera
16:16:00.029 colorbar_dev.c  ...Colorbar video src initialized with 2 device(s):
16:16:00.029 colorbar_dev.c  ... 0: Colorbar generator
16:16:00.029 colorbar_dev.c  ... 1: Colorbar-active
16:16:00.030 sip_endpoint.c  .Module "mod-evsub" registered
16:16:00.030 sip_endpoint.c  .Module "mod-presence" registered
16:16:00.030 sip_endpoint.c  .Module "mod-mwi" registered
16:16:00.030 sip_endpoint.c  .Module "mod-refer" registered
16:16:00.030 sip_endpoint.c  .Module "mod-pjsua-pres" registered
16:16:00.030 sip_endpoint.c  .Module "mod-pjsua-im" registered
16:16:00.030 sip_endpoint.c  .Module "mod-pjsua-options" registered
16:16:00.030   pjsua_core.c  .1 SIP worker threads created
16:16:00.030   pjsua_core.c  .pjsua version 2.6 for Darwin-16.7/x86_64 initialized
16:16:00.030   pjsua_core.c  .PJSUA state changed: CREATED --> INIT
16:16:00.030 sip_endpoint.c  Module "mod-default-handler" registered
16:16:00.030   pjsua_core.c  SIP UDP socket reachable at 192.168.0.4:5060
16:16:00.030 udp0x7fdf0ce0b  SIP UDP transport started, published address is 192.168.0.4:5060
16:16:00.031    pjsua_acc.c  Adding account: id=<sip:192.168.0.4:5060>
16:16:00.031    pjsua_acc.c  .Account <sip:192.168.0.4:5060> added with id 0
16:16:00.031    pjsua_acc.c  Modifying account 0
16:16:00.031    pjsua_acc.c  Acc 0: setting online status to 1..
16:16:00.031     tcptp:5060  SIP TCP listener ready for incoming connections at 192.168.0.4:5060
16:16:00.031    pjsua_acc.c  Adding account: id=<sip:192.168.0.4:5060;transport=TCP>
16:16:00.031    pjsua_acc.c  .Account <sip:192.168.0.4:5060;transport=TCP> added with id 1
16:16:00.031    pjsua_acc.c  Modifying account 1
16:16:00.031    pjsua_acc.c  Acc 1: setting online status to 1..
16:16:00.031   pjsua_core.c  PJSUA state changed: INIT --> STARTING
16:16:00.031 sip_endpoint.c  .Module "mod-unsolicited-mwi" registered
16:16:00.031   pjsua_core.c  .PJSUA state changed: STARTING --> RUNNING
16:16:00.031         main.c  Ready: Success
>>>>
Account list:
  [ 0] <sip:192.168.0.4:5060>: does not register
       Online status: Online
 *[ 1] <sip:192.168.0.4:5060;transport=TCP>: does not register
       Online status: Online
Buddy list:
 -none-

+=============================================================================+
|       Call Commands:         |   Buddy, IM & Presence:  |     Account:      |
|                              |                          |                   |
|  m  Make new call            | +b  Add new buddy       .| +a  Add new accnt |
|  M  Make multiple calls      | -b  Delete buddy         | -a  Delete accnt. |
|  a  Answer call              |  i  Send IM              | !a  Modify accnt. |
|  h  Hangup call  (ha=all)    |  s  Subscribe presence   | rr  (Re-)register |
|  H  Hold call                |  u  Unsubscribe presence | ru  Unregister    |
|  v  re-inVite (release hold) |  t  ToGgle Online status |  >  Cycle next ac.|
|  U  send UPDATE              |  T  Set online status    |  <  Cycle prev ac.|
| ],[ Select next/prev call    +--------------------------+-------------------+
|  x  Xfer call                |      Media Commands:     |  Status & Config: |
|  X  Xfer with Replaces       |                          |                   |
|  #  Send RFC 2833 DTMF       | cl  List ports           |  d  Dump status   |
|  *  Send DTMF with INFO      | cc  Connect port         | dd  Dump detailed |
| dq  Dump curr. call quality  | cd  Disconnect port      | dc  Dump config   |
|                              |  V  Adjust audio Volume  |  f  Save config   |
|  S  Send arbitrary REQUEST   | Cp  Codec priorities     |                   |
+-----------------------------------------------------------------------------+
| Video: "vid help" for more info                                             |
+-----------------------------------------------------------------------------+
|  q  QUIT   L  ReLoad   sleep MS   echo [0|1|txt]     n: detect NAT type     |
+=============================================================================+
You have 0 active call
>>> 

pjsua cli 프로그램 안에서 사용할수 있는 명령어들이 마지막에 출력됩니다.

Make new call 테스트를 하기 위해서 상대방 pc에도 pjsua 가 실행되고있어야하고 마이크,스피커가 제대로되어있어야합니다. 그리고 상대방과 5060 포트가 UDP/TCP 두가지 형식 모두 열려있어야합니다. (주로 웹개발을 해서 TCP만 사용해도되는줄 알았는데 아니였습니다. 에러 남니다. )

전화를 거는 명령어는 다음과 같습니다.

>>> m
>>> sip:localhost

or 

>>> m
>>> sip:192.168.0.1


'etc' 카테고리의 다른 글

Useful JavaScript Library(1)  (1) 2017.10.12
VoIP(Voice over Internet Protocol)  (0) 2017.10.01
멀티 브라우저 제어(Selenium Grid)  (0) 2017.08.04
웹 테스트 자동화 (Selenium IDE)  (0) 2017.07.26
Regular Expression (ide eclipse 사용)  (0) 2017.06.25
댓글
글 보관함
최근에 올라온 글
Total
Today
Yesterday
링크