概念和疑難排解

本頁詳細說明整合所需的特定設定,以及常見問題的疑難排解方式。

電話網路需求

如果網路會篩選輸出流量,則必須允許 SIP 訊號和媒體串流的輸出流量。

如要使用 SIP 信號,請允許通訊埠 5672 上整個 IP 範圍 74.125.88.128/25 (TCP)。如要設定更嚴格的防火牆規則,您可以將 SIP 訊號限制為一或多個區域化 GTP SIP 伺服器:

  • 美國地區:us.telephony.goog (74.125.88.132)
  • 歐盟區域: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 供應商/型號和韌體版本。韌體版本中會連結各供應商的詳細整合說明。

供應商和型號 韌體版本
AudioCodes VE SBC v7.40A.500.786
Avaya Session Border Controller for Enterprise v8.1.3.2-38-22279v10.2.0.0-86-24077
Oracle E-SBC Acme Packet 3900 SCZ9.3.0 正式版 (建構版本 46)
Ribbon Swe Core SBC v11.01.01R005
Cisco Unified Border Element (CUBE) v17.15.03a

支援的 SBC 信號和媒體通訊協定

信號通訊協定 SIP over TLS
媒體 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.createConversationOnTheFly 設為 true。在 SIP INVITE 期間,應使用 Call-InfoUUI 的 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 中要求的相同資料,並將網址編碼為十六進位,且將用途設為 Goog-ContactCenter-Conversation。以下是標頭範例,其中解碼後的十六進位字串為 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

如需將其他資料傳遞至對話式代理程式,並設為工作階段參數,請傳遞以半形分號分隔的鍵值組清單 (以十六進位編碼),然後加上 ;encoding=hex;purpose=Goog-Session-Param。這會建立名為「uui-headers」的會期參數,其中包含已解碼的酬載字串清單。

舉例來說,如果需要傳入字串 key1=value1;key2=value2,系統會傳送下列 UUI 標頭,其中酬載是 key1=value1;key2=value2 的十六進位編碼值。

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)

以下範例顯示從 Playbook 程式碼區塊中的觸發程序呼叫的函式,例如 @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 ""

如要傳送其他資料,可以使用具有不同「purpose」值的個別 UUI 標頭。這些值會新增至 Conversation.telephonyConnectionInfo 物件。請注意,Conversational Agents (Dialogflow CX) 虛擬服務專員在執行階段無法存取這項資料。

傳遞真人服務專員資訊

如要傳遞與真人服務專員相關的資訊,您可以將真人服務專員的 Session Description Protocol (SDP) 媒體標籤屬性,設定為 Real-time Transport Protocol (RTP) 串流的必要資料值。範例: none a=label:7382373482 這項資料會填入 sip_recording_media_label 欄位,並顯示在含有轉錄稿的 New message notification pubsub 主題中。在 pubsub Message.attributes 訊息中尋找 sip_recording_media_label 欄位。

設定參與者角色和媒體串流順序

根據預設,第一個媒體串流會與 END_USER 參與者角色建立關聯,後續的媒體串流則會與 HUMAN_AGENT 參與者角色建立關聯。

如需不同行為 (例如在撥出電話系統中),則標頭中傳遞的網址應附加 roles 參數。

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

網址指定第一個媒體串流應具有 HUMAN_AGENT 角色,第二個媒體串流應具有 END_USER 角色。您可以使用 Call-InfoUUI 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 欄位中設定的號碼。您的酬載應類似下列程式碼範例。

{
    "sip-refer": true
}

如要將資料傳出 Conversational Agents (Dialogflow CX),可以使用 UUI 標頭傳出資料字串。如果您想執行 SIP REFER 並傳遞 2 個鍵/值組合,可以使用類似下列程式碼範例的酬載。

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

這會產生包含下列 UUI 標頭的 SIP REFER。

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

在 SIP BYE 中傳遞資料

前往 End Session 會觸發 SIP BYE。如要將資料傳出 Conversational Agents (Dialogflow CX),可以使用 UUI 標頭傳出資料字串。您會將呼叫路徑導向至定義 Live agent handoff 酬載的網頁,類似於下列程式碼範例,然後轉換至 End Session

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

這會產生 SIP BYE,並包含下列 UUI 標頭。

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

在遠端來電者掛斷電話時觸發動作

新的 BiDi API (ConversationProfile 中的 use_bidi_streaming=True) 支援在遠端來電者掛斷電話時,觸發劇本中的工具呼叫或流程中的 Webhook 呼叫。

遠端來電者掛斷電話,且 Conversational Agents (Dialogflow CX) 收到 SIP BYE 訊息時,就會觸發自訂事件 sys.remote-call-disconnected。如果您使用這個特定事件名稱建立處理常式,就可以在流程中使用 Playbook 或 Webhook 呼叫,藉此觸發工具呼叫。

疑難排解

Google 團隊可能會要求您提供下列構件,協助排解 SIP OPTIONS Ping 和測試通話問題:

  1. 網路封包擷取
  2. SIP 偵錯追蹤記錄,顯示完整標頭和 SIP SDP:
    • 通話 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 會傳回自己的伺服器 TLS 憑證,並由 SBC 進行驗證。
      • SBC 會傳送自己的用戶端 TLS 憑證,並由 GTP 進行驗證。
    • 已建立加密管道,如「加密握手訊息」所示。
    • 透過 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 拒絕錯誤) 回應代碼可能表示配額相關問題。如要瞭解如何申請提高配額,請參閱「配額與限制」頁面。