개념 및 문제 해결

이 페이지에서는 통합에 필요한 특정 구성과 일반적인 문제 해결 방법을 자세히 설명합니다.

전화 통신 네트워크 요구사항

네트워크에서 아웃바운드 트래픽을 필터링하는 경우 SIP 신호 및 미디어 스트리밍을 위한 아웃바운드 트래픽을 허용해야 합니다.

SIP 신호의 경우 포트 5672를 통한 전체 IP 범위 74.125.88.128/25 (TCP)가 허용되어야 합니다. 더 제한적인 방화벽 규칙 집합의 경우 SIP 신호를 하나 이상의 지역화된 GTP SIP 서버로만 제한할 수 있습니다.

  • 미국 리전: us.telephony.goog (74.125.88.132)
  • EU 지역: eu.telephony.goog (74.125.88.133)
  • APAC 지역: ap.telephony.goog (74.125.88.134)
  • 남미 리전: sa.telephony.goog (74.125.88.135)

RTP 미디어의 경우 CIDR IP 범위 74.125.39.0/24로 향하는 트래픽을 허용하도록 방화벽 규칙을 구성해야 합니다. 일반적으로 미디어에 필요한 포트는 16384~32767 (TCP+UDP)이지만 이 포트 범위는 향후 확장될 수 있습니다.

지원되는 SBC 공급업체 또는 모델

다음 표에는 지원되는 SBC 공급업체 또는 모델과 펌웨어 버전이 나와 있습니다. 각 공급업체의 자세한 통합 안내는 펌웨어 버전에 연결되어 있습니다.

공급업체 및 모델 펌웨어 버전
AudioCodes VE SBC v7.60A.100.022 (SIPREC, SIP)
Avaya Session Border Controller for Enterprise v10.2.1.1-104-25336 (SIPREC, SIP)
Oracle E-SBC Acme Packet 4600 SCZ9.3.0 GA (빌드 46) (SIPREC, SIP)
Ribbon Swe Core SBC v12.01.07R000 (SIPREC, SIP)
Cisco Unified Border Element (CUBE) v17.15.4 (SIPREC, SIP)

지원되는 SBC 신호 및 미디어 프로토콜

신호 프로토콜 TLS를 통한 SIP
미디어 SRTP
미디어 암호화 SDES
지원되는 미디어 암호화 스위트 AES_CM_128_HMAC_SHA1_80, AEAD_AES_256_GCM
지원되는 미디어 코덱 G.711 μ-law (PCMU), G.711 A-law (PCMA), Opus

SIP 헤더

대화 프로필과 전화번호를 설정할 때, 다음이 포함된 CCAI 대화 프로필을 만들었습니다. sipConfig.createConversationOnTheFlytrue로 설정되었습니다. 대화 ID는 Call-Info 또는 UUI의 SIP 헤더 값을 사용하여 SIP INVITE 중에 동적으로 생성되어야 합니다.

SIP 헤더 값은 Google Cloud 프로젝트 ID와 대화 ID를 정의하여 Dialogflow 엔드포인트를 가리킵니다.

  1. 프로젝트 ID는프로젝트를 설정할 때 사용한 프로젝트입니다. Google Cloud Google Cloud
  2. 대화 ID 는 SBC에서 동적으로 생성되어야 합니다. 대화 ID는 [3,64] 범위의 문자 길이로 정규 표현식 공식 [a-zA-Z][a-zA-Z0-9_-]*를 준수해야 합니다. 대화 ID를 동적으로 생성하는 일반적인 패턴은 SIP INVITE에서 Call-ID 값을 사용하고 이전에 지정된 정규 표현식을 준수하도록 문자를 프리픽스로 추가하는 것입니다. 예를 들어 Call-ID 값이 297363723_79131759_799783510인 경우 Call-ID 값에 "CID-" 를 프리픽스로 추가하면 정규 표현식 [a-zA-Z][a-zA-Z0-9_-]*를 준수하게 됩니다.

