# 专有版 / BYOC 连接指引

本页为您介绍了连接到专有版和 BYOC 部署所使用的协议和端口并提供了连接问题的排查指南。

## 连接协议和端口 Q&A

以下表格列出了连接专有版和 BYOC 部署所使用的协议和端口。

| **版本** | **TCP 端口（mqtt）** | **MQTT TLS/SSL 端口（mqtts）** | **WebSocket 端口（ws）** | **WebSocket TLS/SSL 端口（wss）** |
| -------- | -------------------- | ------------------------------ | ------------------------ | --------------------------------- |
| 专有版   | 1883                 | 8883                           | 8083                     | 8084                              |
| BYOC     | 1883                 | 8883                           | 8083                     | 8084                              |

### 什么是 TCP MQTT 和 WebSocket 连接？

标准的 MQTT 是基于TCP/IP 协议栈构建的异步通信消息协议，是一种轻量级的发布、订阅信息传输协议。可以在不可靠的网络环境中进行扩展，适用于设备硬件存储空间或网络带宽有限的场景。

WebSocket 协议是基于 TCP 的一种新的网络协议，浏览器和服务器只需要完成一次握手，两者之间就直接可以创建持久性的连接，并进行双向数据传输，客户端和服务器之间的数据交换变得更加简单。这里 WebSocket 更准确的是指先使用 WebSocket 建立连接，然后在 WebSocket 通道上使用 MQTT 协议进行通信，即 MQTT over WebSocket。主要是用于浏览器环境的连接。

标准的 MQTT 和 WebSocket 都是不加密的。会有一定的安全风险。


### 如何使用 TCP MQTT 端口和 WebSocket 端口？

您可以直接通过部署概览上的 1883(mqtt) 端口和 8083(ws) 端口进行连接。

您可以在[客户端连接指引](../connect_to_deployments/overview.md)查看客户端开发 SDK Demo 的示例代码测试并连接。


### 什么是 TLS/SSL 的 MQTT 和 WebSocket 连接？

在 MQTT 或 WebSocket 协议通信的基础上，添加 TLS/SSL 加密，确保通信的安全，不易被窃听和篡改。

MQTT TLS/SSL 端口号为 8883，对应协议标识为 mqtts； WebSocket TLS/SSL 端口号为 8084，对应协议标识为 wss。


### 专有版如何开启 TLS/SSL 的 MQTT 和 WebSocket 端口？

专有版支持自定义单向/双向的 TLS/SSL 验证，需要通过[配置 TLS / SSL](../deployments/tls_ssl.md)开启。开启后，通过部署概览上的 8883(mqtts) 端口和 8084(wss) 端口进行连接。

### BYOC 如何使用 TLS/SSL 的 MQTT 和 WebSocket 端口？

BYOC 支持自定义单向 TLS/SSL 验证，可以直接通过部署概览上的 8883(mqtts) 端口和 8084(wss) 端口进行连接。

### 如何编写客户端 TLS/SSL 代码？

您可以查看示例代码（TLS 相关示例代码）来编写客户端的代码。

[Python](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Python3)<br>
[Java](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Java)<br>
[GO](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Go)<br>
[Node.js](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Node.js)<br>
[ESP 32](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-ESP32)<br>
[ESP 8266](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-ESP8266)<br>
[Android](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-Android)<br>
[swift](https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-swift)<br>

### 专有版是否支持通过 IP 地址连接？

**不建议通过 IP 地址进行连接** EMQX 专有版部署。这是因为在故障转移、版本升级或集群扩容等场景下，实例的 IP 地址可能会发生变化。如果客户端仍使用 IP 连接，可能会因 IP 变更导致连接中断或服务不可用。

因此，我们**强烈建议客户始终使用我们提供的域名进行连接**。域名可以自动解析到最新的可用节点，确保服务的高可用性和稳定性。同时，**因使用 IP 地址而导致的连接中断或服务不可用，不属于 SLA 的保障范围**。

建议客户在系统集成和配置中统一采用域名地址，以避免潜在的可用性风险。

## 连接问题排查指南

如果您在连接到部署时遇到问题，请按照以下指南中的步骤，根据您的部署类型进行排查和自我诊断。

### 专有版部署

当您遇到无法连接到 EMQX 专有版部署的问题时，可以通过以下步骤进行自我诊断和排查：


1. **核对连接地址**。确保您使用的是 EMQX 专有版部署提供的**正确域名连接地址**进行连接。请注意，专有版部署支持使用域名连接地址进行连接，如果您需要自定义域名作为连接地址，可以将您自己的域名通过 CNAME 解析指向 EMQX 专有版部署提供的默认连接地址。


2. **确认连接端口**。专有版部署默认开启 1883 (MQTT) 和 8083 (WebSocket) 端口，您可以通过配置 TLS/SSL 来开启安全的 8883 (MQTTS) 和 8084 (WSS) 端口。不同端口的作用如下：
   - MQTT 和 WebSocket 端口：这些端口支持明文传输，数据在传输过程中没有加密，适用于不要求数据加密的场景，如内部网络通信或开发环境。
   - MQTTS 和 WSS 端口：这些端口支持安全传输，使用 TLS/SSL 加密数据传输，提供更高的安全性，适用于需要加密通信的场景，如生产环境或敏感数据传输。
   - 8883 (MQTTS) 和 8084 (WSS) 端口（在 V5 版本的专有版部署中也是默认启用的）：
     适用于生产环境或敏感数据传输场景，通信过程中数据通过 TLS/SSL 加密。EMQX Cloud 专有版 V5 默认内置 TLS 证书，该证书与部署默认分配的连接地址（IP 地址或系统生成域名）匹配，客户可直接使用。


3. **测试网络连通性**。使用 `telnet` 命令来测试您的服务器与 EMQX 专有版部署之间的网络连通性。例如，您可以运行以下命令来测试连接到专有版部署的 MQTT 端口： telnet <专有版部署的域名连接地址> 1883；

   或者，如果您启用了 TLS/SSL，测试连接到 MQTTS 端口：telnet <专有版部署的域名连接地址> 8883。

   请将 `<专有版部署的域名连接地址>` 替换为您的实际部署地址。


4. **验证认证信息**。EMQX 专有版部署同样不支持匿名认证。请确认您已在 EMQX Cloud 控制台中正确配置了 MQTT 客户端的用户名和密码，并在客户端连接时进行了正确的配置。


5. **使用 MQTTX 客户端进行测试**。我们建议使用 MQTTX 作为 MQTT 客户端测试工具，它是一个免费且易于使用的跨平台 MQTT 5.0 客户端。您可以通过它来验证是否是客户端代码的问题导致无法连接。详细的使用说明，请参见：[MQTTX 使用文档](../connect_to_deployments/mqttx.md)。


### 通过工单获得我们的帮助
如果以上步骤都确认无误但问题仍然存在，请通过工单系统提交帮助请求，并提供以下详细信息，以便我们更快地为您解决问题：

  \- 部署的名称和 ID（可在控制台的"部署管理"页面找到）

  \- 部署类型（例如 Serverless、专有版等）

  \- 客户端的具体类型和版本号

  \- 客户端连接示例代码（请提供您使用的编程语言，例如 Python、JavaScript 等，以及相关的连接代码，确保敏感信息已经脱敏）

  \- 客户端的错误日志或具体的报错信息（请尽可能提供详细的错误描述或截图）

