SIP와 SMPP 메시지 간의 게이트웨이
전화
SIP 프로토콜은 음성 통화에 사용되는 가장 보편적 인 프로토콜 중 하나이지만 SMPP (Short Message Peer-to-Peer)는 문자 메시지를 전송하는 데 가장 널리 사용되는 프로토콜 중 하나입니다. 두 가지 서비스를 함께 제공하면 호환성과 유연성이 향상됩니다.
고객이 통일 된 경험을 갖기 위해서는 한쪽에서 오는 메시지가 다른 쪽에서 보이고 액세스 할 수 있도록해야합니다. 예를 들어 누군가 SMPP를 통해 플랫폼에 오는 SMS를 보낼 수 있으며 SIP 끝점으로 전달해야합니다. 두 프로토콜은 호환되지 않으므로 (아래의 호환성 참조) 두 프로토콜간에 브리징을 수행하는 도구가 필요합니다.
다행스럽게도 OpenSIPS 3.0은 새로운 proto_smpp 모듈을 사용하여 SIP에서 SMPP 로의 게이트웨이를 제공합니다! 이 모듈은 SMSC (Short Message Service Center)에 연결하여 문자 메시지를 교환 할 수있는 ESME (External Short Messaging Entity) 역할을합니다.
적합성
SMPP의 메시지는 TCP를 통해 관련된 엔티티간에 전달되는 이진 인코딩 PDU (프로토콜 데이터 단위)입니다. 스트림 지향 전송 프로토콜을 사용하기 때문에 SMPP 프로토콜에는 SMPP 세션을 활성 상태로 유지하고 끝점간에 데이터를 교환하는 데 사용되는 많은 명령이 있습니다. SMPP 세션을 시작할 때 ESME는 네 개의 바인드 명령 (bind_receiver , bind_transmitter, bind_transceiver 또는 outbind)를 역할 (수신자, 송신자 또는 둘 다)에 따라 SMSC에 전달합니다. 각 명령은 확인되어야합니다 (예 : bind_receiver 명령에 대한 bind_receiver_resp 확인 응답 사용). 그 후에 ping (enquire_link)을 주기적으로 보내야 연결이 열립니 다. 마지막으로, 텍스트 메시지가 보내지면 구성 요소의 상태에 따라 다른 명령 명령이 사용됩니다.
다른 한편, SIP의 경우는 단순합니다. 메시지는 일반 텍스트 SIP 메시지 ( RFC 3428 ) 패킷을 사용하여 생성됩니다. 이러한 메시지는 SIP (UDP, TCP, TLS, SCTP, WebSocket)에서 지원되는 모든 전송 프로토콜 (UDP 인 가장 일반적인 프로토콜)을 사용하여 SIP 끝점과 프록시간에 교환 될 수 있습니다. 전송 된 각 SIP 메시지는 200 OK를 사용하여 수신자가 확인해야합니다. 그리고 그게 다야.
따라서 두 프로토콜이 행동 관점에서 호환되지 않음이 분명합니다. 그러나 하루가 끝나면 두 프로토콜 모두 (주로) 텍스트 메시지를 전송하는 데 사용됩니다. 따라서 실제 메시지 페이로드 및 메타 데이터가있는 한 우리가 사용해야하는 전송 프로토콜에 따라 메시지를 작성해야합니다.
구성
OpenSIPS 설치에서 SMPP 연결을 사용하려면 proto_smpp 모듈을로드하고 통신에 사용할 수신기를 정의해야합니다.
듣기 = smpp : 127.0.0.1 : 2775
...
load_module "proto_smpp.so"
이전 섹션에서 설명한 것처럼 SMSC가 ESME에 메시지를 전달할 수 있으려면 모든 SMPP 연결을 미리 만들어야합니다. 이는 시작시 OpenSIPS가 자동으로 수행합니다. 시작되어야하는 모든 연결은 필요한 모든 매개 변수와 함께 데이터베이스에 설명됩니다. 따라서 스크립트에서 설정해야 할 다음 작업은 데이터베이스에 연결하는 것입니다.
mysql : // opensips : opensipsrw @ localhost / opensips
다음은 송수신기로 SMSC에 연결하는 데 사용되는 SMPP 연결을 설명하는 MySQL 레코드의 예입니다 (session_type = 1).
이름 : SMPP_test
ip : 127.0.0.1
포트 : 2777
system_id : smpp
비밀번호 : 테스트
system_type :
src_ton : 2
src_npi : 1
dst_ton : 2
dst_npi : 1
session_type : 1
name : 스크립트에서이 SMPP 연결을 참조하는 데 사용되는 임의의 고유 한 이름을 나타냅니다.
ip 및 port : SMSC에 연결하는 데 필요한 TCP 정보
system_id (사용자 이름이라고도 함) 및 암호 가 인증에 사용됩니다.
system_type 은 일부 SMPP 공급자가 필요로하는 필드이며 일반적으로 연결에서 사용할 수있는 서비스 유형을 식별하는 데 사용됩니다
발신지 ( src_ton ) 및 수신자 ( dst_ton )의 TON (번호 유형)은 발신자와 수신자에 사용되는 번호의 형식을 나타냅니다. 일반적인 값은 다음과 같습니다.
0 - 알 수 없음
1 - 국제
2 - 내셔널
3 - 특정 네트워크
4 - 가입자 번호
5 - 영숫자
6 - 약식
원본 ( src_npi ) 및 대상 ( dst_npi )의 NPI (번호 계획 지표)는 클라이언트에 사용되는 번호 매기기 구성표를 나타냅니다. 일반적인 값은 다음과 같습니다.
0 - 알 수 없음
1 - ISDN / 전화 번호 계획 (E163 / E164)
3 - 데이터 번호 계획 (X.121)
4 - 텔렉스 번호 매기기 계획 (F.69)
6 - 육상 이동 통신사 (E.212)
8 - 국가 번호 계획
9 - 개인 번호 매기기 계획
10 - ERMES 번호 매기기 계획 (ETSI DE / PS 3 01-3)
13 - 인터넷 (IP)
18 - WAP 클라이언트 ID (WAP 포럼에서 정의)
session_type 은 연결 유형을 지정하는 데 사용되며 다음 값 중 하나를 가져야합니다.
1 - 트랜시버
2 - 송신기
3 - 수신기
4 - 아웃 바인드
연결이 시작되면 OpenSIPS는이를 사용하여 동료와 메시지를 교환 할 수 있습니다. 모듈은 백그라운드에서 모든 SMPP 프로토콜의 특성을 처리합니다.
SIP에서 SMPP 게이트웨이로
SIP 엔티티에서 텍스트 메시지를 가져 오는 경우 스크립트를 실행하여 다른 SIP 요청과 마찬가지로 처리됩니다. 라우팅 논리에 따라 메시지가 SMSC에 끝나야하는 경우 send_smpp_message () 메서드를 호출하여 사용해야 하는 SMSC를 지정하기 만하면 됩니다.
if (is_method ( "MESSAGE") && isflagset (TO_SMPP_TEST))
send_smpp_message ( "SMPP_test");
SMPP에서 SIP 게이트웨이로
SMSC에서 SMPP를 통한 OpenSIPS로 메시지를 보내면 상황이 좀 더 복잡해집니다. SMPP 메시지는 바이너리 인코딩되어 있기 때문에 직접 스크립트로 보낼 수 없습니다. 대신 SIP 메시지로 변환되고 자동으로 outbound_uri 매개 변수로 표시된 SIP 서버 또는 프록시로 전송됩니다. 일반적으로 URI는 동일한 OpenSIPS 인스턴스를 가리키지 만 메시지는 SIP를 통해 전송됩니다. 즉, 다음 홉 또는 최종 대상을 결정하기위한 스크립트를 입력 할 수 있습니다.
수신 대기 = udp : 127.0.0.1 : 5060
...
# 루프백 된 모든 SMPP 메시지를 동일한 인스턴스로 보냅니다.
modparam ( "proto_smpp", "outbound_uri", "sip : 127.0.0.1 : 5060")
...
경로 {
...
if (is_method ( "MESSAGE") && $ Ri == "127.0.0.1") {
# SMPP를 통해받은 메시지를 처리합니다.
...
}
...
}
SIP와 SMPP의 양방향 게이트웨이가 있습니다.
결론
단 몇 줄의 구성과 새로운 SMPP 모듈을 사용하면 텍스트 메시지를 보내는 새로운 방법으로 OpenSIPS 기반 VoIP 플랫폼을 쉽게 향상시킬 수 있습니다. 이 기능을 설정하는 동안 문제가 발생하면 알려주세요!
OpenSIPS 에서 새로운 SMPP 모듈 을 개발하고 테스트 한 Victor Ciurel 에게 특별한 감사를드립니다!