概念和问题排查

本页详细介绍了集成所需的特定配置,以及常见问题的排查方法。

电话网络要求

如果您的网络会过滤出站流量,则必须允许 SIP 信令的出站流量和媒体流的出站流量。

对于 SIP 信令,应允许通过端口 5672 (TCP) 的整个 IP 范围 74.125.88.128/25。如需设置限制性更高的防火墙规则集,您可以将 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 正式版(Build 46)
Ribbon Swe Core SBC v11.01.01R005
Cisco Unified Border Element (CUBE) v17.15.03a

支持的 SBC 信令和媒体协议

信令协议 基于 TLS 的 SIP
媒体 SRTP
媒体加密 SDES
支持的媒体加密套件 AES_CM_128_HMAC_SHA1_80
支持的媒体编解码器 G.711 µ-law (PCMU)、G.711 A-law (PCMA)

SIP 标头

当您设置对话配置文件和手机号码时,您创建了一个 CCAI 对话配置文件,并将 sipConfig.createConversationOnTheFly 设置为 true。对话 ID 应在 SIP INVITE 期间使用 Call-InfoUUI 的 SIP 标头值动态生成。

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,则在 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

例如:none 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。

使用 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

可以使用具有不同“purpose”值的单独 UUI 标头发送其他数据。这些值会添加到 Conversation.telephonyConnectionInfo 对象。请注意,Conversational Agents (Dialogflow CX) 代理在运行时无法访问此数据。

传入人工客服信息

如果您需要传递特定于人工客服的信息,可以将人工客服的会话描述协议 (SDP) 媒体标签属性、实时传输协议 (RTP) 流设置为所需的数据值。 示例: none a=label:7382373482 此数据将填充到 sip_recording_media_label 字段中,并可在包含转写的 New message notification Pub/Sub 主题中使用。在 Pub/Sub 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 角色。您可以将 roles 参数与 Call-InfoUUI SIP 标头搭配使用。

为指定对话设置其他参数

如需为指定对话设置其他参数,请使用 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
}

问题排查

Google 团队可能会要求您提供以下制品,以帮助排查 SIP OPTIONS ping 和进行的测试通话的问题:

  1. 网络数据包捕获
  2. 显示完整标头和 SIP SDP 的 SIP 调试轨迹:
    • Call-ID 值
    • Call-Info 值(如果存在)

网络数据包捕获

网络数据包捕获应显示以下内容:

  1. 您的 SBC 与 GTP SIP 服务器之间通过 TCP 端口 5672 进行通信,并完成完整的 3 向 TCP 握手(SYN、SYN-ACK、ACK)。如果 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 拒绝错误)响应代码可能表示存在配额相关问题。如需详细了解如何申请增加配额,请参阅“配额和限制”页面

在远程通话方挂断电话时触发操作

新的 BiDi API(ConversationProfile 中的 use_bidi_streaming=True)支持在远程调用方挂断电话时,触发 playbook 中的工具调用或流程中的 webhook 调用。

当远程通话方挂断电话,并且 Conversational Agents (Dialogflow CX) 收到 SIP BYE 消息时,系统会触发自定义事件 sys.remote-call-disconnected。如果您创建具有此特定事件名称的处理程序,则可以使用它在流程中通过 playbook 或 webhook 调用来触发工具调用。