![[AIX、Linux 和 Windows]](../ngalw.gif)
正在解决问题: MQTT 客户机未连接
解决 MQTT 客户机程序未能连接到遥测 (MQXR) 服务的问题。
开始之前
此问题发生于服务器、客户机还是连接? 您是否已使用 C 或 Java MQTT 客户机编写了自己的 MQTT v3 协议处理客户机或 MQTT 客户机应用程序?
请参阅 验证 MQ Telemetry 的安装以获取更多信息,并检查遥测通道和遥测 (MQXR) 服务是否正确运行。
关于本任务
过程
- 考虑可以从遥测 (MQXR) 服务返回到 MqttClient.Connect的原因码中得出哪些推论。 它是哪种类型的连接故障?
选项 描述 REASON_CODE_INVALID_PROTOCOL_VERSION请确保套接字地址对应于遥测通道,并且您未对另一个代理使用同一个套接字地址。
REASON_CODE_INVALID_CLIENT_ID检查客户机标识是否不超过 23 个字节,并且仅包含范围内的字符:
A-Z, a-z, 0-9, './_%REASON_CODE_SERVER_CONNECT_ERROR请检查遥测 (MQXR) 服务和队列管理器是否正常运行。 使用 netstat 来检查是否未将套接字地址分配给另一个应用程序。
如果您已编写 MQTT 客户机库,而不是使用 MQ Telemetry提供的其中一个库,请查看
CONNACK返回码。从这三个错误中您可以推断客户机已连接至遥测 (MQXR) 服务,但该服务已发现错误。
- 请考虑当遥测 (MQXR) 服务未作响应时,可以从客户机生成的原因码中得到哪些推论:
选项 描述 REASON_CODE_CLIENT_EXCEPTION
REASON_CODE_CLIENT_TIMEOUT在服务器上查找 FDC 文件; 请参阅 服务器端日志。 当遥测 (MQXR) 服务检测到客户机发生超时时,它会编写一个首次故障数据捕获 (FDC) 文件。 每当连接意外断开时,它就会编写一个 FDC 文件。
遥测 (MQXR) 服务可能不会对客户机以及客户机到期时的超时情况做出响应。 仅当应用程序设置了无限期超时时, MQ Telemetry Java 客户机才会挂起。 在由于未经诊断的连接问题而导致为 MqttClient.Connect 设置的超时到期之后,客户机就会抛出这些异常之一。
除非您找到了与连接故障相关联的 FDC 文件,否则您无法推断出客户机已尝试连接至服务器:
- 确认客户机是否已发送连接请求。
使用 tcpmon 等工具检查 TCPIP 请求,该工具可从(例如)https://code.google.com/archive/p/tcpmon/ 获取
- 客户机所使用的远程套接字地址与为遥测通道定义的套接字地址相匹配吗?
默认文件持久化类 JavaSE MQTT 客户端随附 MQ Telemetry在客户端工作目录中创建一个名为: clientIdentifier -tcp hostName port 或 clientIdentifier -ssl hostName port 的文件夹。 文件夹名称会告诉您在尝试连接时使用的 hostName 和 port ;请参阅 客户端日志文件和客户端配置文件。
- 您可以对远程服务器地址执行 ping 操作吗?
- 服务器上的 netstat 是否显示遥测通道也在客户机所连接的端口上运行?
- 确认客户机是否已发送连接请求。
- 请检查遥测 (MQXR) 服务是否发现客户机请求问题。
遥测 (MQXR) 服务会将它检测到的错误写入 mqxr_n.log,而队列管理器则会将错误写入 AMQERR01.LOG。
- 尝试通过运行另一个客户机来找出问题。请参阅验证 MQ Telemetry 的安装,以获取更多信息。
在服务器平台上运行样本程序,以消除网络连接的不确定性,然后在客户机平台上运行样本。
- 要检查的其他事项:
- 数以万计的 MQTT 客户机尝试同时进行连接吗?
遥测通道有一个队列,用来缓存储备的入局连接。 一秒钟处理超过 10,000 个连接。 可使用 IBM® MQ Explorer 中的遥测通道向导来配置积压缓冲区的大小。 它的缺省大小是 4096。 请检查是否尚未将储备配置为一个较小值。
- 遥测 (MQXR) 服务和队列管理器是否仍在运行?
- 客户机已连接至一个已切换其 TCPIP 地址的高可用性队列管理器吗?
- 防火墙将有选择地过滤出站或者返回数据包吗?
- 数以万计的 MQTT 客户机尝试同时进行连接吗?