Call-Info SIP 헤더

SIP INVITE에 Call-Info라는 맞춤 SIP 헤더를 삽입하여 대화 ID를 고유하게 설정합니다.

Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/$PROJECT_ID/conversations/$CONVERSATION_ID>;purpose=Goog-ContactCenter-Conversation

예:

Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510>;purpose=Goog-ContactCenter-Conversation

UUI SIP 헤더

맞춤 SIP 헤더 Call-Info 설정이 지원되지 않는 경우 SIP INVITE에서 UUI (User-to-User) SIP 헤더를 구성하여 대화 ID를 전달할 수 있습니다.

16진수로 URL 인코딩되고 목적이 Goog-ContactCenter-Conversation으로 설정된 Call-Info에서 요청된 동일한 데이터를 사용합니다. 다음은 디코딩 시 16진수 문자열이 http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510인 헤더의 예입니다.

User-to-User: 687474703a2f2f6469616c6f67666c6f772e676f6f676c65617069732e636f6d2f763262657461312f70726f6a656374732f6763702d70726f6a6563742d69642d31323334352f636f6e766572736174696f6e732f4349442d3239373336333732335f37393133313735395f373939373833353130;encoding=hex;purpose=Goog-ContactCenter-Conversation

추가 데이터를 에이전트에 전달하고 세션 매개변수로 설정해야 하는 경우 16진수로 인코딩된 세미콜론으로 구분된 키-값 쌍 목록을 전달한 후 ;encoding=hex;purpose=Goog-Session-Param을 추가하여 이 작업을 실행할 수 있습니다. 그러면 디코딩된 페이로드 문자열 목록이 포함된 uui-headers라는 이름으로 세션 매개변수가 생성됩니다.

예를 들어 문자열 key1=value1;key2=value2를 전달해야 하는 경우 페이로드가 key1=value1;key2=value2의 16진수 인코딩된 값인 다음 UUI 헤더가 전송됩니다.

User-to-User: 6B6579313D76616C7565313B6B6579323D76616C756532;encoding=hex;purpose=Goog-Session-Param

그러면 다음 세션 매개변수가 생성됩니다.

{
    "uui-headers": ["key1=value1;key2=value2"]
}

SBC에서 여러 UUI 헤더 전송을 지원하는 경우 UUI 헤더당 개별 키-값 문자열을 전송할 수 있으며 uui-headers 세션 매개변수에서 개별 값으로 사용할 수 있습니다.

다음 스니펫은 파라미터 값을 가져온 후 매개변수를 여러 번 분할하여 문자열에서 key2 변수의 적절한 값에 액세스합니다.

$sys.func.GET($sys.func.SPLIT($sys.func.GET($sys.func.SPLIT($session.params.uui-headers,";"),1),"="),1)

다음 예는 플레이북의 코드 블록에서 트리거를 통해 호출되는 함수를 보여줍니다(예:) 플레이북에 입력할 때 호출되는 @PlaybookStartHandler. 다른 함수는 이 함수를 호출하여 uui-headers 매개변수에서 값을 가져옵니다.

def _get_fromuui(attribute):
    try:
        uui_headers_src = history.playbook_input.action_parameters['uui-headers']
        # If uui_headers_src is a string, split by ';'
        if isinstance(uui_headers_src, str):
            headers = uui_headers_src.split(';')
        else:
            # If it's a list, join and split
            headers = ';'.join(uui_headers_src).split(';')
        for header in headers:
            header = header.strip()
            if header.lower().startswith(f"{attribute.lower()}="):
                return header[len(attribute) + 1:]
        return ""
    except Exception:
        return ""

'목적' 값이 다른 별도의 UUI 헤더를 사용하여 추가 데이터를 전송할 수 있습니다. 이러한 값은 Conversation.telephonyConnectionInfo 객체에 추가됩니다. 이 데이터는 런타임에 Dialogflow CX 에이전트에서 사용할 수 없습니다.

