diff --git a/src/UserGuide/Master/Table/API/Programming-MQTT.md b/src/UserGuide/Master/Table/API/Programming-MQTT.md
index e20b3cad4..bad9bda76 100644
--- a/src/UserGuide/Master/Table/API/Programming-MQTT.md
+++ b/src/UserGuide/Master/Table/API/Programming-MQTT.md
@@ -22,27 +22,20 @@
## 1. Overview
-MQTT (Message Queuing Telemetry Transport) is a lightweight messaging protocol designed for IoT and low-bandwidth environments. It operates on a Publish/Subscribe (Pub/Sub) model, enabling efficient and reliable bidirectional communication between devices. Its core objectives are low power consumption, minimal bandwidth usage, and high real-time performance, making it ideal for unstable networks or resource-constrained scenarios (e.g., sensors, mobile devices).
+[MQTT](Message Queuing Telemetry Transport)(http://mqtt.org/) is a lightweight messaging protocol designed for IoT and low-bandwidth environments. It operates on a Publish/Subscribe (Pub/Sub) model, enabling efficient and reliable bidirectional communication between devices. Its core objectives are low power consumption, minimal bandwidth usage, and high real-time performance, making it ideal for unstable networks or resource-constrained scenarios (e.g., sensors, mobile devices).
IoTDB provides deep integration with the MQTT protocol, fully compliant with MQTT v3.1 (OASIS International Standard). The IoTDB server includes a built-in high-performance MQTT Broker module, eliminating the need for third-party middleware. Devices can directly write time-series data into the IoTDB storage engine via MQTT messages.
-
+
-## 2. Configuration
-By default, the IoTDB MQTT service loads configurations from `${IOTDB_HOME}/${IOTDB_CONF}/iotdb-system.properties`.
-
-| **Property** | **Description** | **Default** |
-| ------------------------ | ---------------------------------------------------------------------------------------------------------------------- | ------------------- |
-| `enable_mqtt_service` | Enable/ disable the MQTT service. | FALSE |
-| `mqtt_host` | Host address bound to the MQTT service. | 127.0.0.1 |
-| `mqtt_port` | Port bound to the MQTT service. | 1883 |
-| `mqtt_handler_pool_size` | Thread pool size for processing MQTT messages. | 1 |
-| **`mqtt_payload_formatter`** | **Formatting method for MQTT message payloads. ****Options: `json` (tree model), `line` (table model).** | **json** |
-| `mqtt_max_message_size` | Maximum allowed MQTT message size (bytes). | 1048576 |
-
-## 3. Write Protocol
+## 2. Built-in MQTT Service
+The Built-in MQTT Service provide the ability of direct connection to IoTDB through MQTT. It listen the publish messages from MQTT clients
+and then write the data into storage immediately.
+The MQTT topic corresponds to IoTDB timeseries.The first segment of the MQTT topic (split by `/`) is used as the database name.The table name is derived from the `` in the line protocol.
+The messages payload can be format to events by `PayloadFormatter` which loaded by java SPI, and the implementation of `PayloadFormatter` for table is `LinePayloadFormatter`.
+The following is the line protocol syntax of MQTT message payload and an example:
* Line Protocol Syntax
@@ -56,7 +49,23 @@ By default, the IoTDB MQTT service loads configurations from `${IOTDB_HOME}/${IO
myMeasurement,tag1=value1,tag2=value2 attr1=value1,attr2=value2 fieldKey="fieldValue" 1556813561098000000
```
-
+
+
+## 3. MQTT Configurations
+
+By default, the IoTDB MQTT service loads configurations from `${IOTDB_HOME}/${IOTDB_CONF}/iotdb-system.properties`.
+
+Configurations are as follows:
+
+| **Property** | **Description** | **Default** |
+| ------------------------ | ---------------------------------------------------------------------------------------------------------------------- |-------------|
+| `enable_mqtt_service` | Enable/ disable the MQTT service. | false |
+| `mqtt_host` | Host address bound to the MQTT service. | 127.0.0.1 |
+| `mqtt_port` | Port bound to the MQTT service. | 1883 |
+| `mqtt_handler_pool_size` | Thread pool size for processing MQTT messages. | 1 |
+| **`mqtt_payload_formatter`** | **Formatting method for MQTT message payloads. ****Options: `json` (tree model), `line` (table model).** | **json** |
+| `mqtt_max_message_size` | Maximum allowed MQTT message size (bytes). | 1048576 |
+
## 4. Naming Conventions
@@ -88,3 +97,160 @@ The table name is derived from the `` in the line protocol.
| 1`i32` 123`i32` | INT32 |
| `"xxx"` | TEXT |
| `t`,`T`,`true`,`True`,`TRUE` `f`,`F`,`false`,`False`,`FALSE` | BOOLEAN |
+
+
+## 5. Coding Examples
+The following is an example which a mqtt client send messages to IoTDB server.
+
+ ```java
+MQTT mqtt = new MQTT();
+mqtt.setHost("127.0.0.1", 1883);
+mqtt.setUserName("root");
+mqtt.setPassword("root");
+
+BlockingConnection connection = mqtt.blockingConnection();
+String DATABASE = "myMqttTest";
+connection.connect();
+
+String payload =
+ "test1,tag1=t1,tag2=t2 attr3=a5,attr4=a4 field1=\"fieldValue1\",field2=1i,field3=1u 1";
+connection.publish(DATABASE + "/myTopic", payload.getBytes(), QoS.AT_LEAST_ONCE, false);
+Thread.sleep(10);
+
+payload = "test1,tag1=t1,tag2=t2 field4=2,field5=2i32,field6=2f 2";
+connection.publish(DATABASE, payload.getBytes(), QoS.AT_LEAST_ONCE, false);
+Thread.sleep(10);
+
+payload = "# It's a remark\n " + "test1,tag1=t1,tag2=t2 field4=2,field5=2i32,field6=2f 6";
+ connection.publish(DATABASE + "/myTopic", payload.getBytes(), QoS.AT_LEAST_ONCE, false);
+ Thread.sleep(10);
+
+//batch write example
+payload =
+ "test1,tag1=t1,tag2=t2 field7=t,field8=T,field9=true 3 \n "
+ + "test1,tag1=t1,tag2=t2 field7=f,field8=F,field9=FALSE 4";
+connection.publish(DATABASE + "/myTopic", payload.getBytes(), QoS.AT_LEAST_ONCE, false);
+Thread.sleep(10);
+
+//batch write example
+payload =
+ "test1,tag1=t1,tag2=t2 attr1=a1,attr2=a2 field1=\"fieldValue1\",field2=1i,field3=1u 4 \n "
+ + "test1,tag1=t1,tag2=t2 field4=2,field5=2i32,field6=2f 5";
+connection.publish(DATABASE + "/myTopic", payload.getBytes(), QoS.AT_LEAST_ONCE, false);
+Thread.sleep(10);
+
+connection.disconnect();
+ ```
+
+
+
+## 6. Customize your MQTT Message Format
+
+If you do not like the above Line format, you can customize your MQTT Message format by just writing several lines
+of codes. An example can be found in [example/mqtt-customize](https://github.com/apache/iotdb/tree/master/example/mqtt-customize) project.
+
+Steps:
+1. Create a java project, and add dependency:
+```xml
+
+ org.apache.iotdb
+ iotdb-server
+ 2.0.4-SNAPSHOT
+
+```
+2. Define your implementation which implements `org.apache.iotdb.db.protocol.mqtt.PayloadFormatter`
+ e.g.,
+
+```java
+package org.apache.iotdb.mqtt.server;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.iotdb.db.protocol.mqtt.Message;
+import org.apache.iotdb.db.protocol.mqtt.PayloadFormatter;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class CustomizedLinePayloadFormatter implements PayloadFormatter {
+
+ @Override
+ public List format(String topic, ByteBuf payload) {
+ // Suppose the payload is a line format
+ if (payload == null) {
+ return null;
+ }
+
+ String line = payload.toString(StandardCharsets.UTF_8);
+ // parse data from the line and generate Messages and put them into List ret
+ List ret = new ArrayList<>();
+ // this is just an example, so we just generate some Messages directly
+ for (int i = 0; i < 3; i++) {
+ long ts = i;
+ TableMessage message = new TableMessage();
+
+ // Parsing Database Name
+ message.setDatabase("db" + i);
+
+ //Parsing Table Names
+ message.setTable("t" + i);
+
+ // Parsing Tags
+ List tagKeys = new ArrayList<>();
+ tagKeys.add("tag1" + i);
+ tagKeys.add("tag2" + i);
+ List