티스토리 뷰
네트워크 내에서 음성 및 화상 통신을 지원하는 PJSIP 대해서 소개해보겠습니다.
PJSIP 란 SIP(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)
visulal studio 2017 comunity 다운로드 및 설치 합니다. ( 참고 - 주요 플러그인을 포함하여 설치하게되면 30GB 도 모자르게 느껴집니다. 모든 확장 tool 설치시 80GB 쯤 된다고합니다. C 드라이브에 여유공간이 많이 없다면 이슈가 발생할 수 있습니다. 이유는 설치시에 경로를 D: E: 등 으로 맞춰도 일부는 무조건 C드라이브에 설치됩니다. )
비 메이크 파일 기반 빌드 시스템 (예 : Visual Studio)을 사용하면 config_site.h 파일을 수동으로 만들어야합니다. 공식 사이트에서 내려받은 pjproject-2.6 를 내려받습니다.
pjproject-2.6/pjlib/include/pj/
위의 경로에 config_site.h 내용이 없는 파일을 만들어줍니다.
스튜디오에서 솔루션 열기로 pjsip 안에 있는 pjproject-vs14.sln 를 엽니다. 여는 중에 sdk 설치가 필요다고 하면 예를 눌러줍니다. visual studio version 이 맞지 않아서 처음에 migration 작업을 진행하는 것 같은데 migration 작업의 오류나는 것이 있어도 일단 보류하고 진행합니다.
console 창에 프로젝트 빌드를 해보면 [솔루션 대상 변경] 을 하라는 error 가 나타납니다. 상단에 [프로젝트] > [솔루션 대상 변경] 을 하고 자동으로 설정된 내용을 확인하고 예를 누릅니다.
pjsua 프로젝트를 시작 프로젝트로 설정을 합니다. 이후에 이제 디버깅 시작을 누르면 빌드가 진행되면서 cli 모드가 실행됩니다.
MingGW (window 10)
생대적으로 가벼운 이 컴파일러로 빌드 및 기능 테스트하면 좋을것 같습니다. 저는 3개 pc(window 10) 에서 테스트 했는데 1개만 성공했습니다. 이유는 찾지 못했습니다. build 중에 thread.h( linux 에서 사용하는 header file), timespec 관련 이슈등이 생겨서 급한 성격때문에 보류하였습니다.
- 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 |