SIP x-headers

x-로 시작하는 SIP 헤더는 에이전트에 전달되고 세션 매개변수로 설정될 수 있습니다. SIP 헤더는 x-headers 세션 매개변수에서 사용할 수 있습니다. x- 프리픽스는 세션 매개변수의 헤더 이름에서 삭제됩니다.

예를 들어 SIP INVITE에 다음 헤더가 포함되어 있다고 가정합니다.

x-billing-id: 12345

세션 매개변수 x-headers에는 다음이 포함됩니다.

{
    "x-headers": {
        "billing-id": "12345"
    }
}

값에 액세스하려면 다음을 실행합니다.

$session.params.x-headers.billing-id

상담사 정보 전달

상담사 관련 정보를 전달해야 하는 경우 상담사의 세션 설명 프로토콜 (SDP) 미디어 라벨 속성을 실시간 전송 프로토콜 (RTP) 스트림에 필요한 데이터 값으로 설정할 수 있습니다. 예: none a=label:7382373482 이 데이터는 sip_recording_media_label 필드에 채워지고 트랜스크립트가 포함된 New message notification pubsub 주제에서 사용할 수 있습니다. pubsub Message.attributes 메시지에서 sip_recording_media_label 필드를 찾습니다.

참여자 역할 및 미디어 스트림 순서 구성

기본적으로 첫 번째 미디어 스트림은 END_USER 참여자 역할과 연결되고 후속 미디어 스트림은 HUMAN_AGENT 참여자 역할과 연결됩니다.

다른 동작이 필요한 경우 (예: 아웃바운드 통화 시스템) 헤더에 전달된 URL에 roles 매개변수가 추가되어야 합니다.

예: none http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510?roles=HUMAN_AGENT,END_USER

URL은 첫 번째 미디어 스트림에 HUMAN_AGENT 역할이 있어야 하고 두 번째 미디어 스트림에 END_USER 역할이 있어야 한다고 지정합니다. Call-Info 또는 UUI SIP 헤더를 사용하여 roles 매개변수를 적용할 수 있습니다.

지정된 대화에 추가 매개변수 설정

지정된 대화에 추가 매개변수를 설정하려면 MatchIntentRequest RPC 호출을 사용합니다. query_params.parameters를 필요한 키-값 쌍으로 설정하고 query_input.text를 '매개변수 설정'과 같은 것으로 설정할 수 있습니다.

초기 SIP INVITE에 대한 200 OK 응답 후 API 호출을 실행합니다. 이때 대화가 생성됩니다. MatchIntentRequest의 세션 ID는 INVITE의 Call-Info 헤더에 제공된 대화 ID와 동일합니다.

SIP REFER를 사용하여 SIP 엔드포인트로 통화 트랜스퍼

가상 에이전트에서 SIP 엔드포인트로 통화를 트랜스퍼하려면 SIP REFER 메서드를 사용합니다. Live agent handoff 필드에 페이로드를 포함하고 Telephony transfer call 필드를 아웃바운드 SIP REFER Refer-To 필드에 설정된 번호로 설정합니다. Live agent handoff 페이로드는 다음 코드 샘플과 비슷해야 합니다.

{
    "sip-refer": true
}

Dialogflow CX에서 데이터를 전달해야 하는 경우 UUI 헤더와 x-headers를 사용하여 데이터 문자열을 전달할 수 있습니다. SIP REFER를 실행하고 UUI 헤더에 키-값 쌍 2개와 x-headers 2개를 전달하려면 다음 코드 샘플과 비슷한 Live agent handoff 페이로드를 사용하면 됩니다.

{
    "sip-refer": true,
    "uui-headers": [
        "key1=value1;key2=value2"
    ],
    "x-headers": {
        "header1": "value1",
        "header2": "value2"
    }
}

그러면 다음 UUI 및 x-headers가 포함된 SIP REFER가 생성됩니다.

