====== 常见问题 ====== ===== 概述 ===== 本文主要列举使用服务时遇到的常见问题,列举如下: \\ \\ //**业务开通**// * [[mqtt:faq#注册后无法开通MQTT业务|注册后无法开通MQTT业务]] //**客户端集成**// * [[mqtt:faq#哪些开发语言支持集成MQTT客户端|哪些开发语言支持集成MQTT客户端?]] \\ * [[mqtt:faq#小程序是否支持集成MQTT客户端|小程序是否支持集成MQTT客户端?]] \\ * [[mqtt:faq#安卓端如何集成MQTT客户端|安卓端如何集成MQTT客户端?]] \\ * [[mqtt:faq#iOS如何集成MQTT客户端|iOS端如何集成MQTT客户端?]] \\ * [[mqtt:faq#Java端如何集成MQTT客户端|Java端如何集成MQTT客户端?]] \\ * [[mqtt:faq#Web端如何集成MQTT客户端|Web端如何集成MQTT客户端?]] \\ //**服务器端集成**// \\ * [[mqtt:faq#服务器端如何集成MQTT服务|服务器端如何集成MQTT服务?]] \\ //**客户端连接**// * [[mqtt:faq#开通后无法连接mqtt消息云|开通后无法连接MQTT消息云]] * [[mqtt:faq#MQTT客户端连接消息云时_登录密码是选择用户密码还是token|MQTT客户端连接消息云时,登录密码是选择用户密码还是token?]] * [[mqtt:faq#mqtt客户端反复出现断开重连现象|MQTT客户端反复出现断开重连现象?]] * [[mqtt:faq#用户名存在100个限制怎么办?|用户名存在100个限制怎么办?]] * [[mqtt:faq#登录报错信息server_has_closed_connection_without_connack|登录报错信息Server has closed connection without connack]] //**异常排查**// \\ * [[mqtt:faq#如何查看消息是否发送成功|如何查看消息是否发送成功?]] \\ * [[mqtt:faq#如何查看客户端的订阅关系|如何查看客户端的订阅关系?]] \\ * [[mqtt:faq#如何查看客户端的连接记录|如何查看客户端的连接记录?]] \\ * [[mqtt:faq#如何查看客户端是否在线|如何查看客户端是否在线?]] \\ ===== 详细信息 ===== ==== 业务开通 ==== === 1. 注册后无法开通MQTT业务 === **问题描述:** \\ 在注册账户后,登录console控制台,选择【应用列表】中的某一个App,无法开通MQTT业务。 \\ **问题原因:** \\ (1)使用系统提供的默认demo开通,目前该demo暂不支持开通MQTT业务; \\ (2)在console控制台【添加应用】时,数据中心默认为“国内2区”,需要更改为“国内1区”; \\ {{:playground:message:msgbusiness_02.jpg|}} **解决方案:** \\ 新建应用时,数据中心选择“国内一区”。 ==== 客户端集成 ==== === 1.哪些开发语言支持集成MQTT客户端 === **问题描述:** \\ 都有哪些开发语言支持集成MQTT客户端?\\ **解决方案:** \\ MQTT协议属于标准协议,目前已支持多种开发语言集成,包括:Java、iOS、Android、JavaScript、C、Node.js等等。同时集成MQTT客户端可支持两种方式:\\ (1)选择开源的MQTT SDK:社区提供多种开源的MQTT 客户端SDK,环信已将下载链接整理如下,可根据需要下载。[[mqtt:sdkdownload|客户端SDK下载]] \\ (2)基于标准协议进行开发:基于标准的协议开发MQTT客户端,也可无差异对接MQTT服务器。 === 2.小程序是否支持集成MQTT客户端 === **问题描述:** \\ 小程序(微信小程序、支付宝小程序)是否支持集成MQTT客户端?\\ **解决方案:** \\ 支持的,目前微信及支付宝小程序都支持集成MQTT客户端,可选择使用mqtt.min.js SDK。 \\ 集成步骤如下: \\ 步骤1:选择mqtt.min.js开源的SDK,目前测试只有4.2.1之前的版本小程序端可以使用。 \\ 步骤2:配置域名地址,在【微信/支付宝开发者平台】->【开发】->【开发管理】->【开发设置】->【服务域名配置】部分配置获取token的域名地址和服务器连接的域名地址。 \\ (1)服务器连接的域名地址:在console后台【MQTT】->【服务概览】->【服务配置】下的【连接地址】获取; \\ (2)获取token域名地址:在console后台【即时通讯】->【服务概览】->【服务版本】下的【REST API访问地址】获取; \\ 步骤3:获取orgname和appname:appkey由orgname#appname组成,例如“1145210806152081#demo”,orgname为“1145210806152081”,appname为“demo”; \\ 步骤4:设置用户登录账户,在console后台【应用概览】->【用户认证】下创建账户信息。 \\ 步骤5:获取上述参数,配置到环信小程序demo中的相应字段上,即可成功连接服务器实现消息通信。 [[mqtt:qsalisdk|下载支付宝小程序demo]] 和 [[mqtt:qswxsdk|下载微信小程序demo]] \\ === 3.安卓端如何集成MQTT客户端 === **问题描述:** \\ 安卓端如何集成MQTT客户端?\\ **解决方案:** \\ 环信已提供安卓端使用的MQTT demo,下载链接: [[mqtt:qsandroidsdk|安卓端demo]]\\ === 4.iOS端如何集成MQTT客户端 === **问题描述:** \\ iOS端如何集成MQTT客户端?\\ **解决方案:** \\ 环信已提供iOS端使用的MQTT demo,下载链接: [[mqtt:qsiossdk|iOS端demo]]\\ === 5.Java端如何集成MQTT客户端 === **问题描述:** \\ Java端如何集成MQTT客户端?\\ **解决方案:** \\ 环信已提供Java端使用的MQTT demo,下载链接: [[mqtt:qsjavasdk|Java端demo]]\\ === 6.Web端如何集成MQTT客户端 === **问题描述:** \\ Web端如何集成MQTT客户端?\\ **解决方案:** \\ 环信已提供Web端使用的MQTT demo,下载链接: [[mqtt:qswebsdk|Web端demo]]\\ ==== 服务器端集成 ==== === 1.服务器端如何集成MQTT服务 === **问题描述:** \\ 服务器端如何集成MQTT服务?\\ **解决方案:** \\ 为实现客户服务器、环信 MQTT 消息云及客户终端之间进行消息交互,不仅提供了客户终端使用的 SDK,同时提供了服务器端集成方法,详见 [[mqtt:restapisum|REST API方法]]。\\ ==== 客户端连接 ==== === 1.开通后无法连接MQTT消息云 === **问题描述:** \\ 在创建APP后,通过console后台获取的参数,无法连接MQTT消息云。 \\ **问题原因:** \\ (1)认证鉴权信息填写错误:\\ a)如果使用MQTT桌面客户端连接,登录密码直接使用token内容。token在【应用概览】->【用户认证】页面,选择相应账户后的【查看token】按钮获取;\\ b)如果使用代码连接,需要通过【应用概览】->【用户认证】->【用户ID】列表中的username/password先获取token,在通过token进行认证连接; \\ (2)clientID填写错误:\\ a)clientID由两部分组成,形式为“deviceID@AppID”,其中deviceID由用户自定义,AppID通过【服务概览】->【服务配置】中获取。 例:“0023B8@ipd7a0”;\\ b)部分MQTT客户端会在clientID后自动添加时间戳,需要在连接时,将Append timestamp to MQTT client id置false; \\ **解决方案:** \\ MQTT消息云连接需要5个基本参数,包括**连接地址(Host)、端口(Port)、clientID(MQTT client ID)、用户ID(Username)、token(Password)**。 以下图为例,连接5个参数为: \\ 连接地址:aitbj0.cn1.mqtt.chat \\ 端口:1883(mqtt) \\ clientID:0023B8@aitbj0(自定义@AppID) \\ Username:test \\ token:相应用户ID后的【查看token】内容\\ \\ {{:playground:message:client6_n.jpg|}} {{:playground:message:client7_n.jpg|}} === 2.MQTT客户端连接消息云时,登录密码是选择用户密码还是token? === **问题描述:** \\ MQTT客户端连接消息云时,登录密码是选择用户密码还是token值。 \\ **问题原因:** \\ 取决于使用者是否可以对MQTT客户端连接过程进行修改。 \\ (1)如果可以修改,则需要先编写获取token流程,然后使用获取的token进行连接登录。当获取token时,会使用用户名、用户密码、org_name、app_name以及token域名等信息;\\ (2)如果不可以修改,则直接使用token进行连接登录; \\ **解决方案:** \\ 确定使用的MQTT客户端: \\ (1)如果使用MQTT桌面客户端,比如MQTT Broker、MQTT BOX等,登录密码直接使用token内容。token在【应用概览】->【用户认证】页面,选择相应账户后的【查看token】按钮获取;\\ (2)如果使用代码连接,需要通过【应用概览】->【用户认证】->【用户ID】列表中的用户名和用户密码请求token,在通过获取到的token进行认证连接; \\ === 3.MQTT客户端反复出现断开重连现象 === **问题描述:** \\ MQTT客户端反复出现断开重连现象。 \\ **问题原因:** \\ (1)在配置参数时,设置了断开重连模式; \\ (2)存在两个或两个以上的客户端使用相同的clientid登录,他们会互相踢对方,如果设置成自动重连机制,将会无限循环断开重连; \\ **解决方案:** \\ 确保当前APP下每个clientID的唯一性。\\ === 4.用户名存在100个限制怎么办? === **问题描述:** \\ 在【应用概览】->【用户认证】下创建用户会有100个 数量的限制,如果登录clientID超过100个怎么办? \\ **问题原因:** \\ (1)MQTT消息云以clientID作为唯一标识,不同的clientID可以使用相同的用户信息进行登录,因此100个用户信息可以复用;\\ (2)如果客户需要集成IM、Push等其他的业务,可以联系商务进行版本升级,提高创建用户数量; \\ **解决方案:** \\ 复用用户账户,不同的clientID可以使用相同的用户信息进行登录。\\ === 5.登录报错信息Server has closed connection without connack. === **问题描述:** \\ 在MQTT客户端连接时,服务器返回‘Server has closed connection without connack.’ \\ **问题原因:** \\ (1)MQTT客户端没有启用遗嘱消息(will:false),但是遗嘱消息的Qos等级设置为“1”,标准规定will为false时,willqos必须是0; \\ **解决方案:** \\ 将遗嘱消息的QoS等级设置为'0'。\\ ==== 异常排查 ==== === 1.如何查看消息是否发送成功 === **问题描述:** \\ 发布客户端发送消息后,订阅客户端一直收不到消息,如何确认消息是否发送成功?\\ **问题原因:** \\ 消息接收不到,有以下可能原因: \\ (1)发布客户端没有将消息发布出去; \\ (2)订阅客户端没有接收到消息; \\ **解决方案:** \\ (1)通过调用REST API中[[mqtt:restapisum#查询客户端消息发送_投递记录|查询客户端消息发送&投递记录]]接口查询; \\ (2)通过调用服务器端SDK中[[mqtt:serversdkdownload#查询客户端消息发送_投递记录|QueryMqttRecordMessageOfClient]]函数查询; \\ (3)使用环信console后台中的【记录查询】→【消息记录查询】功能,输入发布/订阅客户端的clientID及相应时间段,即可查看上下行消息记录,定位问题出在发布客户端还是订阅客户端。 \\ {{:playground:message:findmsg2.jpg|}} === 2.如何查看客户端的订阅关系 === **问题描述:** \\ 如何查看客户端的订阅关系?\\ **解决方案:** \\ (1)通过调用REST API中[[mqtt:restapisum#查询客户端session信息|查询客户端session信息]]接口查询; \\ (2)通过调用服务器端SDK中[[mqtt:serversdkdownload#查询客户端session信息|QuerySessionByClientId]]函数查询; \\ (3)使用环信console后台中的【记录查询】→【设备状态查询】功能,输入待查询客户端的clientID,即可查看在线状态、登录用户ID以及订阅关系。 \\ {{:playground:message:findmsg4.jpg|}} === 3.如何查看客户端的连接记录 === **问题描述:** \\ 如何查看客户端的连接记录?\\ **解决方案:** \\ (1)通过调用REST API中[[mqtt:restapisum#查询客户端连接记录|查询客户端连接记录]]接口查询; \\ (2)通过调用服务器端SDK中[[mqtt:serversdkdownload#查询客户端连接记录|QueryMqttRecordDevice]]函数查询; \\ (3)使用环信console后台中的【记录查询】→【设备记录查询】功能,输入待查询客户端的clientID及相应时间段,即可查看客户端连接、订阅以及断开连接等记录。 \\ {{:playground:message:findmsg3.jpg|}} === 4.如何查看客户端是否在线 === **问题描述:** \\ 如何查看客户端是否在线?\\ **解决方案:** \\ (1)通过调用REST API中[[mqtt:restapisum#查询客户端session信息|查询客户端session信息]]接口查询; \\ (2)通过调用服务器端SDK中[[mqtt:serversdkdownload#查询客户端session信息|QuerySessionByClientId]]函数查询; \\ (3)使用环信console后台中的【记录查询】→【设备状态查询】功能,输入待查询客户端的clientID,即可查看在线状态、登录用户ID以及订阅关系。 \\ {{:playground:message:findmsg4.jpg|}} ===== 联系我们 ===== 如果您的问题仍未解决,请[[playground:message:msgcontact|联系我们]] \\ {{:playground:message:微信交流群.jpeg?400|}}