思科可能会在某些地方提供本内容的当地语言翻译版本。请注意,翻译版本仅供参考,如有任何不一致之处,以本内容的英文版本为准。
思科采用人工翻译与机器翻译相结合的方式将此文档翻译成不同语言,希望全球的用户都能通过各自的语言得到支持性的内容。 请注意:即使是最好的机器翻译,其准确度也不及专业翻译人员的水平。 Cisco Systems, Inc. 对于翻译的准确性不承担任何责任,并建议您总是参考英文原始文档(已提供链接)。
本文档介绍使用同步HTTP(BOSH)双向流的Finesse连接的架构,以及如何诊断BOSH连接问题。
Cisco 建议您了解以下主题:
本文档中的信息基于以下软件和硬件版本:
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
可扩展消息和在线状态协议(XMPP)(也称为Jabber)是客户端 — 服务器模型中的状态协议。XMPP允许将少量结构化可扩展标记语言(XML)数据从一个实体快速传送到另一个实体。XMPP/Jabber广泛用于即时消息(IM)和在线状态应用。
所有XMPP实体都由其Jabber ID(JID)标识。
JID编址方案:user@domain/resource
用户 | XMPP服务器上的客户端用户名或会议室的名称 |
域 | XMPP服务器完全限定域名(FQDN) |
资源 | 用户特定实体/终端(例如,笔记本电脑、智能手机等)的标识符、会话标识符或公共节点名称 |
注意:并非所有情况下都使用所有三个JID组件。服务器通常只由域定义,由user@domain定义的会议室,由user@domain/resource定义的客户端。
XMPP消息称为stanza。XMPP中有三个核心标准:
1.<message>:一个方向,一个收件人
2.<presence>:一个方向,发布到多个
3.<iq>:信息/查询 — 请求/响应
所有stanz必须和来自地址,大多数stanz也具有type、id和xml:langattributes。
Stanza属性 | 目的 |
至 | 目的JID |
从 | 源JID |
类型 | 消息的目的 |
id | 用于将请求与<iq>标准的响应链接的唯一标识符 |
xml:lang | 定义标准中任何可读XML的默认语言 |
<message to='person1@example' from='person2@example' type='chat'>
<subject> Team meeting </subject>
<body>Hey, when is our meeting today? </body>
<thread>A4567423</thread>
</message>
如果Web应用需要与XMPP配合使用,会出现多个问题。浏览器本地不支持基于传输控制协议(TCP)的XMPP,因此所有XMPP流量必须由在浏览器内运行的程序处理。Web服务器和浏览器通过超文本传输协议(HTTP)消息进行通信,因此Finesse和其他Web应用程序在HTTP消息内包装XMPP消息。
此方法的第一个困难是HTTP是无状态协议。这意味着每个HTTP请求与任何其他请求都不相关。但是,此问题可以通过应用手段解决 — 例如使用cookie/post数据。
第二个困难是HTTP的单向行为。仅客户端发送请求,服务器只能响应。由于服务器无法推送数据,因此在HTTP上实施XMPP是不自然的。
此问题在原始XMPP核心规范(RFC 6120)中不存在,其中XMPP绑定到TCP。但是,如果要解决绑定到HTTP的XMPP的问题,例如,由于Javascript可以发送HTTP请求,因此有两种可能的解决方案。两者都需要HTTP和XMPP之间的网桥。
推荐的解决方案包括:
1.轮询(传统协议):重复的HTTP请求,请求XEP-0025中定义的新数据:Jabber HTTP轮询
2.长轮询也称为BOSH:传输协议,它通过高效使用多个同步HTTP请求/响应对来模拟两个实体之间长期双向TCP连接的语义,而不需要使用XEP-0124中定义的频繁轮询:XEP-0206的HTTP绑定和扩展:基于BOSH的XMPP
Finesse实施BOSH,因为它从服务器负载角度和流量方面都非常高效。使用BOSH的目的是掩盖服务器在收到请求时不必立即作出响应的事实。响应被延迟到指定的时间,直到服务器有客户端的数据,然后作为响应发送。一旦客户端收到响应,客户端就会发出新请求等。
Finesse桌面客户端(Web应用)每30秒通过TCP端口7443建立一个过时的BOSH连接。30秒后,如果Finesse通知服务没有更新,通知服务将发送HTTP应答,其中200 OK和(几乎)空响应正文。例如,如果通知服务具有有关座席或对话(呼叫)事件的更新,则数据会立即发送到Finesse Web客户端。
此示例显示Finesse客户端和Finesse服务器之间共享的第一个XMPP消息请求响应,以设置BOSH连接。
Finesse client request:
<body xmlns="http://jabber.org/protocol/httpbind" xml:lang="en-US" xmlns:xmpp="urn:xmpp:xbosh" hold="1" ver="1.9" to="fin1.ucce.local" wait="30" xmpp:version="1.0" from="47483648@fin1.ucce.local" rid="704654808"/>
Finesse server response:
<body xmlns="http://jabber.org/protocol/httpbind" xmlns:stream="http://etherx.jabber.org/streams" authid="26779701" sid="26779701" secure="true" requests="4" inactivity="60" polling="5" wait="30" hold="1" ack="704654808" maxpause="300" ver="1.6"><stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism></mechanisms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></stream:features></body>
综述:
Finesse还实施XMPP规范XEP-0060:发布 — 订阅。此规范的目的是允许XMPP服务器(通知服务)获取发布到XMPP节点(主题)的信息,然后将XMPP事件发送到订用到该节点的实体。在Finesse中,计算机电话集成(CTI)服务器将CTI消息发送到Finesse Web服务,以告知Finesse有关配置更新,例如(但不限于)座席或联系服务队列(CSQ)创建或有关呼叫的信息。然后,此信息将转换为Finesse Web服务发布到Finesse通知服务的XMPP消息。然后,Finesse通知服务将XMPP over BOSH消息发送到订用到某些XMPP节点的代理。
在《Finesse Web Services开发人员指南》中定义的一些Finesse API对象是XMPP节点。座席和主管Finesse Web客户端可以订用这些XMPP节点中某些节点的事件更新,以获得有关实时事件(如呼叫事件、状态事件等)的最新信息。 此表显示已启用pubsub的XMPP节点。
Finesse API对象 | 目的 | 订用 |
/finesse/api/user/<LoginID> | 显示座席的状态和组映射 | 座席和主管 |
/finesse/api/user/<LoginID>/对话框 |
显示座席正在处理的呼叫 | 座席和主管 |
/finesse/api/user/<LoginID>/ClientLog |
用于从“发送错误报告”按钮捕获客户端日志 | 座席和主管 |
/finesse/api/user/<LoginID>/Queue/<queueID> |
显示队列统计信息数据(如果已启用) | 座席和主管 |
/finesse/api/Team/<TeamID>/Users |
显示属于特定组的座席,包括状态信息 | 主管 |
/finesse/api/SystemInfo |
显示Finesse服务器的状态。用于确定是否需要故障切换 | 座席和主管 |
步骤1.下载并安装XMPP客户端Pidgin。
步骤2.导航至“帐户”>“修改”>“基本”并配置“登录选项:
步骤3.导航至“帐户”>“修改”>“高级”并配置:
注意:使用端口5222,因为只有Finesse Web客户端可以使用端口7443连接到通知服务。
步骤4.导航至“工具”>“插件”并启用XMPP控制台。
步骤5.导航至“工具”>“XMPP控制台”>“XMPP控制台”以打开“XMPP控制台”。
步骤6.执行此<iq>消息,以查看存在的所有XMPP节点。
例如:
在配置了两个代理和两个CSQ的实验环境中,Finesse响应中包含以下输出:
每个浏览器都有一组开发人员工具。开发人员工具的Network选项卡显示Finesse Web客户端(浏览器)发送和接收的HTTP消息。 例如,此图显示Finesse Web客户端如何发送SystemInfo请求,该请求每分钟检查Finesse Tomcat状态,作为故障转移检查。此外,还显示来自BOSH连接的http-bind消息。如果Web客户端订用的XMPP节点上没有要发布的更新,则Finesse服务器会在30秒内发送回响应。
发生BOSH断开连接时,出现错误“Lost connection to {Finesse Server FQDN}(与{Finesse服务器FQDN}的连接丢失)。Please wait for a reachable Finesse Server to be found...”显示在Finesse桌面顶部的红色标语中。
此消息显示,因为此时无法从Cisco Finesse通知服务接收XMPP订用事件。因此,状态信息和呼叫详细信息无法显示在座席桌面上。
对于UCCX,在浏览器断开后60秒内,座席将进入注销状态。座席可以处于“就绪”或“未就绪”状态,以便注销。
对于UCCE,Finesse最多需要120秒来检测代理关闭浏览器或浏览器崩溃的时间,Finesse在向CTI服务器发送强制注销请求之前等待60秒,这会导致CTI服务器将代理置于未就绪状态。在这些情况下,Finesse可能需要180秒才能注销座席。与UCCX不同,座席将进入“未就绪”状态,而不是“注销”状态。
注意:UCCE中的CTI断开连接未就绪与注销状态行为由PG/LOAD参数控制。根据《统一联系中心企业版和托管版10.0(1)发行版注释》,从UCCE 10.0开始,/LOAD参数已弃用。
有关UCCE Finesse桌面行为的详细信息,请参阅《Cisco Finesse管理指南》中“Cisco Finesse故障转移机制”一章的“桌面行为”部分。
注意:计时器值可能会根据产品要求在未来更改。
Finesse和UCCX通知服务日志可通过RTMT或CLI收集:
文件获取activelog /desktop recurs compress
注意:仅在重现问题时设置调试级别日志。重现问题后关闭调试。
注意:Finesse 9.0(1)没有调试级别日志记录。Finesse 9.1(1)中引入了调试级别日志记录。 在9.1(1)中启用日志记录的过程与Finesse 10.0(1)- 11.6(1)不同。 对于此过程,请参阅《Finesse管理和适用性指南》。
启用Unified Contact Center Express(UCCX)的通知服务调试日志,如图所示:
admin:utils uccx notification-service log enable
WARNING! Enabling Cisco Unified CCX Notification Service logging can affect system performance
and should be disabled when logging is not required.
Do you want to proceed (yes/no)? yes
Cisco Unified CCX Notification Service logging enabled successfully.
NOTE: Logging will be disabled automatically if Cisco Unified CCX Notification Service is restarted.
启用Unified Contact Center Enterprise(UCCE)(Finesse独立版)的通知服务调试日志,如下所示:
admin:utils finesse notification logging enable
Checking that the Cisco Finesse Notification Service is started...
The Cisco Finesse Notification Service is started.
Cisco Finesse Notification Service logging is now enabled.
WARNING! Cisco Finesse Notification Service logging can affect system performance
and should be disabled when logging is not required.
Note: Logging will be disabled automatically if you restart the Cisco Finesse Notification Service
这些日志位于/desktop/logs/openfire文件夹中,名为debug.log。
如图所示,通知服务(Openfire)debug.log显示与桌面的http绑定以及代理PC的IP地址和端口。
如图所示,最后一个活动0毫秒显示会话仍处于活动状态。
Openfire关闭空闲会话表示座席注销将在60秒后触发,Finesse将向CTI服务器发送强制注销,原因代码为255。在这些条件下,桌面的实际行为取决于UCCE中Logout on Agent Disconnect(LOAD)的设置。在UCCX中,这始终是行为。
如果Finese客户端未向Finesse服务器发送http-bind消息,日志将显示会话启动时间并显示会话关闭。
2017.06.17 00:14:34 Session (id=f382a015) was last active 0 ms ago: 1001003@xxxxx.xxxx.xxx.cisco.com/desktop 2017.06.17 00:15:04 Session (id=f382a015) was last active 13230 ms ago: 1001003@xxxxx.xxxx.xxx.cisco.com/desktop 2017.06.17 00:15:34 Session (id=f382a015) was last active 43230 ms ago: 1001003@xxxxx.xxxx.xxx.cisco.com/desktop 2017.06.17 00:16:04 Session (id=f382a015) was last active 63231 ms ago: 1001003@xxxxx.xxxx.xxx.cisco.com/desktop 2017.06.17 00:17:04 Unable to route packet. No session is available so store offline. <message from="pubsub. xxxxx.xxxx.xxx.cisco. com" to="1001003@xxxxx.xxxx.xxx.cisco.com.cisco.com" id="/finesse/api/User/1001003__1001003@xxxxx.xxxx.xxx.cisco.com__o5Aqb"><event xmlns="http://jabber.org/protocol/pubsub#event"><items node="/finesse/api/User/1001003"><item id="0d78a283-466d-4477-a07e-6e33a856fce388"><notification xmlns="http://jabber.org/protocol/pubsub"><Update>
这些日志位于/desktop/logs/openfire文件夹中,并命名为info.log。如果Finesse客户端未向Finesse服务器发送http-bind消息,日志将显示会话处于非活动状态。
2017.06.17 00:16:04 Closing idle session (id=f382a015): 1001003@xxxxx.xxxx.xxx. cisco.com/desktop after being inactive for more than threshold value of 60 2017.06.17 00:16:04 A session is being closed for 1001003@xxxxx.xxxx.xxx. cisco.com/desktop
这些日志位于/desktop/logs/webservices文件夹中,命名为Desktop-webservices.YYYY-MM-DDTHH-MM-SS.sss.log。如果Fincese客户端未在指定的时间内向Finesse服务器发送http-bind消息,则日志将显示代理在线状态变为不可用,60秒后将发生演示驱动注销。
0000001043: XX.XX.XX.XXX: Jun 17 2017 00:16:04.630 +0530: %CCBU_Smack Listener Processor (1)-6-PRESENCE_NOTIFICATION_RECIEVED: %[FROM JID=1001003@xxxxx.xxxx.xxx.cisco.com/desktop][PRESENCE_TYPE=unavailable]:Finesse received a presence notifcation 0000000417: XX.XX.XX.XXX: Jun 17 2017 00:16:04.631 +0530: %CCBU_Smack Listener Processor (1)-6-UNSUBSCRIBE_REQUEST_SUCCESS: %[NodeId=/finesse/api/User/1001003/ClientLog][user_id=1001003@xxxxx.xxxx.xxx.cisco.com]: Sucessfully unsubscribed from a node on the XMPP server 0000001044: XX.XX.XX.XXX: Jun 17 2017 00:16:04.631 +0530: %CCBU_Smack Listener Processor (1)-6-AGENT_PRESENCE_MONITOR: %[message_string=Adding agent 1001003 into the expiry hash.]: 0000001051: XX.XX.XX.XXX: Jun 17 2017 00:16:35.384 +0530: %CCBU_pool-8-thread-1-6-AGENT_PRESENCE_MONITOR: %[message_string=[Expired] Removed agent from cache 1001003]: 0000001060: XX.XX.XX.XXX:: Jun 17 2017 00:17:04.632 +0530: %CCBU_CoreImpl-worker12-6-PRESENCE DRIVEN LOGOUT: %[agent_id=1001003]: Performing CTI Logout on basis of the agents unavailable presence 0000001061: XX.XX.XX.XXX:: Jun 17 2017 00:17:04.633 +0530: %CCBU_CoreImpl-worker12-6-MESSAGE_TO_CTI_SERVER: %[cti_message=Invoke id :39 , agentstate : 1, workmode : 0, reason code: 255, forceflag :1, agentcapacity: 1, agentext: 1001003, agentid: 1001003, supervisorid: null, ssoFlag=false][cti_message_name=SetAgentStateReq]: Message going to the backend cti server 0000001066: XX.XX.XX.XXX:: Jun 17 2017 00:17:04.643 +0530: %CCBU_CTIMessageEventExecutor-0-6-DECODED_MESSAGE_FROM_CTI_SERVER: %[cti_message=CTIAgentStateEvent [skillGroupState=1 (LOGOUT), stateDuration=0, skillGroupNumber=-1, skillGroupPriority=0, agentState=1 (LOGOUT), eventReasonCode=255, numFltSkillGroups=0, CTIClientSignature=null, agentID=1001003, agentExtension=1001003, agentInstrument=null, agentID_Long=1001003, duration=null, nextAgentState=null, fltSkillGroupNumberList=[], fltSkillGroupIDList=[], fltSkillGroupPriorityList=[], fltSkillGroupStateList=[], MRDId=1, agentMode=0]CTIMessageBean [invokeID=null, cti_sequence_id=105, msgID=30, timeTracker={"id":"AgentStateEvent","CTI_MSG_RECEIVED":1497638824642,"CTI_MSG_DISPATCH":1497638824643}, msgName=AgentStateEvent, deploymentType=CCX]][cti_response_time=1][dispatch_phase=DnD-CHECKPOINT-3B]: Decoded Message to Finesse from backend cti server
BOSH连接由Web客户端设置,Finesse服务器确定代理在线状态是否不可用。这些问题几乎总是与浏览器、代理计算机或网络相关的客户端问题,因为启动连接的责任由客户端承担。
检查以下问题:
一、网络问题:
每分钟,客户端都会连接到Finesse服务器,以计算漂移和网络延迟:
<PC date-time with GMT offset>: : <Finesse FQDN>: <Finesse server date-time with offset>: Header : Client: <date-time>, Server: <date-time>, Drift: <drift> ms, Network Latency (round trip): <RTT> ms
2019-01-11T12:24:14.586 -05:00: : fin1.ucce.local: Jan 11 2019 11:24:14.577 -0600: Header : Client: 2019-01-1
2.不支持的浏览器和/或版本:
根据兼容性表使用支持的浏览器/版本和设置:
3.由于其他选项卡/窗口的内容/处理,浏览器卡住情况:
检查代理工作流程,查看其是否:
4.计算机入睡:
检查座席是否在注销Finesse之前将其计算机置于睡眠状态,或者其计算机睡眠设置计时器是否非常低。
5.客户端计算机上的CPU使用率过高或内存过高问题:
6.第三方小工具在后台执行意外、有问题的活动:
删除所有第三方小工具后,测试Finesse桌面行为。
7.服务器或客户端上的NTP问题:
检查以下问题:
1. Cisco Unified Communications Manager CTIManager服务断开连接。如果UCCX的所有CTIManager提供程序都关闭或崩溃,UCCX代理将看到红色标语错误。如果发生这种情况,UCCE代理不会看到红色标语,但呼叫无法正确路由到代理。
注意:核心转储文件名的格式为:core.<ProcessID>.<SignalNumber>.<ProcessName>.<EpochTime>。
示例:core.24587.6.CTIManager.1533441238
因此,可以从纪元时间确定碰撞的时间。
2. Finesse/UCCX通知服务已停止或崩溃:
如果怀疑发生崩溃,请重新启动Cisco Finesse Tomcat和通知服务。仅在网络关闭情况下建议这样做,否则,这些操作会重新启动从Finesse服务器断开代理的连接。
配置Fiddler可能是一项有些困难的任务,不了解所需步骤和Fiddler的工作原理。Fiddler是中间人Web代理,它位于Finesse客户端(Web浏览器)和Finesse服务器之间。由于Finesse客户端和Finesse服务器之间的连接受到保护,这为Fiddler配置增加了一层复杂性,以便查看安全消息。
由于Fiddler位于Finesse客户端和Finesse服务器之间,因此Fiddler应用需要为所有需要证书的Finesse TCP端口创建签名证书:
Cisco Finesse Tomcat服务证书
Cisco Finesse(Unified CCX)通知服务证书
必须启用HTTPS解密,Fiddler才能代表Finesse服务器动态生成证书。默认情况下不启用此功能。
如果未配置HTTPS解密,则会看到到通知服务的初始隧道连接,但http-bind流量不会。Fiddler仅显示:
Tunnel to <Finesse server FQDN>:7443
然后,客户端必须信任由Fiddler签名的Finesse证书。如果这些证书不受信任,则无法通过Finesse登录的Establishing encrypted connection...阶段。
在某些情况下,从登录中接受证书例外不起作用,并且需要由浏览器手动信任证书。
警告:提供的示例配置适用于实验室环境中Windows 7 x64上的.NET 4.5和Mozilla Firefox 64.0.2(32位)的Fiddler v5.0.20182.28034。这些步骤可能不会推广到所有版本的Fiddler、所有浏览器或所有计算机操作系统。如果网络处于活动状态,请确保您了解任何配置的潜在影响。有关详细信息,请参阅官方的Fiddler文档。
步骤1.下载文件夹
步骤2.启用HTTPS解密:工具>选项> HTTPS >选中解密HTTPS流量复选框
步骤3.打开警告消息框,要求信任Fiddler根证书。选择是。
步骤4.系统将打开一个警告消息框,其中显示“您即将从声明代表以下内容的认证机构(CA)安装证书:DO_NOT_TRUST_FiddlerRoot...是否要安装此证书?”。 选择是。
步骤5.手动将Finesse发布者和订用者证书添加到计算机或浏览器证书信任库。确保端口8445、7443和(仅适用于UCCE)443。例如,在Firefox上,无需从“Finesse操作系统管理”页下载证书即可完成此操作:
选项>在选项(搜索)>证书>服务器>添加例外>位置> 输入https://<Finesse服务器>:port作为两个Finesse服务器的相关端口。
步骤6.登录Finesse并查看http绑定消息,通过Fiddler将Finesse客户端保留到Finesse服务器。
在提供的示例中,前5条消息显示Finesse服务器响应的http-bind消息。第一条消息包含在消息正文中返回的1571字节数据。正文包含有关代理事件的XMPP更新。最终的http-bind消息已由Finesse客户端发送,但尚未从Finesse服务器获得响应。这可以通过查看HTTP结果为空(-),响应正文中的字节数为空(-1)来确定。
更详细地了解数据:
XMPP消息的响应正文:
Wireshark是常用的数据包嗅探工具,可用于嗅探和解码HTTPS流量。HTTPS流量是通过传输层安全(TLS)保护的HTTP流量。TLS为主机之间提供完整性、身份验证和机密性。它常用于Web应用程序,但可以与使用TCP作为传输层协议的任何协议一起使用。安全套接字层(SSL)是TLS协议的前版本,因为它不安全而不再使用。这些名称经常互换使用,用于SSL或TLS流量的Wireshark过滤器是ssl。
警告:提供的示例配置是在实验室环境中为Windows7 x64上的Wireshark 2.6.6(v2.6-0-gdf942cd8)和Mozilla Firefox 64.0.2(32位)提供的。这些步骤可能不会推广到所有版本的Fiddler、所有浏览器或所有计算机操作系统。如果您的网络处于活动状态,请确保您了解任何配置的潜在影响。有关详细信息,请参阅官方的Wireshark SSL文档。需要Wireshark 1.6或更高版本。
注意:此方法仅适用于Firefox和Chrome。此方法对Internet Explorer不起作用。
步骤1.在座席的Windows PC上,导航至“控制面板”>“系统和安全”>“系统”>“高级系统设置”“环境变量……
步骤2.导航至用户<username> > New...的用户变量
创建名为SSLKEYLOGFILE的变量。
创建文件以将SSL预主机密钥存储在专用目录中:SSLKEYLOGFILE=</path/to/private/directory/with/logfile>
注意:创建系统变量而不是用户变量和/或将文件存储在非专用目录中也会起作用,但是,系统上的所有用户都可以访问预主机密钥,这不太安全。
步骤3.如果Firefox或Chrome已打开,请关闭应用。重新打开后,它们将开始写入SSLKEYLOGFILE。
步骤4.在Wireshark上,导航至“编辑”>“首选项……”
导航至Protocols > SSL。
步骤5.输入在步骤2中配置的预主加密日志文件名的位置。
步骤6.使用Wireshark过滤器tcp.port==7443 && ssl,Finesse客户端和Finesse服务器(通知服务)之间的安全HTTP通信被解密。