本頁詳細說明整合所需的特定設定,以及常見問題的疑難排解方式。
電話網路需求
如果網路會篩選輸出流量,則必須允許 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-22279、v10.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-Info
或 UUI
的 SIP 標頭值,動態產生對話 ID。
SIP 標頭值會定義Google Cloud 專案 ID 和對話 ID,指向 Dialogflow 端點:
- Google Cloud 專案 ID 是您設定 Google Cloud 專案時使用的專案。
- 對話 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-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
欄位中設定的號碼。您的酬載應類似下列程式碼範例。
{
"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 和測試通話問題:
- 網路封包擷取
- SIP 偵錯追蹤記錄,顯示完整標頭和 SIP SDP:
- 通話 ID 值
Call-Info
值 (如有)
網路封包擷取
網路封包擷取畫面應顯示下列內容:
SBC 與 GTP SIP 伺服器之間完成 3 向 TCP 交握 (SYN、SYN-ACK、ACK),並透過 TCP 通訊埠 5672 通訊。如果無法建立 TCP 連線,可能的原因如下:
- 網路封鎖了對外流量。
- 通訊內容未傳送至其中一個區域化 GTP SIP 伺服器。請參閱「電話連線網路需求」。
- 通訊未透過 TCP 通訊埠 5672 傳送。
與下列項目完成傳輸層安全標準 (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 設定」。
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 拒絕錯誤) 回應代碼可能表示配額相關問題。如要瞭解如何申請提高配額,請參閱「配額與限制」頁面。