User-to-User: <hex encoded "key1=value1;key2=value2">;encoding=hex;purpose=Goog-Session-Param
x-header1: value1
x-header2: value2

SIP INVITE를 사용하여 다른 SIP 엔드포인트와 통화 컨퍼런스

최종 고객의 통화를 SIP 엔드포인트를 사용하여 액세스할 수 있는 상담사와 컨퍼런스하려면 SIP INVITE 메서드를 사용합니다. 이렇게 하면 Google이 미디어 경로에 유지되고 Agent Assist 기능을 사용할 수 있습니다. Telephony transfer call 필드를 아웃바운드 SIP INVITE To 필드에 설정된 번호로 설정합니다.

Dialogflow CX에서 데이터를 전달해야 하는 경우 UUI 헤더와 x-headers를 사용하여 데이터 문자열을 전달할 수 있습니다. SIP INVITE를 실행하고 UUI 헤더에 키-값 쌍 2개와 x-headers 2개를 전달하려면 다음 코드 샘플과 비슷한 Live agent handoff 페이로드를 사용하면 됩니다.

{
    "uui-headers": [
        "key1=value1;key2=value2"
    ],
    "x-headers": {
        "header1": "value1",
        "header2": "value2"
    }
}

그러면 다음 UUI 및 x-headers가 포함된 SIP INVITE가 생성됩니다.

User-to-User: <hex encoded "key1=value1;key2=value2">;encoding=hex;purpose=Goog-Session-Param
x-header1: value1
x-header2: value2

SIP BYE에서 데이터 전달

End Session으로 이동하면 SIP BYE가 트리거됩니다. Dialogflow CX에서 데이터를 전달하려면 UUI 헤더 또는 x-headers를 사용하여 데이터 문자열을 전달할 수 있습니다. End Session으로 전환하기 전에 다음 코드 샘플과 비슷한 Live agent handoff 페이로드를 정의한 페이지로 통화를 라우팅합니다.

{
    "uui-headers": [
        "key1=value1;key2=value2"
    ],
    "x-headers": {
        "header1": "value1",
        "header2": "value2"
    }
}

그러면 다음 UUI 및 x-headers가 포함된 SIP BYE가 생성됩니다.

User-to-User: <hex encoded "key1=value1;key2=value2">;encoding=hex;purpose=Goog-Session-Param
x-header1: value1
x-header2: value2

원격 호출자가 전화를 끊을 때 작업 트리거

새 BiDi API (ConversationProfile의 use_bidi_streaming=True)는 원격 호출자가 전화를 끊을 때 플레이북 내에서 도구 호출을 트리거하거나 흐름 내에서 웹훅 호출을 트리거하는 것을 지원합니다.

원격 호출자가 전화를 끊고 Dialogflow CX가 SIP BYE 메시지를 수신하면 맞춤 이벤트 sys.remote-call-disconnected가 트리거됩니다. 이 특정 이벤트 이름으로 핸들러를 만들면 플레이북으로 도구 호출을 트리거하거나 흐름 내에서 웹훅 호출을 트리거하는 데 사용할 수 있습니다.

SBC의 통화만 허용

PSTN의 통화를 거부하고 SBC에서 시작된 통화만 연결하려면 PhoneNumber 객체를 업데이트하여 allowedSipTrunks 메시지를 지정합니다. 통합에서 SIP 트렁크를 사용하는 경우 특정 SIP 트렁크 ID 목록을 지정할 수 있습니다. 메시지가 빈 목록으로 생성되면 모든 SIP 트렁크가 허용됩니다. 비공개 상호 연결이 설정된 경우 Google 전화 통신팀에서 프로비저닝한 통신사 ID를 제공합니다.

문제 해결

Google팀에서 SIP OPTIONS ping 및 실행된 테스트 통화의 문제 해결을 지원하기 위해 다음 아티팩트를 제공해 달라고 요청할 수 있습니다.

  1. 네트워크 패킷 캡처
  2. 전체 헤더 및 SIP SDP를 보여주는 SIP 디버그 추적:
    • Call-ID 값
    • Call-Info 값 (있는 경우)

