개념 및 문제 해결

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

전화 네트워크 요구사항

네트워크에서 발신 트래픽을 필터링하는 경우 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)
  • 아시아 태평양 리전: 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 공급업체 또는 모델과 펌웨어 버전이 나와 있습니다. 펌웨어 버전에 연결된 각 공급업체의 자세한 통합 안내를 확인할 수 있습니다.

공급업체 및 모델 펌웨어 버전 (SIPREC, SIP)
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)
미디어 SRTP (보안 실시간 전송 프로토콜)
미디어 암호화 SDES (SDP 보안 설명)
지원되는 미디어 암호화 스위트 AES_CM_128_HMAC_SHA1_80, AEAD_AES_256_GCM
지원되는 미디어 코덱 G.711 µ-law (PCMU), G.711 A-law (PCMA), Opus

SIP 헤더

대화 프로필 및 전화번호를 설정할 때 sipConfig.createConversationOnTheFly가 true로 설정된 CCAI 대화 프로필을 만들었습니다. SIP INVITE 중에 Call-Info 또는 UUI의 SIP 헤더 값을 사용하여 대화 ID를 동적으로 생성해야 합니다.

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

  1. Google Cloud 프로젝트 ID는 Google Cloud 프로젝트를 설정할 때 사용한 프로젝트입니다.
  2. 대화 ID는 SBC에서 동적으로 생성해야 합니다. 대화 ID는 정규 표현식 수식 [a-zA-Z][a-zA-Z0-9_-]*을 준수해야 하며 문자 길이는 3~64자(영문 기준)여야 합니다. 대화 ID를 동적으로 생성하려면 SIP INVITE에서 Call-ID 값을 가져와서 이전에 지정된 정규 표현식을 준수하도록 문자 앞에 접두사를 추가하는 일반적인 패턴을 사용합니다. 예를 들어 Call-ID 값이 297363723_79131759_799783510인 경우 앞에 "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 (사용자 간) SIP 헤더를 구성하여 대화 ID를 전달할 수 있습니다.

Call-Info에서 요청된 것과 동일한 데이터를 사용하되 URL은 16진수로 인코딩하고 목적은 Goog-ContactCenter-Conversation로 설정합니다. 다음은 헤더의 예시입니다. 여기서 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 문자열을 전달해야 하는 경우 다음 UUI 헤더가 전송됩니다. 여기서 페이로드는 key1=value1;key2=value2의 16진수 인코딩 값입니다.

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

상담사 정보 전달

상담사 관련 정보를 전달해야 하는 경우 상담사 실시간 전송 프로토콜 (RTP) 스트림의 세션 설명 프로토콜 (SDP) 미디어 라벨 속성을 필수 데이터 값으로 설정할 수 있습니다.

예:

a=label:7382373482

이 데이터는 sip_recording_media_label 필드에 채워지며 스크립트가 포함된 New message notification Pub/Sub 주제에서 사용할 수 있습니다. pubsub Message.attributes 메시지에서 sip_recording_media_label 필드를 찾습니다.

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

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

아웃바운드 전화 시스템과 같이 다른 동작이 필요한 경우 헤더에 전달된 URL에 roles 매개변수를 추가해야 합니다.

예:

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 헤더를 사용하여 역할 매개변수를 적용할 수 있습니다.

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

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

초기 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-헤더를 사용하여 데이터 문자열을 전달할 수 있습니다. SIP REFER를 수행하고 UUI 헤더와 x-헤더 2개에 키-값 쌍 2개를 전달하려면 다음 코드 샘플과 유사한 Live agent handoff 페이로드를 사용하면 됩니다.

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

그러면 다음 UUI 및 x-헤더가 포함된 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-헤더를 사용하여 데이터 문자열을 전달할 수 있습니다. SIP INVITE를 실행하고 UUI 헤더와 x-헤더 2개에 키-값 쌍 2개를 전달하려면 다음 코드 샘플과 유사한 Live agent handoff 페이로드를 사용하면 됩니다.

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

그러면 다음 UUI 및 x-헤더가 포함된 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-헤더를 사용하여 데이터 문자열을 전달하면 됩니다. End Session로 전환하기 전에 다음 코드 샘플과 유사한 Live agent handoff 페이로드를 정의하는 페이지로 호출을 라우팅할 수 있습니다.

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

그러면 다음 UUI 및 x-헤더가 포함된 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 (대화 프로필의 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 핑 및 테스트 통화 문제 해결에 도움이 되는 다음 아티팩트를 제공해 달라고 요청할 수 있습니다.

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

네트워크 패킷 캡처

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

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

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

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

    TLS 연결을 설정할 수 없는 경우 다음과 같은 문제가 있을 수 있습니다. - GTP 측에 SIP 트렁크가 생성되지 않았습니다. - SIP 트렁크에 구성된 FQDN이 SBC의 TLS 인증서 (CN 또는 SAN 속성)에 표시된 FQDN과 일치하지 않습니다. - TLS 버전 1.2 이상만 지원되므로 TLS 버전이 지원되지 않습니다. - 요청된 암호화 스위트가 지원되지 않습니다. SBC의 TLS 구성을 참고하세요. - 신뢰할 수 없는 TLS 인증서 제공업체. SBC의 TLS 구성을 참고하세요.

  3. SIP 디버그 trace에 다음이 표시됩니다.

    • 고객 Call-Info SIP 헤더가 다음 형식으로 삽입됩니다.

      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
      
    • SIP 헤더에는 전화번호가 E.164 형식 (+16501234567)으로 표시됩니다.

    • SIP 헤더는 요청 URI 및 To, From, Via와 같은 기타 SIP 헤더 필드에 사용되는 공개 IP 주소를 표시합니다. 비공개 IP 주소는 거부됩니다.

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

    • GTP는 기본적으로 첫 번째 미디어 스트림을 최종 사용자로 처리하므로 최종 사용자 스트림을 먼저 전송한 후 상담사의 미디어 스트림을 두 번째로 전송합니다.

    SIP 오류 응답 코드가 표시되는 경우:

    • SIP 400 클래스 오류(예: 488 Not Acceptable Here)는 GTP가 SIP 헤더 또는 SIP 미디어 SDP 구성을 거부했음을 나타냅니다.
    • SIP 603 거부 오류와 같은 SIP 600 클래스 오류는 할당량 관련 문제를 나타냅니다. 상향 요청 방법에 대한 자세한 내용은 할당량 및 한도 페이지를 참조하세요.