네트워크 패킷 캡처

네트워크 패킷 캡처에는 다음이 표시되어야 합니다.

  1. TCP 포트 5672를 통해 통신된 SBC와 GTP SIP 서버 간의 완전한 3방향 TCP 핸드셰이크 (SYN, SYN-ACK, ACK). TCP 연결을 설정하지 못한 경우 발생할 수 있는 문제는 다음과 같습니다.

    • 네트워크에서 아웃바운드 트래픽을 차단하고 있습니다.
    • 통신이 지역화된 GTP SIP 서버 중 하나로 전송되지 않습니다. 전화 통신 연결 네트워크 요구사항을 참고하세요.
    • 통신이 TCP 포트 5672를 통해 전송되지 않습니다.
  2. 다음이 포함된 완전한 TLS 연결 핸드셰이크:

    • SBC에서 시작된 TLS v1.2 이상.
    • SBC에서 '클라이언트 Hello'를 시작하고 GTP에서 '서버 Hello'로 응답합니다.
    • 상호 TLS 인증 프로세스.
      • GTP는 SBC에서 인증한 자체 서버 TLS 인증서로 응답합니다.
      • SBC는 GTP에서 인증한 자체 클라이언트 TLS 인증서를 전송합니다.
    • '암호화된 핸드셰이크 메시지'에서 알 수 있듯이 암호화된 채널이 설정되었습니다.
    • TLS 채널을 통해 '애플리케이션 데이터'가 전송되는 증거.

    TLS 연결을 설정하지 못한 경우 발생할 수 있는 문제는 다음과 같습니다.

    • GTP 측에서 SIP 트렁크가 생성되지 않았습니다.
    • 구성된 SIP 트렁크 FQDN이 SBC의 TLS 인증서 (CN 또는 SAN 속성)에 표시된 FQDN과 일치하지 않습니다.
    • TLS 버전이 지원되지 않습니다. TLS 버전 1.2 이상만 지원됩니다.
    • 요청된 암호화 스위트가 지원되지 않습니다. SBC의 TLS 구성을 참고하세요.
    • 신뢰할 수 없는 TLS 인증서 제공업체. SBC의 TLS 구성을 참고하세요.
  3. SIP 디버그 추적에는 다음이 표시되어야 합니다.

    • 고객 Call-Info SIP 헤더가 이 형식으로 삽입되었습니다. none Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/$PROJECT_ID/conversations/$CONVERSATION_ID>;purpose=Goog-ContactCenter-Conversation

      예: none Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510>;purpose=Goog-ContactCenter-Conversation

    • SIP 헤더에 전화번호가 E.164 형식 (+16501234567)으로 표시됩니다.

    • SIP 헤더에 요청 URI 및 기타 SIP 헤더 필드 (예: To, From, Via)에서 사용되는 공개 IP 주소가 표시됩니다. 비공개 IP 주소는 거부됩니다.

    • SIP SDP 연결 정보 (c= ... )는 공개 IP 주소로 지정됩니다. 비공개 IP 주소는 거부됩니다.

    • 미디어 우선순위 지정에서 GTP는 첫 번째 미디어 스트림을 최종 사용자로 기본 처리하므로 최종 사용자 스트림을 먼저 전송한 후 상담사의 미디어 스트림을 두 번째로 전송해야 합니다.

    SIP 오류 응답 코드를 수신하는 경우:

    • SIP 400 오류 (예: 488 Not Acceptable Here) 응답 코드는 GTP에서 SIP 헤더 또는 SIP 미디어 SDP 구성을 거부했음을 나타낼 수 있습니다.
    • SIP 600 오류 (SIP 603 Declined Error) 응답 코드는 할당량 관련 문제를 나타낼 수 있습니다. 증가를 요청하는 방법에 관한 자세한 내용은 할당량 및 한도 페이지를 참고하세요.