ESP32C3-ATUser-Guide
ESP32C3-ATUser-Guide
Release v2.3.0.0-esp32c3-156-g205b068
Espressif Systems
Aug 09, 2022
Table of contents
Table of contents i
1 Get Started 3
1.1 What is ESP-AT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Hardware Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.1 What You Need . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.2 ESP32-C3 Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Downloading Guide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.1 Download AT Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.2 Flash AT Firmware into Your Device . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.3 Check Whether AT Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2 AT Binary Lists 11
2.1 Released Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.1 ESP32-C3-MINI-1 Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3 AT Command Set 13
3.1 Basic AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.1.1 AT: Test AT Startup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.1.2 AT+RST: Restart a Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.1.3 AT+GMR: Check Version Information . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.1.4 AT+CMD: List all AT commands and types supported in current firmware . . . . . . . . 15
3.1.5 AT+GSLP: Enter Deep-sleep Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.1.6 ATE: Configure AT Commands Echoing . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.1.7 AT+RESTORE: Restore Factory Default Settings . . . . . . . . . . . . . . . . . . . . . 16
3.1.8 AT+UART_CUR: Current UART Configuration, Not Saved in Flash . . . . . . . . . . . 16
3.1.9 AT+UART_DEF: Default UART Configuration, Saved in Flash . . . . . . . . . . . . . . 17
3.1.10 AT+SLEEP: Set the Sleep Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.11 AT+SYSRAM: Query Current Remaining Heap Size and Minimum Heap Size . . . . . . 20
3.1.12 AT+SYSMSG: Query/Set System Prompt Information . . . . . . . . . . . . . . . . . . . 20
3.1.13 AT+SYSFLASH: Query/Set User Partitions in Flash . . . . . . . . . . . . . . . . . . . . 22
3.1.14 AT+FS: Filesystem Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.15 AT+RFPOWER: Query/Set RF TX Power . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.16 Note . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1.17 AT+SYSROLLBACK: Roll Back to the Previous Firmware . . . . . . . . . . . . . . . . 25
3.1.18 AT+SYSTIMESTAMP: Query/Set Local Time Stamp . . . . . . . . . . . . . . . . . . . 25
3.1.19 AT+SYSLOG: Enable or Disable the AT Error Code Prompt . . . . . . . . . . . . . . . 26
3.1.20 AT+SLEEPWKCFG: Set the Light-sleep Wakeup Source and Awake GPIO . . . . . . . . 28
3.1.21 AT+SYSSTORE: Query/Set Parameter Store Mode . . . . . . . . . . . . . . . . . . . . 28
3.1.22 AT+SYSREG: Read/Write the Register . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.1.23 AT+SYSTEMP: Read the Internal Chip Celsius Temperature Value . . . . . . . . . . . . 30
3.2 Wi-Fi AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.1 AT+CWMODE: Query/Set the Wi-Fi Mode (Station/SoftAP/Station+SoftAP) . . . . . . 31
3.2.2 AT+CWSTATE: Query the Wi-Fi state and Wi-Fi information . . . . . . . . . . . . . . 32
3.2.3 AT+CWJAP: Connect to an AP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.4 AT+CWRECONNCFG: Query/Set the Wi-Fi Reconnecting Configuration . . . . . . . . 35
3.2.5 AT+CWLAPOPT: Set the Configuration for the Command AT+CWLAP . . . . . . . . . 36
i
3.2.6 AT+CWLAP: List Available APs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2.7 AT+CWQAP: Disconnect from an AP . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2.8 AT+CWSAP: Query/Set the configuration of an ESP32-C3 SoftAP . . . . . . . . . . . . 39
3.2.9 AT+CWLIF: Obtain IP Address of the Station That Connects to an ESP32-C3 SoftAP . . 40
3.2.10 AT+CWQIF: Disconnect Stations from an ESP32-C3 SoftAP . . . . . . . . . . . . . . . 40
3.2.11 AT+CWDHCP: Enable/Disable DHCP . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2.12 AT+CWDHCPS: Query/Set the IP Addresses Allocated by an ESP32-C3 SoftAP DHCP
Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.13 AT+CWAUTOCONN: Automatically Connect to an AP When Powered on . . . . . . . . 43
3.2.14 AT+CWAPPROTO: Query/Set the 802.11 b/g/n Protocol Standard of SoftAP Mode . . . 44
3.2.15 AT+CWSTAPROTO: Query/Set the 802.11 b/g/n Protocol Standard of Station Mode . . 44
3.2.16 AT+CIPSTAMAC: Query/Set the MAC Address of an ESP32-C3 Station . . . . . . . . 45
3.2.17 AT+CIPAPMAC: Query/Set the MAC Address of an ESP32-C3 SoftAP . . . . . . . . . 46
3.2.18 AT+CIPSTA: Query/Set the IP Address of an ESP32-C3 Station . . . . . . . . . . . . . 47
3.2.19 AT+CIPAP: Query/Set the IP Address of an ESP32-C3 SoftAP . . . . . . . . . . . . . . 48
3.2.20 AT+CWSTARTSMART: Start SmartConfig . . . . . . . . . . . . . . . . . . . . . . . . 49
3.2.21 AT+CWSTOPSMART: Stop SmartConfig . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.2.22 AT+WPS: Enable the WPS Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.2.23 AT+MDNS: Configure the mDNS Function . . . . . . . . . . . . . . . . . . . . . . . . 51
3.2.24 AT+CWJEAP: Connect to a WPA2 Enterprise AP . . . . . . . . . . . . . . . . . . . . . 52
3.2.25 AT+CWHOSTNAME: Query/Set the Host Name of an ESP32-C3 Station . . . . . . . . 54
3.2.26 AT+CWCOUNTRY: Query/Set the Wi-Fi Country Code . . . . . . . . . . . . . . . . . 55
3.3 TCP/IP AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.3.1 AT+CIPV6: Enable/disable the network of Internet Protocol Version 6 (IPv6) . . . . . . 56
3.3.2 AT+CIPSTATE: Obtain the TCP/UDP/SSL Connection Information . . . . . . . . . . . 57
3.3.3 AT+CIPSTATUS (deprecated): Obtain the TCP/UDP/SSL Connection Status and Infor-
mation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.3.4 AT+CIPDOMAIN: Resolve a Domain Name . . . . . . . . . . . . . . . . . . . . . . . . 58
3.3.5 AT+CIPSTART: Establish TCP Connection, UDP Transmission, or SSL Connection . . . 59
3.3.6 AT+CIPSTARTEX: Establish TCP connection, UDP transmission, or SSL connection with
an Automatically Assigned ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.3.7 [Data Mode Only] +++: Exit from Data Mode . . . . . . . . . . . . . . . . . . . . . . . 63
3.3.8 AT+CIPSEND: Send Data in the Normal Transmission Mode or Wi-Fi Passthrough Mode 63
3.3.9 AT+CIPSENDL: Send Long Data in Paraller in the Normal Transmission Mode. . . . . . 64
3.3.10 AT+CIPSENDLCFG: Set the Configuration for the Command AT+CIPSENDL . . . . . 66
3.3.11 AT+CIPSENDEX: Send Data in the Normal Transmission Mode in Expanded Ways . . . 66
3.3.12 AT+CIPCLOSE: Close TCP/UDP/SSL Connection . . . . . . . . . . . . . . . . . . . . 67
3.3.13 AT+CIFSR: Obtain the Local IP Address and MAC Address . . . . . . . . . . . . . . . 68
3.3.14 AT+CIPMUX: Enable/disable Multiple Connections . . . . . . . . . . . . . . . . . . . . 69
3.3.15 AT+CIPSERVER: Delete/create a TCP/SSL Server . . . . . . . . . . . . . . . . . . . . 70
3.3.16 AT+CIPSERVERMAXCONN: Query/Set the Maximum Connections Allowed by a Server 71
3.3.17 AT+CIPMODE: Query/Set the Transmission Mode . . . . . . . . . . . . . . . . . . . . 72
3.3.18 AT+SAVETRANSLINK: Set Whether to Enter Wi-Fi Passthrough Mode on Power-up . . 73
3.3.19 AT+CIPSTO: Query/Set the local TCP/SSL Server Timeout . . . . . . . . . . . . . . . . 74
3.3.20 AT+CIPSNTPCFG: Query/Set the Time Zone and the SNTP Server . . . . . . . . . . . 75
3.3.21 AT+CIPSNTPTIME: Query the SNTP Time . . . . . . . . . . . . . . . . . . . . . . . . 76
3.3.22 AT+CIPSNTPINTV: Query/Set the SNTP time synchronization interval . . . . . . . . . 77
3.3.23 AT+CIUPDATE: Upgrade Firmware Through Wi-Fi . . . . . . . . . . . . . . . . . . . 78
3.3.24 AT+CIPDINFO: Set +IPD Message Mode . . . . . . . . . . . . . . . . . . . . . . . 80
3.3.25 AT+CIPSSLCCONF: Query/Set SSL Clients . . . . . . . . . . . . . . . . . . . . . . . . 81
3.3.26 AT+CIPSSLCCN: Query/Set the Common Name of the SSL Client . . . . . . . . . . . . 82
3.3.27 AT+CIPSSLCSNI: Query/Set SSL Client Server Name Indication (SNI) . . . . . . . . . 83
3.3.28 AT+CIPSSLCALPN: Query/Set SSL Client Application Layer Protocol Negotiation (ALPN) 83
3.3.29 AT+CIPSSLCPSK: Query/Set SSL Client Pre-shared Key (PSK) . . . . . . . . . . . . . 84
3.3.30 AT+CIPRECONNINTV: Query/Set the TCP/UDP/SSL reconnection Interval for the Wi-
Fi Passthrough Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.3.31 AT+CIPRECVMODE: Query/Set Socket Receiving Mode . . . . . . . . . . . . . . . . . 86
3.3.32 AT+CIPRECVDATA: Obtain Socket Data in Passive Receiving Mode . . . . . . . . . . 87
ii
3.3.33 AT+CIPRECVLEN: Obtain Socket Data Length in Passive Receiving Mode . . . . . . . 88
3.3.34 AT+PING: Ping the Remote Host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3.3.35 AT+CIPDNS: Query/Set DNS Server Information . . . . . . . . . . . . . . . . . . . . . 89
3.3.36 AT+CIPTCPOPT: Query/Set the Socket Options . . . . . . . . . . . . . . . . . . . . . . 90
3.4 Bluetooth® Low Energy AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
3.4.1 AT+BLEINIT: Bluetooth LE Initialization . . . . . . . . . . . . . . . . . . . . . . . . . 93
3.4.2 AT+BLEADDR: Query/Set Bluetooth LE Device Address . . . . . . . . . . . . . . . . . 94
3.4.3 AT+BLENAME: Query/Set Bluetooth LE Device Name . . . . . . . . . . . . . . . . . . 95
3.4.4 AT+BLESCANPARAM: Query/Set Parameters of Bluetooth LE Scanning . . . . . . . . 96
3.4.5 AT+BLESCAN: Enable Bluetooth LE Scanning . . . . . . . . . . . . . . . . . . . . . . 97
3.4.6 AT+BLESCANRSPDATA: Set Bluetooth LE Scan Response . . . . . . . . . . . . . . . 98
3.4.7 AT+BLEADVPARAM: Query/Set Parameters of Bluetooth LE Advertising . . . . . . . 98
3.4.8 AT+BLEADVDATA: Set Bluetooth LE Advertising Data . . . . . . . . . . . . . . . . . 100
3.4.9 AT+BLEADVDATAEX: Automatically Set Bluetooth LE Advertising Data . . . . . . . . 101
3.4.10 AT+BLEADVSTART: Start Bluetooth LE Advertising . . . . . . . . . . . . . . . . . . . 102
3.4.11 AT+BLEADVSTOP: Stop Bluetooth LE Advertising . . . . . . . . . . . . . . . . . . . . 102
3.4.12 AT+BLECONN: Establish Bluetooth LE Connection . . . . . . . . . . . . . . . . . . . 103
3.4.13 AT+BLECONNPARAM: Query/Update Parameters of Bluetooth LE Connection . . . . 104
3.4.14 AT+BLEDISCONN: End Bluetooth LE Connection . . . . . . . . . . . . . . . . . . . . 105
3.4.15 AT+BLEDATALEN: Set Bluetooth LE Data Packet Length . . . . . . . . . . . . . . . . 106
3.4.16 AT+BLECFGMTU: Set Bluetooth LE MTU Length . . . . . . . . . . . . . . . . . . . . 106
3.4.17 AT+BLEGATTSSRVCRE: GATTS Creates Services . . . . . . . . . . . . . . . . . . . 107
3.4.18 AT+BLEGATTSSRVSTART: GATTS Starts Services . . . . . . . . . . . . . . . . . . . 108
3.4.19 AT+BLEGATTSSRVSTOP: GATTS Stops Services . . . . . . . . . . . . . . . . . . . . 109
3.4.20 AT+BLEGATTSSRV: GATTS Discovers Services . . . . . . . . . . . . . . . . . . . . . 109
3.4.21 AT+BLEGATTSCHAR: GATTS Discovers Characteristics . . . . . . . . . . . . . . . . 110
3.4.22 AT+BLEGATTSNTFY: Notify a Client of the Value of a Characteristic Value from the
Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
3.4.23 AT+BLEGATTSIND: Indicate the Characteristic Value from the Server to a Client . . . . 111
3.4.24 AT+BLEGATTSSETATTR: GATTS Sets Characteristics . . . . . . . . . . . . . . . . . 112
3.4.25 AT+BLEGATTCPRIMSRV: GATTC Discovers Primary Services . . . . . . . . . . . . 113
3.4.26 AT+BLEGATTCINCLSRV: GATTC Discovers Included Services . . . . . . . . . . . . 114
3.4.27 AT+BLEGATTCCHAR: GATTC Discovers Characteristics . . . . . . . . . . . . . . . . 114
3.4.28 AT+BLEGATTCRD: GATTC Reads Characteristics . . . . . . . . . . . . . . . . . . . . 115
3.4.29 AT+BLEGATTCWR: GATTC Writes Characteristics . . . . . . . . . . . . . . . . . . . 116
3.4.30 AT+BLESPPCFG: Query/Set Bluetooth LE SPP Parameters . . . . . . . . . . . . . . . 117
3.4.31 AT+BLESPP: Enter Bluetooth LE SPP Mode . . . . . . . . . . . . . . . . . . . . . . . 118
3.4.32 AT+BLESECPARAM: Query/Set Bluetooth LE Encryption Parameters . . . . . . . . . . 119
3.4.33 AT+BLEENC: Initiate Bluetooth LE Encryption Request . . . . . . . . . . . . . . . . . 120
3.4.34 AT+BLEENCRSP: Respond to the Pairing Request from the Peer Device . . . . . . . . . 121
3.4.35 AT+BLEKEYREPLY: Reply the Key Value to the Peer Device . . . . . . . . . . . . . . 122
3.4.36 AT+BLECONFREPLY: Reply the Confirm Value to the Peer Device in the Legacy Con-
nection Stage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
3.4.37 AT+BLEENCDEV: Query Bonded Bluetooth LE Encryption Device List . . . . . . . . . 123
3.4.38 AT+BLEENCCLEAR: Clear Bluetooth LE Encryption Device List . . . . . . . . . . . . 123
3.4.39 AT+BLESETKEY: Set Bluetooth LE Static Pair Key . . . . . . . . . . . . . . . . . . . 124
3.4.40 AT+BLEHIDINIT: Bluetooth LE HID Profile Initialization . . . . . . . . . . . . . . . . 125
3.4.41 AT+BLEHIDKB: Send Bluetooth LE HID Keyboard Information . . . . . . . . . . . . . 126
3.4.42 AT+BLEHIDMUS: Send Bluetooth LE HID Mouse Information . . . . . . . . . . . . . 126
3.4.43 AT+BLEHIDCONSUMER: Send Bluetooth LE HID Consumer Information . . . . . . . 127
3.4.44 AT+BLUFI: Start or Stop BluFi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
3.4.45 AT+BLUFINAME: Query/Set BluFi Device Name . . . . . . . . . . . . . . . . . . . . 129
3.4.46 AT+BLEPERIODICDATA: Set Bluetooth LE periodic advertising data . . . . . . . . . . 130
3.4.47 AT+BLEPERIODICSTART: Start Bluetooth LE periodic advertising . . . . . . . . . . . 130
3.4.48 AT+BLEPERIODICSTOP: Stop Bluetooth LE periodic advertising . . . . . . . . . . . . 131
3.4.49 AT+BLESYNCSTART: Start to synchronize with periodic advertising . . . . . . . . . . 131
3.4.50 AT+BLESYNCSTOP: Stop synchronizing with periodic advertising . . . . . . . . . . . . 132
3.4.51 AT+BLEREADPHY: Query the current transmitter PHY . . . . . . . . . . . . . . . . . 132
iii
3.4.52 AT+BLESETPHY: Set the current transmitter PHY . . . . . . . . . . . . . . . . . . . . 133
3.5 MQTT AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
3.5.1 AT+MQTTUSERCFG: Set MQTT User Configuration . . . . . . . . . . . . . . . . . . 134
3.5.2 AT+MQTTCLIENTID: Set MQTT Client ID . . . . . . . . . . . . . . . . . . . . . . . 135
3.5.3 AT+MQTTUSERNAME: Set MQTT Username . . . . . . . . . . . . . . . . . . . . . . 135
3.5.4 AT+MQTTPASSWORD: Set MQTT Password . . . . . . . . . . . . . . . . . . . . . . 136
3.5.5 AT+MQTTCONNCFG: Set Configuration of MQTT Connection . . . . . . . . . . . . . 136
3.5.6 AT+MQTTALPN: Set MQTT Application Layer Protocol Negotiation (ALPN) . . . . . . 137
3.5.7 AT+MQTTCONN: Connect to MQTT Brokers . . . . . . . . . . . . . . . . . . . . . . 138
3.5.8 AT+MQTTPUB: Publish MQTT Messages in String . . . . . . . . . . . . . . . . . . . . 139
3.5.9 AT+MQTTPUBRAW: Publish Long MQTT Messages . . . . . . . . . . . . . . . . . . . 139
3.5.10 AT+MQTTSUB: Subscribe to MQTT Topics . . . . . . . . . . . . . . . . . . . . . . . . 140
3.5.11 AT+MQTTUNSUB: Unsubscribe from MQTT Topics . . . . . . . . . . . . . . . . . . . 141
3.5.12 AT+MQTTCLEAN: Close MQTT Connections . . . . . . . . . . . . . . . . . . . . . . 141
3.5.13 MQTT AT Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
3.5.14 MQTT AT Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
3.6 HTTP AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
3.6.1 AT+HTTPCLIENT: Send HTTP Client Request . . . . . . . . . . . . . . . . . . . . . . 144
3.6.2 AT+HTTPGETSIZE: Get HTTP Resource Size . . . . . . . . . . . . . . . . . . . . . . 145
3.6.3 AT+HTTPCGET: Get HTTP Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
3.6.4 AT+HTTPCPOST: Post HTTP data of specified length . . . . . . . . . . . . . . . . . . 146
3.6.5 AT+HTTPURLCFG: Set/Get long HTTP URL . . . . . . . . . . . . . . . . . . . . . . 147
3.6.6 HTTP AT Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
3.7 Signaling Test AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
3.7.1 AT+FACTPLCP: Send with Long or Short PLCP . . . . . . . . . . . . . . . . . . . . . 148
3.8 Web Server AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
3.8.1 AT+WEBSERVER: Enable/disable Wi-Fi connection configuration via Web server . . . . 149
3.9 Driver AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
3.9.1 AT+DRVADC: Read ADC Channel Value . . . . . . . . . . . . . . . . . . . . . . . . . 150
3.9.2 AT+DRVPWMINIT: Initialize PWM Driver . . . . . . . . . . . . . . . . . . . . . . . . 151
3.9.3 AT+DRVPWMDUTY: Set PWM Duty . . . . . . . . . . . . . . . . . . . . . . . . . . 152
3.9.4 AT+DRVPWMFADE: Set PWM Fade . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
3.9.5 AT+DRVI2CINIT: Initialize I2C Master Driver . . . . . . . . . . . . . . . . . . . . . . 153
3.9.6 AT+DRVI2CRD: Read I2C Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
3.9.7 AT+DRVI2CWRDATA: Write I2C Data . . . . . . . . . . . . . . . . . . . . . . . . . . 154
3.9.8 AT+DRVI2CWRBYTES: Write No More Than 4 Bytes I2C Data . . . . . . . . . . . . . 155
3.9.9 AT+DRVSPICONFGPIO: Configure SPI GPIO . . . . . . . . . . . . . . . . . . . . . . 156
3.9.10 AT+DRVSPIINIT: Initialize SPI Master Driver . . . . . . . . . . . . . . . . . . . . . . 156
3.9.11 AT+DRVSPIRD: Read SPI Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
3.9.12 AT+DRVSPIWR: Write SPI Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
3.10 User AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
3.10.1 AT+USERRAM: Operate user s free RAM . . . . . . . . . . . . . . . . . . . . . . . . 158
3.10.2 AT+USEROTA: Upgrade the Firmware According to the Specified URL . . . . . . . . . 160
3.10.3 AT+USERDOCS: Query the ESP-AT User Guide for Current Firmware . . . . . . . . . 161
3.11 AT Command Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
3.12 AT Commands with Configuration Saved in the Flash . . . . . . . . . . . . . . . . . . . . . . . . 162
3.13 AT Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
iv
4.1.9 UART Wi-Fi passthrough transmission when the ESP32-C3 works as a TCP client in single
connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
4.1.10 UART Wi-Fi passthrough transmission when the ESP32-C3 works as a TCP server . . . . 182
4.1.11 UART Wi-Fi passthrough transmission when the ESP32-C3 works as a softAP in UDP
transparent transmission . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
4.2 Bluetooth LE AT Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
4.2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
4.2.2 Bluetooth LE client reads and write services . . . . . . . . . . . . . . . . . . . . . . . . 187
4.2.3 Bluetooth LE server read and write services . . . . . . . . . . . . . . . . . . . . . . . . 191
4.2.4 Encrypt Bluetooth LE connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
4.2.5 Establish SPP connection between two ESP32-C3 development boards and transmit data
in UART-Bluetooth LE Passthrough Mode . . . . . . . . . . . . . . . . . . . . . . . . . 200
4.2.6 Establish SPP connection between ESP32-C3 and mobile phone and transmit data in
UART-Bluetooth LE passthrough mode . . . . . . . . . . . . . . . . . . . . . . . . . . 204
4.3 MQTT AT Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
4.3.1 MQTT over TCP (with a local MQTT broker)(suitable for a small amount of data) . . . . 207
4.3.2 MQTT over TCP (with a local MQTT broker)(suitable for large amounts of data) . . . . . 208
4.3.3 MQTT over TLS (with a local MQTT broker) . . . . . . . . . . . . . . . . . . . . . . . 210
4.3.4 MQTT over WSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
4.4 MQTT AT Examples for Cloud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
4.4.1 Obtain certificates and endpoints from AWS IoT . . . . . . . . . . . . . . . . . . . . . . 213
4.4.2 Connect to AWS IoT based on mutual authentication with MQTT AT commands . . . . . 214
4.5 Web Server AT Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
4.5.1 Wi-Fi Provisioning Using a Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
4.5.2 OTA Firmware Upgrade Using a Browser . . . . . . . . . . . . . . . . . . . . . . . . . 224
4.5.3 Wi-Fi Provisioning Using a WeChat Applet . . . . . . . . . . . . . . . . . . . . . . . . 225
4.5.4 OTA Firmware Upgrade Using a WeChat Applet . . . . . . . . . . . . . . . . . . . . . . 236
4.5.5 ESP32-C3 Using Captive Portal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
4.6 HTTP AT Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
4.6.1 The HEAD method of HTTP client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
4.6.2 The GET method of HTTP client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
4.6.3 The POST method of HTTP client (suitable for POST small amount of data) . . . . . . . 239
4.6.4 The POST method of HTTP client (recommended method) . . . . . . . . . . . . . . . . 240
4.6.5 The PUT method of HTTP client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
4.6.6 The DELETE method of HTTP client . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
4.7 Sleep AT Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
4.7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
4.7.2 Set Modem-sleep mode in Wi-Fi mode . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
4.7.3 Set Light-sleep mode in Wi-Fi mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
4.7.4 Set Modem-sleep mode in Bluetooth LE advertising mode . . . . . . . . . . . . . . . . . 248
4.7.5 Set Modem-sleep mode in Bluetooth LE connection mode . . . . . . . . . . . . . . . . . 248
4.7.6 Set Light-sleep mode in Bluetooth LE advertising mode . . . . . . . . . . . . . . . . . . 249
4.7.7 Set Light-sleep mode in Bluetooth LE connection mode . . . . . . . . . . . . . . . . . . 250
4.7.8 Set Deep-sleep mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
v
5.3 How to add user-defined AT commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
5.3.1 Define AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
5.3.2 Register AT Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
5.3.3 Give it a try . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
5.3.4 Define Return Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
5.3.5 Access Command Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
5.3.6 Omit Command Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
5.3.7 Block Command Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
5.3.8 Access Input Data from AT Command Port . . . . . . . . . . . . . . . . . . . . . . . . . 264
5.4 How to Improve ESP-AT Throughput Performance . . . . . . . . . . . . . . . . . . . . . . . . . 268
5.4.1 [Simple] Quick Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
5.4.2 [Recommended] Understand Data Stream and Make the Precise Configuration . . . . . . 269
5.5 How to Generate Factory Parameter Bin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
5.5.1 factory_param_type.csv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
5.5.2 factory_param_data.csv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
5.5.3 Add a Customized Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
5.5.4 Add a Customized Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
5.5.5 Modify Factory Parameter Data on an Existing Module . . . . . . . . . . . . . . . . . . 276
5.6 How to Customize Bluetooth® LE Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
5.6.1 Bluetooth LE Service Source File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
5.6.2 Customize Bluetooth LE Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
5.7 How to Customize Partitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
5.7.1 Modify at_customize.csv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
5.7.2 Generate at_customize.bin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
5.7.3 Flash at_customize.bin into ESP32-C3 Device . . . . . . . . . . . . . . . . . . . . . . . 282
5.7.4 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
5.8 How to Add Support for a Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
5.8.1 Add Module to factory_param_data.csv . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
5.8.2 Modify esp_at_module_info Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
5.8.3 Configure the Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
5.9 SPI AT Guide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
5.9.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
5.9.2 How to Use SPI AT? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
5.9.3 SPI AT Throughput . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
5.10 How to Implement OTA Upgrade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
5.10.1 Comparison Among OTA Commands and Their Application Scenarios . . . . . . . . . . 289
5.10.2 Perform OTA Upgrade with ESP-AT OTA Commands . . . . . . . . . . . . . . . . . . 290
5.11 How to Update the ESP-IDF Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
5.12 ESP-AT Firmware Differences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
5.12.1 ESP32-C3 Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
5.13 How to Download the Latest Temporary Version of AT Firmware from GitHub . . . . . . . . . . 298
5.14 Customize Bluetooth LE Services Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
5.14.1 Generate Bin File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
5.14.2 Download or Update Bin File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
5.15 How to Generate PKI Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
5.15.1 Certificate Bin Files Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
5.15.2 Generate Certificate Bin Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
5.15.3 Download or Update Certificate Bin Files . . . . . . . . . . . . . . . . . . . . . . . . . . 308
5.16 AT API Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
5.16.1 Header File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
5.16.2 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
5.16.3 Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
5.16.4 Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
5.16.5 Type Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
5.16.6 Enumerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
5.16.7 Header File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
5.16.8 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
5.16.9 Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
vi
6 Customized AT Commands and Firmware 321
6.1 Tencent Cloud IoT AT Commands and Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . 321
6.1.1 Tencent Cloud IoT AT Command Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
6.1.2 Tencent Cloud IoT AT Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
7 AT FAQ 323
7.1 AT Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
7.1.1 There is no released firmware for my module. Where can I get the firmware for it? . . . . 324
7.1.2 How to get the source code of AT firmware? . . . . . . . . . . . . . . . . . . . . . . . . 324
7.1.3 How to download the AT firmware on Espressif s official website? . . . . . . . . . . . . 324
7.1.4 How to combine all the bin files compiled by ESP-AT? . . . . . . . . . . . . . . . . . . . 324
7.1.5 Does the AT firmware shipped in modules support flow control? . . . . . . . . . . . . . . 324
7.2 AT Commands and Responses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
7.2.1 What is the reason why AT prompts busy? . . . . . . . . . . . . . . . . . . . . . . . . . 324
7.2.2 Why does the ESP-AT firmware always return the following message after the I powered
up the device and sent the first command? . . . . . . . . . . . . . . . . . . . . . . . . . 325
7.2.3 What commands are supported by the default ESP-AT firmware on different modules, and
from which version are they supported? . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
7.2.4 When the host MCU sends an AT command to the ESP32-C3 device, there is no response.
What is the reason? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
7.2.5 Do AT commands support ESP-WIFI-MESH? . . . . . . . . . . . . . . . . . . . . . . . 325
7.2.6 Does AT support websocket commands? . . . . . . . . . . . . . . . . . . . . . . . . . . 325
7.2.7 Can AT command set Bluetooth LE transmit power? . . . . . . . . . . . . . . . . . . . . 325
7.2.8 How to support commands that are not supported by the default firmware but can be sup-
ported after configuring and compiling the ESP-AT project? . . . . . . . . . . . . . . . . 325
7.2.9 How to handle special characters in AT commands? . . . . . . . . . . . . . . . . . . . . 326
7.2.10 Can the serial port baudrate be modified in AT Commands? (Default: 115200) . . . . . . 326
7.2.11 After ESP32-C3 enters the passthrough mode using AT commands, can ESP32-C3 give a
message if the connected hotspot is disconnected? . . . . . . . . . . . . . . . . . . . . . 326
7.2.12 How to set ADV broadcast parameters after it exceeds 32 bytes? . . . . . . . . . . . . . . 326
7.3 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
7.3.1 How big is the chip flash required for ESP-AT firmware on different modules? . . . . . . 326
7.3.2 How to view the error log of AT firmware? . . . . . . . . . . . . . . . . . . . . . . . . . 326
7.3.3 The UART1 communication pin used by ESP-AT on the ESP32-C3 module is inconsistent
with the default UART1 pin described in the ESP32-C3 module s datasheet? . . . . . . 326
7.4 Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
7.4.1 How long does it take for the AT to connect to Wi-Fi? . . . . . . . . . . . . . . . . . . . 326
7.4.2 Is it possible to change the TCP send window size in AT firmware? . . . . . . . . . . . . 327
7.4.3 How to test and optimize the throughput of ESP32-C3 AT? . . . . . . . . . . . . . . . . 327
7.5 Other . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
7.5.1 What interfaces of ESP32-C3 chips can be used to transmit AT commands? . . . . . . . . 327
7.5.2 How does ESP-AT conduct BQB certification? . . . . . . . . . . . . . . . . . . . . . . . 327
7.5.3 How do I specify the TLS protocol version for ESP32-C3 AT? . . . . . . . . . . . . . . . 327
7.5.4 How to modify the number of TCP connections in AT? . . . . . . . . . . . . . . . . . . 327
9 About 333
Index 335
Index 335
vii
viii
Table of contents
This is the documentation for ESP-AT Development Framework. ESP-AT project was started and powered by
Espressif Systems as an official project, for the ESP32, ESP32-C3, ESP8266, and ESP32-S2 Series SoCs provided
for Windows, Linux, and macOS.
This document describes using ESP-AT with the ESP32-C3 SoC.
Get Started
This Get Started guide provides users with detailed information on what is ESP-AT, how to connect hardware, and
how to download and flash AT firmware. It consists of the following parts:
ESP-AT is a solution developed by Espressif to integrate connectivity into customers products, which can be quickly
moved to mass production. It aims to reduce software development costs and quickly form products. With ESP-AT
commands, you can quickly join the wireless network, connect to the cloud platform, realize data transmission and
remote control functions, and realize the interconnection of everything through wireless communication easily.
ESP-AT is a project based on ESP-IDF. It makes an ESP32-C3 board work as a slave, and an MCU as a host. The host
MCU sends AT commands to the ESP32-C3 chip and receives AT responses back. ESP-AT provides a wide range
of AT commands with different functions, such as Wi-Fi commands, TCP/IP commands, Bluetooth LE commands,
Bluetooth commands, MQTT commands, HTTP commands, and Ethernet commands.
AT commands start with AT , which stand for Attention , and end with a new line (CR LF). Every time
you send a command, you will receive an OK or ERROR, which indicates the final execution status of the current
command. Please be noted that all commands are executed serially, which means only one AT command can be
executed at a time. Therefore, you should wait for the previous command to be executed before sending out the next
3
Chapter 1. Get Started
one. Otherwise, you will receive busy P.... For more details about AT commands, please refer to AT Command
Set.
By default, the host MCU connects to the ESP32-C3 board via UART, and sends/receives AT commands/responses
through UART. But you can also use other interfaces, such as SDIO, according to your actual use scenario.
You can develop your own AT commands based on our ESP-AT project and implement more features according to
your actual use scenario.
This document introduces what hardware you need to prepare and how to connect them in order to download AT
firmware, send AT commands, and receive AT responses.
For different series of modules, the commands supported by AT firmware are different. Please refer to ESP-AT
Firmware Differences for more details.
Please note that in the above picture, four jump wires are used to connect the ESP32-C3 board and USB to serial
converter. If you don t use hardware flow control, two wires connecting TX/RX and a simpler converter will be
enough.
ESP32-C3 AT uses two UART ports: UART0 is used to download firmware and log output; UART1 is used to send
AT commands and receive AT responses. Both UART0 and UART1 use 115200 baud rate for communication by
default.
AT command/response 2
UART1 USB to serial converter
• GPIO6 (RX) • TX
• GPIO7 (TX) • RX
• GPIO5 (CTS) • RTS
• GPIO4 (RTS) • CTS
Note 1: Connection between individual pins of the ESP32-C3 board and the PC is already established internally on
the ESP32-C3 board. You only need to provide USB cable between the board and PC.
Note 2: Connection between CTS/RTS is optional, depending on whether you want to use hardware flow control.
If you want to connect your device directly with ESP32-C3-MINI-1 module rather than the ESP32-C3 board that
integrates it, please refer to ESP32-C3-MINI-1 Datasheet for more details.
This Guide demonstrates how to download AT firmware and flash it into an ESP32-C3-MINI-1 device by taking
ESP32-C3-MINI-1 as an example. The Guide is also applicable to other ESP32-C3 modules.
Before you start, please make sure you have already connected your hardware. For more details, see Hardware
Connection.
For different series of modules, the commands supported by AT firmware are different. Please refer to ESP-AT
Firmware Differences for more details.
The file download.config contains the configuration to flash the firmware into multiple addresses:
--flash_mode dio --flash_freq 40m --flash_size 4MB
0x8000 partition_table/partition-table.bin
0xd000 ota_data_initial.bin
0xf000 phy_init_data.bin
0x0 bootloader/bootloader.bin
0x60000 esp-at.bin
0x1e000 at_customize.bin
0x1F000 customized_partitions/ble_data.bin
0x3a000 customized_partitions/mqtt_key.bin
0x27000 customized_partitions/server_key.bin
0x3c000 customized_partitions/mqtt_ca.bin
0x2d000 customized_partitions/client_key.bin
0x2b000 customized_partitions/client_cert.bin
0x31000 customized_partitions/factory_param.bin
0x2f000 customized_partitions/client_ca.bin
0x38000 customized_partitions/mqtt_cert.bin
0x29000 customized_partitions/server_ca.bin
0x25000 customized_partitions/server_cert.bin
• --flash_mode dio means the firmware is compiled with flash DIO mode.
• --flash_freq 40m means the firmware s flash frequency is 40 MHz.
• --flash_size 4MB means the firmware is using flash size 4 MB.
• 0xd000 ota_data_initial.bin means downloading ota_data_initial.bin into the address
0xd000.
Windows
Before starting to flash, you need to download Flash Download Tools for Windows. For more details about the tools,
please see the doc folder in the zip folder.
• Open the ESP32-C3 Flash Download Tool.
• Select chipType. (Here, we select ESP32C3.)
• Select a workMode according to your need. (Here, we select Developer Mode.)
• Select a loadMode according to your need. (Here, we select uart.)
• Flash AT firmware into your device. You can select either of the two ways below.
– To download one combined factory bin to address 0, select DoNotChgBin to use the default config-
uration of the factory bin.
– To download multiple bins separately to different addresses, set up the configurations according to the
file download.config and do NOT select DoNotChgBin .
In case of flashing issues, please verify what the COM port number of download interface of the ESP32-C3 board
is and select it from COM: dropdown list. If you don t know the port number, you can refer to Check port on
Windows for details.
When you finish flashing, please Check Whether AT Works.
Linux or macOS
Replace PORTNAME with your port name. If you don t know it, you can refer to Check port on Linux and
macOS for details.
Replace download.config with the content inside the file.
Below is the example command for ESP32-C3-MINI-1.
,→0x25000 customized_partitions/server_cert.bin
• To download the bins together to one address, enter the following command and replace PORTNAME and
FILEDIRECTORY:
Replace PORTNAME with your port name. If you don t know it, you can refer to Check port on Linux and
macOS for details.
Replace FILEDIRECTORY with the file directory you would flash to the address 0x0. It is normally fac-
tory/XXX.bin.
Below is the example command for ESP32-C3-MINI-1.
ESP-ROM:esp32c3-api1-20210207
Build:Feb 7 2021
rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:2
load:0x3fcd6100,len:0x1948
load:0x403ce000,len:0x8dc
load:0x403d0000,len:0x2de0
entry 0x403ce000
I (31) boot: ESP-IDF v4.3.1-354-g98d34e5 2nd stage bootloader
I (32) boot: compile time 11:21:56
I (32) boot: chip revision: 3
I (34) boot.esp32c3: SPI Speed : 40MHz
I (39) boot.esp32c3: SPI Mode : DIO
I (44) boot.esp32c3: SPI Flash Size : 4MB
I (49) boot: Enabling RNG early entropy source...
I (54) boot: Partition Table:
I (58) boot: ## Label Usage Type ST Offset Length
I (65) boot: 0 otadata OTA data 01 00 0000d000 00002000
I (72) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (80) boot: 2 nvs WiFi data 01 02 00010000 0000e000
I (87) boot: 3 at_customize unknown 40 00 0001e000 00042000
I (95) boot: 4 ota_0 OTA app 00 10 00060000 001d0000
I (102) boot: 5 ota_1 OTA app 00 11 00230000 001d0000
I (110) boot: End of partition table
I (114) esp_image: segment 0: paddr=00060020 vaddr=3c140020 size=29060h (168032)␣
,→map
AT Binary Lists
It is recommended to use the lastest version of firmware. Currently, Espressif only releases AT firmware for the
following ESP32-C3 series of modules.
Note: If there is no released firmware for your module, you can either use the firmware for the module that has the
same hardware configuration as yours (see ESP-AT Firmware Differences for which module has the same configura-
tion), or create a factory parameter bin for your module (see How to Generate Factory Parameter Bin for details).
Note: If you design your own module, please configure and compile with reference to How to Generate Factory
Parameter Bin, and the binaries will be automatically generated after compilation. Or you can select firmware
with similar configuration according to the configuration of UART pins,PSRAM,Flash (The premise is to
ensure that the hardware meets the requirements. Please refer to ESP-AT Firmware Differences for the firmware
applicable to your module).
When you flash the firmware into module according to the download.config, the cus-
tomized_partitions/factory_param.bin should be replaced with the actual module-specific
11
Chapter 2. AT Binary Lists
• ESP32-C3 Series
Modules UART Pins (TX, RX, CTS, RTS) Factory Parameter Bin
ESP32-C3-MINI Series factory_param_MINI-1.
• GPIO7
bin
• GPIO6
• GPIO5
• GPIO4
• ble_data.bin provides Bluetooth LE services when the ESP32-C3 works as a Bluetooth LE server;
• server_cert.bin, server_key.bin and server_ca.bin are examples of SSL server s certifi-
cate;
• client_cert.bin, client_key.bin and client_ca.bin are examples of SSL client s certifi-
cate;
• mqtt_cert.bin, mqtt_key.bin and mqtt_ca.bin are examples of MQTT SSL client s certificate;
If some of the functions are not used, then the corresponding binaries need not to be downloaded into flash.
AT Command Set
Execute Command
Command:
AT
13
Chapter 3. AT Command Set
Response:
OK
Execute Command
Command:
AT+RST
Response:
OK
Execute Command
Command:
AT+GMR
Response:
OK
Parameters
• <AT version info>: information about the esp-at core library version, which is under the directory: esp-at/
components/at/lib/. Code is closed source, no plan to open.
• <SDK version info>: information about the esp-at platform sdk version, which is defined in file: esp-at/
module_config/module_{platform}_default/IDF_VERSION
• <compile time>: the time to compile the firmware.
• <Bin version>: esp-at firmware version. Version information can be modified in menuconfig.
Note
• If you have any issues on esp-at firmware, please provide AT+GMR version information firstly.
Example
AT+GMR
AT version:2.2.0.0-dev(ca41ec4 - ESP32-C3 - Sep 16 2020 11:28:17)
SDK version:v4.0.1-193-ge7ac221b4
compile time(98b95fc):Oct 29 2020 11:23:25
Bin version:2.1.0(MINI-1)
(continues on next page)
OK
3.1.4 AT+CMD: List all AT commands and types supported in current firmware
Query Command
Command:
AT+CMD?
Response:
OK
Parameters
Set Command
Command:
AT+GSLP=<time>
Response:
<time>
OK
Parameter
• <time>: the duration when the device stays in Deep-sleep. Unit: millisecond. When the time is up, the device
automatically wakes up, calls Deep-sleep wake stub, and then proceeds to load the application.
– 0 means restarting right now
– the maximum Deep-sleep time is about 28.8 days (2 31 -1 milliseconds)
Notes
• The theoretical and actual time of Deep-sleep may be different due to external factors.
Execute Command
Command:
ATE0
or
ATE1
Response:
OK
Parameters
Execute Command
Command:
AT+RESTORE
Response:
OK
Notes
• The execution of this command will restore all parameters saved in flash to factory default settings of the
module.
• The device will be restarted when this command is executed.
Query Command
Command:
AT+UART_CUR?
Response:
+UART_CUR:<baudrate>,<databits>,<stopbits>,<parity>,<flow control>
OK
Set Command
Command:
AT+UART_CUR=<baudrate>,<databits>,<stopbits>,<parity>,<flow control>
Response:
OK
Parameters
Notes
• The Query Command will return actual values of UART configuration parameters, which may have minor
differences from the set value because of the clock division.
• The configuration changes will NOT be saved in flash.
• To use hardware flow control, you need to connect CTS/RTS pins of your ESP32-C3. For more de-
tails, please refer to Hardware Connection or components/customized_partitions/raw_data/
factory_param/factory_param_data.csv.
Example
AT+UART_CUR=115200,8,1,0,3
Query Command
Command:
AT+UART_DEF?
Response:
+UART_DEF:<baudrate>,<databits>,<stopbits>,<parity>,<flow control>
OK
Set Command
Command:
AT+UART_DEF=<baudrate>,<databits>,<stopbits>,<parity>,<flow control>
Response:
OK
Parameters
Notes
• The configuration changes will be saved in the NVS area, and will still be valid when the chip is powered on
again.
• To use hardware flow control, you need to connect CTS/RTS pins of your ESP32-C3. For more de-
tails, please refer to Hardware Connection or components/customized_partitions/raw_data/
factory_param/factory_param_data.csv.
Example
AT+UART_DEF=115200,8,1,0,3
Query Command
Command:
AT+SLEEP?
Response:
+SLEEP:<sleep mode>
OK
Set Command
Command:
AT+SLEEP=<sleep mode>
Response:
OK
Parameter
• <sleep mode>:
– 0: Disable the sleep mode.
– 1: Modem-sleep mode.
∗ Only Wi-Fi mode.
· RF will be periodically closed according to AP DTIM.
∗ Only BLE mode.
· RF will be periodically closed according to advertising interval ( BLE state in advertising ).
· RF will be periodically closed according to connection interval ( BLE state in connection ).
– 2: Light-sleep mode.
∗ Only Wi-Fi mode.
· CPU will automatically sleep and RF will be periodically closed according to listen in-
terval set by AT+CWJAP.
∗ Only BLE mode.
· CPU will automatically sleep and RF will be periodically closed according to advertising interval
( BLE state in advertising ).
· CPU will automatically sleep and RF will be periodically closed according to connection interval
( BLE state in connection ).
– 3: Modem-sleep listen interval mode.
∗ Only Wi-Fi mode.
· RF will be periodically closed according to listen interval set by AT+CWJAP.
∗ Only BLE mode.
· RF will be periodically closed according to advertising interval ( BLE state in advertising ).
· RF will be periodically closed according to connection interval ( BLE state in connection ).
Note
• When sleep mode is disabled, you cannot initialize Bluetooth LE. When Bluetooth LE is initialized, you cannot
disable sleep mode.
• Modem-sleep mode and Light-sleep mode can be set under Wi-Fi mode or BLE mode, but in Wi-Fi mode,
these two modes can only be set in station mode.
• Before setting the Light-sleep mode, it is recommended to set the wakeup source in advance through the
command AT+SLEEPWKCFG, otherwise ESP32-C3 can t wake up and will always be in sleep mode.
• After setting the Light-sleep mode, if the Light-sleep wakeup condition is not met, ESP32-C3 will automatically
enter the sleep mode. When the Light-sleep wakeup condition is met, ESP32-C3 will automatically wake up
from sleep mode.
• For Light-sleep mode in BLE mode, users must ensure external 32KHz crystal oscillator, otherwise the Light-
sleep mode will work in Modem-sleep mode.
• For more examples, please refer to Sleep AT Examples.
Example
AT+SLEEP=0
3.1.11 AT+SYSRAM: Query Current Remaining Heap Size and Minimum Heap Size
Query Command
Command:
AT+SYSRAM?
Response:
Parameters
Example
AT+SYSRAM?
+SYSRAM:148408,84044
OK
Query Command
Function:
Query the current system prompt information state.
Command:
AT+SYSMSG?
Response:
+SYSMSG:<state>
OK
Set Command
Function:
Configure system prompt information.
Command:
AT+SYSMSG=<state>
Response:
OK
Parameter
• <state>:
– Bit0: Prompt information when quitting Wi-Fi Passthrough Mode, Bluetooth LE SPP and Bluetooth SPP.
∗ 0: Print no prompt information when quitting Wi-Fi Passthrough Mode, Bluetooth LE SPP and
Bluetooth SPP.
∗ 1: Print +QUITT when quitting Wi-Fi Passthrough Mode, Bluetooth LE SPP and Bluetooth SPP.
– Bit1: Connection prompt information type.
∗ 0: Use simple prompt information, such as XX,CONNECT.
∗ 1: Use detailed prompt information, such as +LINK_CONN:status_type,link_id,
ip_type,terminal_type,remote_ip,remote_port,local_port.
– Bit2: Connection status prompt information for Wi-Fi Passthrough Mode, Bluetooth LE SPP and Blue-
tooth SPP.
∗ 0: Print no prompt information.
∗ 1: Print one of the following prompt information when Wi-Fi, socket, Bluetooth LE or Bluetooth
status is changed:
Notes
Example
or
// In the transparent transmission mode, a prompt message will be printed when the␣
,→Wi-Fi, socket, Bluetooth LE or Bluetooth status changes
AT+SYSMSG=4
Query Command
Function:
Query user partitions in flash.
Command:
AT+SYSFLASH?
Response:
+SYSFLASH:<partition>,<type>,<subtype>,<addr>,<size>
OK
Set Command
Function:
Read/write the user partitions in flash.
Command:
AT+SYSFLASH=<operation>,<partition>,<offset>,<length>
Response:
+SYSFLASH:<length>,<data>
OK
Parameters
• <operation>:
– 0: erase sector
– 1: write data into the user partition
– 2: read data from the user partition
• <partition>: name of user partition
• <offset>: offset of user partition
• <length>: data length
• <type>: type of user partition
• <subtype>: subtype of user partition
• <addr>: address of user partition
• <size>: size of user partition
Notes
• Please make sure that you have downloaded at_customize.bin before using this command. For more details,
please refer to How to Customize Partitions.
• Before downloading the secondary user partition, please refer How to Generate PKI Files to generate the binary
user partition file.
• When erasing the targeted user partition in its entirety, you can omit the parameters <offset> and
<length>. For example, command AT+SYSFLASH=0,"ble_data" can erase the entire ble_data
user partition. But if you want to keep the two parameters, they have to be 4KB-aligned.
• The introduction to partitions is in ESP-IDF Partition Tables.
• If the operator is write, wrap return > after the write command, then you can send the data that you want to
write. The length should be parameter <length>.
• If the operator is write, please make sure that you have already erased this partition.
• If the operator is write on a PKI bin, the <length> should be 4 bytes aligned.
Example
Set Command
Command:
AT+FS=<type>,<operation>,<filename>,<offset>,<length>
Response:
OK
Parameters
Notes
• Please make sure that you have downloaded at_customize.bin before using this command. For more details,
refer to ESP-IDF Partition Tables and How to Customize Partitions.
• If the length of the read data is greater than the actual file length, only the actual data length of the file will be
returned.
• If the operator is write, wrap return > after the write command, then you can send the data that you want to
write. The length should be parameter <length>.
Example
// delete a file.
AT+FS=0,0,"filename"
Query Command
Function:
Query the RF TX Power.
Command:
AT+RFPOWER?
Response:
+RFPOWER:<wifi_power>,<ble_adv_power>,<ble_scan_power>,<ble_conn_power>
OK
Set Command
Command:
AT+RFPOWER=<wifi_power>[,<ble_adv_power>,<ble_scan_power>,<ble_conn_power>]
Response:
OK
Parameters
• <wifi_power>: the unit is 0.25 dBm. For example, if you set the value to 78, the actual maximum RF Power
value is 78 * 0.25 dBm = 19.5 dBm. After you configure it, please confirm the actual value by entering the
command AT+RFPOWER?.
– For ESP32-C3 devices, the range is [40,84]:
3.1.16 Note
• Since the RF TX Power is actually divided into several levels, and each level has its own value range, the
wifi_power value queried by the esp_wifi_get_max_tx_power may differ from the value set by
esp_wifi_set_max_tx_power and is no larger than the set value.
Execute Command
Command:
AT+SYSROLLBACK
Response:
OK
Note
• This command will not upgrade via OTA. It only rolls back to the firmware which is in the other OTA partition.
Query Command
Function:
Query the time stamp.
Command:
AT+SYSTIMESTAMP?
Response:
+SYSTIMESTAMP:<Unix_timestamp>
OK
Set Command
Function:
Set local time stamp. It will be the same as SNTP time when the SNTP time is updated.
Command:
AT+SYSTIMESTAMP=<Unix_timestamp>
Response:
OK
Parameter
Example
Query Command
Function:
Query whether the AT error code prompt is enabled or not.
Command:
AT+SYSLOG?
Response:
+SYSLOG:<status>
OK
Set Command
Function:
Enable or disable the AT error code prompt.
Command:
AT+SYSLOG=<status>
Response:
OK
Parameter
Example
OK
AT+FAKE
ERR CODE:0x01090000
ERROR
OK
AT+FAKE
// No `ERR CODE:0x01090000`
ERROR
• extension: error extension information. There are different extensions for different subcategory. For more
information, please see the components/at/include/esp_at.h.
For example, the error code ERR CODE:0x01090000 means the command is not supported.
3.1.20 AT+SLEEPWKCFG: Set the Light-sleep Wakeup Source and Awake GPIO
Set Command
Command:
AT+SLEEPWKCFG=<wakeup source>,<param1>[,<param2>]
Response:
OK
Parameters
• <wakeup source>:
– 0: wakeup by a timer.
– 1: reserved.
– 2: wakeup by GPIO.
• <param1>:
– If the wakeup source is a timer, it means the time before wakeup. Unit: millisecond.
– If the wakeup source is GPIO, it means the GPIO number.
• <param2>:
– If the wakeup source is GPIO, it means the wakeup level:
– 0: low level.
– 1: high level.
Example
// Timer wakeup
AT+SLEEPWKCFG=0,1000
Query Command
Function:
Query the AT parameter store mode.
Command:
AT+SYSSTORE?
Response:
+SYSSTORE:<store_mode>
OK
Set Command
Command:
AT+SYSSTORE=<store_mode>
Response:
OK
Parameter
• <store_mode>:
– 0: command configuration is not stored into flash.
– 1: command configuration is stored into flash. (Default)
Note
• This command affects set commands only. Query commands are always fetched from RAM.
• Affected commands:
• AT+SYSMSG
• AT+CWMODE
• AT+CIPV6
• AT+CWJAP
• AT+CWSAP
• AT+CWRECONNCFG
• AT+CIPAP
• AT+CIPSTA
• AT+CIPAPMAC
• AT+CIPSTAMAC
• AT+CIPDNS
• AT+CIPSSLCCONF
• AT+CIPRECONNINTV
• AT+CIPTCPOPT
• AT+CWDHCPS
• AT+CWDHCP
• AT+CWSTAPROTO
• AT+CWAPPROTO
• AT+CWJEAP
• AT+BLENAME
• AT+BLEADVPARAM
• AT+BLEADVDATA
• AT+BLEADVDATAEX
• AT+BLESCANRSPDATA
• AT+BLESCANPARAM
Examples
AT+SYSSTORE=0
AT+CWMODE=1 // Not stored into flash
AT+CWJAP="test","1234567890" // Not stored into flash
AT+SYSSTORE=1
(continues on next page)
Set Command
Command:
AT+SYSREG=<direct>,<address>[,<write value>]
Response:
Parameters
Note
• AT does not check address. Make sure that the registers you are operating on are valid.
Function:
Read data from the internal chip temperature sensor and convert it into values in Celsius degrees.
Query Command
Command:
AT+SYSTEMP?
Response:
+SYSTEMP:<value>
OK
Parameter
• <value>: Celsius temperature value. Floating point type with two decimal places.
Query Command
Function:
Query the Wi-Fi mode of ESP32-C3.
Command:
AT+CWMODE?
Response:
+CWMODE:<mode>
OK
Set Command
Function:
Set the Wi-Fi mode of ESP32-C3.
Command:
AT+CWMODE=<mode>[,<auto_connect>]
Response:
OK
Parameters
• <mode>:
– 0: Null mode. Wi-Fi RF will be disabled.
– 1: Station mode.
– 2: SoftAP mode.
– 3: SoftAP+Station mode.
• <auto_connect>: Enable or disable automatic connection to an AP when you change the mode of the ESP32-
C3 from the SoftAP mode or null mode to the station mode or the SoftAP+Station mode. Default: 1. If you
omit the parameter, the default value will be used, i.e. automatically connecting to an AP.
– 0: The ESP32-C3 will not automatically connect to an AP.
– 1: The ESP32-C3 will automatically connect to an AP if the configuration to connect to the AP has
already been saved in flash before.
Note
Example
AT+CWMODE=3
Query Command
Function:
Query the Wi-Fi state and Wi-Fi information of ESP32-C3.
Command:
AT+CWSTATE?
Response:
+CWSTATE:<state>,<"ssid">
OK
Parameters
Note
• When ESP32-C3 station is not connected to an AP, it is recommended to use this command to query Wi-Fi
information; after ESP32-C3 station is connected to an AP, it is recommended to use AT+CWJAP to query
Wi-Fi information.
Query Command
Function:
Query the AP to which the ESP32-C3 Station is already connected.
Command:
AT+CWJAP?
Response:
+CWJAP:<ssid>,<bssid>,<channel>,<rssi>,<pci_en>,<reconn_interval>,<listen_interval>
,→,<scan_mode>,<pmf>
OK
Set Command
Function:
Connect an ESP32-C3 station to a targeted AP.
Command:
AT+CWJAP=[<ssid>],[<pwd>][,<bssid>][,<pci_en>][,<reconn_interval>][,<listen_
,→interval>][,<scan_mode>][,<jap_timeout>][,<pmf>]
Response:
WIFI CONNECTED
WIFI GOT IP
OK
[WIFI GOT IPv6 LL]
[WIFI GOT IPv6 GL]
or
+CWJAP:<error code>
ERROR
Execute Command
Function:
Connect an ESP32-C3 station to a targeted AP with last Wi-Fi configuration.
Command:
AT+CWJAP
Response:
WIFI CONNECTED
WIFI GOT IP
OK
[WIFI GOT IPv6 LL]
[WIFI GOT IPv6 GL]
or
+CWJAP:<error code>
ERROR
Parameters
Notes
command AT+CWRECONNCFG. Therefore, if you omit <reconn_interval> when running this com-
mand, the interval between Wi-Fi reconnections will use the default value 1.
• If the <ssid> and <password> parameter are omitted, AT will use the last configuration.
• Execute command has the same maximum timeout to setup command. The default value is 15 seconds, but
you can change it by setting the parameter <jap_timeout>.
• To get an IPv6 address, you need to set AT+CIPV6=1.
• Response OK means that the IPv4 network is ready, but not the IPv6 network. At present, ESP-AT is mainly
based on IPv4 network, supplemented by IPv6 network.
• WIFI GOT IPv6 LL represents that the linklocal IPv6 address has been obtained. This address is calculated
locally through EUI-64 and does not require the participation of the AP. Because of the parallel timing, this
print may be before or after OK.
• WIFI GOT IPv6 GL represents that the global IPv6 address has been obtained. This address is combined by
the prefix issued by AP and the suffix calculated internally, which requires the participation of the AP. Because
of the parallel timing, this print may be before or after OK, or it may not be printed because the AP does not
support IPv6.
Example
// If the target AP's SSID is "abc" and the password is "0123456789", the command␣
,→should be:
AT+CWJAP="abc","0123456789"
// If the target AP's SSID is "ab\,c" and the password is "0123456789"\", the␣
,→command should be:
AT+CWJAP="ab\\\,c","0123456789\"\\"
// If multiple APs all have the SSID of "abc", the target AP can be found by BSSID:
AT+CWJAP="abc","0123456789","ca:d7:19:d8:a6:44"
AT+CWJAP="abc","0123456789",,,,,,,3
Query Command
Function:
Query the configuration of Wi-Fi reconnect.
Command:
AT+CWRECONNCFG?
Response:
+CWRECONNCFG:<interval_second>,<repeat_count>
OK
Set Command
Function:
Set the configuration of Wi-Fi reconnect.
Command:
AT+CWRECONNCFG=<interval_second>,<repeat_count>
Response:
OK
Parameters
• <interval_second>: the interval between Wi-Fi reconnections. Unit: second. Default: 0. Maximum: 7200.
– 0: The ESP32-C3 station will not reconnect to the AP when disconnected.
– [1,7200]: The ESP32-C3 station will reconnect to the AP at the specified interval when disconnected.
• <repeat_count>: the number of attempts the ESP32-C3 makes to reconnect to the AP. This parameter only
works when the parameter <interval_second> is not 0. Default: 0. Maximum: 1000.
– 0: The ESP32-C3 station will always try to reconnect to AP.
– [1,1000]: The ESP32-C3 station will attempt to reconnect to AP for the specified times.
Example
// The ESP32-C3 station tries to reconnect to AP at the interval of one second for␣
,→100 times.
AT+CWRECONNCFG=1,100
Notes
Set Command
Command:
AT+CWLAPOPT=<reserved>,<print mask>[,<rssi filter>][,<authmode mask>]
Response:
OK
or
ERROR
Parameters
Example
// The first parameter is 1, meaning that the result of the command AT+CWLAP will␣
,→be ordered according to RSSI;
// The second parameter is 31, namely 0x1F, meaning that the corresponding bits of
,→<print mask> are set to 1. All parameters will be shown in the result of␣
,→AT+CWLAP.
AT+CWLAPOPT=1,31
AT+CWLAP
Set Command
Function:
Query the APs with specified parameters, such as the SSID, MAC address, or channel.
Command:
AT+CWLAP=[<ssid>,<mac>,<channel>,<scan_type>,<scan_time_min>,<scan_time_max>]
Execute Command
Function:
AT+CWLAP
Response:
+CWLAP:<ecn>,<ssid>,<rssi>,<mac>,<channel>,<freq_offset>,<freqcal_val>,<pairwise_
,→cipher>,<group_cipher>,<bgn>,<wps>
OK
Parameters
Example
AT+CWLAP="Wi-Fi","ca:d7:19:d8:a6:44",6,0,400,1000
Execute Command
Command:
AT+CWQAP
Response:
OK
Query Command
Function:
Query the configuration parameters of an ESP32-C3 SoftAP.
Command:
AT+CWSAP?
Response:
Set Command
Function:
Set the configuration of an ESP32-C3 SoftAP.
Command:
Response:
OK
Parameters
– 0: OPEN
– 2: WPA_PSK
– 3: WPA2_PSK
– 4: WPA_WPA2_PSK
• [<max conn>]: maximum number of stations that ESP32-C3 SoftAP can connect. Range: [1,10].
• [<ssid hidden>]:
– 0: broadcasting SSID (default).
– 1: not broadcasting SSID.
Notes
Example
AT+CWSAP="ESP","1234567890",5,3
Execute Command
Command:
AT+CWLIF
Response:
+CWLIF:<ip addr>,<mac>
OK
Parameters
• <ip addr>: IP address of the station that connects to the ESP32-C3 SoftAP.
• <mac>: MAC address of the station that connects to the ESP32-C3 SoftAP.
Note
• This command cannot get a static IP. It works only when DHCP of both the ESP32-C3 SoftAP and the
connected station are enabled.
Execute Command
Function:
Disconnect all stations that are connected to the ESP32-C3 SoftAP.
Command:
AT+CWQIF
Response:
OK
Set Command
Function:
Disconnect a specific station from the ESP32-C3 SoftAP.
Command:
AT+CWQIF=<mac>
Response:
OK
Parameter
Query Command
Command:
AT+CWDHCP?
Response:
+CWDHCP:<state>
OK
Set Command
Function:
Enable/disable DHCP.
Command:
AT+CWDHCP=<operate>,<mode>
Response:
OK
Parameters
• <operate>:
– 0: disable
– 1: enable
• <mode>:
– Bit0: Station DHCP
– Bit1: SoftAP DHCP
• <state>: the status of DHCP
– Bit0:
∗ 0: Station DHCP is disabled.
∗ 1: Station DHCP is enabled.
– Bit1:
∗ 0: SoftAP DHCP is disabled.
∗ 1: SoftAP DHCP is enabled.
– Bit2:
∗ 0: Ethernet DHCP is disabled.
∗ 1: Ethernet DHCP is enabled.
Notes
Example
// Enable Station DHCP. If the last DHCP mode is 2, the current DHCP mode will be␣
,→3.
AT+CWDHCP=1,1
// Disable SoftAP DHCP. If the last DHCP mode is 3, the current DHCP mode will be␣
,→1.
AT+CWDHCP=0,2
Query Command
Command:
AT+CWDHCPS?
Response:
Set Command
Function:
Response:
OK
Parameters
• <enable>:
– 1: Enable DHCP server settings. The parameters below have to be set.
– 0: Disable DHCP server settings and use the default IP address range.
• <lease time>: lease time. Unit: minute. Range [1,2880].
• <start IP>: start IP address of the IP address range that can be obtained from ESP32-C3 SoftAP DHCP
server.
• <end IP>: end IP address of the IP address range that can be obtained from ESP32-C3 SoftAP DHCP server.
Notes
Example
AT+CWDHCPS=1,3,"192.168.4.10","192.168.4.15"
AT+CWDHCPS=0 // Disable the settings and use the default IP address range.
Set Command
Command:
AT+CWAUTOCONN=<enable>
Response:
OK
Parameters
• <enable>:
– 1: Enable automatic connection to an AP when powered on. (Default)
– 0: Disable automatic connection to an AP when powered on.
Note
Example
AT+CWAUTOCONN=1
Query Command
Command:
AT+CWAPPROTO?
Response:
+CWAPPROTO=<protocol>
OK
Set Command
Command:
AT+CWAPPROTO=<protocol>
Response:
OK
Parameters
• <protocol>:
– bit0: 802.11b protocol standard.
– bit1: 802.11g protocol standard.
– bit2: 802.11n protocol standard.
Note
Query Command
Command:
AT+CWSTAPROTO?
Response:
+CWSTAPROTO=<protocol>
OK
Set Command
Command:
AT+CWSTAPROTO=<protocol>
Response:
OK
Parameters
• <protocol>:
– bit0: 802.11b protocol standard.
– bit1: 802.11g protocol standard.
– bit2: 802.11n protocol standard.
Note
Query Command
Function:
Query the MAC address of the ESP32-C3 Station.
Command:
AT+CIPSTAMAC?
Response:
+CIPSTAMAC:<mac>
OK
Set Command
Function:
Set the MAC address of an ESP32-C3 station.
Command:
AT+CIPSTAMAC=<mac>
Response:
OK
Parameters
Notes
Example
AT+CIPSTAMAC="1a:fe:35:98:d3:7b"
Query Command
Function:
Query the MAC address of the ESP32-C3 SoftAP.
Command:
AT+CIPAPMAC?
Response:
+CIPAPMAC:<mac>
OK
Set Command
Function:
Set the MAC address of the ESP32-C3 SoftAP.
Command:
AT+CIPAPMAC=<mac>
Response:
OK
Parameters
Notes
• Bit 0 of the ESP32-C3 MAC address CANNOT be 1. For example, a MAC address can be 18: but not
15: .
• FF:FF:FF:FF:FF:FF and 00:00:00:00:00:00 are invalid MAC and cannot be set.
Example
AT+CIPAPMAC="18:fe:35:98:d3:7b"
Query Command
Function:
Query the IP address of the ESP32-C3 Station.
Command:
AT+CIPSTA?
Response:
+CIPSTA:ip:<"ip">
+CIPSTA:gateway:<"gateway">
+CIPSTA:netmask:<"netmask">
+CIPSTA:ip6ll:<"ipv6 addr">
+CIPSTA:ip6gl:<"ipv6 addr">
OK
Set Command
Function:
Set the IPv4 address of the ESP32-C3 station.
Command:
AT+CIPSTA=<"ip">[,<"gateway">,<"netmask">]
Response:
OK
Parameters
• < ip >: string parameter showing the IPv4 address of the ESP32-C3 station.
• < gateway >: gateway.
• < netmask >: netmask.
• < ipv6 addr >: string parameter showing the IPv6 address of the ESP32-C3 station.
Notes
• For the query command, only when the ESP32-C3 station is connected to an AP or the static IP address is
configured can its IP address be queried.
• The configuration changes will be saved in the NVS area if AT+SYSSTORE=1.
• The Set Command correlates with the commands that set DHCP, such as AT+CWDHCP.
– If static IP address is enabled, DHCP will be disabled;
– If DHCP is enabled, static IP address will be disabled;
– The last configuration overwrites the previous configuration.
Example
AT+CIPSTA="192.168.6.100","192.168.6.1","255.255.255.0"
Query Command
Function:
Query the IP address of the ESP32-C3 SoftAP.
Command:
AT+CIPAP?
Response:
+CIPAP:ip:<"ip">
+CIPAP:gateway:<"gateway">
+CIPAP:netmask:<"netmask">
+CIPAP:ip6ll:<"ipv6 addr">
+CIPAP:ip6gl:<"ipv6 addr">
OK
Set Command
Function:
Set the IPv4 address of the ESP32-C3 SoftAP.
Command:
AT+CIPAP=<"ip">[,<"gateway">,<"netmask">]
Response:
OK
Parameters
• < ip >: string parameter showing the IPv4 address of the ESP32-C3 SoftAP.
• < gateway >: gateway.
• < netmask >: netmask.
• < ipv6 addr >: string parameter showing the IPv6 address of the ESP32-C3 SoftAP.
Notes
Example
AT+CIPAP="192.168.5.1","192.168.5.1","255.255.255.0"
Execute Command
Function:
Start SmartConfig of the type ESP-TOUCH+AirKiss.
Command:
AT+CWSTARTSMART
Set Command
Function:
Start SmartConfig of a designated type.
Command:
Response:
OK
Parameters
• <type>:
– 1: ESP-TOUCH
– 2: AirKiss
– 3: ESP-TOUCH+AirKiss
– 4: ESP-TOUCH v2
• <auth floor>: Wi-Fi authentication mode floor. ESP-AT will not connect to the AP whose authmode is lower
than this floor.
– 0: OPEN (Default)
– 1: WEP
– 2: WPA_PSK
– 3: WPA2_PSK
– 4: WPA_WPA2_PSK
– 5: WPA2_ENTERPRISE
– 6: WPA3_PSK
– 7: WPA2_WPA3_PSK
• < esptouch v2 key >: ESP-TOUCH v2 decrypt key. It is used to decrypt Wi-Fi password and reserved
data. Length: 16 bytes.
Notes
Example
AT+CWMODE=1
AT+CWSTARTSMART
Execute Command
Command:
AT+CWSTOPSMART
Response:
OK
Note
• Irrespective of whether SmartConfig succeeds or not, please always call AT+CWSTOPSMART before executing
any other AT commands to release the internal memory taken up by SmartConfig.
Example
AT+CWMODE=1
AT+CWSTARTSMART
AT+CWSTOPSMART
Set Command
Command:
AT+WPS=<enable>[,<auth floor>]
Response:
OK
Parameters
• <enable>:
– 1: Enable WPS (Wi-Fi Protected Setup) that uses PBC (Push Button Configuration) mode.
– 0: Disable WPS that uses PBC mode.
• <auth floor>: Wi-Fi authentication mode floor. ESP-AT will not connect to the AP whose authmode is lower
than this floor.
– 0: OPEN (Default)
– 1: WEP
– 2: WPA_PSK
– 3: WPA2_PSK
– 4: WPA_WPA2_PSK
– 5: WPA2_ENTERPRISE
– 6: WPA3_PSK
– 7: WPA2_WPA3_PSK
Notes
Example
AT+CWMODE=1
AT+WPS=1
Set Command
Command:
AT+MDNS=<enable>[,<hostname>,<service_name>,<port>]
Response:
OK
Parameters
• <enable>:
– 1: Enable the mDNS function. The following three parameters need to be set.
– 0: Disable the mDNS function. The following three parameters does not need to be set.
• <hostname>: mDNS host name.
• <service_name>: mDNS service name.
• <port>: mDNS port.
Example
AT+CWMODE=1
AT+CWJAP="1234567890","1234567890"
AT+MDNS=1,"espressif","_iot",8080
AT+MDNS=0
Query Command
Function:
Query the configuration information of the Enterprise AP to which the ESP32-C3 station is already connected.
Command:
AT+CWJEAP?
Response:
+CWJEAP:<ssid>,<method>,<identity>,<username>,<password>,<security>
OK
Set Command
Function:
Connect to the targeted Enterprise AP.
Command:
AT+CWJEAP=<ssid>,<method>,<identity>,<username>,<password>,<security>[,<jeap_
,→timeout>]
Response:
OK
or
+CWJEAP:Timeout
ERROR
Parameters
• <security>:
– Bit0: Client certificate.
– Bit1: Server certificate.
• [<jeap_timeout>]: maximum timeout for AT+CWJEAP command. Unit: second. Default: 15. Range:
[3,600].
Example
// Connect to EAP-TLS mode Enterprise AP, set identity, verify server certificate␣
,→and load client certificate
AT+CWJEAP="dlink11111",0,"example@espressif.com",,,3
// Connect to EAP-PEAP mode Enterprise AP, set identity, username and password,␣
,→not verify server certificate and not load client certificate
AT+CWJEAP="dlink11111",1,"example@espressif.com","espressif","test11",0
Error Code:
The WPA2 Enterprise error code will be prompt as ERR CODE:0x<%08x>.
AT_EAP_MALLOC_FAILED 0x8001
AT_EAP_GET_NVS_CONFIG_FAILED 0x8002
AT_EAP_CONN_FAILED 0x8003
AT_EAP_SET_WIFI_CONFIG_FAILED 0x8004
AT_EAP_SET_IDENTITY_FAILED 0x8005
AT_EAP_SET_USERNAME_FAILED 0x8006
AT_EAP_SET_PASSWORD_FAILED 0x8007
AT_EAP_GET_CA_LEN_FAILED 0x8008
AT_EAP_READ_CA_FAILED 0x8009
AT_EAP_SET_CA_FAILED 0x800A
AT_EAP_GET_CERT_LEN_FAILED 0x800B
AT_EAP_READ_CERT_FAILED 0x800C
AT_EAP_GET_KEY_LEN_FAILED 0x800D
AT_EAP_READ_KEY_FAILED 0x800E
AT_EAP_SET_CERT_KEY_FAILED 0x800F
AT_EAP_ENABLE_FAILED 0x8010
AT_EAP_ALREADY_CONNECTED 0x8011
AT_EAP_GET_SSID_FAILED 0x8012
AT_EAP_SSID_NULL 0x8013
AT_EAP_SSID_LEN_ERROR 0x8014
AT_EAP_GET_METHOD_FAILED 0x8015
AT_EAP_CONN_TIMEOUT 0x8016
AT_EAP_GET_IDENTITY_FAILED 0x8017
AT_EAP_IDENTITY_LEN_ERROR 0x8018
AT_EAP_GET_USERNAME_FAILED 0x8019
AT_EAP_USERNAME_LEN_ERROR 0x801A
AT_EAP_GET_PASSWORD_FAILED 0x801B
AT_EAP_PASSWORD_LEN_ERROR 0x801C
AT_EAP_GET_SECURITY_FAILED 0x801D
AT_EAP_SECURITY_ERROR 0x801E
AT_EAP_METHOD_SECURITY_UNMATCHED 0x801F
AT_EAP_PARAMETER_COUNTS_ERROR 0x8020
AT_EAP_GET_WIFI_MODE_ERROR 0x8021
AT_EAP_WIFI_MODE_NOT_STA 0x8022
AT_EAP_SET_CONFIG_FAILED 0x8023
AT_EAP_METHOD_ERROR 0x8024
Note
Query Command
Function:
Query the host name of ESP32-C3 Station.
Command:
AT+CWHOSTNAME?
Response:
+CWHOSTNAME:<hostname>
OK
Set Command
Function:
Set the host name of ESP32-C3 Station.
Command:
AT+CWHOSTNAME=<hostname>
Response:
OK
ERROR
Parameters
• <hostname>: the host name of the ESP32-C3 Station. Maximum length: 32 bytes.
Note
Example
AT+CWMODE=3
AT+CWHOSTNAME="my_test"
Query Command
Function:
Query Wi-Fi country code information.
Command:
AT+CWCOUNTRY?
Response:
+CWCOUNTRY:<country_policy>,<country_code>,<start_channel>,<total_channel_count>
OK
Set Command
Function:
Set the Wi-Fi country code information.
Command:
AT+ CWCOUNTRY=<country_policy>,<country_code>,<start_channel>,<total_channel_count>
Response:
OK
Parameters
• <country_policy>:
– 0: will change the county code to be the same as the AP that the ESP32-C3 is connected to.
– 1: the country code will not change, always be the one set by command.
• <country_code>: country code. Maximum length: 3 characters.
• <start_channel>: the channel number to start. Range: [1,14].
• <total_channel_count>: total number of channels.
Note
Example
AT+CWMODE=3
AT+CWCOUNTRY=1,"CN",1,13
Query Command
Function:
Query whether IPv6 is enabled.
Command:
AT+CIPV6?
Response:
+CIPV6:<enable>
OK
Set Command
Function:
Enable/Disable IPv6 network.
Command:
AT+CIPV6=<enable>
Response:
OK
Parameters
Notes
• You should enable IPv6 network before using IPv6 related upper layer AT commands
(TCP/UDP/SSL/PING/DNS based on IPv6 network, also known as TCP6/UDP6/SSL6/PING6/DNS6
or TCPv6/UDPv6/SSLv6/PINGv6/DNSv6).
Query Command
Command:
AT+CIPSTATE?
Response:
When there is a connection, AT returns:
OK
OK
Parameters
Execute Command
Command:
AT+CIPSTATUS
Response:
STATUS:<stat>
+CIPSTATUS:<link ID>,<"type">,<"remote IP">,<remote port>,<local port>,<tetype>
OK
Parameters
Notes
• It is recommended to use AT+CWSTATE command to query Wi-Fi state and AT+CIPSTATE command to
query TCP/UDP/SSL state.
Set Command
Command:
Response:
+CIPDOMAIN:<"IP address">
OK
Parameter
Example
Response:
For single connection, it returns:
CONNECT
OK
<link ID>,CONNECT
OK
Parameters
• <link ID>: ID of network connection (0~4), used for multiple connections. The range of this parameter
depends on two configuration items in menuconfig. One is AT_SOCKET_MAX_CONN_NUM of the AT
component, and its default value is 5. The other is LWIP_MAX_SOCKETS of the LWIP component, and its
default value is 10. To modify the range of this parameter, you need to set AT_SOCKET_MAX_CONN_NUM
and make sure it is no larger than the value of LWIP_MAX_SOCKETS. (See Compile ESP-AT Project for details
on configuring and build ESP-AT projects.)
• < type >: string parameter showing the type of transmission: TCP , or TCPv6 . Default: TCP .
• < remote host >: IPv4 address, IPv6 address, or domain name of remote host.
• <remote port>: the remote port number.
• <keep_alive>: It configures the SO_KEEPALIVE option for socket. Unit: second.
– Range: [0,7200].
∗ 0: disable keep-alive function (default).
∗ 1 ~ 7200: enable keep-alive function. TCP_KEEPIDLE value is <keep_alive>,
TCP_KEEPINTVL value is 1, and TCP_KEEPCNT value is 3.
– This parameter of this command is the same as the <keep_alive> parameter of AT+CIPTCPOPT
command. It always takes the value set later by either of the two commands. If it is omitted or not set,
the last configured value is used by default.
• < local IP >: the local IPv4 address or IPv6 address that the connection binds. This parameter is useful
when you are using multiple network interfaces or multiple IP addresses. By default, it is disabled. If you want
to use it, you should specify it first. Null is also valid.
Notes
• If you want to establish TCP connection based on IPv6 network, set AT+CIPV6=1 first, and ensure the
connected AP by AT+CWJAP supports IPv6 and esp-at got the IPv6 address which you can check it by
AT+CIPSTA.
Example
AT+CIPSTART="TCP","iot.espressif.cn",8000
AT+CIPSTART="TCP","192.168.101.110",1000
AT+CIPSTART="TCP","192.168.101.110",2500,60
AT+CIPSTART="TCP","192.168.101.110",1000,,"192.168.101.100"
AT+CIPSTART="TCPv6","test-ipv6.com",80
AT+CIPSTART="TCPv6","fe80::860d:8eff:fe9d:cd90",1000,,"fe80::411c:1fdb:22a6:4d24"
Response:
For single connection, it returns:
CONNECT
OK
<link ID>,CONNECT
OK
Parameters
• <link ID>: ID of network connection (0~4), used for multiple connections.
• < type >: string parameter showing the type of transmission: UDP , or UDPv6 . Default: TCP
.
• < remote host >: IPv4 address, IPv6 address, or domain name of remote host.
• <remote port>: remote port number.
• <local port>: UDP port of ESP32-C3.
• <mode>: In the UDP Wi-Fi passthrough, the value of this parameter has to be 0.
– 0: After UDP data is received, the parameters <"remote host"> and <remote port> will stay
unchanged (default).
– 1: Only the first time that UDP data is received from an IP address and port that are different from the
initially set value of parameters <remote host> and <remote port>, will they be changed to the
IP address and port of the device that sends the data.
– 2: Each time UDP data is received, the <"remote host"> and <remote port> will be changed
to the IP address and port of the device that sends the data.
• < local IP >: the local IPv4 address or IPv6 address that the connection binds. This parameter is useful
when you are using multiple network interfaces or multiple IP addresses. By default, it is disabled. If you want
to use it, you should specify it first. Null is also valid.
Notes
• If the remote host over the UDP is an IPv4 multicast address (224.0.0.0 ~ 239.255.255.255), the ESP32-C3
will send and receive the UDPv4 multicast.
• If the remote host over the UDP is an IPv4 broadcast address (255.255.255.255), the ESP32-C3 will send and
receive the UDPv4 broadcast.
• If the remote host over the UDP is an IPv6 multicast address (FF00:0:0:0:0:0:0:0 ~
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF), the ESP32-C3 will send and receive the UDP mul-
ticast based on IPv6 network.
• To use the parameter <mode>, parameter <local port> must be set first.
• If you want to establish UDP connection based on IPv6 network, set AT+CIPV6=1 first, and ensure the
connected AP by AT+CWJAP supports IPv6 and esp-at got the IPv6 address which you can check it by
AT+CIPSTA.
Example
// UDP unicast
AT+CIPSTART="UDP","192.168.101.110",1000,1002,2
AT+CIPSTART="UDP","192.168.101.110",1000,,,"192.168.101.100"
Response:
For single connection, it returns:
CONNECT
OK
<link ID>,CONNECT
OK
Parameters
• <link ID>: ID of network connection (0~4), used for multiple connections.
• < type >: string parameter showing the type of transmission: SSL , or SSLv6 . Default: TCP .
• < remote host >: IPv4 address, IPv6 address, or domain name of remote host.
• <remote port>: the remote port number.
• <keep_alive>: It configures the SO_KEEPALIVE option for socket. Unit: second.
– Range: [0,7200].
∗ 0: disable keep-alive function (default).
∗ 1 ~ 7200: enable keep-alive function. TCP_KEEPIDLE value is <keep_alive>,
TCP_KEEPINTVL value is 1, and TCP_KEEPCNT value is 3.
– This parameter of this command is the same as the <keep_alive> parameter of AT+CIPTCPOPT
command. It always takes the value set later by either of the two commands. If it is omitted or not set,
the last configured value is used by default.
• < local IP >: the local IPv4 address or IPv6 address that the connection binds. This parameter is useful
when you are using multiple network interfaces or multiple IP addresses. By default, it is disabled. If you want
to use it, you should specify it first. Null is also valid.
Notes
• The number of SSL connections depends on available memory and the maximum number of connections.
• SSL connection needs a large amount of memory. Insufficient memory may cause the system reboot.
• If the AT+CIPSTART is based on an SSL connection and the timeout of each packet is 10 s, the total timeout
will be much longer depending on the number of handshake packets.
• If you want to establish SSL connection based on IPv6 network, set AT+CIPV6=1 first, and ensure the
connected AP by AT+CWJAP supports IPv6 and esp-at got the IPv6 address which you can check it by
AT+CIPSTA.
Example
AT+CIPSTART="SSL","iot.espressif.cn",8443
AT+CIPSTART="SSL","192.168.101.110",1000,,"192.168.101.100"
This command is similar to AT+CIPSTART except that you don t need to assign an ID by yourself in multiple
connections mode (AT+CIPMUX=1). The system will assign an ID to the new connection automatically.
Function:
Exit from Data Mode and enter the Command Mode.
Command:
Notes
• This special execution command consists of three identical + characters (0x2b ASCII), and no CR-LF appends
to the command tail.
• Make sure there is more than 20 ms interval before the first + character, more than 20 ms interval after the
third + character, less than 20 ms interval among the three + characters. Otherwise, the + characters will be
sent out as normal data.
• This command returns no reply.
• Please wait for at least one second before sending the next AT command.
Set Command
Function:
Set the data length to be send in the Normal Transmission Mode. If the length of data you need to send exceeds 8192
bytes, please use the AT+CIPSENDL command.
Command:
Response:
OK
>
This response indicates that AT is ready for receiving serial data. You should enter the data, and when the data length
reaches the <length> value, the transmission of data starts.
If the connection cannot be established or is disrupted during data transmission, the system returns:
ERROR
SEND OK
Execute Command
Function:
Enter the Wi-Fi Passthrough Mode.
Command:
AT+CIPSEND
Response:
OK
>
or
ERROR
Enter the Wi-Fi Passthrough Mode. The ESP32-C3 can receive 8192 bytes and send 2920 bytes at most each time.
If the length of the currently received data is greater than the maximum number of bytes that can be sent, AT will
send the received data immediately; Otherwise, the received data will be sent out within 20 ms. When a single packet
containing +++ is received, the ESP32-C3 will exit the data sending mode under the Wi-Fi Passthrough Mode.
Please wait for at least one second before sending the next AT command.
This command can only be used for single connection in the Wi-Fi Passthrough Mode. For UDP Wi-Fi passthrough,
the <mode> parameter has to be 0 when using AT+CIPSTART.
Parameters
Notes
• You can use AT+CIPTCPOPT command to configure socket options for each TCP connection. For example,
setting <so_sndtimeo> to 5000 will enable TCP send to return results within 5 seconds, whether it succeeds or
fails. This can save the time that the MCU waits for AT command response.
3.3.9 AT+CIPSENDL: Send Long Data in Paraller in the Normal Transmission Mode.
Set Command
Function:
In the Normal Transmission Mode, set the data length to be sent, and then send data to remote host in parallel
(the AT command port receives data in parallel with the AT sending data to the remote host). You can use the
AT+CIPSENDLCFG command to configure this command. If the length of data you need to send is less than 8192
bytes, you also can use the AT+CIPSEND command.
Command:
Response:
OK
>
This response indicates that AT enters the Data Mode and AT command port is ready to receive data. You can enter
the data now. Once the port receives data, it will be pushed to underlying protocol stack and the transmission starts.
If the transmission starts, the system reports message according to AT+CIPSENDLCFG configuration:
SEND CANCELLED
If not all the data has been sent out, the system finally returns:
SEND FAIL
SEND OK
When the connection is disconnected, you can send +++ command to cancel the transmission, then the ESP32-C3
will exit from the Data Mode, otherwise, the Data Mode will not end until the AT command port receives all the data
of the specified <length>.
Parameters
Notes
• You can use AT+CIPTCPOPT command to configure socket options for each TCP connection. For example,
setting <so_sndtimeo> to 5000 will enable TCP send to return results within 5 seconds, whether it succeeds or
fails. This can save the time that the MCU waits for AT command response.
Query Command
Function:
Query the configuration of AT+CIPSENDL.
Command:
AT+CIPSENDLCFG?
Response:
OK
Set Command
Function:
Set the configuration of AT+CIPSENDL.
Command:
Response:
OK
Parameters
• <report size>: report block size for AT+CIPSENDL. Default: 1024. Range: [100,2 20 ]. For example, set
<report size> to 100, <had sent len> report sequence in the response of AT+CIPSENDL will be
(100, 200, 300, 400, ). The final <had sent len> report is always equal to the data length that had
been sent out.
• <transmit size>: transmit block size of AT+CIPSENDL. It specifies the size of the data block sent to the
underlying protocol stack. Default: 2920. Range: [100,2920]. If the received data length is greater than or
equal to <transmit size>, it is pushed to the underlying protocol stack immediately, otherwise, the data
waits for 20 ms and then is pushed to the protocol stack.
Note
• For devices with small throughput but high real-time requirements, it is recommended to set a smaller
<transmit size>. It is also recommended to set TCP_NODELAY by AT+CIPTCPOPT command.
• For devices with large throughput, it is recommended to set a larger <transmit size>. It is also recom-
mended to read How to Improve ESP-AT Throughput Performance first.
Set Command
Function:
Set the data length to be send in Normal Transmission Mode, or use \0 (0x5c, 0x30 ASCII) to trigger data transmis-
sion.
Command:
Response:
OK
>
This response indicates that AT is ready for receiving data. You should enter the data of designated length. When
the data length reaches the <length> value, or when the string \0 appears in the data, the transmission starts.
If the connection cannot be established or gets disconnected during transmission, the system returns:
ERROR
SEND OK
Parameters
Notes
• When the requirement of data length is met, or when the string \0 (0x5c, 0x30 in ASCII) appears, the trans-
mission of data starts. Go back to the normal command mode and wait for the next AT command.
• If the data contains the \<any>, it means that drop backslash symbol and only use <any> character.
• When sending \0, please use a backslash to escape it as \\0.
• You can use AT+CIPTCPOPT command to configure socket options for each TCP connection. For example,
setting <so_sndtimeo> to 5000 will enable TCP send to return results within 5 seconds, whether it succeeds or
fails. This can save the time that the MCU waits for AT command response.
Set Command
Function:
Close TCP/UDP/SSL connection in the multiple connections mode.
Command:
AT+CIPCLOSE=<link ID>
Response:
<link ID>,CLOSED
OK
Execute Command
Function:
Close TCP/UDP/SSL connection in the single connection mode.
AT+CIPCLOSE
Response:
CLOSED
OK
Parameter
• <link ID>: ID of the connection that you want to close. If you set it to 5, all connections will be closed.
Execute Command
Command:
AT+CIFSR
Response:
+CIFSR:APIP,<"APIP">
+CIFSR:APIP6LL,<"APIP6LL">
+CIFSR:APIP6GL,<"APIP6GL">
+CIFSR:APMAC,<"APMAC">
+CIFSR:STAIP,<"STAIP">
+CIFSR:STAIP6LL,<"STAIP6LL">
+CIFSR:STAIP6GL,<"STAIP6GL">
+CIFSR:STAMAC,<"STAMAC">
+CIFSR:ETHIP,<"ETHIP">
+CIFSR:ETHIP6LL,<"ETHIP6LL">
+CIFSR:ETHIP6GL,<"ETHIP6GL">
+CIFSR:ETHMAC,<"ETHMAC">
OK
Parameters
Note
• Only when the ESP32-C3 has the valid interface information can you query its IP address and MAC address.
Query Command
Function:
Query the connection type.
Command:
AT+CIPMUX?
Response:
+CIPMUX:<mode>
OK
Set Command
Function:
Set the connection type.
Command:
AT+CIPMUX=<mode>
Response:
OK
Parameter
Notes
• This mode can only be changed after all connections are disconnected.
• If you want to set the multiple connections mode, ESP32-C3 should be in the Normal Transmission Mode
(AT+CIPMODE=0).
• If you want to set the single connection mode when the TCP/SSL server is running, you should delete the server
first. (AT+CIPSERVER=0).
Example
AT+CIPMUX=1
Query Command
Function:
Query the TCP/SSL server status.
Command:
AT+CIPSERVER?
Response:
+CIPSERVER:<mode>[,<port>,<"type">][,<CA enable>]
OK
Set Command
Command:
AT+CIPSERVER=<mode>[,<param2>][,<"type">][,<CA enable>]
Response:
OK
Parameters
• <mode>:
– 0: delete a server.
– 1: create a server.
• <param2>: It means differently depending on the parameter <mode>:
• If <mode> is 1, <param2> represents the port number. Default: 333.
• If <mode> is 0, <param2> represents whether the server closes all connections. Default: 0.
– 0: shutdown the server and keep existing connections.
– 1: shutdown the server and close all connections.
• < type >: server type: TCP , TCPv6 , SSL , or SSLv6 . Default: TCP .
• <CA enable>:
– 0: disable CA.
– 1: enable CA.
Notes
• A TCP/SSL server can only be created when multiple connections are activated (AT+CIPMUX=1).
• A server monitor will be created automatically when the server is created. Only one server can be created at
most.
• When a client is connected to the server, it will take up one connection and be assigned an ID.
• If you want to create a TCP/SSL server based on IPv6 network, set AT+CIPV6=1 first, and obtain an IPv6
address.
• Parameters <"type"> and <CA enable> must be omitted when delete a server.
Example
Query Command
Function:
Obtain the maximum number of clients allowed to connect to the TCP/SSL server.
Command:
AT+CIPSERVERMAXCONN?
Response:
+CIPSERVERMAXCONN:<num>
OK
Set Command
Function:
Set the maximum number of clients allowed to connect to the TCP/SSL server.
Command:
AT+CIPSERVERMAXCONN=<num>
Response:
OK
Parameter
• <num>: the maximum number of clients allowed to connect to the TCP/SSL server. Range: [1,5]. For how
to change the upper limit of this range, please refer to the description of the <link ID> parameter of the
AT+CIPSTART command.
Note
Example
AT+CIPMUX=1
AT+CIPSERVERMAXCONN=2
AT+CIPSERVER=1,80
Query Command
Function:
Query the transmission mode.
Command:
AT+CIPMODE?
Response:
+CIPMODE:<mode>
OK
Set Command
Function:
Set the transmission mode.
Command:
AT+CIPMODE=<mode>
Response:
OK
Parameter
• <mode>:
– 0: Normal Transmission Mode.
– 1: Wi-Fi Passthrough Receiving Mode, or called transparent receiving transmission, which can only be
enabled in TCP single connection mode, UDP mode when the remote host and port do not change, or
SSL single connection mode.
Notes
Example
AT+CIPMODE=1
Response:
OK
Parameters
• <mode>:
– 0: ESP32-C3 will NOT enter Wi-Fi Passthrough Mode on power-up.
– 1: ESP32-C3 will enter Wi-Fi Passthrough Mode on power-up.
• < remote host >: IPv4 address, IPv6 address, or domain name of remote host.
• <remote port>: the remote port number.
• < type >: string parameter showing the type of transmission: TCP , TCPv6 , SSL , or SSLv6
. Default: TCP .
• <keep_alive>: It configures the SO_KEEPALIVE option for socket. Unit: second.
– Range: [0,7200].
∗ 0: disable keep-alive function (default).
∗ 1 ~ 7200: enable keep-alive function. TCP_KEEPIDLE value is <keep_alive>,
TCP_KEEPINTVL value is 1, and TCP_KEEPCNT value is 3.
– This parameter of this command is the same as the <keep_alive> parameter of AT+CIPTCPOPT
command. It always takes the value set later by either of the two commands. If it is omitted or not set,
the last configured value is used by default.
Notes
• This command will save the Wi-Fi Passthrough Mode configuration in the NVS area. If <mode> is set to 1,
ESP32-C3 will enter the Wi-Fi Passthrough Mode in any subsequent power cycles. The configuration will take
effect after ESP32-C3 reboots.
• As long as the remote host and port are valid, the configuration will be saved in flash.
• If you want to establish TCP/SSL connection based on IPv6 network, set AT+CIPV6=1 first, and ensure
the connected AP by AT+CWJAP supports IPv6 and esp-at got the IPv6 address which you can check it by
AT+CIPSTA.
Example
AT+SAVETRANSLINK=1,"192.168.6.110",1002,"TCP"
AT+SAVETRANSLINK=1,"www.baidu.com",443,"SSL"
AT+SAVETRANSLINK=1,"240e:3a1:2070:11c0:55ce:4e19:9649:b75",8080,"TCPv6"
AT+SAVETRANSLINK=1,"240e:3a1:2070:11c0:55ce:4e19:9649:b75",8080,"SSLv6"
Response:
OK
Parameters
• <mode>:
– 0: ESP32-C3 will NOT enter Wi-Fi Passthrough Mode on power-up.
– 1: ESP32-C3 will enter Wi-Fi Passthrough Mode on power-up.
• < remote host >: IPv4 address, IPv6 address, or domain name of remote host.
• <remote port>: the remote port number.
• < type >: string parameter showing the type of transmission: UDP or UDPv6 . Default: TCP .
• <local port>: local port when UDP Wi-Fi passthrough is enabled on power-up.
Notes
• This command will save the Wi-Fi Passthrough Mode configuration in the NVS area. If <mode> is set to 1,
ESP32-C3 will enter the Wi-Fi Passthrough Mode in any subsequent power cycles. The configuration will take
effect after ESP32-C3 reboots.
• As long as the remote host and port are valid, the configuration will be saved in flash.
• If you want to establish UDP transmission based on IPv6 network, set AT+CIPV6=1 first, and ensure the
connected AP by AT+CWJAP supports IPv6 and esp-at got the IPv6 address which you can check it by
AT+CIPSTA.
Example
AT+SAVETRANSLINK=1,"192.168.6.110",1002,"UDP",1005
AT+SAVETRANSLINK=1,"240e:3a1:2070:11c0:55ce:4e19:9649:b75",8081,"UDPv6",1005
Query Command
Function:
Query the local TCP/SSL server timeout.
Command:
AT+CIPSTO?
Response:
+CIPSTO:<time>
OK
Set Command
Function:
Set the local TCP/SSL server timeout.
Command:
AT+CIPSTO=<time>
Response:
OK
Parameter
Notes
• When a TCP/SSL client does not communicate with the ESP32-C3 server within the <time> value, the server
will terminate this connection.
• If you set <time> to 0, the connection will never timeout. This configuration is not recommended.
• When the client initiates a communication with the server within the set time, the timer will restart. After the
timeout expires, the client is closed. During the set time, if the server initiate a communication with the client,
the timer will not restart. After the timeout expires, the client is closed.
Example
AT+CIPMUX=1
AT+CIPSERVER=1,1001
AT+CIPSTO=10
3.3.20 AT+CIPSNTPCFG: Query/Set the Time Zone and the SNTP Server
Query Command
Command:
AT+CIPSNTPCFG?
Response:
Set Command
Command:
Response:
OK
Parameters
Note
• If the three SNTP servers are not configured, one of the following default servers will be used: cn.ntp.org.cn
, ntp.sjtu.edu.cn , and us.pool.ntp.org .
• For the query command, <timezone> parameter in the response may be different from the <timezone>
parameter in set command. Because the <timezone> parameter supports the second UTC offset format,
for example, set AT+CIPSNTPCFG=1,015, for query command, ESP-AT ignores the leading zero of the
<timezone> parameter, and the valid value is 15. It does not belong to the first format, so it is parsed
according to the second UTC offset format, that is, UTC+00:15, that is, timezone is 0 in the response.
Example
// Enable SNTP server, set timezone to New York of the United States (UTC 05:00)
AT+CIPSNTPCFG=1,-5,"0.pool.ntp.org","time.google.com"
or
AT+CIPSNTPCFG=1,-500,"0.pool.ntp.org","time.google.com"
// Enable SNTP server, set timezone to New Zealand (Chatham Islands, UTC+12:45)
AT+CIPSNTPCFG=1,1245,"0.pool.ntp.org","time.google.com"
Query Command
Command:
AT+CIPSNTPTIME?
Response:
Note
Example
AT+CWMODE=1
AT+CWJAP="1234567890","1234567890"
AT+CIPSNTPCFG=1,8,"cn.ntp.org.cn","ntp.sjtu.edu.cn"
AT+CIPSNTPTIME?
+CIPSNTPTIME:Tue Oct 19 17:47:56 2021
OK
or
AT+CWMODE=1
AT+CWJAP="1234567890","1234567890"
AT+CIPSNTPCFG=1,530
AT+CIPSNTPTIME?
+CIPSNTPTIME:Tue Oct 19 15:17:56 2021
OK
Query Command
Command:
AT+CIPSNTPINTV?
Response:
+CIPSNTPINTV:<interval second>
OK
Set Command
Command:
AT+CIPSNTPINTV=<interval second>
Response:
OK
Parameters
• <interval second>: the SNTP time synchronization interval. Unit: second. Range: [15,4294967].
Notes
• It configures interval for synchronization, which means that it sets interval how often ESP32-C3 connects to
NTP servers to get new time.
Example
AT+CIPSNTPCFG=1,8,"cn.ntp.org.cn","ntp.sjtu.edu.cn"
OK
OK
ESP-AT upgrades firmware at runtime by downloading the new firmware from a specific server through Wi-Fi and
then flash it into some partitions.
Query Command
Function:
Query ESP32-C3 upgrade status.
Command:
AT+CIUPDATE?
Response:
+CIPUPDATE:<state>
OK
Execute Command
Function:
Upgrade OTA the latest version of firmware via TCP from the server in blocking mode.
Command:
AT+CIUPDATE
Response:
Please refer to the response in the set command.
Set Command
Function:
Upgrade the specified version of firmware from the server.
Command:
AT+CIUPDATE=<ota mode>[,<version>][,<firmware name>][,<nonblocking>]
Response:
If OTA succeeds in blocking mode, the system returns:
+CIPUPDATE:1
+CIPUPDATE:2
+CIPUPDATE:3
+CIPUPDATE:4
OK
ERROR
Parameters
• <ota mode>:
– 0: OTA via HTTP.
– 1: OTA via HTTPS. If it does not work, please check whether ./build.py menuconfig > Com-
ponent config > AT > OTA based upon ssl is enabled. For more information, please refer
to Compile ESP-AT Project.
• <version>: AT version, such as, v1.2.0.0, v1.1.3.0, v1.1.2.0.
• <firmware name>: firmware to upgrade, such as, ota, mqtt_ca, client_ca or other custom partition
in at_customize.csv.
• <nonblocking>:
– 0: OTA by blocking mode (In this mode, you can not send AT command until OTA completes success-
fully or fails.)
– 1: OTA by non-blocking mode (You need to manually restart after upgrade done (+CIPUPDATE:4).)
• <state>:
– 1: Server found.
– 2: Connected to the server.
– 3: Got the upgrade version.
– 4: Upgrade done.
– -1: OTA fails in non-blocking mode.
Notes
Example
AT+CWMODE=1
AT+CWJAP="1234567890","1234567890"
AT+CIUPDATE
AT+CIUPDATE=1
AT+CIUPDATE=1,"v1.2.0.0"
AT+CIUPDATE=1,"v2.2.0.0","mqtt_ca"
AT+CIUPDATE=1,"v2.2.0.0","ota",1
AT+CIUPDATE=1,,,1
AT+CIUPDATE=1,,"ota",1
AT+CIUPDATE=1,"v2.2.0.0",,1
Query Command
Command:
AT+CIPDINFO?
Response:
+CIPDINFO:true
OK
or
+CIPDINFO:false
OK
Set Command
Command:
AT+CIPDINFO=<mode>
Response:
OK
Parameters
• <mode>:
– 0: does not show the remote host and port in +IPD and +CIPRECVDATA messages.
– 1: show the remote host and port in +IPD and +CIPRECVDATA messages.
Example
AT+CIPDINFO=1
Query Command
Function:
Query the configuration of each connection where the ESP32-C3 runs as an SSL client.
Command:
AT+CIPSSLCCONF?
Response:
+CIPSSLCCONF:<link ID>,<auth_mode>,<pki_number>,<ca_number>
OK
Set Command
Command:
Response:
OK
Parameters
• <link ID>: ID of the connection (0 ~ max). For multiple connections, if the value is max, it means all
connections. By default, max is 5.
• <auth_mode>:
– 0: no authentication. In this case <pki_number> and <ca_number> are not required.
– 1: the client provides the client certificate for the server to verify.
– 2: the client loads CA certificate to verify the server s certificate.
– 3: mutual authentication.
• <pki_number>: the index of certificate and private key. If there is only one certificate and private key, the
value should be 0.
• <ca_number>: the index of CA. If there is only one CA, the value should be 0.
Notes
• If you want this configuration to take effect immediately, run this command before establishing an SSL con-
nection.
• The configuration changes will be saved in the NVS area. If you set the command AT+SAVETRANSLINK to
enter SSL Wi-Fi Passthrough Mode on power-up, the ESP32-C3 will establish an SSL connection based on
this configuration when powered up next time.
• If you want to use your own certificate or use multiple sets of certificates, please refer to the documentation:
How to Generate PKI Files.
Query Command
Function:
Query the common name of the SSL client of each connection.
Command:
AT+CIPSSLCCN?
Response:
Set Command
Command:
Response:
OK
Parameters
• <link ID>: ID of the connection (0 ~ max). For the single connection, the link ID is 0. For multiple connec-
tions, if the value is max, it means all connections. Max is 5 by default.
• < common name >: this parameter is used to verify the Common Name in the certificate sent by the server.
The maximum length of common name is 64 bytes.
Note
• If you want this configuration to take effect immediately, run this command before establishing the SSL con-
nection.
Query Command
Function:
Query the SNI configuration of each connection.
Command:
AT+CIPSSLCSNI?
Response:
+CIPSSLCSNI:<link ID>,<"sni">
OK
Set Command
Command:
Response:
OK
Parameters
• <link ID>: ID of the connection (0 ~ max). For the single connection, the link ID is 0. For multiple connec-
tions, if the value is max, it means all connections. Max is 5 by default.
• < sni >: the Server Name Indication in ClientHello. The maximum length of sni is 64 bytes.
Notes
• If you want this configuration to take effect immediately, run this command before establishing the SSL con-
nection.
Query Command
Function:
Query the ALPN configuration of each connection where the ESP32-C3 runs as an SSL client.
Command:
AT+CIPSSLCALPN?
Response:
+CIPSSLCALPN:<link ID>[,<"alpn">][,<"alpn">][,<"alpn">]
OK
Set Command
Command:
Response:
OK
Parameters
• <link ID>: ID of the connection (0 ~ max). For the single connection, the link ID is 0. For multiple connec-
tions, if the value is max, it means all connections. Max is 5 by default.
• <counts>: the number of ALPNs. Range: [0,5].
• 0: clean the ALPN configuration.
• [1,5]: set the ALPN configuration.
• < alpn >: a string paramemter showing the ALPN in ClientHello. The maximum length of alpn is limited
by the command length.
Note
• If you want this configuration to take effect immediately, run this command before establishing the SSL con-
nection.
Query Command
Function:
Query the PSK configuration of each connection where the ESP32-C3 runs as an SSL client.
Command:
AT+CIPSSLCPSK?
Response:
+CIPSSLCPSK:<link ID>,<"psk">,<"hint">
OK
Set Command
Command:
Response:
OK
Parameters
• <link ID>: ID of the connection (0 ~ max). For single connection, <link ID> is 0. For multiple connections,
if the value is max, it means all connections, max is 5 by default.
• < psk >: PSK identity. Maximum length: 32.
• < hint >: PSK hint. Maximum length: 32.
Notes
• If you want this configuration to take effect immediately, run this command before establishing the SSL con-
nection.
Query Command
Function:
Query the automatic connect interval for the Wi-Fi Passthrough Mode.
Command:
AT+CIPRECONNINTV?
Response:
+CIPRECONNINTV:<interval>
OK
Set Command
Function:
Set the automatic reconnecting interval when TCP/UDP/SSL transmission breaks in the Wi-Fi Passthrough Mode.
Command:
AT+CIPRECONNINTV=<interval>
Response:
OK
Parameter
• <interval>: the duration between automatic reconnections. Unit: 100 milliseconds. Default: 1. Range:
[1,36000].
Note
Example
AT+CIPRECONNINTV=10
Query Command
Function:
Query the socket receiving mode.
Command:
AT+CIPRECVMODE?
Response:
+CIPRECVMODE:<mode>
OK
Set Command
Command:
AT+CIPRECVMODE=<mode>
Response:
OK
Parameter
Notes
• The configuration can not be used in the Wi-Fi Passthrough Mode. If it is a UDP transmission in passive mode,
data will be lost when the buffer is full.
• When ESP-AT receives socket data in passive mode, it will prompt the following messages in different sce-
narios:
– For multiple connections mode (AT+CIPMUX=1), the message is +IPD,<link ID>,<len>.
– For single connection mode (AT+CIPMUX=0), the message is +IPD,<len>.
• <len> is the total length of socket data in the buffer.
• You should read data by running AT+CIPRECVDATA once there is a +IPD reported. Otherwise, the next
+IPD will not be reported to the host MCU until the previous +IPD has been read.
• In case of disconnection, the buffered socket data will still be there and can be read by the MCU until you
send AT+CIPCLOSE (AT as client) or AT+CIPSERVER=0,1 (AT as server). In other words, if +IPD has
been reported, the message CLOSED of this connection will never come until you send AT+CIPCLOSE or
AT+CIPSERVER=0,1 or read all data by command AT+CIPRECVDATA.
Example
AT+CIPRECVMODE=1
Set Command
Command:
Response:
+CIPRECVDATA:<actual_len>,<data>
OK
or
Parameters
Example
AT+CIPRECVMODE=1
// For example, if host MCU gets a message of receiving 100-byte data in␣
,→connection with No.0,
Query Command
Function:
Query the length of the entire data buffered for the connection.
Command:
AT+CIPRECVLEN?
Response:
OK
Parameters
• <data length of link>: length of the entire data buffered for the connection.
Note
• For SSL connections, ESP-AT will return the length of the encrypted data, so the returned length will be larger
than the real data length.
Example
AT+CIPRECVLEN?
+CIPRECVLEN:100,,,,,
OK
Set Command
Function:
Ping the remote host.
Command:
AT+PING=<"host">
Response:
+PING:<time>
OK
or
+PING:TIMEOUT // esp-at returns this response only when the domain name␣
,→resolution failure or ping timeout
ERROR
Parameters
• < host >: string parameter showing the host IPv4 address or IPv6 address or domain name.
• <time>: the response time of ping. Unit: millisecond.
Notes
• If you want to ping a remote host based on IPv6 network, set AT+CIPV6=1 first, and ensure the connected AP
by AT+CWJAP supports IPv6 and esp-at got the IPv6 address which you can check it by AT+CIPSTA.
• If the remote host is a domain name string, ping will first resolve the domain name (IPv4 address preferred)
from DNS (domain name server), and then ping the remote IP address.
Example
AT+PING="192.168.1.1"
AT+PING="www.baidu.com"
Query Command
Function:
Query the current DNS server information.
Command:
AT+CIPDNS?
Response:
+CIPDNS:<enable>[,<"DNS IP1">][,<"DNS IP2">][,<"DNS IP3">]
OK
Set Command
Function:
Set DNS server information.
Command:
Response:
OK
or
ERROR
Parameters
Notes
Example
AT+CIPDNS=0
AT+CIPDNS=1,"208.67.222.222","114.114.114.114","8.8.8.8"
// first DNS Server based on IPv6: China Future Internet Engineering Center
// second DNS Server based on IPv6: google-public-dns-a.google.com
// third DNS Server based on IPv6: main DNS Server based on IPv6 in JiangSu␣
,→Province, China
AT+CIPDNS=1,"240c::6666","2001:4860:4860::8888","240e:5a::6666"
Query Command
Function:
Query current socket options.
Command:
AT+CIPTCPOPT?
Response:
+CIPTCPOPT:<link_id>,<so_linger>,<tcp_nodelay>,<so_sndtimeo>,<keep_alive>
OK
Set Command
Command:
Response:
OK
or
ERROR
Parameters
• <link_id>: ID of the connection (0 ~ max). For multiple connections, if the value is max, it means all
connections. By default, max is 5.
• <so_linger>: configure the SO_LINGER options for the socket (refer to SO_LINGER description). Unit:
second. Default: -1.
– = -1: off
– = 0: on, linger time = 0
– > 0: on, linger time = <so_linger>
• <tcp_nodelay>: configure the TCP_NODELAY option for the socket (refer to TCP_NODELAY description).
Default: 0.
– 0: disable TCP_NODELAY
– 1: enable TCP_NODELAY
• <so_sndtimeo>: configure the SO_SNDTIMEO option for socket (refer to SO_SNDTIMEO description).
Unit: millisecond. Default: 0.
• <keep_alive>: configure the SO_KEEPALIVE option for socket. Unit: second.
– Range: [0,7200].
∗ 0: disable keep-alive function (default).
∗ 1 ~ 7200: enable keep-alive function. TCP_KEEPIDLE value is <keep_alive>,
TCP_KEEPINTVL value is 1, and TCP_KEEPCNT value is 3.
– This parameter of this command is the same as the <keep_alive> parameter of AT+CIPSTART
command. It always takes the value set later by either of the two commands. If it is omitted or not set,
the last configured value is used by default.
Notes
• Before configuring these socket options, please make sure you fully understand the function of them and
the possible impact after configuration.
• The SO_LINGER option is not recommended to be set to a large value. For example, if you set SO_LINGER
value to 60, then AT+CIPCLOSE command will block for 60 seconds if ESP32-C3 cannot receive TCP FIN
packet from the remote TCP peer due to network issues, so ESP32-C3 is unable to respond to any other AT
commands. Therefore, it is recommended to keep the default value of the SO_LINGER option.
• The TCP_NODELAY option is used for situations with small throughput but high real-time requirements. If
this option is enabled, LwIP will speed up TCP transmission, but in a poor network environment, the through-
put will be reduced due to retransmission. Therefore, it is recommended to keep the default value of the
TCP_NODELAY option.
• The SO_SNDTIMEO option is used for situations where the keepalive parameter is not configured
in AT+CIPSTART command. After this option is configured, AT+CIPSEND, AT+CIPSENDL, and
AT+CIPSENDEX commands will exit within this timeout, regardless of whether data are sent successfully
or not. Here, SO_SNDTIMEO is recommended to be set to 5 ~ 10 seconds.
• The SO_KEEPALIVE option is used for actively and regularly detecting whether the connection is discon-
nected. It is generally recommended to configure this option when AT is used as a TCP server. After this
option is configured, additional network bandwidth will be cost. Recommended value of SO_KEEPALIVE
should be not less than 60 seconds.
Currently, AT firmware for ESP32-C3 supports Bluetooth® Core Specification Version 5.0.
• AT+BLECONFREPLY: Reply the confirm value to the peer device in the legacy connection stage.
• AT+BLEENCDEV: Query bonded Bluetooth LE encryption device list.
• AT+BLEENCCLEAR: Clear Bluetooth LE encryption device list.
• AT+BLESETKEY: Set Bluetooth LE static pair key.
• AT+BLEHIDINIT: Bluetooth LE Human Interface Device (HID) profile initialization.
• AT+BLEHIDKB: Send Bluetooth LE HID keyboard information.
• AT+BLEHIDMUS: Send Bluetooth LE HID mouse information.
• AT+BLEHIDCONSUMER: Send Bluetooth LE HID consumer information.
• AT+BLUFI: Start or Stop BluFi.
• AT+BLUFINAME: Query/Set BluFi device name.
• AT+BLEPERIODICDATA: Set Bluetooth LE periodic advertising data.
• AT+BLEPERIODICSTART: Start Bluetooth LE periodic advertising.
• AT+BLEPERIODICSTOP: Stop Bluetooth LE periodic advertising.
• AT+BLESYNCSTART: Start to synchronize with periodic advertising.
• AT+BLESYNCSTOP: Stop synchronizing with periodic advertising.
• AT+BLEREADPHY: Query the current transmitter PHY.
• AT+BLESETPHY: Set the current transmitter PHY.
Query Command
Function:
Check the initialization status of Bluetooth LE.
Command:
AT+BLEINIT?
Response:
If Bluetooth LE is initialized, AT will return:
+BLEINIT:<role>
OK
+BLEINIT:0
OK
Set Command
Function:
Initialize the role of Bluetooth LE.
Command:
AT+BLEINIT=<init>
Response:
OK
Parameter
• <init>:
– 0: deinit Bluetooth LE
– 1: client role
– 2: server role
Notes
• When using Bluetooth LE function, if you do not need to use SoftAP mode, it is recommended that you can
disable the mode through AT+CWMODE.
• The file at_customize.bin has to be downloaded, so that the relevant commands can be used. Please refer
to How to Customize Bluetooth® LE Services for more details.
• Before using other Bluetooth LE AT commands, you should run this command first to trigger the initialization
process.
• After the initialization, the Bluetooth LE role cannot be changed unless you run AT+RST to restart the system
first and then re-initialize the Bluetooth LE role.
• If you use an ESP32-C3 as a Bluetooth LE server, a service bin should be downloaded into flash.
– To learn how to generate a service bin, please refer to esp-at/tools/readme.md.
– The download address of the service bin is the ble_data address in esp-
at/module_config/module_${platform}_default/at_customize.csv.
• Before de-initialize Bluetooth stack, it is recommended to stop broadcasting, stop scanning and disconnect all
existing connections.
Example
AT+BLEINIT=1
Query Command
Function:
Query the Bluetooth LE Public Address.
Command:
AT+BLEADDR?
Response:
+BLEADDR:<BLE_public_addr>
OK
Set Command
Function:
Set the Bluetooth LE address type.
Command:
AT+BLEADDR=<addr_type>[,<random_addr>]
Response:
OK
Parameter
• <addr_type>:
– 0: Public Address
– 1: Random Address
Note
Example
Query Command
Function:
Query the Bluetooth LE device name.
Command:
AT+BLENAME?
Response:
+BLENAME:<device_name>
OK
Set Command
Function:
Set the Bluetooth LE device name.
Command:
AT+BLENAME=<device_name>
Response:
OK
Parameter
• <device_name>: the Bluetooth LE device name. The maximum length is 32. Default: ESP-AT .
Note
Example
AT+BLENAME="esp_demo"
Query Command
Function:
Query the parameters of Bluetooth LE scanning.
Command:
AT+BLESCANPARAM?
Response:
+BLESCANPARAM:<scan_type>,<own_addr_type>,<filter_policy>,<scan_interval>,<scan_
,→window>
OK
Set Command
Function:
Set the parameters of Bluetooth LE scanning.
Command:
AT+BLESCANPARAM=<scan_type>,<own_addr_type>,<filter_policy>,<scan_interval>,<scan_
,→window>
Response:
OK
Parameters
• <scan_type>:
– 0: passive scan
– 1: active scan
• <own_addr_type>:
– 0: Public Address
– 1: Random Address
– 2: RPA Public Address
Example
Set Command
Function:
Enable/disable scanning.
Command:
AT+BLESCAN=<enable>[,<interval>][,<filter_type>,<filter_param>]
Response:
+BLESCAN:<addr>,<rssi>,<adv_data>,<scan_rsp_data>,<addr_type>
OK
Parameters
• <enable>:
– 1: enable continuous scanning.
– 0: disable continuous scanning.
• [<interval>]: optional parameter. Unit: second.
– If you want to disable the scanning, this parameter should be omitted.
– If you want to enable the scanning, set a value for this parameter:
– When you set it to 0, it means that scanning is continuous.
– When set it to a value other than 0, for example, AT+BLESCAN=1,3, it means that scanning will last
for 3 seconds and then stop automatically. The scanning results will be returned.
• [<filter_type>]: filtering option.
– 1: MAC .
– 2: NAME .
• <filter_param>: filtering parameter showing the remote device MAC address or remote device name.
• <addr>: Bluetooth LE address.
• <rssi>: signal strength.
• <adv_data>: advertising data.
• <scan_rsp_data>: scan response data.
• <addr_type>: the address type of broadcasters.
Notes
• The response OK does not necessarily come before the response +BLESCAN:<addr>,<rssi>,
<adv_data>,<scan_rsp_data>,<addr_type>. It may be output before +BLESCAN:<addr>,
<rssi>,<adv_data>,<scan_rsp_data>,<addr_type> or after it.
Example
Set Command
Function:
Set scan response.
Command:
AT+BLESCANRSPDATA=<scan_rsp_data>
Response:
OK
Parameter
• <scan_rsp_data>: scan response data is a HEX string. For example, if you want to set the response data to
0x11 0x22 0x33 0x44 0x55 , the command should be AT+BLESCANRSPDATA="1122334455".
Example
Query Command
Function:
Query the parameters of advertising.
Command:
AT+BLEADVPARAM?
Response:
+BLEADVPARAM:<adv_int_min>,<adv_int_max>,<adv_type>,<own_addr_type>,<channel_map>,
,→<adv_filter_policy>,<peer_addr_type>,<peer_addr>,<primary_phy>,<secondary_phy>
OK
Set Command
Function:
Set the parameters of advertising.
Command:
AT+BLEADVPARAM=<adv_int_min>,<adv_int_max>,<adv_type>,<own_addr_type>,<channel_map>
,→[,<adv_filter_policy>][,<peer_addr_type>,<peer_addr>][,<primary_phy>,<secondary_
,→phy>]
Response:
OK
Parameters
• <adv_int_min>: minimum advertising interval. The range of this parameter is [0x0020,0x4000]. The actual
advertising interval equals this parameter multiplied by 0.625 ms, so the range for the actual minimum
interval is [20, 10240] ms. It should be less than or equal to the value of <adv_int_max>.
• <adv_int_max>: maximum advertising interval. The range of this parameter is [0x0020,0x4000]. The actual
advertising interval equals this parameter multiplied by 0.625 ms, so the range for the actual maximum
interval is [20, 10240] ms. It should be more than or equal to the value of <adv_int_min>.
• <adv_type>:
• 0: ADV_TYPE_IND
• 1: ADV_TYPE_DIRECT_IND_HIGH
• 2: ADV_TYPE_SCAN_IND
• 3: ADV_TYPE_NONCONN_IND
• 4: ADV_TYPE_DIRECT_IND_LOW
• 5: ADV_TYPE_EXT_NOSCANNABLE_IND
• 6: ADV_TYPE_EXT_CONNECTABLE_IND
• 7: ADV_TYPE_EXT_SCANNABLE_IND
• <own_addr_type>: own Bluetooth LE address type.
– 0: BLE_ADDR_TYPE_PUBLIC
– 1: BLE_ADDR_TYPE_RANDOM
• <channel_map>: channel of advertising.
– 1: ADV_CHNL_37
– 2: ADV_CHNL_38
– 4: ADV_CHNL_39
– 7: ADV_CHNL_ALL
• [<adv_filter_policy>]: filter policy of advertising.
– 0: ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY
– 1: ADV_FILTER_ALLOW_SCAN_WLST_CON_ANY
– 2: ADV_FILTER_ALLOW_SCAN_ANY_CON_WLST
– 3: ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST
• [<peer_addr_type>]: remote Bluetooth LE address type.
– 0: PUBLIC
– 1: RANDOM
• [<peer_addr>]: remote Bluetooth LE address.
• [<primary_phy>]: advertising primary PHY. Default: 1M PHY.
– 1: 1M PHY
– 3: Coded PHY
• [<secondary_phy>]: advertising secondary PHY. Default: 1M PHY.
– 1: 1M PHY
– 2: 2M PHY
– 3: Coded PHY
Note
Example
Set Command
Function:
Set advertising data.
Command:
AT+BLEADVDATA=<adv_data>
Response:
OK
Parameter
• <adv_data>: advertising data in HEX string. For example, to set the advertising data to 0x11 0x22 0x33
0x44 0x55 , the command should be AT+BLEADVDATA="1122334455".
Note
Example
Query Command
Function:
Query the parameters of advertising data.
Command:
AT+BLEADVDATAEX?
Response:
+BLEADVDATAEX:<dev_name>,<uuid>,<manufacturer_data>,<include_power>
OK
Set Command
Function:
Set the advertising data and start advertising.
Command:
AT+BLEADVDATAEX=<dev_name>,<uuid>,<manufacturer_data>,<include_power>
Response:
OK
Parameters
• <dev_name>: string parameter showing a device name. For example, if you want to set the de-
vice name to just-test , the command should be AT+BLEADVSTARTEX="just-test",<uuid>,
<manufacturer_data>,<include_power>.
• <uuid>: string parameter. For example, if you want to set the UUID to 0xA002 , the command should be
AT+BLEADVSTARTEX=<dev_name>,"A002",<manufacturer_data>,<include_power>.
• <manufacturer_data>: manufacturer data in HEX string. For example, if you set the manufacturer data to
0x11 0x22 0x33 0x44 0x55 , the command should be AT+BLEADVSTARTEX=<dev_name>,<uuid>,
"1122334455",<include_power>.
• <include_power>: If you need to include the TX power in the advertising data, you should set the parameter
to 1. Otherwise, set it to 0.
Note
Example
Execute Command
Function:
Start advertising.
Command:
AT+BLEADVSTART
Response:
OK
Notes
• If advertising parameters are NOT set by command AT+BLEADVPARAM=<adv_parameter>, the default pa-
rameters will be used.
• If advertising data is NOT set by command AT+BLEADVDATA=<adv_data>, the advertising playload will be
empty.
• If advertising data is preset by command AT+BLEADVDATA=<adv_data>, it will be overwritten by
AT+BLEADVDATAEX=<dev_name>,<uuid>,<manufacturer_data>,<include_power> and vice versa.
Example
Execute Command
Function:
Stop advertising.
Command:
AT+BLEADVSTOP
Response:
OK
Note
• After the start of advertising, if the Bluetooth LE connection is established successfully, it will stop advertising
automatically. In such a case, this command does NOT need to be called.
Example
Query Command
Function:
Query the Bluetooth LE connection.
Command:
AT+BLECONN?
Response:
+BLECONN:<conn_index>,<remote_address>
OK
If the connection has not been established, there will be no <conn_index> and <remote_address> in the response.
Set Command
Function:
Establish the Bluetooth LE connection.
Command:
AT+BLECONN=<conn_index>,<remote_address>[,<addr_type>,<timeout>]
Response:
If the connection is established successfully, it will prompt:
+BLECONN:<conn_index>,<remote_address>
OK
+BLECONN:<conn_index>,-1
ERROR
If the connection fails due to parameters error or other reasons, it will prompt:
ERROR
Parameters
Notes
• It is recommended to scan devices by running AT+BLESCAN before initiating a new connection to ensure that
the target device is in the broadcast state.
• The maximum timeout for connection is 30 seconds.
• If the Bluetooth LE server is initialized and the connection is established successfully, you can use this command
to discover the services in the peer device (GATTC). The following GATTC commands can also be used:
– AT+BLEGATTCPRIMSRV
– AT+BLEGATTCINCLSRV
– AT+BLEGATTCCHAR
– AT+BLEGATTCRD
– AT+BLEGATTCWR
– AT+BLEGATTSIND
• If the AT+BLECONN? is executed when the Bluetooth LE is not initialized (AT+BLEINIT=0), the system will
not output +BLECONN:<conn_index>,<remote_address> .
Example
Query Command
Function:
Query the parameters of Bluetooth LE connection.
Command:
AT+BLECONNPARAM?
Response:
+BLECONNPARAM:<conn_index>,<min_interval>,<max_interval>,<cur_interval>,<latency>,
,→<timeout>
OK
Set Command
Function:
Update the parameters of Bluetooth LE connection.
Command:
AT+BLECONNPARAM=<conn_index>,<min_interval>,<max_interval>,<latency>,<timeout>
Response:
OK
+BLECONNPARAM: <conn_index>,-1
Parameters
Note
• This command only supports the client role when updating its connection parameters. Of course, the connection
has to be established first.
Example
Execute Command
Function:
End the Bluetooth LE connection.
Command:
AT+BLEDISCONN=<conn_index>
Response:
Parameters
Note
Example
Set Command
Function:
Set the length of Bluetooth LE data packet.
Command:
AT+BLEDATALEN=<conn_index>,<pkt_data_len>
Response:
OK
Parameters
Note
Example
Query Command
Function:
Query the length of the maximum transmission unit (MTU).
Command:
AT+BLECFGMTU?
Response:
+BLECFGMTU:<conn_index>,<mtu_size>
OK
Set Command
Function:
Set the length of the maximum transmission unit (MTU).
Command:
AT+BLECFGMTU=<conn_index>,<mtu_size>
Response:
OK // The command is received.
Parameters
Notes
Example
Execute Command
Function:
The Generic Attributes Server (GATTS) creates Bluetooth LE services.
Command:
AT+BLEGATTSSRVCRE
Response:
OK
Notes
• If you are using an ESP32-C3 as a Bluetooth LE server, a service bin should be downloaded into flash in order
to provide services.
– To learn how to generate a service bin, please refer to esp-at/tools/readme.md.
– The download address of the service bin is the ble_data address in esp-
at/module_config/module_${platform}_default/at_customize.csv.
• This command should be called immediately to create services, right after the Bluetooth LE server is initialized;
If a Bluetooth LE connection is established first, the service creation will fail.
• If the Bluetooth LE client is initialized, you can use this command to create local services. Some GATTS
commands can also be used, such as those to start and stop services, set attribute values, and send notifica-
tions/indications. See the list below for the specific commands.
– AT+BLEGATTSSRVCRE (It is recommended to execute this command before the connection is estab-
lished)
– AT+BLEGATTSSRVSTART (It is recommended to execute this command before the connection is estab-
lished)
– AT+BLEGATTSSRV
– AT+BLEGATTSCHAR
– AT+BLEGATTSNTFY
– AT+BLEGATTSIND
– AT+BLEGATTSSETATTR
Example
Execute Command
Function:
GATTS starts all services.
Command:
AT+BLEGATTSSRVSTART
Set Command
Function:
GATTS starts a specific service.
Command:
AT+BLEGATTSSRVSTART=<srv_index>
Response:
OK
Parameter
Example
Execute Command
Function:
GATTS stops all services.
Command:
AT+BLEGATTSSRVSTOP
Set Command
Function:
GATTS stops a specific service.
Command:
AT+BLEGATTSSRVSTOP=<srv_index>
Response:
OK
Parameter
Example
Query Command
Function:
GATTS discovers services.
Command:
AT+BLEGATTSSRV?
Response:
+BLEGATTSSRV:<srv_index>,<start>,<srv_uuid>,<srv_type>
OK
Parameters
Example
Query Command
Function:
GATTS discovers characteristics.
Command:
AT+BLEGATTSCHAR?
Response:
The response for a characteristic:
+BLEGATTSCHAR:"char",<srv_index>,<char_index>,<char_uuid>,<char_prop>
+BLEGATTSCHAR:"desc",<srv_index>,<char_index>,<desc_index>
OK
Parameters
Example
Set Command
Function:
Notify a client of the value of a characteristic value from the server.
Command:
AT+BLEGATTSNTFY=<conn_index>,<srv_index>,<char_index>,<length>
Response:
>
The symbol > indicates that AT is ready for receiving serial data, and you can enter data now. When the requirement
of data length determined by the parameter <length> is met, the notification starts.
If the data transmission is successful, AT returns:
OK
Parameters
Example
// For example, to notify of 4-byte data using the 6th characteristic in the 3rd␣
,→service, use the following command:
AT+BLEGATTSNTFY=0,3,6,4
// After the symbol ">" shows, enter the 4-byte data, such as "1234". Then the␣
,→data will be transmitted automatically.
Set Command
Function:
Indicate the characteristic value from the server to a client.
Command:
AT+BLEGATTSIND=<conn_index>,<srv_index>,<char_index>,<length>
Response:
>
The symbol > indicates that AT is ready for receiving serial data and you can enter data now. When the requirement
of data length determined by the parameter <length> is met, the indication starts.
If the data transmission is successful, AT returns:
OK
Parameters
Example
// For example, to indicate 4 bytes of data using the 7th characteristic in the␣
,→3rd service, use the following command:
AT+BLEGATTSIND=0,3,7,4
// After the symbol ">" shows, input 4 bytes of data, such as "1234". Then the␣
,→data will be transmitted automatically.
Set Command
Function:
GATTS sets its characteristic (descriptor).
Command:
AT+BLEGATTSSETATTR=<srv_index>,<char_index>,[<desc_index>],<length>
Response:
>
The symbol > indicates that AT is ready for receiving serial data and you can enter data now. When the requirement
of data length determined by the parameter <length> is met, the setting starts.
If the setting is successful, AT returns:
OK
Parameters
Note
• If the value of <length> is larger than the maximum length allowed, the setting will fail. The service table
is defined in components/customized_partitions/raw_data/ble_data.
Example
AT+BLEGATTSSETATTR=1,1,,1
// After the symbol ">" shows, input 1 byte of data, such as "8". Then the setting␣
,→starts.
Query Command
Function:
Generic Attributes Client (GATTC) discovers primary services.
Command:
AT+BLEGATTCPRIMSRV=<conn_index>
Response:
+BLEGATTCPRIMSRV:<conn_index>,<srv_index>,<srv_uuid>,<srv_type>
OK
Parameters
Note
Example
Set Command
Function:
GATTC discovers included services.
Command:
AT+BLEGATTCINCLSRV=<conn_index>,<srv_index>
Response:
+BLEGATTCINCLSRV:<conn_index>,<srv_index>,<srv_uuid>,<srv_type>,<included_srv_uuid>
,→,<included_srv_type>
OK
Parameters
Note
Example
Set Command
Function:
AT+BLEGATTCCHAR=<conn_index>,<srv_index>
Response:
The response for a characteristic:
+BLEGATTCCHAR:"char",<conn_index>,<srv_index>,<char_index>,<char_uuid>,<char_prop>
+BLEGATTCCHAR:"desc",<conn_index>,<srv_index>,<char_index>,<desc_index>,<desc_uuid>
OK
Parameters
Note
Example
Set Command
Function:
GATTC reads a characteristic or descriptor.
Command:
AT+BLEGATTCRD=<conn_index>,<srv_index>,<char_index>[,<desc_index>]
Response:
+BLEGATTCRD:<conn_index>,<len>,<value>
OK
Parameters
Notes
Example
// For example, to read 1st descriptor of the 2nd characteristic in the 3rd␣
,→service, use the following command:
AT+BLEGATTCRD=0,3,2,1
Set Command
Function:
GATTC writes characteristics or descriptors.
Command:
AT+BLEGATTCWR=<conn_index>,<srv_index>,<char_index>[,<desc_index>],<length>
Response:
>
The symbol > indicates that AT is ready for receiving serial data and you can enter data now. When the requirement
of data length determined by the parameter <length> is met, the writing starts.
If the setting is successful, AT returns:
OK
Parameters
Notes
Example
// For example, to write 6 bytes of data to the 4th characteristic in the 3rd␣
,→service, use the following command:
AT+BLEGATTCWR=0,3,4,,6
// After the symbol ">" shows, input 6 bytes of data, such as "123456". Then the␣
,→writing starts.
Query Command
Function:
Query the parameters of Bluetooth LE Serial Port Profile (SPP).
Command:
AT+BLESPPCFG?
Response:
+BLESPPCFG:<tx_service_index>,<tx_char_index>,<rx_service_index>,<rx_char_index>,
,→<auto_conn>
OK
Set Command
Function:
Set or reset the parameters of Bluetooth LE SPP.
Command:
AT+BLESPPCFG=<cfg_enable>[,<tx_service_index>,<tx_char_index>,<rx_service_index>,
,→<rx_char_index>][,<auto_conn>]
Response:
OK
Parameters
• <cfg_enable>:
– 0: all the SPP parameters will be reset, and the following parameters don t need input.
– 1: you should input the following parameters.
• <tx_service_index>: tx service s index. It can be fetched with command
AT+BLEGATTCPRIMSRV=<conn_index> and AT+BLEGATTSSRV?.
• <tx_char_index>: tx characteristic s index. It can be fetched with command
AT+BLEGATTCCHAR=<conn_index>,<srv_index> and AT+BLEGATTSCHAR?.
• <rx_service_index>: rx service s index. It can be fetched with command
AT+BLEGATTCPRIMSRV=<conn_index> and AT+BLEGATTSSRV?.
• <rx_char_index>: rx characteristic s index. It can be fetched with command
AT+BLEGATTCCHAR=<conn_index>,<srv_index> and AT+BLEGATTSCHAR?.
• <auto_conn>: Bluetooth LE SPP auto-reconnection flag. By default, automatic reconnection is enabled.
– 0: disable Bluetooth LE SPP automatic reconnection.
– 1: enable Bluetooth LE SPP automatic reconnection
Notes
• In Bluetooth LE client, the property of tx characteristic must be write with response or write
without response, and the property of rx characteristic must be indicate or notify.
• In Bluetooth LE server, the property of tx characteristic must be indicate or notify, and the property
of rx characteristic must be write with response or write without response.
• If the automatic reconnection function is disabled, when the connection is disconnected, a disconnection mes-
sage is displayed (depending on AT+SYSMSG), you need to send the connection command again; If this
function is enabled, the connection will be automatically reconnected after disconnection, and the MCU side
will not be aware of the disconnection. If the MAC of the peer end changes, the connection will fail.
Example
Execute Command
Function:
Enter Bluetooth LE SPP mode.
Command:
AT+BLESPP
Response:
OK
>
This response indicates that AT has entered Bluetooth LE SPP mode and can send and receive data.
If the Bluetooth LE SPP status is wrong ( Notifications are not enabled at the opposite end after the Bluetooth LE
connection is established ), the system returns:
ERROR
Notes
• During the SPP transmission, AT will not prompt any exit the Bluetooth LE SPP passthrough mode information
unless Bit0 of AT+SYSMSG is 1.
• During the SPP transmission, AT will not prompt any connection status changes unless Bit2 of AT+SYSMSG
is 1.
• When the packet which only contains +++ is received, the device returns to normal command mode. Please
wait for at least one second before sending the next AT command.
Example
Query Command
Function:
Query the parameters of Bluetooth LE SMP.
Command:
AT+BLESECPARAM?
Response:
+BLESECPARAM:<auth_req>,<iocap>,<enc_key_size>,<init_key>,<rsp_key>,<auth_option>
OK
Set Command
Function:
Set the parameters of Bluetooth LE SMP.
Command:
AT+BLESECPARAM=<auth_req>,<iocap>,<enc_key_size>,<init_key>,<rsp_key>[,<auth_
,→option>]
Response:
OK
Parameters
Note
Example
AT+BLESECPARAM=1,4,16,3,3,0
Set Command
Function:
Start a pairing request
Command:
AT+BLEENC=<conn_index>,<sec_act>
Response:
OK
Parameters
• <sec_act>:
– 0: SEC_NONE
– 1: SEC_ENCRYPT
– 2: SEC_ENCRYPT_NO_MITM
– 3: SEC_ENCRYPT_MITM
Note
• Before running this command, please set the security parameters and connection with remote devices.
Example
AT+RESTORE
AT+BLEINIT=2
AT+BLEGATTSSRVCRE
AT+BLEGATTSSRVSTART
AT+BLEADDR?
AT+BLESECPARAM=1,0,16,3,3
AT+BLESETKEY=123456
AT+BLEADVSTART
// Use your Bluetooth LE debugging app as a client to establish a Bluetooth LE␣
,→connection with the ESP32-C3
AT+BLEENC=0,3
3.4.34 AT+BLEENCRSP: Respond to the Pairing Request from the Peer Device
Set Command
Function:
Respond to the pairing request from the peer device.
Command:
AT+BLEENCRSP=<conn_index>,<accept>
Response:
OK
Parameters
Note
• After running this command, AT will output the pairing result at the end of the pairing process.
+BLEAUTHCMPL:<conn_index>,<enc_result>
– 0: encryption succeeded
– 1: encryption failed
Example
AT+BLEENCRSP=0,1
Set Command
Function:
Reply a pairing key.
Command:
AT+BLEKEYREPLY=<conn_index>,<key>
Response:
OK
Parameters
Example
AT+BLEKEYREPLY=0,649784
3.4.36 AT+BLECONFREPLY: Reply the Confirm Value to the Peer Device in the Legacy
Connection Stage
Set Command
Function:
Reply a pairing result.
Command:
AT+BLECONFREPLY=<conn_index>,<confirm>
Response:
OK
Parameters
Example
AT+BLECONFREPLY=0,1
Query Command
Function:
Query bonded Bluetooth LE encryption device list.
Command:
AT+BLEENCDEV?
Response:
+BLEENCDEV:<enc_dev_index>,<mac_address>
OK
Parameters
• <enc_dev_index>: index of the bonded devices. This parameter is not necessarily equal to the conn_index
parameter in the Bluetooth LE connection list queried by the command AT+BLECONN. Range: [0,14].
• <mac_address>: MAC address.
Note
• ESP-AT allows a maximum of 15 devices to be bonded. If the number of bonded devices exceeds 15, the
newly bonded device information will sequentially (from 0 to 14) overwrite the previous device information
according to the binding order.
Example
AT+BLEENCDEV?
Set Command
Function:
Remove a device from the security database list with a specific index.
Command:
AT+BLEENCCLEAR=<enc_dev_index>
Response:
OK
Execute Command
Function:
Remove all devices from the security database.
Command:
AT+BLEENCCLEAR
Response:
OK
Parameter
Example
AT+BLEENCCLEAR
Query Command
Function:
Query the Bluetooth LE static pair key. If it is not set, AT will return -1.
Command:
AT+BLESETKEY?
Response:
+BLESETKEY:<static_key>
OK
Set Command
Function:
Set a Bluetooth LE static pair key for all Bluetooth LE connections.
Command:
AT+BLESETKEY=<static_key>
Response:
OK
Parameter
Example
AT+BLESETKEY=123456
Query Command
Function:
Query the initialization status of Bluetooth LE HID profile.
Command:
AT+BLEHIDINIT?
Response:
If Bluetooth LE HID device profile is not initialized, AT will return:
+BLEHIDINIT:0
OK
+BLEHIDINIT:1
OK
Set Command
Function:
Initialize the Bluetooth LE HID profile.
Command:
AT+BLEHIDINIT=<init>
Response:
OK
Parameter
• <init>:
– 0: deinit Bluetooth LE HID profile
– 1: init Bluetooth LE HID profile
Note
• The Bluetooth LE HID command cannot be used at the same time with general GATT/GAP commands.
Example
AT+BLEHIDINIT=1
Set Command
Function:
Send keyboard information.
Command:
AT+BLEHIDKB=<Modifier_keys>,<key_1>,<key_2>,<key_3>,<key_4>,<key_5>,<key_6>
Response:
OK
Parameters
Note
• For more information about key codes, please refer to the chapter Keyboard/Keypad Page of Universal Serial
Bus HID Usage Tables.
• To use this command to interact with iOS products, your devices need to pass MFI certification first.
Example
Set Command
Function:
Send mouse information.
Command:
AT+BLEHIDMUS=<buttons>,<X_displacement>,<Y_displacement>,<wheel>
Response:
OK
Parameters
Note
• For more information about HID mouse, please refer to the section Generic Desktop Page, and Application
Usages of Universal Serial Bus HID Usage Tables.
• To use this command to interact with iOS products, your devices need to pass MFI certification first.
Example
AT+BLEHIDMUS=0,10,10,0
Set Command
Function:
Send consumer information.
Command:
AT+BLEHIDCONSUMER=<consumer_usage_id>
Response:
OK
Parameter
• <consumer_usage_id>: consumer ID, such as power, reset, help, volume and so on. See chapter Consumer
Page (0x0C) of HID Usage Tables for Universal Serial Bus (USB) for more information.
Note
• To use this command to interact with iOS products, your devices need to pass MFI certification first.
Example
AT+BLEHIDCONSUMER=233 // volume up
Query Command
Function:
Query the status of BluFi.
Command:
AT+BLUFI?
Response:
If BluFi is not started, it will return:
+BLUFI:0
OK
+BLUFI:1
OK
Set Command
Function:
Start or stop BluFi.
Command:
AT+BLUFI=<option>[,<auth floor>]
Response:
OK
Parameter
• <option>:
– 0: stop BluFi
– 1: start BluFi
• <auth floor>: Wi-Fi authentication mode floor. ESP-AT will not connect to the AP whose authmode is lower
than this floor.
– 0: OPEN (Default)
– 1: WEP
– 2: WPA_PSK
– 3: WPA2_PSK
– 4: WPA_WPA2_PSK
– 5: WPA2_ENTERPRISE
– 6: WPA3_PSK
– 7: WPA2_WPA3_PSK
Note
• You can only start or stop BluFi when Bluetooth LE is not initialized (AT+BLEINIT=0).
Example
AT+BLUFI=1
Query Command
Function:
Query the BluFi name.
Command:
AT+BLUFINAME?
Response:
+BLUFINAME:<device_name>
OK
Set Command
Function:
Set the BluFi device name.
Command:
AT+BLUFINAME=<device_name>
Response:
OK
Parameter
Notes
• If you need to set BluFi name, please set it before command AT+BLUFI=1. Otherwise, it will use the default
name BLUFI_DEVICE.
• The maximum length of BluFi name is 29 bytes.
Example
AT+BLUFINAME="BLUFI_DEV"
AT+BLUFINAME?
Set Command
Function:
Set periodic advertising data.
Command:
AT+BLEPERIODICDATA=<periodic_data>
Response:
OK
Parameter
• <periodic_data>: Periodic advertising data in HEX string. For example, to set the periodic advertising data
to 0x11 0x22 0x33 0x44 0x55 , the command should be AT+BLEPERIODICDATA="1122334455".
Example
Execute Command
Function:
Start periodic advertising.
Command:
AT+BLEPERIODICSTART
Response:
OK
Notes
• The extended advertising should be started before the start of periodic advertising, and the adv type should be
ADV_TYPE_EXT_NOSCANNABLE_IND.
Example
Execute Command
Function:
Stop periodic advertising.
Command:
AT+BLEPERIODICSTOP
Response:
OK
Example
Set Command
Function:
Synchroize with the target device and get the periodic advertising data.
Command:
AT+BLESYNCSTART=<target_address>
Response:
+BLESYNC:<addr>,<rssi>,<periodic_adv_data>
OK
Parameters
Notes
• Before you start to synchronize with the remote device, the blescan must be start.
Example
Execute Command
Function:
Stop synchronizing with the target device.
Command:
AT+BLESYNCSTOP
Response:
OK
Notes
• If you stop blescan with AT+BLESCAN=0 command, the synchronization will be stopped automatically.
Example
Set Command
Function:
Query the current transmitter PHY.
Command:
AT+BLEREADPHY=<conn_index>
Response:
If the query succeeds, it will return:
+BLEREADPHY:<device_addr>,<tx_PHY>,<rx_PHY>
OK
+BLEREADPHY:-1
OK
Parameters
– 3: Coded PHY.
• <rx_PHY>:
– 1: 1M PHY.
– 2: 2M PHY.
– 3: Coded PHY.
Example
Set Command
Function:
Set the current transmitter PHY.
Command:
AT+BLESETPHY=<conn_index>,<tx_rx_phy>
Response:
If the query succeeds, it will return:
+BLESETPHY:<device_addr>,<tx_PHY>,<rx_PHY>
OK
Parameters
Example
Set Command
Function:
Set MQTT User Configuration.
Command:
AT+MQTTUSERCFG=<LinkID>,<scheme>,<"client_id">,<"username">,<"password">,<cert_key_
,→ID>,<CA_ID>,<"path">
Response:
OK
Parameters
Note
• The length of the entire AT command should be less than 256 bytes.
Set Command
Function:
Set MQTT Client ID.
Command:
AT+MQTTCLIENTID=<LinkID>,<"client_id">
Response:
OK
Parameters
Notes
• The length of the entire AT command should be less than 256 bytes.
• The command AT+MQTTUSERCFG can also set MQTT client ID. The differences between the two commands
include:
– You can use AT+MQTTCLIENTID to set a relatively long client ID since there is a limitation on the
length of the AT+MQTTUSERCFG command.
– You should set AT+MQTTCLIENTID after setting the AT+MQTTUSERCFG command.
Set Command
Function:
Set MQTT username.
Command:
AT+MQTTUSERNAME=<LinkID>,<"username">
Response:
OK
Parameters
Notes
• The length of the entire AT command should be less than 256 bytes.
• The command AT+MQTTUSERCFG can also set MQTT username. The differences between the two com-
mands include:
– You can use AT+MQTTUSERNAME to set a relatively long username since there is a limitation on the
length of the AT+MQTTUSERCFG command.
– You should set AT+MQTTUSERNAME after setting the command AT+MQTTUSERCFG.
Set Command
Function:
Set MQTT password.
Command:
AT+MQTTPASSWORD=<LinkID>,<"password">
Response:
OK
Parameters
Notes
• The length of the entire AT command should be less than 256 bytes.
• The command AT+MQTTUSERCFG can also set MQTT password. The differences between the two com-
mands include:
– You can use AT+MQTTPASSWORD to set a relatively long password since there is a limitation on the
length of the AT+MQTTUSERCFG command.
– You should set AT+MQTTPASSWORD after setting the command AT+MQTTUSERCFG.
Set Command
Function:
Set configuration of MQTT Connection.
Command:
AT+MQTTCONNCFG=<LinkID>,<keepalive>,<disable_clean_session>,<"lwt_topic">,<"lwt_msg
,→">,<lwt_qos>,<lwt_retain>
Response:
OK
Parameters
Set Command
Function:
Set MQTT Application Layer Protocol Negotiation (ALPN).
Command:
AT+MQTTALPN=<LinkID>,<alpn_counts>[,<"alpn">][,<"alpn">][,<"alpn">]
Response:
OK
Parameters
Notes
• The length of the entire AT command should be less than 256 bytes.
• MQTT ALPN will only be effective if the MQTT connection is based on TLS or WSS.
• You should set AT+MQTTALPN after setting the command AT+MQTTUSERCFG.
Example
AT+CWMODE=1
AT+CWJAP="ssid","password"
AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com","ntp2.aliyun.com"
AT+MQTTUSERCFG=0,5,"ESP32-C3","espressif","1234567890",0,0,""
AT+MQTTALPN=0,2,"mqtt-ca.cn","mqtt-ca.us"
AT+MQTTCONN=0,"192.168.200.2",8883,1
Query Command
Function:
Query the MQTT broker that ESP32-C3 are connected to.
Command:
AT+MQTTCONN?
Response:
+MQTTCONN:<LinkID>,<state>,<scheme><"host">,<port>,<"path">,<reconnect>
OK
Set Command
Function:
Connect to an MQTT broker.
Command:
AT+MQTTCONN=<LinkID>,<"host">,<port>,<reconnect>
Response:
OK
Parameters
Set Command
Function:
Publish MQTT messages in string to a defined topic. If the amount of data you publish is relatively large, and the
length of a single AT command has exceeded the threshold of 256, please use the AT+MQTTPUBRAW command.
Command:
AT+MQTTPUB=<LinkID>,<"topic">,<"data">,<qos>,<retain>
Response:
OK
Parameters
Notes
• The length of the entire AT command should be less than 256 bytes.
• This command cannot send data \0. If you need to send \0, please use the command AT+MQTTPUBRAW
instead.
Example
AT+CWMODE=1
AT+CWJAP="ssid","password"
AT+MQTTUSERCFG=0,1,"ESP32-C3","espressif","1234567890",0,0,""
AT+MQTTCONN=0,"192.168.10.234",1883,0
AT+MQTTPUB=0,"topic","\"{\"timestamp\":\"20201121085253\"}\"",0,0
Set Command
Function:
Publish long MQTT messages to a defined topic. If the amount of data you publish is relatively small, and the length
of a single AT command is not greater than the threshold of 256, you also can use the AT+MQTTPUB command.
Command:
AT+MQTTPUBRAW=<LinkID>,<"topic">,<length>,<qos>,<retain>
Response:
OK
>
The symbol > indicates that AT is ready for receiving serial data, and you can enter the data now. When the require-
ment of message length determined by the parameter <length> is met, the transmission starts.
If the transmission is successful, AT returns:
+MQTTPUB:OK
Otherwise, it returns:
+MQTTPUB:FAIL
Parameters
Query Command
Function:
List all MQTT topics that have been already subscribed.
Command:
AT+MQTTSUB?
Response:
+MQTTSUB:<LinkID>,<state>,<"topic1">,<qos>
+MQTTSUB:<LinkID>,<state>,<"topic2">,<qos>
+MQTTSUB:<LinkID>,<state>,<"topic3">,<qos>
...
OK
Set Command
Function:
Subscribe to defined MQTT topics with defined QoS. It supports subscribing to multiple topics.
Command:
AT+MQTTSUB=<LinkID>,<"topic">,<qos>
Response:
OK
+MQTTSUBRECV:<LinkID>,<"topic">,<data_length>,data
ALREADY SUBSCRIBE
Parameters
Set Command
Function:
Unsubscribe the client from defined topics. This command can be called multiple times to unsubscribe from different
topics.
Command:
AT+MQTTUNSUB=<LinkID>,<"topic">
Response:
OK
NO UNSUBSCRIBE
OK
Parameters
Set Command
Function:
Close the MQTT connection and release the resource.
Command:
AT+MQTTCLEAN=<LinkID>
Response:
OK
Parameter
• In general, AT MQTT commands responds within 10 s, except the command AT+MQTTCONN. For example, if
the router fails to access the Internet, the command AT+MQTTPUB will respond within 10 s. But the command
AT+MQTTCONN may need more time due to packet retransmission in a bad network environment.
• If the AT+MQTTCONN is based on a TLS connection, the timeout of each packet is 10 s, and the total timeout
will be much longer depending on the handshake packets count.
• When the MQTT connection ends, it will prompt the message +MQTTDISCONNECTED:<LinkID>.
• When the MQTT connection established, it will prompt the message +MQTTCONNECTED:<LinkID>,
<scheme>,<"host">,port,<"path">,<reconnect>.
Set Command
Command:
AT+HTTPCLIENT=<opt>,<content-type>,<"url">,[<"host">],[<"path">],<transport_type>[,
,→<"data">][,<"http_req_header">][,<"http_req_header">][...]
Response:
+HTTPCLIENT:<size>,<data>
OK
Parameters
Notes
• If the length of the entire command containing the URL exceeds 256 bytes, please use the AT+HTTPURLCFG
command to preset the URL first, and then set the < url > parameter of this command to "".
• If the url parameter is not null, HTTP client will use it and ignore the host parameter and path parameter;
If the url parameter is omited or null string, HTTP client will use host parameter and path parameter.
• In some released firmware, HTTP client commands are not supported (see ESP-AT Firmware Differences), but
you can enable it by ./build.py menuconfig > Component config > AT > AT http command
support and build the project (see Compile ESP-AT Project).
Example
// HEAD Request
AT+HTTPCLIENT=1,0,"http://httpbin.org/get","httpbin.org","/get",1
// GET Request
AT+HTTPCLIENT=2,0,"http://httpbin.org/get","httpbin.org","/get",1
// POST Request
AT+HTTPCLIENT=3,0,"http://httpbin.org/post","httpbin.org","/post",1,"field1=value1&
,→field2=value2"
Set Command
Command:
AT+HTTPGETSIZE=<"url">
Response:
+HTTPGETSIZE:<size>
OK
Parameters
• < url >: HTTP URL. It is a string parameter and should be enclosed with quotes.
• <size>: HTTP resource size.
Note
• If the length of the entire command containing the URL exceeds 256 bytes, please use the AT+HTTPURLCFG
command to preset the URL first, and then set the < url > parameter of this command to "".
• In some released firmware, HTTP client commands are not supported (see ESP-AT Firmware Differences), but
you can enable it by ./build.py menuconfig > Component config > AT > AT http command
support and build the project (see Compile ESP-AT Project).
Example
AT+HTTPGETSIZE="http://www.baidu.com/img/bdlogo.gif"
Set Command
Command:
Response:
+HTTPCGET:<size>,<data>
OK
Parameters
• < url >: HTTP URL. It is a string parameter and should be enclosed with quotes.
• <tx size>: HTTP send buffer size. Unit: byte. Default: 2048. Range: [0,10240].
• <rx size>: HTTP receive buffer size. Unit: byte. Default: 2048. Range: [0,10240].
• <timeout>: Network timeout. Unit: millisecond. Default: 5000. Range: [0,180000].
Note
• If the length of the entire command containing the URL exceeds 256 bytes, please use the AT+HTTPURLCFG
command to preset the URL first, and then set the < url > parameter of this command to "".
Set Command
Command:
AT+HTTPCPOST=<"url">,<length>[,<http_req_header_cnt>][,<http_req_header>..<http_
,→req_header>]
Response:
OK
>
The symbol > indicates that AT is ready for receiving serial data, and you can enter the data now. When the require-
ment of message length determined by the parameter <length> is met, the transmission starts.
If the transmission is successful, AT returns:
SEND OK
Otherwise, it returns:
SEND FAIL
Parameters
• < url >: HTTP URL. It is a string parameter and should be enclosed with quotes.
• <length>: HTTP data length to POST. The maximum length is equal to the system allocable heap size.
• <http_req_header_cnt>: the number of <http_req_header> parameters.
• [<http_req_header>]: you can send more than one request header to the server.
Note
• If the length of the entire command containing the URL exceeds 256 bytes, please use the AT+HTTPURLCFG
command to preset the URL first, and then set the < url > parameter of this command to "".
Query Command
Command:
AT+HTTPURLCFG?
Response:
[+HTTPURLCFG:<url length>,<data>]
OK
Set Command
Command:
AT+HTTPURLCFG=<url length>
Response:
OK
>
This response indicates that AT is ready for receiving serial data. You should enter the URL now, and when the URL
length reaches the <url length> value, the system returns:
SET OK
Parameters
• HTTP Client:
• HTTP Server:
• HTTP AT:
– The error code of command AT+HTTPCLIENT will be 0x7000+Standard HTTP Error Code
(For more details about Standard HTTP/1.1 Error Code, see RFC 2616).
– For example, if AT gets the HTTP error 404 when calling command AT+HTTPCLIENT, it will respond
with error code of 0x7194 (hex(0x7000+404)=0x7194).
• AT+FACTPLCP: Send with long or short PLCP (Physical Layer Convergence Procedure)
Set Command
Command:
AT+FACTPLCP=<enable>,<tx_with_long>
Response:
OK
Parameters
Set Command
Command:
AT+WEBSERVER=<enable>,<server_port>,<connection_timeout>
Response:
OK
Parameters
Notes
• There are two ways to provide the HTML files needed by the Web server. One is to use FAT file system, and
you need to enable AT FS command at this time. The other one is to use embedded files to store HTML files
(default setting).
• Please make sure that the maximum number of open sockets is not less than 12, you may change the number by
./build.py menuconfig > Component config > LWIP > Max bumber of open sockets
and compile the project (see Compile ESP-AT Project).
• The default firmware does not support Web server AT commands (see ESP-AT Firmware Differences), but
you can enable it by ./build.py menuconfig > Component config > AT > AT WEB Server
command support and compile the project (see Compile ESP-AT Project).
• ESP-AT supports captive portals in ESP32-C3 series of devices. See example.
• For more examples, please refer to Web Server AT Example.
• The command implementation is open-source. See the source code in at/src/at_web_server_cmd.c.
• Please refer to How to Implement OTA Upgrade for more OTA commands.
Example
// Enable the Web server with port 80, and the timeout for the every connection is␣
,→50 seconds
AT+WEBSERVER=1,80,50
Set Command
Command:
AT+DRVADC=<channel>,<atten>
Response:
+DRVADC:<raw data>
OK
Parameters
CHANNEL GPIO
0 GPIO0
1 GPIO1
2 GPIO2
3 GPIO3
4 GPIO4
• <atten>: attenuation.
• 0: 0 dB attenuation, effective measurement range is [0, 750] mV.
Notes
Example
OK
Set Command
Command:
AT+DRVPWMINIT=<freq>,<duty_res>,<ch0_gpio>[,...,<ch3_gpio>]
Response:
OK
Parameters
Notes
Example
Set Command
Command:
AT+DRVPWMDUTY=<ch0_duty>[,...,<ch3_duty>]
Response:
OK
Parameter
Notes
Example
Set Command
Command:
AT+DRVPWMFADE=<ch0_target_duty>,<ch0_fade_time>[,...,<ch3_target_duty>,<ch3_fade_
,→time>]
Response:
OK
Parameters
Notes
Example
Set Command
Command:
AT+DRVI2CINIT=<num>,<scl_io>,<sda_io>,<clock>
Response:
OK
Parameters
• <num>: I2C port number. Range: 0 ~ 1. If the following parameters are not set, AT will deinitialize the I2C
port.
• <scl_io>: GPIO number for I2C SCL signal.
• <sda_io>: GPIO number for I2C SDA signal.
• <clock>: I2C clock frequency for master mode. Unit: Hz. Maximum: 1 MHz.
Note
Example
Set Command
Command:
AT+DRVI2CRD=<num>,<address>,<length>
Response:
+DRVI2CRD:<read data>
OK
Parameters
Note
Example
Set Command
Command:
AT+DRVI2CWRDATA=<num>,<address>,<length>
Response:
OK
>
This response indicates that you should enter the data you want to write. When the requirement of data length is met,
the data transmission starts.
If the data is transmitted successfully, AT returns:
OK
ERROR
Parameters
Note
Example
Set Command
Command:
AT+DRVI2CWRBYTES=<num>,<address>,<length>,<data>
Response:
OK
Parameters
Note
Example
Set Command
Command:
AT+DRVSPICONFGPIO=<mosi>,<miso>,<sclk>,<cs>
Response:
OK
Parameters
Set Command
Command:
AT+DRVSPIINIT=<clock>,<mode>,<cmd_bit>,<addr_bit>,<dma_chan>[,bits_msb]
Response:
OK
Parameters
Note
Example
OK
AT+DRVSPIINIT=0 // delete SPI Driver
OK
Set Command
Command:
AT+DRVSPIRD=<data_len>[,<cmd>,<cmd_len>][,<addr>,<addr_len>]
Response:
+DRVSPIRD:<read data>
OK
Parameters
• <data_len>: length of SPI data you want to read. Range: 1 ~ 4092 bytes.
• <cmd>: command data. The length of the data is set in <cmd_len>.
• <cmd_len>: command length in this transaction. Range: 0 ~ 2 bytes.
• <addr>: command address. The length of the address is set in <addr_len>.
• <addr_len>: The address length in this transaction. Range: 0 ~ 4 bytes.
Note
• If you don t use DMA, the maximum <data_len> you can set is 64 bytes each time.
Example
+DRVI2CREAD:ffff
OK
Set Command
Command:
AT+DRVSPIWR=<data_len>[,<cmd>,<cmd_len>][,<addr>,<addr_len>]
Response:
When <data_len> is larger than 0, AT returns:
OK
>
This response indicates that you should enter the data you want to write. When the requirement of data length is met,
the data transmission starts.
If the data is transmitted successfully, AT returns:
OK
When <data_len> is equal to 0, which means AT transmits commands and addresses only, and no SPI data, AT
returns:
OK
Parameters
Note
• If you don t use DMA, the maximum <data_len> you can set is 64 bytes each time.
Example
OK
Query Command
Function:
AT+USERRAM?
Response:
+USERRAM:<size>
OK
Set Command
Function:
Operate user s free RAM
Command:
AT+USERRAM=<operation>,<size>[,<offset>]
Response:
OK
Parameters
• <operation>:
– 0: release user s RAM
– 1: malloc user s RAM
– 2: write user s RAM
– 3: read user s RAM
– 4: clear user s RAM
• <size>: the size to malloc/read/write
• <offset>: the offset to read/write. Default: 0
Notes
• Please malloc the RAM size before you perform any other operations.
• If the operator is write, wrap return > after the write command, then you can send the data that you want to
write. The length should be parameter <length>.
• If the operator is read and the length is bigger than 1024, ESP-AT will reply multiple times in the same
format, each reply can carry up to 1024 bytes of data, and eventually end up with \r\nOK\r\n.
Example
ESP-AT upgrades firmware at runtime by downloading the new firmware from a specific URL.
Set Command
Function:
Upgrade to the firmware version specified by the URL.
Command:
AT+USEROTA=<url len>
Response:
OK
>
This response indicates that AT is ready for receiving URL. You should enter the URL, and when the URL length
reaches the <url len> value, the system returns:
After AT outputs the above information, the upgrade process starts. If the upgrade process is complete, the system
return:
OK
ERROR
Parameters
Note
• When the URL is HTTPS, SSL verification is not recommended. If SSL verification is required, you need to
generate your own PKI files and download them into the corresponding partition, and then load the certificates
in the code implemented by the AT+USEROTA command. Please refer to How to Generate PKI Files for PKI
files. For AT+USEROTA command, ESP-AT project provides an example of USEROTA.
• Please refer to How to Implement OTA Upgrade for more OTA commands.
Example
AT+USEROTA=36
OK
>
Recv 36 bytes
OK
3.10.3 AT+USERDOCS: Query the ESP-AT User Guide for Current Firmware
Query Command
Function:
Query the ESP-AT English and Chinese user guide for current running firmware.
Command:
AT+USERDOCS?
Response:
+USERDOCS:<"en url">
+USERDOCS:<"cn url">
OK
Parameters
Example
AT+USERDOCS?
+USERDOCS:"https://docs.espressif.com/projects/esp-at/en/latest/esp32c3/index.html"
+USERDOCS:"https://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32c3/index.
,→html"
OK
It is strongly recommended to read the following sections for some common information on AT commands before
you dive into the details of each command.
• AT Command Types
• AT Commands with Configuration Saved in the Flash
• AT Messages
• Not all AT commands support all of the four types mentioned above.
• Currently, only strings and integer numbers are supported as input parameters in AT commands.
• Angle brackets < > designate parameters that can not be omitted.
• Square brackets [ ] designate optional parameters that can be omitted. The default value of the parameter
will be used instead when you omit it. Below are examples of entering the command AT+CWJAP with some
parameters omitted.
AT+CWJAP="ssid","password"
AT+CWJAP="ssid","password","11:22:33:44:55:66"
• If the parameter you want to omit is followed by a parameter(s), you must give a , to indicate it.
AT+CWJAP="ssid","password",,1
AT+CWSAP="ESP756290","21030826",1,4
• Escape character syntax is needed if a string contains special characters, such as ,, ", or \:
– \\: escape the backslash itself
– \,: escape comma which is not used to separate each parameter
– \": escape double quotation mark which is not used to mark string input
– \<any>: escape <any> character means that drop backslash symbol and only use <any> character
• Escape is needed in AT commands only, not elsewhere. For example, when AT command port prints > and
wait for your input, the input does not need to be escaped.
AT+CWJAP="comma\,backslash\\ssid","1234567890"
AT+MQTTPUB=0,"topic","\"{\"sensor\":012}\"",1,0
• AT+SAVETRANSLINK: AT+SAVETRANSLINK=1,"192.168.6.10",1001
• AT+CWAUTOCONN: AT+CWAUTOCONN=1
Saving of configuration settings by several other commands can be switched on or off with AT+SYSSTORE command,
which is mentioned in the Note section of these commands.
Note: The parameters of AT commands are saved based on NVS library. Therefore, if the command is configured
with the same parameter value, flash will not be written; If the command is configured with the different parameter
value, flash will not be erased frequently.
3.13 AT Messages
There are two types of ESP-AT messages returned from the ESP-AT command port:
• ESP-AT Response Messages (passive)
Each ESP-AT command input returns response messages to tell the sender the result of the ESP-AT command.
The last message in the response is either OK or ERROR.
AT Command Examples
This document provides detailed command examples to illustrate how to utilize TCP/IP AT Commands on ESP32-C3.
AT+CWMODE=1
Response:
OK
AT+CWJAP="espressif","1234567890"
Response:
165
Chapter 4. AT Command Examples
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
3. Query the device s IP address.
Command:
AT+CIPSTA?
Response:
+CIPSTA:ip:"192.168.3.112"
+CIPSTA:gateway:"192.168.3.1"
+CIPSTA:netmask:"255.255.255.0"
OK
Note:
• The query results you obtained may be different from those in the above response.
4. Connect the PC to the same router which ESP32-C3 is connected to.
Use a network tool on the PC to create a TCP server. For example, the TCP server on PC is 192.168.3.
102, and the port is 8080.
5. ESP32-C3 is connected to the TCP server as a client over TCP. The server s IP address is 192.168.3.102,
and the port is 8080.
Command:
AT+CIPSTART="TCP","192.168.3.102",8080
Response:
CONNECT
OK
AT+CIPSEND=4
Response:
OK
>
Input 4 bytes, for example, test, then AT will respond the following message.
Recv 4 bytes
SEND OK
Note:
• If the number of bytes inputted are more than the length (n) set by AT+CIPSEND, the system will reply
busy p..., and send the first n bytes. And after sending the first n bytes, the system will reply SEND
OK.
7. Receive 4 bytes of data.
Assume that the TCP server sends 4 bytes of data (data is test), the system will prompt:
+IPD,4:test
When ESP32-C3 works as a TCP server, multiple connections should be enabled by AT+CIPMUX=1 command,
because in most cases more than one client needs to be connected to the ESP32-C3 server.
Below is an example showing how a TCP server is established when ESP32-C3 works in the softAP mode. If ESP32-
C3 works as a station, you can set up a server in the same way mentioned above after connecting ESP32-C3 to the
router.
1. Set the Wi-Fi mode to softAP.
Command:
AT+CWMODE=2
Response:
OK
AT+CIPMUX=1
Response:
OK
3. Set softAP.
Command:
AT+CWSAP="ESP32_softAP","1234567890",5,3
Response:
OK
AT+CIPAP?
Response:
AT+CIPAP?
+CIPAP:ip:"192.168.4.1"
+CIPAP:gateway:"192.168.4.1"
+CIPAP:netmask:"255.255.255.0"
OK
Note:
• The address you obtained may be different from that in the above response.
5. Set up a TCP server, the default port is 333.
Command:
AT+CIPSERVER=1
Response:
OK
AT+CIPSEND=0,4
Response:
OK
>
Input 4 bytes, for example, test, then AT will respond the following messages.
Recv 4 bytes
SEND OK
Note:
• If the number of bytes inputted are more than the length (n) set by AT+CIPSEND, the system will reply
busy p..., and send the first n bytes. And after sending the first n bytes, the system will reply SEND
OK.
9. Receive 4 bytes of data from connection link 0.
Assume that the TCP server sends 4 bytes of data (data is test), the system will prompt:
+IPD,0,4:test
AT+CIPCLOSE=0
Response:
0,CLOSED
OK
AT+CWMODE=1
Response:
OK
AT+CWJAP="espressif","1234567890"
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
3. Query the device s IP address.
Command:
AT+CIPSTA?
Response:
+CIPSTA:ip:"192.168.3.112"
+CIPSTA:gateway:"192.168.3.1"
+CIPSTA:netmask:"255.255.255.0"
OK
Note:
• The query results you obtained may be different from those in the above response.
4. Connect the PC to the same router which ESP32-C3 is connected to.
Use a network tool on the PC to create UDP transmission. For example, the PC s IP address is 192.168.
3.102, and the port is 8080.
5. Enable multiple connections.
Command:
AT+CIPMUX=1
Response:
OK
6. Create a UDP transmission. The connection link is 4, the remote host s IP address is 192.168.3.102,
the remote port is 8080, the local port is 1112, and the mode is 0.
Important: In UDP transmission, whether the remote IP address and port are fixed or not is determined by
the mode parameter of AT+CIPSTART. If the parameter is 0, a specific connection link ID will be given to
ensure that the remote IP address and port are fixed and the data sender and receiver will not be replaced by
other devices.
Command:
AT+CIPSTART=4,"UDP","192.168.3.102",8080,1112,0
Response:
4,CONNECT
OK
Note:
• "192.168.3.102" and 8080 are the remote IP address and port of UDP transmission on the remote
side, i.e., the UDP configuration set by PC.
• 1112 is the local port number of ESP32-C3. You can define this port number, or else, a random port
will be used.
• 0 means that the remote IP address and port are fixed and cannot be changed. For example, when there is
another PC creating a UDP entity and sending data to ESP32-C3 port 1112, ESP32-C3 will still receive
the data from UDP port 1112, and if the AT command AT+CIPSEND=4,X is used, the data will still
be sent to the first PC end. However, if the parameter is not set as 0, the data will be sent to the new PC.
7. Send 7 bytes of data to connection link 4.
Command:
AT+CIPSEND=4,7
Response:
OK
>
Input 7 bytes, for example, abcdefg, then AT will respond the following messages.
Recv 7 bytes
SEND OK
Note:
• If the number of bytes inputted are more than the length (n) set by AT+CIPSEND, the system will reply
busy p..., and send the first n bytes. And after sending the first n bytes, the system will reply SEND
OK.
8. Receive 4 bytes of data from connection link 4.
Assume that the PC sends 4 bytes of data (data is test), the system will prompt:
+IPD,4,4:test
AT+CIPCLOSE=4
Response:
4,CLOSED
OK
AT+CWMODE=1
Response:
OK
AT+CWJAP="espressif","1234567890"
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
3. Query the device s IP address.
Command:
AT+CIPSTA?
Response:
+CIPSTA:ip:"192.168.3.112"
+CIPSTA:gateway:"192.168.3.1"
+CIPSTA:netmask:"255.255.255.0"
OK
Note:
• The query results you obtained may be different from those in the above response.
4. Connect the PC to the same router which ESP32-C3 is connected to.
Use a network tool on the PC to create UDP transmission. For example, the PC s IP address is 192.168.
3.102, and the port is 8080.
5. Enable single connections.
Command:
AT+CIPMUX=0
Response:
OK
6. Create a UDP transmission. The remote host s IP address is 192.168.3.102, the remote port is 8080,
the local port is 1112, and the mode is 2.
Command:
AT+CIPSTART="UDP","192.168.3.102",8080,1112,2
Response:
CONNECT
OK
Note:
• "192.168.3.102" and 8080 are the remote IP address and port of UDP transmission on the remote
side, i.e., the UDP configuration set by PC.
• 1112 is the local port number of ESP32-C3. You can define this port number, or else, a random port
will be used.
• 2 means the opposite terminal of UDP transmission can be changed. The remote IP address and port
will be automatically changed to those of the last UDP connection to ESP32-C3.
7. Send 4 bytes of data.
Command:
AT+CIPSEND=4
Response:
OK
>
Input 4 bytes, for example, test, then AT will respond the following messages.
Recv 4 bytes
SEND OK
Note:
• If the number of bytes inputted are more than the length (n) set by AT+CIPSEND, the system will reply
busy p..., and send the first n bytes. And after sending the first n bytes, the system will reply SEND
OK.
8. Send data to any other UDP terminal. For example, you can send 4 bytes of data with the remote host s IP
address as 192.168.3.103 and the remote port as 1000.
If you want to send data to any other UDP terminal, please designate the IP address and port of the target
terminal in the command.
Command:
AT+CIPSEND=4,"192.168.3.103",1000
Response:
OK
>
Input 4 bytes, for example, test, then AT will respond the following messages.
Recv 4 bytes
SEND OK
Response:
CLOSED
OK
Response:
OK
Response:
WIFI CONNECTED
WIFI GOT IP
(continues on next page)
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
3. Query the device s IP address.
Command:
AT+CIPSTA?
Response:
+CIPSTA:ip:"192.168.3.112"
+CIPSTA:gateway:"192.168.3.1"
+CIPSTA:netmask:"255.255.255.0"
OK
Note:
• The query results you obtained may be different from those in the above response.
4. Connect the PC to the same router which ESP32-C3 is connected to.
5. Use the OpenSSL command on the PC to create an SSL server. For example, the SSL server on PC is 192.
168.3.102, and the port is 8070.
Command:
openssl s_server -cert /home/esp-at/components/customized_partitions/raw_data/
,→server_cert/server_cert.crt -key /home/esp-at/components/customized_
Response:
ACCEPT
6. Connect the ESP32-C3 to the SSL server as a client over SSL. The server s IP address is 192.168.3.102,
and the port is 8070.
Command:
AT+CIPSTART="SSL","192.168.3.102",8070
Response:
CONNECT
OK
Response:
OK
>
Input 4 bytes, for example, test, then AT will respond the following message.
Recv 4 bytes
SEND OK
Note:
• If the number of bytes inputted are more than the length (n) set by AT+CIPSEND, the system will reply
busy p..., and send the first n bytes. And after sending the first n bytes, the system will reply SEND
OK.
8. Receive 4 bytes of data.
Assume that the SSL server sends 4 bytes of data (data is test), the system will prompt:
+IPD,4:test
When ESP32-C3 works as an SSL server, multiple connections should be enabled by AT+CIPMUX=1 command,
because in most cases more than one client needs to be connected to the ESP32-C3 server.
Below is an example showing how an SSL server is established when ESP32-C3 works in the softAP mode. If ESP32-
C3 works as a station, after connecting to the router, follow the steps for establishing a connection to an SSL server
in this example.
1. Set the Wi-Fi mode to softAP.
Command:
AT+CWMODE=2
Response:
OK
AT+CIPMUX=1
Response:
OK
AT+CWSAP="ESP32_softAP","1234567890",5,3
Response:
OK
AT+CIPAP?
Response:
AT+CIPAP?
+CIPAP:ip:"192.168.4.1"
+CIPAP:gateway:"192.168.4.1"
+CIPAP:netmask:"255.255.255.0"
OK
Note:
• The address you obtained may be different from that in the above response.
5. Set up an SSL server.
Command:
AT+CIPSERVER=1,8070,"SSL"
Response:
OK
7. Use the OpenSSL command on PC to create an SSL client and connect it to the SSL server that ESP32-C3
has created.
Command:
CONNECT
AT+CIPSEND=0,4
Response:
OK
>
Input 4 bytes, for example, test, then AT will respond the following messages.
Recv 4 bytes
SEND OK
Note:
• If the number of bytes inputted are more than the length (n) set by AT+CIPSEND, the system will reply
busy p..., and send the first n bytes. And after sending the first n bytes, the system will reply SEND
OK.
9. Receive 4 bytes of data from connection link 0.
Assume that the SSL server sends 4 bytes of data (data is test), the system will prompt:
+IPD,0,4:test
AT+CIPCLOSE=0
Response:
0,CLOSED
OK
4.1.7 ESP32-C3 as an SSL client to create a single connection with mutual authentication
The certificate used in the example is the default certificate in esp-at. You can also generate and flash your
own the certificate, then you need replace the SSL server certificate path below with your certificate path. To
obtain the SSL certificate, please refer to tools/README.md for how to generate the certificate bin and esp-
at/module_config/module_name/at_customize.csv for where to flash it.
1. Set the Wi-Fi mode to station.
Command:
AT+CWMODE=1
Response:
OK
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
3. Set the SNTP server.
Command:
AT+CIPSNTPCFG=1,8,"cn.ntp.org.cn","ntp.sjtu.edu.cn"
Response:
OK
Note:
• You can set the SNTP server according to your country s time zone.
4. Query the SNTP time.
Command:
AT+CIPSNTPTIME?
Response:
+CIPSNTPTIME:Mon Oct 18 20:12:27 2021
OK
Note:
• You can check whether the SNTP time matches the real-time time to determine whether the SNTP server
you set takes effect.
5. Query the device s IP address.
Command:
AT+CIPSTA?
Response:
+CIPSTA:ip:"192.168.3.112"
+CIPSTA:gateway:"192.168.3.1"
+CIPSTA:netmask:"255.255.255.0"
OK
Note:
• The query results you obtained may be different from those in the above response.
6. Connect the PC to the same router which ESP32-C3 is connected to.
7. Use the OpenSSL command on the PC to create an SSL server. For example, the SSL server on PC is 192.
168.3.102, and the port is 8070.
Command:
CONNECT
Note:
• The certificate path in the command can be adjusted according to the location of your certificate.
8. The ESP32-C3 sets up the SSL client mutual authentication configuration.
Command:
AT+CIPSSLCCONF=3,0,0
Response:
OK
9. Connect the ESP32-C3 to the SSL server as a client over SSL. The server s IP address is 192.168.3.102,
and the port is 8070.
Command:
AT+CIPSTART="SSL","192.168.3.102",8070
Response:
CONNECT
OK
AT+CIPSEND=4
Response:
OK
>
Input 4 bytes, for example, test, then AT will respond the following message.
Recv 4 bytes
SEND OK
Note:
• If the number of bytes inputted are more than the length (n) set by AT+CIPSEND, the system will reply
busy p..., and send the first n bytes. And after sending the first n bytes, the system will reply SEND
OK.
11. Receive 4 bytes of data.
Assume that the SSL server sends 4 bytes of data (data is test), the system will prompt:
+IPD,4:test
4.1.8 ESP32-C3 as an SSL server to create multiple connections with mutual authenti-
cation
When ESP32-C3 works as an SSL server, multiple connections should be enabled by AT+CIPMUX=1 command,
because in most cases more than one client needs to be connected to the ESP32-C3 server.
Below is an example showing how an SSL server is established when ESP32-C3 works in the station mode. If
ESP32-C3 works as a softAP, refer to the example of ESP32-C3 as an SSL server in multiple connections.
1. Set the Wi-Fi mode to station.
Command:
AT+CWMODE=1
Response:
OK
AT+CWJAP="espressif","1234567890"
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
3. Query the device s IP address.
Command:
AT+CIPSTA?
Response:
+CIPSTA:ip:"192.168.3.112"
+CIPSTA:gateway:"192.168.3.1"
+CIPSTA:netmask:"255.255.255.0"
OK
Note:
• The query results you obtained may be different from those in the above response.
4. Enable multiple connections.
Command:
AT+CIPMUX=1
Response:
OK
Response:
OK
7. Use the OpenSSL command on PC to create an SSL client and connect it to the SSL server that ESP32-C3
has created.
Command:
openssl s_client -CAfile /home/esp-at/components/customized_partitions/raw_
,→data/client_ca/client_ca_00.crt -cert /home/esp-at/components/customized_
,→components/customized_partitions/raw_data/client_key/client_key_00.key -host␣
Response:
OK
>
Input 4 bytes, for example, test, then AT will respond the following messages.
Recv 4 bytes
SEND OK
Note:
• If the number of bytes inputted are more than the length (n) set by AT+CIPSEND, the system will reply
busy p..., and send the first n bytes. And after sending the first n bytes, the system will reply SEND
OK.
9. Receive 4 bytes of data from connection link 0.
Assume that the SSL server sends 4 bytes of data (data is test), the system will prompt:
+IPD,0,4:test
Response:
0,CLOSED
OK
Response:
OK
4.1.9 UART Wi-Fi passthrough transmission when the ESP32-C3 works as a TCP client
in single connection
Response:
OK
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
3. Query the device s IP address.
Command:
AT+CIPSTA?
Response:
+CIPSTA:ip:"192.168.3.112"
+CIPSTA:gateway:"192.168.3.1"
(continues on next page)
OK
Note:
• The query results you obtained may be different from those in the above response.
4. Connect the PC to the same router which ESP32-C3 is connected to.
Use a network tool on the PC to create a TCP server. For example, the TCP server on PC is 192.168.3.
102, and the port is 8080.
5. Connect the ESP32-C3 to the TCP server as a TCP client over TCP. The server s IP address is 192.168.
3.102, and the port is 8080.
Command:
AT+CIPSTART="TCP","192.168.3.102",8080
Response:
CONNECT
OK
AT+CIPMODE=1
Response:
OK
AT+CIPSEND
Response:
OK
>
Important: The aim of ending the packet with +++ is to exit Passthrough Mode and to accept normal AT
commands, while TCP still remains connected. However, you can also use command AT+CIPSEND to go
back into Passthrough Mode.
AT+CIPMODE=0
Response:
OK
AT+CIPCLOSE
Response:
CLOSED
OK
4.1.10 UART Wi-Fi passthrough transmission when the ESP32-C3 works as a TCP
server
AT+CWMODE=1
Response:
OK
AT+CWJAP="espressif","1234567890"
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
3. Enable multiple connections.
Command:
AT+CIPMUX=1
Response:
OK
Note:
• TCP server can be created only in multiple connections.
4. Set the maximum number of TCP server connections to 1.
Command:
AT+CIPSERVERMAXCONN=1
Response:
OK
Note:
• The passthrough mode is point-to-point, so the maximum number of connections to the TCP server can
only be 1.
5. Create TCP server.
Command:
AT+CIPSERVER=1,8080
Response:
OK
Note:
• Set the TCP server port to 8080. You can also set it to other port.
6. Query the device s IP address.
Command:
AT+CIPSTA?
Response:
+CIPSTA:ip:"192.168.3.112"
+CIPSTA:gateway:"192.168.3.1"
+CIPSTA:netmask:"255.255.255.0"
OK
Note:
• The query results you obtained may be different from those in the above response.
7. Connect the PC to the ESP32-C3 TCP server
Connect the PC to the same router which ESP32-C3 is connected to.
Use a network tool on the PC to create a TCP client and connect to the ESP32-C3 TCP server. The remote
address is 192.168.3.112, and the port is 8080.
AT Response:
0,CONNECT
AT+CIPMODE=1
Response:
OK
AT+CIPSEND
Response:
OK
>
Important: The aim of ending the packet with +++ is to exit Passthrough Mode and to accept normal AT
commands, while TCP still remains connected. However, you can also use command AT+CIPSEND to go
back into Passthrough Mode.
AT+CIPMODE=0
Response:
OK
Response:
CLOSED
OK
4.1.11 UART Wi-Fi passthrough transmission when the ESP32-C3 works as a softAP in
UDP transparent transmission
Response:
OK
2. Set softAP.
Command:
AT+CWSAP="ESP32_softAP","1234567890",5,3
Response:
OK
Command:
AT+CIPSTART="UDP","192.168.4.2",8080,2233,0
Response:
CONNECT
OK
AT+CIPMODE=1
Response:
OK
AT+CIPSEND
Response:
OK
>
Important: The aim of ending the packet with +++ is to exit Passthrough Mode and to accept normal AT
commands, while TCP still remains connected. However, you can also use command AT+CIPSEND to go
back into Passthrough Mode.
AT+CIPMODE=0
Response:
OK
AT+CIPCLOSE
Response:
CLOSED
OK
This document provides an introduction and detailed command examples to illustrate how to utilize Bluetooth® Low
Energy AT Commands on ESP32-C3.
• Introduction
• Bluetooth LE client reads and write services
• Bluetooth LE server read and write services
• Encrypt Bluetooth LE connection
• Establish SPP connection between two ESP32-C3 development boards and transmit data in UART-Bluetooth
LE Passthrough Mode
• Establish SPP connection between ESP32-C3 and mobile phone and transmit data in UART-Bluetooth LE
passthrough mode
4.2.1 Introduction
ESP-AT currently only supports Bluetooth LE 4.2 protocol specification, and the description in this document is
only for Bluetooth LE 4.2 protocol specification. Please refer to Core Specification 4.2 for more details.
Bluetooth LE protocol stack is divided into several layers from bottom to top: Physical Layer (PHY), Link
Layer (LL), Host Controller Interface (HCI), Logical Link Control and Adaptation
Protocol Layer (L2CAP), Attribute Protocol (ATT), Security Manager Protocol
(SMP), Generic Attribute Profile (GATT), Generic Access Profile (GAP).
• PHY: the PHY layer is responsible for transmitting and receiving packets of information on the physical channel.
Bluetooth LE uses 40 RF channels. Frequency Range: 2402 MHz to 2480 MHz.
• LL: the LL layer is responsible for the creation, modification and release of logical links (and, if required, their
associated logical transports), as well as the update of parameters related to physical links between devices. It
controls the Link Layer state machine in one of the five states of standby, advertising, scanning,
initiating and connected.
• HCI: the HCI layer provides a standardized interface to host and controller. This layer can be implemented by
software API or controlled by hardware interfaces UART, SPI and USB.
• L2CAP: the L2CAP layer is responsible for protocol multiplexing capability, segmentation, and reassembly
operation for data exchanged between the host and the protocol stack.
• ATT: the ATT layer implements the peer-to-peer protocol between an attribute server and an attribute client.
The ATT client sends commands, requests, and confirmations to the ATT server. The ATT server sends
responses, notifications and indications to the client.
• SMP: the SMP layer is the peer-to-peer protocol used to generate encryption keys and identity keys. The
SMP also manages storage of the encryption keys and identity keys and is responsible for generating random
addresses and resolving random addresses to known device identities.
• GATT: the GATT layer represents the functionality of the attribute server and, optionally, the attribute client.
The profile describes the hierarchy of services, characteristics and attributes used in the attribute server.
The layer provides interfaces for discovering, reading, writing and indicating of service characteristics and
attributes.
• GAP: the GAP represents the base functionality common to all Bluetooth devices such as modes and access
procedures used by the transports, protocols and application profiles. GAP services include device discovery,
connection modes, security, authentication, association models and service discovery.
There are different roles in different levels of the Bluetooth LE protocol architecture. These divisions are not affected
by each other.
• LL: devices can be divided into master and slave, the slave advertises, and the master initiates a connection.
• GAP: GAP defines four specific roles: broadcaster, observer, peripheral, and central.
Important:
• The Bluetooth LE server and Bluetooth LE client described in this document are both GATT
layer roles.
• At present, ESP-AT supports the existence of Bluetooth LE server and Bluetooth LE client
at the same time.
• No matter ESP-AT is initialized as Bluetooth LE server or Bluetooth LE client, the maximum number of
devices connected at the same time is 3.
GATT is actually an attribute transmission protocol, which can be regarded as an application layer protocol for
attribute transmission. The structure of this attribute is very simple. It is composed of services, each service
is composed of different numbers of characteristics, and each characteristic is composed of many
other elements.
GATT server and GATT client roles exist after the Bluetooth LE connection is established. The GATT
server stores the data transported over the Attribute Protocol and accepts Attribute Protocol requests, commands and
confirmations from the GATT client. In short, the end that provides data is called GATT server, and the end that
accesses data is called GATT client.
Important:
• The ESP32-C3 Bluetooth LE server needs to download a ble_data.bin into flash to provide Bluetooth
LE services.
– To learn how to generate a ble_data.bin, please refer to Customize Bluetooth LE Services Tools.
– The download address of the ble_data.bin is the address of ble_data in at_customize.csv,
or described in build/download.config.
Below is an example of using two ESP32-C3 development boards, one as a Bluetooth LE server (only as Bluetooth
LE server role), the other one as a Bluetooth LE client (only as Bluetooth LE client role). The example shows how
to use Bluetooth LE functions with AT commands.
Important: In the following steps, the operations starting with ESP32-C3 Bluetooth LE server only need
to be executed at ESP32-C3 Bluetooth LE server, and the operations starting with ESP32-C3 Bluetooth LE
client only need to be executed at ESP32-C3 Bluetooth LE client.
1. Bluetooth LE initialization.
ESP32-C3 Bluetooth LE server:
Command:
AT+BLEINIT=2
Response:
OK
AT+BLEINIT=1
Response:
OK
AT+BLEADDR?
Response:
+BLEADDR:"24:0a:c4:d6:e4:46"
OK
Note:
• The address you obtain may be different from that in the above response. Keep yours handy as you will
need it in one of the following steps.
3. ESP32-C3 Bluetooth LE server creates services.
Command:
AT+BLEGATTSSRVCRE
Response:
OK
AT+BLEGATTSSRVSTART
Response:
OK
AT+BLEGATTSCHAR?
Response:
+BLEGATTSCHAR:"char",1,1,0xC300,0x02
+BLEGATTSCHAR:"desc",1,1,1,0x2901
+BLEGATTSCHAR:"char",1,2,0xC301,0x02
+BLEGATTSCHAR:"desc",1,2,1,0x2901
+BLEGATTSCHAR:"char",1,3,0xC302,0x08
+BLEGATTSCHAR:"desc",1,3,1,0x2901
+BLEGATTSCHAR:"char",1,4,0xC303,0x04
+BLEGATTSCHAR:"desc",1,4,1,0x2901
+BLEGATTSCHAR:"char",1,5,0xC304,0x08
+BLEGATTSCHAR:"char",1,6,0xC305,0x10
+BLEGATTSCHAR:"desc",1,6,1,0x2902
+BLEGATTSCHAR:"char",1,7,0xC306,0x20
+BLEGATTSCHAR:"desc",1,7,1,0x2902
+BLEGATTSCHAR:"char",1,8,0xC307,0x02
+BLEGATTSCHAR:"desc",1,8,1,0x2901
+BLEGATTSCHAR:"char",2,1,0xC400,0x02
+BLEGATTSCHAR:"desc",2,1,1,0x2901
+BLEGATTSCHAR:"char",2,2,0xC401,0x02
+BLEGATTSCHAR:"desc",2,2,1,0x2901
OK
6. ESP32-C3 Bluetooth LE server starts advertising, then the ESP32-C3 Bluetooth LE client starts scanning and
lasts for 3 s.
ESP32-C3 Bluetooth LE server:
Command:
AT+BLEADVSTART
Response:
OK
AT+BLESCAN=1,3
Response:
OK
+BLESCAN:"5b:3b:6c:51:90:49",-87,02011a020a0c0aff4c001005071c3024dc,,1
+BLESCAN:"c4:5b:be:93:ec:66",-84,0201060303111809095647543147572d58020a03,,0
+BLESCAN:"24:0a:c4:d6:e4:46",-29,,,0
Note:
• The scan results you obtain may be different from those in the above response.
7. Establish the Bluetooth LE connection.
ESP32-C3 Bluetooth LE client:
Command:
AT+BLECONN=0,"24:0a:c4:d6:e4:46"
Response:
+BLECONN:0,"24:0a:c4:d6:e4:46"
OK
Note:
• When entering the above command, replace the address with your ESP32-C3 Bluetooth LE server ad-
dress.
• If the Bluetooth LE connection is established successfully, message +BLECONN:0,
"24:0a:c4:d6:e4:46 will be prompted.
• If the Bluetooth LE connection is broken, message +BLECONN:0,-1 will be prompted.
8. ESP32-C3 Bluetooth LE client discovers services.
Command:
AT+BLEGATTCPRIMSRV=0
Response:
+BLEGATTCPRIMSRV:0,1,0x1801,1
+BLEGATTCPRIMSRV:0,2,0x1800,1
+BLEGATTCPRIMSRV:0,3,0xA002,1
+BLEGATTCPRIMSRV:0,4,0xA003,1
OK
Note:
• When discovering services, the ESP32-C3 Bluetooth LE client will get two more default services (UUID:
0x1800 and 0x1801) than what the ESP32-C3 Bluetooth LE server will get. So, for the same service,
the <srv_index> received by the ESP32-C3 Bluetooth LE client equals the <srv_index> received by the
ESP32-C3 Bluetooth LE server + 2. For example, for service 0xA002, the <srv_index> queried on
the ESP32-C3 Bluetooth LE client is 3, if the ESP32-C3 Bluetooth LE server is queried through the
command AT+BLEGATTSSRV?, then <srv_index> is 1.
9. ESP32-C3 Bluetooth LE client discovers characteristics.
Command:
AT+BLEGATTCCHAR=0,3
Response:
+BLEGATTCCHAR:"char",0,3,1,0xC300,0x02
+BLEGATTCCHAR:"desc",0,3,1,1,0x2901
+BLEGATTCCHAR:"char",0,3,2,0xC301,0x02
+BLEGATTCCHAR:"desc",0,3,2,1,0x2901
+BLEGATTCCHAR:"char",0,3,3,0xC302,0x08
+BLEGATTCCHAR:"desc",0,3,3,1,0x2901
+BLEGATTCCHAR:"char",0,3,4,0xC303,0x04
+BLEGATTCCHAR:"desc",0,3,4,1,0x2901
+BLEGATTCCHAR:"char",0,3,5,0xC304,0x08
+BLEGATTCCHAR:"char",0,3,6,0xC305,0x10
+BLEGATTCCHAR:"desc",0,3,6,1,0x2902
+BLEGATTCCHAR:"char",0,3,7,0xC306,0x20
+BLEGATTCCHAR:"desc",0,3,7,1,0x2902
+BLEGATTCCHAR:"char",0,3,8,0xC307,0x02
+BLEGATTCCHAR:"desc",0,3,8,1,0x2901
OK
AT+BLEGATTCRD=0,3,1
Response:
+BLEGATTCRD:0,1,0
OK
Note:
• Please note that the target characteristic s property has to support the read operation.
• If the ESP32-C3 Bluetooth LE client reads the characteristic successfully, message +READ:0,
"7c:df:a1:b3:8d:de" will be prompted on the ESP32-C3 Bluetooth LE Server side.
11. ESP32-C3 Bluetooth LE client writes a characteristic.
Command:
AT+BLEGATTCWR=0,3,3,,2
Response:
>
The symbol > indicates that AT is ready for receiving serial data and you can enter data now. When the
requirement of data length determined by the parameter <length> is met, the writing starts.
OK
Note:
• If the ESP32-C3 Bluetooth LE client writes the characteristic successfully, message
+WRITE:<conn_index>,<srv_index>,<char_index>,[<desc_index>],<len>,
<value> will be prompted on the ESP32-C3 Bluetooth LE server side.
12. Indicate a characteristic.
ESP32-C3 Bluetooth LE client:
Command:
AT+BLEGATTCWR=0,3,7,1,2
Response:
>
The symbol > indicates that AT is ready for receiving serial data and you can enter data now. When the
requirement of data length determined by the parameter <length> is met, the writing starts.
To receive data from ESP32-C3 Bluetooth LE server (through the notify or the indicate method), the
ESP32-C3 Bluetooth LE client needs to register with the server in advance. Write the value 0x0001 to use
the notify method, and 0x0002 to use the indicate method. This example writes the 0x0002 to use
the indicate method.
OK
Note:
• If the ESP32-C3 Bluetooth LE client writes the descriptor successfully, message
+WRITE:<conn_index>,<srv_index>,<char_index>,<desc_index>,<len>,
<value> will be prompted on the ESP32-C3 Bluetooth LE server side.
ESP32-C3 Bluetooth LE server:
Command:
AT+BLEGATTSIND=0,1,7,3
Response:
>
The symbol > indicates that AT is ready for receiving serial data and you can enter data now. When the
requirement of data length determined by the parameter <length> is met, the indication starts.
OK
Note:
• If the ESP32-C3 Bluetooth LE client receives the indication, message +INDICATE:<conn_index>,
<srv_index>,<char_index>,<len>,<value> will be prompted.
• For the same service, the <srv_index> on the ESP32-C3 Bluetooth LE client side equals the <srv_index>
on the ESP32-C3 Bluetooth LE server side + 2.
• For the permissions of the characteristics in the services, please refer to How to Customize Bluetooth®
LE Services.
Below is an example of using two ESP32-C3 development boards, one as a Bluetooth LE server (only as Bluetooth
LE server role), the other one as a Bluetooth LE client (only as Bluetooth LE client role). The example shows how
to establish a Bluetooth LE connection, as well as the read and write characteristics of the server and client settings,
and notification characteristics.
Important: In the step, the operations starting with ESP32-C3 Bluetooth LE server only need to
be executed at ESP32-C3 Bluetooth LE server, and the operations starting with ESP32-C3 Bluetooth LE
client only need to be executed at ESP32-C3 Bluetooth LE client.
1. Bluetooth LE initialization.
ESP32-C3 Bluetooth LE server:
Command:
AT+BLEINIT=2
Response:
OK
Response:
OK
AT+BLEGATTSSRVCRE
Response:
OK
AT+BLEGATTSSRVSTART
Response:
OK
AT+BLEADDR?
Response:
+BLEADDR:"24:0a:c4:d6:e4:46"
OK
Note:
• The address you obtain may be different from that in the above response. Keep yours handy as you will
need it in one of the following steps.
5. Set Bluetooth LE advertising data.
Command:
AT+BLEADVDATA="0201060A09457370726573736966030302A0"
Response:
OK
AT+BLEADVSTART
Response:
OK
AT+BLEGATTSSRVCRE
Response:
OK
AT+BLEGATTSSRVSTART
Response:
OK
AT+BLEADDR?
Response:
+BLEADDR:"24:0a:c4:03:a7:4e"
OK
Note:
• The address you obtain may be different from that in the above response. Keep yours handy as you will
need it in one of the following steps.
10. ESP32-C3 Bluetooth LE client enables a scanning for three seconds.
Command:
AT+BLESCAN=1,3
Response:
OK
+BLESCAN:"5b:3b:6c:51:90:49",-87,02011a020a0c0aff4c001005071c3024dc,,1
+BLESCAN:"c4:5b:be:93:ec:66",-84,0201060303111809095647543147572d58020a03,,0
+BLESCAN:"24:0a:c4:d6:e4:46",-29,,,0
Note:
• The scan results you obtain may be different from those in the above response.
11. Establish the Bluetooth LE connection.
ESP32-C3 Bluetooth LE client:
Command:
AT+BLECONN=0,"24:0a:c4:d6:e4:46"
Response:
+BLECONN:0,"24:0a:c4:d6:e4:46"
OK
Note:
• When entering the above command, replace the address with your ESP32-C3 Bluetooth LE server ad-
dress.
• If the Bluetooth LE connection is established successfully, message +BLECONN:0,
"24:0a:c4:d6:e4:46 will be prompted.
• If the Bluetooth LE connection is broken, message +BLECONN:0,-1 will be prompted.
ESP32-C3 Bluetooth LE server:
Command:
AT+BLECONN=0,"24:0a:c4:03:a7:4e"
Response:
+BLECONN:0,"24:0a:c4:03:a7:4e"
OK
Note:
• When entering the above command, replace the address with your ESP32-C3 Bluetooth LE server ad-
dress.
• If the Bluetooth LE connection is established successfully, the message OK will be prompted and the
message +BLECONN:0,"24:0a:c4:03:a7:4e will not be prompted.
• If the Bluetooth LE connection is broken, the message ERROR will be prompted and the message +BLE-
CONN:0,-1 will not be prompted.
12. ESP32-C3 Bluetooth LE client discovers local services.
Command:
AT+BLEGATTSSRV?
Response:
+BLEGATTSSRV:1,1,0xA002,1
+BLEGATTSSRV:2,1,0xA003,1
OK
AT+BLEGATTSCHAR?
Response:
+BLEGATTSCHAR:"char",1,1,0xC300,0x02
+BLEGATTSCHAR:"desc",1,1,1,0x2901
+BLEGATTSCHAR:"char",1,2,0xC301,0x02
+BLEGATTSCHAR:"desc",1,2,1,0x2901
+BLEGATTSCHAR:"char",1,3,0xC302,0x08
+BLEGATTSCHAR:"desc",1,3,1,0x2901
+BLEGATTSCHAR:"char",1,4,0xC303,0x04
+BLEGATTSCHAR:"desc",1,4,1,0x2901
+BLEGATTSCHAR:"char",1,5,0xC304,0x08
+BLEGATTSCHAR:"char",1,6,0xC305,0x10
+BLEGATTSCHAR:"desc",1,6,1,0x2902
+BLEGATTSCHAR:"char",1,7,0xC306,0x20
+BLEGATTSCHAR:"desc",1,7,1,0x2902
+BLEGATTSCHAR:"char",1,8,0xC307,0x02
+BLEGATTSCHAR:"desc",1,8,1,0x2901
+BLEGATTSCHAR:"char",2,1,0xC400,0x02
+BLEGATTSCHAR:"desc",2,1,1,0x2901
+BLEGATTSCHAR:"char",2,2,0xC401,0x02
+BLEGATTSCHAR:"desc",2,2,1,0x2901
OK
AT+BLEGATTCPRIMSRV=0
Response:
+BLEGATTCPRIMSRV:0,1,0x1801,1
+BLEGATTCPRIMSRV:0,2,0x1800,1
+BLEGATTCPRIMSRV:0,3,0xA002,1
+BLEGATTCPRIMSRV:0,4,0xA003,1
OK
Note:
• When discovering services, the ESP32-C3 Bluetooth LE server will get two more default services (UUID:
0x1800 and 0x1801) than what the ESP32-C3 Bluetooth LE client will get. So, for the same service,
the <srv_index> received by the ESP32-C3 Bluetooth LE server equals the <srv_index> received by
the ESP32-C3 Bluetooth LE client + 2. For example, for service 0xA002, the <srv_index> queried on
the ESP32-C3 Bluetooth LE client is 3, if the ESP32-C3 Bluetooth LE server is queried through the
command AT+BLEGATTSSRV?, then <srv_index> is 1.
15. ESP32-C3 Bluetooth LE server discovers primary characteristics.
Command:
AT+BLEGATTCCHAR=0,3
Response:
+BLEGATTCCHAR:"char",0,3,1,0xC300,0x02
+BLEGATTCCHAR:"desc",0,3,1,1,0x2901
+BLEGATTCCHAR:"char",0,3,2,0xC301,0x02
+BLEGATTCCHAR:"desc",0,3,2,1,0x2901
+BLEGATTCCHAR:"char",0,3,3,0xC302,0x08
+BLEGATTCCHAR:"desc",0,3,3,1,0x2901
+BLEGATTCCHAR:"char",0,3,4,0xC303,0x04
+BLEGATTCCHAR:"desc",0,3,4,1,0x2901
+BLEGATTCCHAR:"char",0,3,5,0xC304,0x08
+BLEGATTCCHAR:"char",0,3,6,0xC305,0x10
+BLEGATTCCHAR:"desc",0,3,6,1,0x2902
+BLEGATTCCHAR:"char",0,3,7,0xC306,0x20
+BLEGATTCCHAR:"desc",0,3,7,1,0x2902
+BLEGATTCCHAR:"char",0,3,8,0xC307,0x02
+BLEGATTCCHAR:"desc",0,3,8,1,0x2901
OK
Response:
>
Command:
Write 1 byte ``9``
Response:
OK
Response:
+BLEGATTCRD:0,1,9
OK
Response:
>
Command:
Write 2 bytes ``12``
Response:
OK
Note:
• If the Bluetooth LE server successfully writes the service characteristic value, the Bluetooth LE client
will prompt +WRITE:0,1,6,1,2,12.
Response:
>
Command:
Write 10 bytes ``1234567890``
Response:
OK
Note:
• If the ESP32-C3 Bluetooth LE client s notify characteristic is successfully sent to the server, the Blue-
tooth LE server +NOTIFY:0,3,6,10,1234567890 will be prompt.
Below is an example of using two ESP32-C3 development boards, one as a Bluetooth LE server (only as Bluetooth
LE server role), the other one as a Bluetooth LE client (only as Bluetooth LE client role). The example shows how
to encrypt Bluetooth LE connection.
Important:
• In the following steps, the operations starting with ESP32-C3 Bluetooth LE server only need to be
executed at ESP32-C3 Bluetooth LE server, and the operations starting with ESP32-C3 Bluetooth LE
client only need to be executed at ESP32-C3 Bluetooth LE client.
• Encryption and bonding are two different concepts. bonding is just a long-term key stored locally
after successful encryption.
• ESP-AT allows a maximum of 10 devices to be bonded.
1. Bluetooth LE initialization.
ESP32-C3 Bluetooth LE server:
Command:
AT+BLEINIT=2
Response:
OK
Response:
OK
Response:
+BLEADDR:"24:0a:c4:d6:e4:46"
OK
Note:
• The address you obtain may be different from that in the above response. Keep yours handy as you will
need it in one of the following steps.
3. ESP32-C3 Bluetooth LE server creates services.
Command:
AT+BLEGATTSSRVCRE
Response:
OK
AT+BLEGATTSSRVSTART
Response:
OK
AT+BLEGATTSCHAR?
Response:
+BLEGATTSCHAR:"char",1,1,0xC300,0x02
+BLEGATTSCHAR:"desc",1,1,1,0x2901
+BLEGATTSCHAR:"char",1,2,0xC301,0x02
+BLEGATTSCHAR:"desc",1,2,1,0x2901
+BLEGATTSCHAR:"char",1,3,0xC302,0x08
+BLEGATTSCHAR:"desc",1,3,1,0x2901
+BLEGATTSCHAR:"char",1,4,0xC303,0x04
+BLEGATTSCHAR:"desc",1,4,1,0x2901
+BLEGATTSCHAR:"char",1,5,0xC304,0x08
+BLEGATTSCHAR:"char",1,6,0xC305,0x10
+BLEGATTSCHAR:"desc",1,6,1,0x2902
+BLEGATTSCHAR:"char",1,7,0xC306,0x20
+BLEGATTSCHAR:"desc",1,7,1,0x2902
+BLEGATTSCHAR:"char",1,8,0xC307,0x02
+BLEGATTSCHAR:"desc",1,8,1,0x2901
+BLEGATTSCHAR:"char",2,1,0xC400,0x02
+BLEGATTSCHAR:"desc",2,1,1,0x2901
+BLEGATTSCHAR:"char",2,2,0xC401,0x02
+BLEGATTSCHAR:"desc",2,2,1,0x2901
OK
6. ESP32-C3 Bluetooth LE server starts advertising, then the ESP32-C3 Bluetooth LE client starts scanning and
lasts for 3 s.
ESP32-C3 Bluetooth LE server:
Command:
AT+BLEADVSTART
Response:
OK
AT+BLESCAN=1,3
Response:
OK
+BLESCAN:"5b:3b:6c:51:90:49",-87,02011a020a0c0aff4c001005071c3024dc,,1
+BLESCAN:"c4:5b:be:93:ec:66",-84,0201060303111809095647543147572d58020a03,,0
+BLESCAN:"24:0a:c4:d6:e4:46",-29,,,0
Note:
• The scan results you obtain may be different from those in the above response.
7. Establish the Bluetooth LE connection.
ESP32-C3 Bluetooth LE client:
Command:
AT+BLECONN=0,"24:0a:c4:d6:e4:46"
Response:
+BLECONN:0,"24:0a:c4:d6:e4:46"
OK
Note:
• When entering the above command, replace the address with your ESP32-C3 Bluetooth LE server ad-
dress.
• If the Bluetooth LE connection is established successfully, message +BLECONN:0,
"24:0a:c4:d6:e4:46 will be prompted.
• If the Bluetooth LE connection is broken, message +BLECONN:0,-1 will be prompted.
8. ESP32-C3 Bluetooth LE client discovers services.
Command:
AT+BLEGATTCPRIMSRV=0
Response:
+BLEGATTCPRIMSRV:0,1,0x1801,1
+BLEGATTCPRIMSRV:0,2,0x1800,1
+BLEGATTCPRIMSRV:0,3,0xA002,1
+BLEGATTCPRIMSRV:0,4,0xA003,1
OK
Note:
• When discovering services, the ESP32-C3 Bluetooth LE client will get two more default services (UUID:
0x1800 and 0x1801) than what the ESP32-C3 Bluetooth LE server will get. So, for the same service,
the <srv_index> received by the ESP32-C3 Bluetooth LE client equals the <srv_index> received by the
ESP32-C3 Bluetooth LE server + 2. For example, for service 0xA002, the <srv_index> queried on
the ESP32-C3 Bluetooth LE client is 3, if the ESP32-C3 Bluetooth LE server is queried through the
command AT+BLEGATTSSRV?, then <srv_index> is 1.
9. ESP32-C3 Bluetooth LE client discovers characteristics.
Command:
AT+BLEGATTCCHAR=0,3
Response:
+BLEGATTCCHAR:"char",0,3,1,0xC300,0x02
+BLEGATTCCHAR:"desc",0,3,1,1,0x2901
+BLEGATTCCHAR:"char",0,3,2,0xC301,0x02
+BLEGATTCCHAR:"desc",0,3,2,1,0x2901
+BLEGATTCCHAR:"char",0,3,3,0xC302,0x08
+BLEGATTCCHAR:"desc",0,3,3,1,0x2901
+BLEGATTCCHAR:"char",0,3,4,0xC303,0x04
+BLEGATTCCHAR:"desc",0,3,4,1,0x2901
+BLEGATTCCHAR:"char",0,3,5,0xC304,0x08
+BLEGATTCCHAR:"char",0,3,6,0xC305,0x10
(continues on next page)
OK
10. Set Bluetooth LE encryption parameters. Set auth_req to SC_MITM_BOND, server s iocap to Key-
boardOnly, client s iocap to KeyboardDisplay, key_size to 16, init_key to 3, rsp_key
to 3.
ESP32-C3 Bluetooth LE server:
Command:
AT+BLESECPARAM=13,2,16,3,3
Response:
OK
AT+BLESECPARAM=13,4,16,3,3
Response:
OK
Note:
• In this example, ESP32-C3 Bluetooth LE server enters the pairing code and ESP32-C3 Bluetooth LE
client displays the pairing code.
• ESP-AT supports Legacy Pairing and Secure Connections encryption methods, but the
latter has a higher priority. If the peer also supports Secure Connections, then Secure Con-
nections will be used for encryption.
11. ESP32-C3 Bluetooth LE client initiates encryption request.
Command:
AT+BLEENC=0,3
Response:
OK
Note:
If the ESP32-C3 Bluetooth LE server successfully receives the encryption request, message +BLESECREQ:0
will be prompted on the ESP32-C3 Bluetooth LE server side.
12. ESP32-C3 Bluetooth LE server responds to the pairing request.
Command:
AT+BLEENCRSP=0,1
Response:
OK
Note:
• If the ESP32-C3 Bluetooth LE client successfully receives the pairing response, a 6-digit pairing code
will generate on the ESP32-C3 Bluetooth LE client side.
• In this example, message +BLESECNTFYKEY:0,793718 will be prompted on the ESP32-C3 Blue-
tooth LE client side. Pairing code is 793718.
13. ESP32-C3 Bluetooth LE server replies pairing code.
Command:
AT+BLEKEYREPLY=0,793718
Response:
OK
After running this command, there will be corresponding messages prompt on both the ESP32-C3 Bluetooth
LE server and the ESP32-C3 Bluetooth LE client.
ESP32-C3 Bluetooth LE server:
+BLESECKEYTYPE:0,16
+BLESECKEYTYPE:0,1
+BLESECKEYTYPE:0,32
+BLESECKEYTYPE:0,2
+BLEAUTHCMPL:0,0
+BLESECNTFYKEY:0,793718
+BLESECKEYTYPE:0,2
+BLESECKEYTYPE:0,16
+BLESECKEYTYPE:0,1
+BLESECKEYTYPE:0,32
+BLEAUTHCMPL:0,0
You can ignore the message starting with +BLESECKEYTYPE. In terms of the second parameter in the mes-
sage +BLEAUTHCMPL:0,0, 0 means encryption is successful, and 1 means encryption fails.
4.2.5 Establish SPP connection between two ESP32-C3 development boards and transmit
data in UART-Bluetooth LE Passthrough Mode
Below is an example of using two ESP32-C3 development boards, one as a Bluetooth LE server (only as Bluetooth
LE server role), the other one as a Bluetooth LE client (only as Bluetooth LE client role). The example shows how
to build Bluetooth LE SPP (Serial Port Profile, UART-Bluetooth LE passthrough mode) with AT commands.
Important: In the following steps, the operations starting with ESP32-C3 Bluetooth LE server only need
to be executed at ESP32-C3 Bluetooth LE server, and the operations starting with ESP32-C3 Bluetooth LE
client only need to be executed at ESP32-C3 Bluetooth LE client.
1. Bluetooth LE initialization.
ESP32-C3 Bluetooth LE server:
Command:
AT+BLEINIT=2
Response:
OK
AT+BLEINIT=1
Response:
OK
AT+BLEGATTSSRVCRE
Response:
OK
AT+BLEGATTSSRVSTART
Response:
OK
AT+BLEADDR?
Response:
+BLEADDR:"24:0a:c4:d6:e4:46"
OK
Note:
• The address you obtain may be different from that in the above response. Keep yours handy as you will
need it in one of the following steps.
5. Set Bluetooth LE advertising data.
Command:
AT+BLEADVDATA="0201060A09457370726573736966030302A0"
Response:
OK
AT+BLEADVSTART
Response:
OK
AT+BLESCAN=1,3
Response:
OK
+BLESCAN:"24:0a:c4:d6:e4:46",-78,0201060a09457370726573736966030302a0,,0
+BLESCAN:"45:03:cb:ac:aa:a0",-62,0201060aff4c001005441c61df7d,,1
+BLESCAN:"24:0a:c4:d6:e4:46",-26,0201060a09457370726573736966030302a0,,0
Note:
• The scan results you obtain may be different from those in the above response.
8. Establish the Bluetooth LE connection.
ESP32-C3 Bluetooth LE client:
Command:
AT+BLECONN=0,"24:0a:c4:d6:e4:46"
Response:
+BLECONN:0,"24:0a:c4:d6:e4:46"
OK
Note:
• When entering the above command, replace the address your ESP32-C3 Bluetooth LE server address.
• If the Bluetooth LE connection is established successfully, message +BLECONN:0,
"24:0a:c4:d6:e4:46 will be prompted.
• If the Bluetooth LE connection is broken, message +BLECONN:0,-1 will be prompted.
9. ESP32-C3 Bluetooth LE server discovers local services.
Command:
AT+BLEGATTSSRV?
Response:
+BLEGATTSSRV:1,1,0xA002,1
+BLEGATTSSRV:2,1,0xA003,1
OK
AT+BLEGATTSCHAR?
Response:
+BLEGATTSCHAR:"char",1,1,0xC300,0x02
+BLEGATTSCHAR:"desc",1,1,1,0x2901
+BLEGATTSCHAR:"char",1,2,0xC301,0x02
+BLEGATTSCHAR:"desc",1,2,1,0x2901
+BLEGATTSCHAR:"char",1,3,0xC302,0x08
+BLEGATTSCHAR:"desc",1,3,1,0x2901
+BLEGATTSCHAR:"char",1,4,0xC303,0x04
+BLEGATTSCHAR:"desc",1,4,1,0x2901
+BLEGATTSCHAR:"char",1,5,0xC304,0x08
+BLEGATTSCHAR:"char",1,6,0xC305,0x10
+BLEGATTSCHAR:"desc",1,6,1,0x2902
+BLEGATTSCHAR:"char",1,7,0xC306,0x20
+BLEGATTSCHAR:"desc",1,7,1,0x2902
+BLEGATTSCHAR:"char",1,8,0xC307,0x02
+BLEGATTSCHAR:"desc",1,8,1,0x2901
+BLEGATTSCHAR:"char",2,1,0xC400,0x02
+BLEGATTSCHAR:"desc",2,1,1,0x2901
+BLEGATTSCHAR:"char",2,2,0xC401,0x02
+BLEGATTSCHAR:"desc",2,2,1,0x2901
OK
AT+BLEGATTCPRIMSRV=0
Response:
+BLEGATTCPRIMSRV:0,1,0x1801,1
+BLEGATTCPRIMSRV:0,2,0x1800,1
+BLEGATTCPRIMSRV:0,3,0xA002,1
+BLEGATTCPRIMSRV:0,4,0xA003,1
OK
Note:
• When discovering services, the ESP32-C3 Bluetooth LE client will get two more default services (UUID:
0x1800 and 0x1801) than what the ESP32-C3 Bluetooth LE server will get. So, for the same service,
the <srv_index> received by the ESP32-C3 Bluetooth LE client equals the <srv_index> received by the
ESP32-C3 Bluetooth LE server + 2. For example, for service 0xA002, the <srv_index> queried on
the ESP32-C3 Bluetooth LE client is 3, if the ESP32-C3 Bluetooth LE server is queried through the
command AT+BLEGATTSSRV?, then <srv_index> is 1.
12. ESP32-C3 Bluetooth LE client discovers characteristics.
Command:
AT+BLEGATTCCHAR=0,3
Response:
+BLEGATTCCHAR:"char",0,3,1,0xC300,0x02
+BLEGATTCCHAR:"desc",0,3,1,1,0x2901
+BLEGATTCCHAR:"char",0,3,2,0xC301,0x02
+BLEGATTCCHAR:"desc",0,3,2,1,0x2901
+BLEGATTCCHAR:"char",0,3,3,0xC302,0x08
+BLEGATTCCHAR:"desc",0,3,3,1,0x2901
+BLEGATTCCHAR:"char",0,3,4,0xC303,0x04
+BLEGATTCCHAR:"desc",0,3,4,1,0x2901
+BLEGATTCCHAR:"char",0,3,5,0xC304,0x08
+BLEGATTCCHAR:"char",0,3,6,0xC305,0x10
+BLEGATTCCHAR:"desc",0,3,6,1,0x2902
+BLEGATTCCHAR:"char",0,3,7,0xC306,0x20
+BLEGATTCCHAR:"desc",0,3,7,1,0x2902
+BLEGATTCCHAR:"char",0,3,8,0xC307,0x02
+BLEGATTCCHAR:"desc",0,3,8,1,0x2901
OK
AT+BLESPPCFG=1,3,5,3,7
Response:
OK
AT+BLESPP
Response:
OK
>
This response indicates that AT has entered Bluetooth LE SPP mode and can send and receive data.
Note:
• After the ESP32-C3 Bluetooth LE client enables Bluetooth LE SPP, data received from serial port will
be transmitted to the Bluetooth LE server directly.
15. ESP32-C3 Bluetooth LE server Configures Bluetooth LE SPP.
Set a characteristic that supports notification or indication to TX channel for sending data. Set another char-
acteristic that enables writing permission to RX channel for receiving data.
Command:
AT+BLESPPCFG=1,1,7,1,5
Response:
OK
AT+BLESPP
Response:
OK
>
This response indicates that AT has entered Bluetooth LE SPP mode and can send and receive data.
Note:
• After the ESP32-C3 Bluetooth LE server enables Bluetooth LE SPP, the data received from serial port
will be transmitted to the Bluetooth LE client directly.
• If the ESP32-C3 Bluetooth LE client does not enable Bluetooth LE SPP first, or uses other device as
Bluetooth LE client, then the Bluetooth LE client needs to listen to the notification or indication first. For
example, if the ESP32-C3 Bluetooth LE client does not enable Bluetooth LE SPP first, then it should
use command AT+BLEGATTCWR=0,3,7,1,1 to enable listening function first, so that the ESP32-C3
Bluetooth LE server can transmit successfully.
• For the same service, the <srv_index> on the ESP32-C3 Bluetooth LE client side equals the <srv_index>
on the ESP32-C3 Bluetooth LE server side + 2.
4.2.6 Establish SPP connection between ESP32-C3 and mobile phone and transmit data
in UART-Bluetooth LE passthrough mode
The example shows how to establish SPP connection between an ESP32-C3 development board (only serving as the
Bluetooth LE server role) and a mobile phone (only serve as the Bluetooth LE client role) and how to transmit data
between them in UART-Bluetooth LE passthrough mode.
Important: In the following steps, the operations starting with ESP32-C3 Bluetooth LE server only
need to be executed at ESP32-C3 Bluetooth LE server, and those Bluetooth LE client only need to be executed at
the Bluetooth debugging assistant of the mobile phone.
1. First, you need to download the Bluetooth LE debugging assistant on the mobile phone, such as nRF Connect
app (Android) and LightBlue (iOS).
2. Bluetooth LE initialization.
ESP32-C3 Bluetooth LE server:
Command:
AT+BLEINIT=2
Response:
OK
AT+BLEGATTSSRVCRE
Response:
OK
AT+BLEGATTSSRVSTART
Response:
OK
AT+BLEADDR?
Response:
+BLEADDR:"24:0a:c4:d6:e4:46"
OK
Note:
• The address you obtain may be different from that in the above response. Keep yours handy as you will
need it in one of the following steps.
6. Set Bluetooth LE advertising data.
Command:
AT+BLEADVDATA="0201060A09457370726573736966030302A0"
Response:
OK
AT+BLEADVSTART
Response:
OK
AT+BLEGATTSSRV?
Response:
+BLEGATTSSRV:1,1,0xA002,1
+BLEGATTSSRV:2,1,0xA003,1
OK
AT+BLEGATTSCHAR?
Response:
+BLEGATTSCHAR:"char",1,1,0xC300,0x02
+BLEGATTSCHAR:"desc",1,1,1,0x2901
+BLEGATTSCHAR:"char",1,2,0xC301,0x02
+BLEGATTSCHAR:"desc",1,2,1,0x2901
+BLEGATTSCHAR:"char",1,3,0xC302,0x08
(continues on next page)
OK
AT+BLESPPCFG=1,1,7,1,5
Response:
OK
AT+BLESPP
Response:
OK
>
This response indicates that AT has entered Bluetooth LE SPP mode and can send and receive data.
15. Bluetooth LE client sends data.
In the nRF debugging assistant client, select the 0xC304 service characteristic value and send the data test
to the ESP32-C3 Bluetooth LE server. Then, the ESP32-C3 Bluetooth LE server can receive the test.
16. ESP32-C3 Bluetooth LE server sends data.
The ESP32-C3 Bluetooth LE server sends test, and then the nRF debugging assistant client can receive
test.
This document provides detailed command examples to illustrate how to utilize MQTT AT Commands on ESP32-C3.
• MQTT over TCP (with a local MQTT broker)(suitable for a small amount of data)
• MQTT over TCP (with a local MQTT broker)(suitable for large amounts of data)
• MQTT over TLS (with a local MQTT broker)
• MQTT over WSS
Important:
• The examples described in this document are based on the situation that Wi-Fi has been connected.
4.3.1 MQTT over TCP (with a local MQTT broker)(suitable for a small amount of data)
Below is an example of using two ESP32-C3 development boards, one as a MQTT publisher (only as MQTT publisher
role), the other one as a MQTT subscriber (only as MQTT subscriber role).
The example shows how to establish MQTT connections over TCP. You need to first create a local MQTT broker.
For example, the MQTT broker s IP address is 192.168.3.102, and the port is 8883.
Important: In the step, the operations starting with ESP32-C3 MQTT publisher only need to be executed at
ESP32-C3 MQTT publisher, and the operations starting with ESP32-C3 MQTT subscriber only need to be
executed at ESP32-C3 MQTT subscriber. If the operation is not specified on which side it is executed, it needs to be
executed on both the publisher side and the subscriber side.
AT+MQTTUSERCFG=0,1,"publisher","espressif","123456789",0,0,""
Response:
OK
AT+MQTTUSERCFG=0,1,"subscriber","espressif","123456789",0,0,""
Response:
OK
AT+MQTTCONN=0,"192.168.3.102",8883,1
Response:
+MQTTCONNECTED:0,1,"192.168.3.102","8883","",1
OK
Note:
• The MQTT broker domain or MQTT broker IP address you enter may be different from those in the
above command.
3. Subscribe to MQTT topics.
ESP32-C3 MQTT subscriber:
Command:
AT+MQTTSUB=0,"topic",1
Response:
OK
AT+MQTTPUB=0,"topic","test",1,0
Response:
OK
Note:
• If the ESP32-C3 MQTT publisher successfully publishes the message, following message will be
prompted on the ESP32-C3 MQTT subscriber.
+MQTTSUBRECV:0,"topic",4,test
AT+MQTTCLEAN=0
Response:
OK
4.3.2 MQTT over TCP (with a local MQTT broker)(suitable for large amounts of data)
Below is an example of using two ESP32-C3 development boards, one as a MQTT publisher (only as MQTT publisher
role), the other one as a MQTT subscriber (only as MQTT subscriber role).
The example shows how to establish MQTT connections over TCP. You need to first create a local MQTT broker.
For example, the MQTT broker s IP address is 192.168.3.102, and the port is 8883.
If the amount of data you publish is relatively large, and the length of a single AT command has exceeded the threshold
of 256, it is recommended that you use the AT+MQTTPUBRAW command.
Important: In the step, the operations starting with ESP32-C3 MQTT publisher only need to be executed at
ESP32-C3 MQTT publisher, and the operations starting with ESP32-C3 MQTT subscriber only need to be
executed at ESP32-C3 MQTT subscriber. If the operation is not specified on which side it is executed, it needs to be
executed on both the publisher side and the subscriber side.
AT+MQTTUSERCFG=0,1,"publisher","espressif","123456789",0,0,""
Response:
OK
AT+MQTTUSERCFG=0,1,"subscriber","espressif","123456789",0,0,""
Response:
OK
Response:
+MQTTCONNECTED:0,1,"192.168.3.102","8883","",1
OK
Note:
• The MQTT broker domain or MQTT broker IP address you enter may be different from those in the
above command.
3. Subscribe to MQTT topics.
ESP32-C3 MQTT subscriber:
Command:
AT+MQTTSUB=0,"topic",1
Response:
OK
,→": "Root=1-6150581e-1ad4bd5254b4bf5218070413"}}
Response:
OK
>
This response indicates that AT is ready for receiving serial data. You should enter the data, and when the data
length reaches the <length> value, the transmission of data starts.
+MQTTPUB:OK
Note:
• After AT outputs the > character, the special characters in the data does not need to be escaped through
the escape character, and it does not need to end with a new line(CR-LF).
• If the ESP32-C3 MQTT publisher successfully publishes the message, following message will be
prompted on the ESP32-C3 MQTT subscriber.
+MQTTSUBRECV:0,"topic",427,{"headers": {"Accept": "application/json",
,→"Accept-Encoding": "gzip, deflate","Accept-Language": "en-US,en;q=0.9,zh-
,→"http://httpbin.org","Referer": "http://httpbin.org/","User-Agent":
,→1ad4bd5254b4bf5218070413"}}
Command:
AT+MQTTCLEAN=0
Response:
OK
Below is an example of using two ESP32-C3 development boards, one as a MQTT publisher (only as MQTT publisher
role), the other one as a MQTT subscriber (only as MQTT subscriber role).
The example shows how to establish MQTT connections over TLS. You need to first create a local MQTT broker.
For example, the MQTT broker s IP address is 192.168.3.102, and port is 8883.
Important: In the step, the operations starting with ESP32-C3 MQTT publisher only need to be executed at
ESP32-C3 MQTT publisher, and the operations starting with ESP32-C3 MQTT subscriber only need to be
executed at ESP32-C3 MQTT subscriber. If the operation is not specified on which side it is executed, it needs to be
executed on both the publisher side and the subscriber side.
AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
Response:
OK
AT+CIPSNTPTIME?
Response:
Note:
• The time you obtained may be different from that in the above response.
• Please make sure that the SNTP time must be a real and valid time and cannot be the time in 1970 or
before.
• The purpose of setting the time is to verify the validity period of the certificates during TLS authentication.
3. Set MQTT user configuration.
ESP32-C3 MQTT publisher:
Command:
AT+MQTTUSERCFG=0,4,"publisher","espressif","123456789",0,0,""
Response:
OK
AT+MQTTUSERCFG=0,4,"subscriber","espressif","123456789",0,0,""
Response:
OK
AT+MQTTCONNCFG=0,0,0,"lwtt","lwtm",0,0
Response:
OK
AT+MQTTCONN=0,"192.168.3.102",8883,1
Response:
+MQTTCONNECTED:0,4,"192.168.3.102","8883","",1
OK
Note:
• The MQTT broker domain or MQTT broker IP address you enter may be different from those in the
above command.
6. Subscribe to MQTT topics.
ESP32-C3 MQTT subscriber:
Command:
AT+MQTTSUB=0,"topic",1
Response:
OK
AT+MQTTPUB=0,"topic","test",1,0
Response:
OK
Note:
• If the ESP32-C3 MQTT publisher successfully publishes the message, following message will be
prompted on the ESP32-C3 MQTT subscriber.
+MQTTSUBRECV:0,"topic",4,test
AT+MQTTCLEAN=0
Response:
OK
Below is an example of using two ESP32-C3 development boards, one as a MQTT publisher (only as MQTT publisher
role), the other one as a MQTT subscriber (only as MQTT subscriber role).
The example shows how to establish MQTT connections over WSS and how to communicate with a MQTT broker.
For example, the MQTT broker s domain name is test.mosquitto.org, and the port is 8081.
Important: In the step, the operations starting with ESP32-C3 MQTT publisher only need to be executed at
ESP32-C3 MQTT publisher, and the operations starting with ESP32-C3 MQTT subscriber only need to be
executed at ESP32-C3 MQTT subscriber. If the operation is not specified on which side it is executed, it needs to be
executed on both the publisher side and the subscriber side.
AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
Response:
OK
AT+CIPSNTPTIME?
Response:
Note:
• The time you obtained may be different from that in the above response.
• Please make sure that the SNTP time must be a real and valid time and cannot be the time in 1970 or
before.
• The purpose of setting the time is to verify the validity period of the certificates during TLS authentication.
3. Set MQTT user configuration.
ESP32-C3 MQTT publisher:
Command:
AT+MQTTUSERCFG=0,7,"publisher","espressif","1234567890",0,0,""
Response:
OK
AT+MQTTUSERCFG=0,7,"subscriber","espressif","1234567890",0,0,""
Response:
OK
AT+MQTTCONN=0,"test.mosquitto.org",8081,1
Response:
+MQTTCONNECTED:0,7,"test.mosquitto.org","8081","/",1
OK
Note:
• The MQTT broker domain or MQTT broker IP address you enter may be different from those in the
above command.
AT+MQTTSUB=0,"topic",1
Response:
OK
AT+MQTTPUB=0,"topic","test",1,0
Response:
OK
Note:
• If the ESP32-C3 MQTT publisher successfully publishes the message, following message will be
prompted on the ESP32-C3 MQTT subscriber.
+MQTTSUBRECV:0,"topic",4,test
AT+MQTTCLEAN=0
Response:
OK
This document mainly describes how to connect your ESP32-C3 to AWS IoT with MQTT AT commands.
Important: For details on how to use MQTT AT commands, please refer to MQTT AT Commands. You need to
become familiar with the AWS IoT by reading the AWS IoT Development Guide.
Please follow the steps below to connect your ESP32-C3 to AWS IoT with ESP-AT.
1. Sign in to your AWS IoT Console account and switch to the IoT Core services.
2. Create an AWS IoT policy, thing, and certificates following the instructions in Create AWS IoT Resources.
Make sure you have got the following certificate and key files:
• device.pem.crt (Device certificate)
• private.pem.key (Private key)
• Amazon-root-CA-1.pem (Root CA certificate)
3. Get the endpoint and bind the thing to the policy through the certificate according to the documentation Set up
the policy.
The endpoint value has the format of xxx-ats.iot.us-east-2.amazonaws.com.
Note: It is strongly recommended to familiarize yourself with the AWS IoT Developer Guide. Below are some key
points from this Guide that are worth noting.
• All devices must have a device certificate, private key, and root CA certificate installed in order to communicate
with AWS IoT.
• Information on how to activate certificates.
• Select Ohio as your region.
4.4.2 Connect to AWS IoT based on mutual authentication with MQTT AT commands
Replace certificates
Compile the ESP-AT project to build the AT firmware, and flash the firmware to your ESP32-C3. For more infor-
mation, please refer to Compile ESP-AT Project.
Note: If you don t want to compile the ESP-AT project to replace certificates, you can directly use the AT command
to replace certificates in the firmware. For more information, please refer to How to Generate PKI Files.
AT+CWMODE=1
Response:
OK
AT+CWJAP=<ssid>,<password>
Response:
OK
AT+CIPSNTPCFG=1,8,"pool.ntp.org"
Response:
OK
Response:
+CIPSNTPTIME:<asctime style time>
OK
Note:
• The <asctime style time> obtained at this time must be the real-time time of the set time zone, otherwise
the connection will fail due to the validity period of the certificate.
5. Set MQTT user properties.
Command:
AT+MQTTUSERCFG=0,5,"esp32","espressif","1234567890",0,0,""
Response:
OK
Note:
• If the second parameter of AT+MQTTUSERCFG is 5, it is authenticated by both sides and cannot be
changed.
6. Connect to AWS IoT.
Command:
AT+MQTTCONN=0,"<endpoint>",8883,1
Response:
+MQTTCONNECTED:0,5,<endpoint>,"8883","",1
OK
Note:
• Please fill in your endpoint value in the <endpoint> parameter.
• The port 8883 cannot be changed.
7. Subscribe to messages.
Command:
AT+MQTTSUB=0,"topic/esp32at",1
Response:
OK
8. Publish a message.
Command:
AT+MQTTPUB=0,"topic/esp32at","hello aws!",1,0
Response:
+MQTTSUBRECV:0,"topic/esp32at",10,hello aws!
OK
Example log
This document mainly introduces the use of AT web server, mainly involving the following applications:
Note: The default firmware does not support web server AT commands, please refer to Web Server AT Commands
to enable the web server.
Introduction
With the web server, mobile phone or PC is able to control ESP32-C3 s Wi-Fi provisioning service. You can
use a mobile phone or computer to connect to the SoftAP of the ESP32-C3, open the web pages via browser, start
provisioning service, and then the ESP32-C3 can connect to the target router as you set.
The whole process can be divided into the following three steps:
Use STA Device to Connect to ESP32-C3 Device Firstly, ESP32-C3 needs to be configured to softAP + STA
mode, and creates a web server to wait for Wi-Fi provisioning messages. In this case, a mobile phone or a PC can
connect to the ESP32-C3 softAP as a station. The corresponding AT commands are as follows:
1. Clear the previous Wi-Fi provisioning information.
• Command
AT+RESTORE
AT+CWMODE=3
3. Set the configuration of an ESP32-C3 SoftAP. (For example, set the default connection ssid to pos_softap
, Wi-Fi without password.)
• Command
AT+CWSAP="pos_softap","",11,0,3
AT+CIPMUX=1
5. Create a web server, port: 80, connection timeout: 25 s (default maximum is 60 s).
• Command
AT+WEBSERVER=1,80,25
After starting the web sever according to the above commands, you can turn on the Wi-Fi connection function on
your STA device, and connect it to the softAP of the ESP32-C3:
Use the Browser to Send Wi-Fi Connection Information After your STA device connected to the ESP32-C3
softAP, it can send Wi-Fi connection information to ESP32-C3 in an HTTP request. Please note that if your target
AP is the hotspot of the device which opens the web pages, you may not receive the Wi-Fi connection result. You
can enter the default IP address of the web server in the browser (the default IP is 192.168.4.1, or you can query the
current SoftAP IP address by command AT+CIPAP?), open the Wi-Fi provisioning interface, and enter the ssid and
password of the router to be connected, click Connect to let ESP32-C3 start connecting to the router:
Or you can click the drop-down box of SSID to list all APs nearby, select the target AP and enter the password, and
then click Connect to let the ESP32-C3 start connecting to the router:
Get the Result of Wi-Fi Connection After the Wi-Fi connection is established successfully, the web page will be
displayed as follows:
Note 1: After the Wi-Fi connection is established successfully, the webpage will be closed automatically. If you want
to continue to access the webpage, please re-enter the IP address of the ESP32-C3 and reopen the webpage.
At the same time, the following messages will be returned from the ESP-AT command port:
+WEBSERVERRSP:1 // meaning that ESP32-C3 has received Wi-Fi connection␣
,→information
If the ESP32-C3 fails to connect to the router, the web page will display:
At the same time, the following messages will be returned from the ESP-AT command port:
+WEBSERVERRSP:1 // meaning that ESP32-C3 has received Wi-Fi connection␣
,→information, but failed to connect to the rounter.
Troubleshooting
Note 1: The network configuration page received a prompt Connection failed . Please check whether the Wi-Fi
AP of the ESP32-C3 module is correctly turned on, and the relevant configuration of the AP, and confirm that the
correct AT command has been entered to successfully enable the web server.
Introduction
After the browser opens the web page of the web server, you can choose to enter the OTA upgrade page to upgrade
the firmware of the ESP32-C3 through the web page.
Open the OTA Configuration Page As shown in the figure, click on the OTA option in the lower right corner
of the web page, and after opening the OTA configuration page, you can view the current firmware version and AT
Core version:
Note 1: The configuration interface can only be opened when the STA device is connected to the AP of the ESP32-
C3, or the STA device accessing the OTA configuration page is connected to the ESP32-C3 in the same subnet.
Note 2: The current app version displayed on the webpage is the version number of the application. You can change
the version number through ./build.py menuconfig > Component config > AT > AT firmware
version (see Compile ESP-AT Project). In this case, you can manage your application firmware version.
Select and Send the New Firmware As shown in the figure, click the Browse button on the page and select
the new firmware to be sent:
Note 1: Before sending the new firmware, the system will check the selected firmware. The suffix of the firmware
name must be .bin, and its size should not exceed 2M.
Get the Result of OTA As shown in the figure, if the ESP32-C3 OTA successfully, it will prompt OTA Suc-
ceeded :
At the same time, the following messages will be returned from the ESP-AT command port:
If the received firmware data verification fails, the following message will be received on the serial port:
Introduction
The WeChat applet can automatically connect to the WiFi AP of the ESP32-C3, and then send the ssid and password
required by the ESP32-C3 to connect to the network.
The whole process can be divided into the following four steps:
Configure ESP32-C3 Device Parameters Firstly, ESP32-C3 needs to be configured to softAP + STA mode, and
creates a web server to wait for Wi-Fi provisioning messages. In this case, a mobile phone or a PC can connect to
the ESP32-C3 softAP as a station. The corresponding AT commands are as follows:
1. Clear the previous Wi-Fi provisioning information.
• Command
AT+RESTORE
AT+CWMODE=3
3. Set the configuration of an ESP32-C3 SoftAP. (For example, set the default connection ssid to pos_softap
, and password to espressif .)
• Command
AT+CWSAP="pos_softap","espressif",11,3,3
Note: By default, the WeChat applet initiates a connection to the SoftAP whose ssid is pos_softap and
password is espressif. Please make sure to set the parameters of the ESP32-C3 according to the above
configuration.
AT+CIPMUX=1
2. Create a web server, port: 80, connection timeout: 40 s (default maximum is 60 s).
• Command
AT+WEBSERVER=1,80,40
Load WeChat Applet Open the mobile phone WeChat, scan the following QR code:
Open the WeChat applet and enter the Wi-Fi provisioning interface:
Target AP Selection After loading the WeChat applet, there are two situations according to different target AP:
Situation 1. If your target AP is the hotspot of the mobile phone which running the WeChat applet, please select the
Local phone hotspot option box on the WeChat applet page.
Situation 2. If your target AP is just another AP, not as the special situation one as above, then please do not select
the Local phone hotspot option box.
The target AP to be accessed is not the hotspot provided by the mobile phone which loading the WeChat ap-
plet. Here, take connecting to a router as an example, the process of Wi-Fi Connection configuration is introduced:
1.Turn on the mobile Wi-Fi and connect to the router:
2.Open the WeChat applet, you can see that the applet page has automatically displayed the ssid of the current router
as FAST_FWR310_02 .
Fig. 12: The applet obtains the information of the router to be connected
Note: If the ssid of the connected router is not displayed on the current page, please click Re-enter applet in the
following figure to refresh the current page:
3.After entering the password of the router, click Connect .
Fig. 14: The applet starts the ESP32-C3 to connect to the router
4.After the Wi-Fi connection is established successfully, the web page will be displayed as follows:
At the same time, the following messages will be returned from the ESP-AT command port:
5.If the ESP32-C3 fails to connect to the router, the page will display:
At the same time, the following messages will be returned from the ESP-AT command port:
The target AP to be accessed is the hotspot provided by the mobile phone which loading the WeChat applet.
If the target AP to be accessed is the hotspot provided by the mobile phone which loading the WeChat applet, it is
not necessary to enter the ssid, but only needs to enter the password of the AP, and turn on the mobile AP in time
according to the prompts.
1.Select the Local phone hotspot option box on the WeChat applet page, enter the password of the local hotspot,
and click Connect .
2.After receiving the prompt Connecting to the mobile phone hotspot , please check that the local mobile phone
hotspot is turned on. At this time, the ESP32-C3 will automatically scan the surrounding hotspots and initiate a
connection.
3.The display of the WiFi connection results on the applet page and the data output from the serial port are the same
as the above-mentioned The target AP to be accessed is not the hotspot provided by the mobile phone which loading
the WeChat applet. , please refer to the above.
Troubleshooting
Note 1: The Wi-Fi provisioning page received a prompt Data transmission failed . Please check whether the
Wi-Fi AP of the ESP32-C3 is correctly turned on, and the relevant configuration of the AP, and confirm that the
correct AT command has been entered to successfully enable the web server.
Note 2: The Wi-Fi provisioning page receives a prompt Failed to connect to the AP . Please check whether
the Wi-Fi connection function of the mobile phone is turned on, check whether the Wi-Fi AP of the ESP32-C3 is
correctly turned on, and whether the ssid and password of the AP are configured according to the above steps.
Note 3: The Wi-Fi provisioning page receives a prompt The Wi-Fi provisioning saved by the system expired
. Please manually connect the ESP32-C3 AP with a mobile phone, and confirm that the ssid and password of the
ESP32-C3 module have been configured according to the above steps.
The WeChat applet support online firmware upgrade , please refer to the above-described Configure ESP32-C3 Device
Parameters specific steps performed ESP32-C3 configuration (if the configuration has been completed, do not repeat
configuration). Once configured, the device performs OTA firmware upgrade processes is similar as OTA Firmware
Upgrade Using a Browser .
Introduction
Captive Portal is commonly used to present a specified page to newly connected devices of a Wi-Fi or wired network.
For more information about Captive Portal, please refer to Captive Portal Wiki .
Note: The default firmware does not support web server Captive Portal, you may enable it by ./build.py
menuconfig > Component config > AT > AT WEB Server command support > AT WEB captive
portal support and build the project (see Compile ESP-AT Project). In addition, enabling this feature may cause
page skipping when using wechat applet for Wi-Fi provisioning or OTA firmware upgrade. It is recommended that
this feature be enabled only when accessing at web using browser.
After Enable Captive Portal support, please refer to Use STA Device to Connect to ESP32-C3 Device to complete the
configuration of the ESP32-C3, and then connect to the AP of the ESP32-C3:
As shown in the figure above, after the Station device is connected to the AP of the ESP32-C3 with the Captive Portal
function enabled, it will prompt requires login/authentication , and then the browser will automatically open and
jump to the main interface of AT Web. If it cannot be redirected automatically, please follow the instructions of the
Station device, click Authentication or click the name of the pos_softap hotspot in the figure above to manually
trigger the Captive Portal to automatically open the browser and enter the main interface of AT Web.
Troubleshooting
Note 1: Both Station device and AP device support the Captive Portal function to ensure the normal use of this func-
tion. Therefore, if the device is connected to the AP of the ESP32-C3, but it does not prompt Login/Authentication
, it may be that the Station device does not support this function. In this case, please refer to the specific steps of Use
the Browser to Send Wi-Fi Connection Information above to open the main interface of AT Web.
This document provides detailed command examples to illustrate how to utilize HTTP AT Commands on ESP32-C3.
Response:
OK
Response:
OK
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
4. Send an HTTP HEAD request. Set opt to 1 (HEAD method), url to http://httpbin.org/get and
transport_type to 1 (HTTP_TRANSPORT_OVER_TCP).
Command:
AT+HTTPCLIENT=1,0,"http://httpbin.org/get",,,1
Response:
OK
Note:
• The HTTP header information you obtain may be different from those in the above response.
This example describes how to download an image file in JPG format. The image link is https://www.espressif.com/
sites/all/themes/espressif/images/about-us/solution-platform.jpg.
1. Restore factory default settings of the module.
Command:
AT+RESTORE
Response:
OK
AT+CWMODE=1
Response:
OK
AT+CWJAP="espressif","1234567890"
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
4. Send an HTTP GET request. Set opt to 2 (GET method), url to https://www.espressif.
com/sites/all/themes/espressif/images/about-us/solution-platform.jpg and
transport_type to 2 (HTTP_TRANSPORT_OVER_SSL).
Command:
AT+HTTPCLIENT=2,0,"https://www.espressif.com/sites/all/themes/espressif/images/
,→about-us/solution-platform.jpg",,,2
Response:
+HTTPCLIENT:512,<0xff><0xd8><0xff><0xe2><0x0c>XICC_PROFILE<break>
<0x01><0x01><break>
<break>
<0x0c>HLino<0x02><0x10><break>
<break>
mntrRGB XYZ <0x07><0xce><break>
<0x02><break>
...
+HTTPCLIENT:512,<0xeb><0xe2>v<0xcb><0x98>-<0xf8><0x8a><0xae><0xf3><0xc8><0xb6>
,→<0xa8><0x86><0x02>j<0x06><0xe2>
"<0xaa>*p<0x7f>2",h<0x12>N<0xa5><0x1e><0xd2>bp<0xea><0x1e><0xf5><0xa3>x<0xa6>J
,→<0x14>Ti<0xc3>m<0x1a>m<0x94>T<0xe1>I<0xb6><0x90><0xdc>_<0x11>QU;<0x94><0x97>
,→<0xcb><0xdd><0xc7><0xc6><0x85><0xd7>U<0x02><0xc9>W<0xa4><0xaa><0xa1><0xa1>
,→<0x08>hB<0x1a><0x10><0x86><0x84>!<0xa1><0x08>hB<0x1a><0x10><0x9b><0xb9>K
,→<0xf5>5<0x95>5-=<0x8a><0xcb><0xce><0xe0><0x91><0xf0>m<0xa9><0x04>C<0xde>k
,→<0xe7><0xc2>v<H|<0xaf><0xb8>L<0x91>=<0xda>_<0x94><0xde><0xd0><0xa9><0xc0>
,→<0xdd>8<0x9a>B<0xaa><0x1a><0x10><0x86><0x84>$<0xf4><0xd6><0xf2><0xa3><0x92>
,→<0xe7><0xa8>I<0xa3>b<0x1f>)<0xe1>z<0xc4>y<0xae><0xca><0xed><0xec><0x1e>|^
,→<0xd7>E<0xa2>_<0x13><0x9e>;{|<0xb5>Q<0x97><0xa5>P<0xdf><0xa1>#3vn<0x1b><0xc3>
,→-<0x92><0xe2>dIn<0x9c><0xb8>
<0xc7><0xa9><0xc6>(<0xe0><0xd3>i-<0x9e>@<0xbb><0xcc><0x88><0xd5>K<0xe3><0xf0>O
,→<0x9f>Km<0xb3>h<0xa8>omR<0xfe><0x8b><0xf9><0xa4><0xa6><0xff><break>
aU<0xdf><0xf3><0xa3>:A<0xe2>UG<0x04>k<0xaa>*<0xa1><0xa1><0x0b><0xca><0xec>
,→<0xd8>Q<0xfb><0xbc>yqY<0xec><0xfb>?<0x16>CM<0xf6>|}<0xae><0xf3><0x1e><0xdf>%
,→<0xf8><0xe8><0xb1>B<0x8f>[<0xb3>><0x04><0xec><0xeb>f<0x06><0x1c><0xe8><0x92>
,→<0xc9><0x8c><0xb0>I<0xd1><0x8b>%<0x99><0x04><0xd0><0xbb>s<0x8b>xj<0xe2>4f
,→<0xa0><0x8e>+E<0xda><0xab><0xc7>=<0xab><0xc7><0xb9>xz1f<0xba><0xfd>_e6<0xff>
,→<break>
(w<0xa7>b<0xe3>m<0xf0>|<0x82><0xc9><0xfb><0x8b><0xac>r<0x95><0x94><0x96><0xd9>i
,→<0xe9>RVA<0x91><0x83><0x8b>M'<0x86><0x8f><0xa3>A<0xd8><0xd8>"r"<0x8a><0xa8>
,→<0x9e>zl=<0xcd><0x16><0x07>D<0xa2><0xd0>u(<0xc2><0x8b><0x0b><0xc4><0xf1>
,→<0x87><0x9c><0x93><0x8f><0xe3><0xd5>U<0x12>]<0x8e><0x91>]<0x91><0x06>#l<0xbe>
,→<0xf4>t0?<0xd7><0x85><GEM<0xb1>%<0xee>UUT<0xe7><0xdf><0xa0><0xb9><0xce><0xe2>
,→U@<0x03><0x82>S<0xe9>*<0xa8>hB<0x1a><0x10><0xa1><0xaf>V<0x19>U<0x9d><0xb3>x
,→<0xa6><0xc7><0xe2><0x86><0x8e>d[<0x89>e<0x05>l<0x80>H<0x91>#<0xd2><0x8c>
,→<0xe1>j<0x1b>rH<0x04><0x89><0x98><0xd3>lZW]q><0xc2><';<0x93><0xb4><0xf5>&
,→<0x9d><0xa0>^Wp<0xa9>6`<0xe2>T<0xa2><0xc2><0xb1>*<0xbc><0x13><0x13><0xa0>
,→<0xc4>)<0x83><0xb6><0xbe><0x86><0xb9><0x88>-<0x1a>
OK
4.6.3 The POST method of HTTP client (suitable for POST small amount of data)
In this example, the HTTP server is http://httpbin.org and the data type is application/json.
1. Restore factory default settings of the module.
Command:
AT+RESTORE
Response:
OK
AT+CWMODE=1
Response:
OK
AT+CWJAP="espressif","1234567890"
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
4. Send an HTTP POST request. Set opt to 3 (POST method), url to http://httpbin.
org/post, content-type to 1 (application/json) and transport_type to 1
(HTTP_TRANSPORT_OVER_TCP).
Command:
AT+HTTPCLIENT=3,1,"http://httpbin.org/post",,,1,"{\"form\":{\"purpose\":\"test\
,→"}}"
Response:
+HTTPCLIENT:282,{
"args": {},
"data": "{\"form\":{\"purpose\":\"test\"}}",
"files": {},
"form": {},
"headers": {
"Content-Length": "27",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "ESP32 HTTP Client/1.0",
"X-Amzn-Trace-Id": "Root=
+HTTPCLIENT:173,1-61503a3f-4b16b71918855b97614c5dfb"
},
"json": {
"form": {
"purpose": "test"
}
},
"origin": "20.187.154.207",
"url": "http://httpbin.org/post"
}
OK
Note:
• The results you obtain may be different from those in the above response.
If the amount of data you post is relatively large, and the length of a single AT command has exceeded the threshold
of 256, it is recommended that you use the AT+HTTPCPOST command.
In this example, the HTTP server is http://httpbin.org and the data type is application/json.
1. Restore factory default settings of the module.
Command:
AT+RESTORE
Response:
OK
Response:
OK
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
4. Post HTTP data of specified length. The command specifies that the number of HTTP header fields is 2,
which are connection field and content-type field respectively. connection is keep-alive
and content-type is application/json.
Assume the JSON data you want to post is as follows, length is 472 bytes.
{"headers": {"Accept": "application/json","Accept-Encoding": "gzip, deflate",
,→"Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7","Content-Length": "0
,→": "Root=1-6150581e-1ad4bd5254b4bf5218070413"}}
Command:
AT+HTTPCPOST="http://httpbin.org/post",427,2,"connection: keep-alive","content-
,→type: application/json"
Response:
OK
>
This response indicates that AT is ready for receiving serial data. You should enter the data, and when the data
length reaches the <length> value, the transmission of data starts.
+HTTPCPOST:281,{
"args": {},
"data": "{\"headers\": {\"Accept\": \"application/json\",\"Accept-Encoding\
,→": \"gzip, deflate\",\"Accept-Language\": \"en-US,en;q=0.9,zh-CN;q=0.8,zh;
,→"http://httpbin.org\",\"Referer\": \"htt
,→537.36\",\"X-Amzn-Trace-Id\": \"Root=1-6150581e-1ad4bd5254b4bf5218070413\"}}
,→",
"files": {},
"form": {},
"headers": {
"Content-Length": "427",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "ESP32 HTTP Client/1.0",
"X-Amzn-Trace-Id": "Root=1-61505e76-278b5c267aaf55842bd58b32"
},
"json": {
"headers": {
+HTTPCPOST:512,"Accept": "application/json",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
"Content-Length": "0",
"Host": "httpbin.org",
"Origin": "http://httpbin.org",
"Referer": "http://httpbin.org/",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,
,→ like Gecko) Chrome/91.0.4472.114 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-6150581e-1ad4bd5254b4bf5218070413"
}
},
"origin": "20.187.154
+HTTPCPOST:45,.207",
"url": "http://httpbin.org/post"
}
SEND OK
Note:
• After AT outputs the > character, the special characters in the HTTP body does not need to be escaped
through the escape character, and it does not need to end with a new line(CR-LF).
In this example, the HTTP server is http://httpbin.org. PUT request supports Query String Parameters mode.
1. Restore factory default settings of the module.
Command:
AT+RESTORE
Response:
OK
AT+CWMODE=1
Response:
OK
Command:
AT+CWJAP="espressif","1234567890"
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
4. Send an HTTP PUT request. Set opt to 4 (PUT method), url to http://httpbin.org/put, and
transport_type to 1 (HTTP_TRANSPORT_OVER_TCP).
Command:
AT+HTTPCLIENT=4,0,"http://httpbin.org/put?user=foo",,,1
Response:
+HTTPCLIENT:282,{
"args": {
"user": "foo"
},
"data": "",
"files": {},
"form": {},
"headers": {
"Content-Length": "0",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "ESP32 HTTP Client/1.0",
"X-Amzn-Trace-Id": "R
+HTTPCLIENT:140,oot=1-61503d41-1dd8cbe0056190f721ab1912"
},
"json": null,
"origin": "20.187.154.207",
"url": "http://httpbin.org/put?user=foo"
}
OK
Note:
• The results you obtain may be different from those in the above response.
In this example, the HTTP server is http://httpbin.org. The DELETE method is used to delete resources on a server.
The exact use of DELETE requests depends on the server implementation.
1. Restore factory default settings of the module.
Command:
AT+RESTORE
Response:
OK
AT+CWMODE=1
Response:
OK
AT+CWJAP="espressif","1234567890"
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
4. Send an HTTP DELETE request. Set opt to 5 (DELETE method), url to http://httpbin.org/
delete, and transport_type to 1 (HTTP_TRANSPORT_OVER_TCP).
Command:
AT+HTTPCLIENT=5,0,"https://httpbin.org/delete",,,1
Response:
+HTTPCLIENT:282,{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Content-Length": "0",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "ESP32 HTTP Client/1.0",
"X-Amzn-Trace-Id": "Root=1-61504289-468a41
+HTTPCLIENT:114,737b0d251672acec9d"
},
"json": null,
"origin": "20.187.154.207",
"url": "https://httpbin.org/delete"
}
OK
Note:
• The results you obtain may be different from those in the above response.
This document provides an introduction and detailed command examples to illustrate how to utilize AT commands
to set sleep modes on ESP32-C3 series of products.
• Introduction
• Set Modem-sleep mode in Wi-Fi mode
• Set Light-sleep mode in Wi-Fi mode
• Set Modem-sleep mode in Bluetooth LE advertising mode
• Set Modem-sleep mode in Bluetooth LE connection mode
• Set Light-sleep mode in Bluetooth LE advertising mode
• Set Light-sleep mode in Bluetooth LE connection mode
• Set Deep-sleep mode
4.7.1 Introduction
With the use of advanced power-management technologies, ESP32-C3 series can switch between different power
modes. Currently, ESP-AT supports the following four power consumption modes (for more sleep modes, please
refer to the datasheet):
1. Active Mode: CPU and chip radio are powered on. The chip can receive, transmit, or listen.
2. Modem-sleep Mode: The CPU is operational and the clock speed can be reduced. Wi-Fi baseband, Blue-
tooth LE baseband, and radio are disabled, but Wi-Fi and Bluetooth LE connection can remain active.
3. Light-sleep Mode: The CPU is paused. Any wake-up events (MAC, host, RTC timer, or external inter-
rupts) will wake up the chip. Wi-Fi and Bluetooth LE connection can remain active.
4. Deep-sleep Mode: CPU and most peripherals are powered down. Only the RTC memory is powered on.
By default, ESP32-C3 will enter Active mode after system reset. When the CPU does not need to work all the
time, such as waiting for external activities to wake up, the system can enter low-power modes.
For current consumption of ESP32-C3, please refer to ESP32-C3 Series Datasheet.
Note:
• Setting ESP32-C3 to sleep modes in Wi-Fi mode and Bluetooth LE mode will be described separately.
• In single Wi-Fi mode, only station mode supports Modem-sleep mode and Light-sleep mode.
• For Light-sleep mode in Bluetooth LE mode, please ensure that there is an external 32 KHz crystal oscillator.
If there is no external 32 KHz crystal oscillator, ESP-AT will work as the Modem-sleep mode.
Measurement Method
In order to avoid some unnecessary interference during the power consumption test process, it is recommended to
use the Espressif modules that integrate the chip for the test.
Refer to the following figure for hardware connection. (Note that the development board below only has the ESP32-
C3 module on board, and all other peripheral components have been removed.)
AT+CWMODE=1
Response:
OK
2. Connect to an router.
Command:
AT+CWJAP="espressif","1234567890"
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
3. Set the sleep mode to Modem-sleep mode.
Command:
AT+SLEEP=1
Response:
OK
Note:
• RF will be periodically closed according to AP DTIM (routers generally set DTIM to 1).
AT+CWMODE=1
Response:
OK
AT+CWJAP="espressif","1234567890",,,,3
Response:
WIFI CONNECTED
WIFI GOT IP
OK
Note:
• The SSID and password you entered may be different from those in the above command. Please replace
the SSID and password with those of your router settings.
3. Set the sleep mode to Light-sleep mode.
Command:
AT+SLEEP=2
Response:
OK
Note:
• CPU will automatically sleep and RF will be periodically closed according to listen interval set by AT+CWJAP.
AT+BLEINIT=2
Response:
OK
AT+BLEADVPARAM=1600,1600,0,0,7,0,0,"00:00:00:00:00:00"
Response:
OK
AT+BLEADVSTART
Response:
OK
4. Disable Wi-Fi.
Command:
AT+CWMODE=0
Response:
OK
AT+SLEEP=1
Response:
OK
AT+BLEINIT=2
Response:
OK
AT+BLEADVSTART
Response:
OK
+BLECONN:0,"47:3f:86:dc:e4:7d"
+BLECONNPARAM:0,0,0,6,0,500
+BLECONNPARAM:0,0,0,24,0,500
OK
Note:
• In this example, Bluetooth LE client address is 47:3f:86:dc:e4:7d.
• For prompt information (+BLECONN and +BLECONNPARAM), please refer to AT+BLECONN and
AT+BLECONNPARAM for more details.
4. Update parameters of Bluetooth LE connection. Set Bluetooth LE connection interval to 1 s.
Command:
AT+BLECONNPARAM=0,800,800,0,500
Response:
OK
+BLECONNPARAM:0,800,800,800,0,500
Note:
• For prompt information (+BLECONNPARAM), please refer to AT+BLECONNPARAM for more details.
5. Disable Wi-Fi.
Command:
AT+CWMODE=0
Response:
OK
AT+SLEEP=1
Response:
OK
AT+BLEINIT=2
Response:
OK
AT+BLEADVPARAM=1600,1600,0,0,7,0,0,"00:00:00:00:00:00"
Response:
OK
AT+BLEADVSTART
Response:
OK
4. Disable Wi-Fi.
Command:
AT+CWMODE=0
Response:
OK
AT+SLEEP=2
Response:
OK
AT+BLEINIT=2
Response:
OK
AT+BLEADVSTART
Response:
OK
+BLECONN:0,"47:3f:86:dc:e4:7d"
+BLECONNPARAM:0,0,0,6,0,500
+BLECONNPARAM:0,0,0,24,0,500
OK
Note:
• In this example, Bluetooth LE client address is 47:3f:86:dc:e4:7d.
• For prompt information (+BLECONN and +BLECONNPARAM), please refer to AT+BLECONN and
AT+BLECONNPARAM for more details.
AT+BLECONNPARAM=0,800,800,0,500
Response:
OK
+BLECONNPARAM:0,800,800,800,0,500
Note:
• For prompt information (+BLECONNPARAM), please refer to AT+BLECONNPARAM for more details.
5. Disable Wi-Fi.
Command:
AT+CWMODE=0
Response:
OK
AT+SLEEP=2
Response:
OK
1. Set the sleep mode to Deep-sleep mode. Set the deep-sleep time to 3600000 ms.
Command:
AT+GSLP=3600000
Response:
OK
Note:
• When the time is up, the device automatically wakes up, calls Deep-sleep wake stub, and then proceeds
to load the application.
• For Deep-sleep mode, the only wake-up method is timed wake-up.
This document details how to build your own ESP-AT project and flash the generated firmware into your ESP32-C3.
It comes in handy when the official released fimware cannot meet your needs, for example, to customize the AT port
pins, Bluetooth LE services, and partitions, and so on.
Please follow the detailed steps below to set up your environment and build the project.
• Step 1. Get Started with ESP-IDF
• Step 2. Get ESP-AT
• Step 3. Install Environment
• Step 4. Connect Your Device
• Step 5. Configure
• Step 6. Build the Project
• Step 7. Flash onto the Device
• build.py Advanced Usage
Get started with ESP-IDF before compiling an ESP-AT project, because ESP-AT is developed based on ESP-IDF.
Please follow ESP-IDF v4.3 Get Started guide, configure, build, flash onto the ESP32-C3 device of the
hello_world example.
Note: This step is not a must, but if you are a beginner, you are strongly recommended to complete it in order to
familiarize yourself with ESP-IDF and ensure smooth proceeding with the following steps.
After you complete the ESP-IDF get started in the step above, now you can proceed to compile an ESP-AT project
according to the following steps.
253
Chapter 5. How to Compile and Develop Your Own AT Project
To compile an ESP-AT project, you need the software libraries provided by Espressif in the ESP-AT repository.
To get ESP-AT, navigate to your installation directory and clone the repository with git clone, following instruc-
tions below specific to your operating system.
• Linux or macOS
cd ~/esp
git clone --recursive https://github.com/espressif/esp-at.git
• Windows
For ESP32-C3 series of modules, it is recommended that you run ESP-IDF 4.3 CMD as an administrator first.
cd %userprofile%\esp
git clone --recursive https://github.com/espressif/esp-at.git
If you are located in China or have difficulties to access GitHub, you can also use git clone https://gitee.
com/EspressifSystems/esp-at.git to get ESP-AT, which may be faster.
ESP-AT will be downloaded into ~/esp/esp-at on Linux or macOS, or %userprofile%\esp\esp-at on
Windows.
Note: This guide uses the directory ~/esp on Linux or macOS, or %userprofile%\esp on Windows as
an installation folder for ESP-AT. You can use any directory, but you will need to adjust paths for the commands
respectively. Keep in mind that ESP-AT does not support spaces in paths.
Run the project tool install to install the environment. This tool will automatically install Python packages,
ESP-IDF repository, and the compiler and tools used by ESP-IDF.
• Linux or macOS
./build.py install
• Windows
Select the following configuration options for your ESP32-C3 if it is your first time.
• Select the Platform name for your ESP32-C3. For example, select PLATFORM_ESP32C3 for ESP32-C3
series of products. Platform name is defined in factory_param_data.csv .
• Select the Module name for your ESP32-C3. For example, select MINI-1 for the ESP32-C3-MINI-1
module. Module name is defined in factory_param_data.csv .
• Enable or disable silence mode. If enabled, it will remove some logs and reduce the firmware size.
Generally, it should be disabled.
• The above three option items will not appear if the file build/module_info.json exists. So please
delete it if you want to reconfigure the module information.
Connect your ESP32-C3 device to the PC with a USB cable to download firmware and print log. See Hardware
Connection for more information. Note that you do not need to set up the AT command/response connection if
you do not send AT commands and receive AT responses during the compiling process. You can change default port
pins referring to How to Set AT Port Pins.
./build.py menuconfig
• Windows
If the previous steps have been done correctly, the following menu pops up:
You are using this menu to set up project-specific configuration, e.g. changing AT port pins, enabling Classic Blue-
tooth function, etc. If you made no changes, it will run with the default configuration.
./build.py build
• Windows
If Bluetooth feature is enabled, the firmware size will be much larger. Please make sure it does not exceed the OTA
partition size.
After compiled, the combined factory bin will be created in build/factory. See ESP-AT Firmware Differences
for more information.
Flash the firmware that you just compiled onto your ESP32-C3 by running:
• Linux or macOS
• Windows
Note that you need to replace (PORT) with your ESP32-C3 s serial port name. Or you can follow the printed
instructions to download the bin files into flash. Note that you also need to replace the (PORT).
If the ESP-AT bin fails to boot and prints ota data partition invalid , you should run python build.py
erase_flash to erase the entire flash, and then reflash the AT firmware.
The script build.py is based on idf.py, which means that all idf.py <cmd> features should be included in
build.py <cmd>. You can run the following command for more details.
• Linux or macOS
./build.py --help
• Windows
This document introduces how to modify AT port pins in the firmware for ESP32-C3 series of products. By default,
ESP-AT uses two UART interfaces as AT ports: one is to output logs (named as log port below) and the other to send
AT commands and receive responses (named as command port below).
To modify the AT port pins of your ESP32-C3, you should:
• clone the ESP-AT project;
• modify the pins either in the menuconfig utility or the factory_param_data.csv table;
• compile the project to generate the new bin in build/customized_partitions/factory_param.
bin;
• flash the new bin to your device.
This document focuses on modifying the pins. Click the links above for details of other steps.
Note: To use other interfaces as the AT command port, please refer to AT through SDIO , AT through SPI , or AT
through socket for more details.
The log port and command port pins of ESP32-C3 AT firmware can be user-defined to other pins. Refer to ESP32-C3
Technical Reference Manual for the pins you can use.
By default, the ESP32-C3 AT firmware provided by Espressif uses the following UART0 pins to output log:
• TX: GPIO21
• RX: GPIO20
When compiling your ESP-AT project, you can modify them to other pins with the menuconfig utitlity:
• ./build.py menuconfig > Component config > Common ESP-related > UART for
console output
• ./build.py menuconfig > Component config > Common ESP-related > UART TX
on GPIO#
• ./build.py menuconfig > Component config > Common ESP-related > UART RX
on GPIO#
By default, UART1 is used to send AT commands and receive AT responses, and its pins are defined in Col-
umn uart_port, uart_tx_pin, uart_rx_pin, uart_cts_pin, and uart_rts_pin of the fac-
tory_param_data.csv .
You can change them directly in your factory_param_data.csv table:
• Open your local factory_param_data.csv file.
• Locate the row of your module.
• Set uart_port as needed.
• Set uart_tx_pin and uart_rx_pin as needed.
• Set uart_cts_pin and uart_rts_pin to be -1 if you do not use the hardware flow control function.
• Save the table.
This document details how to add a user-defined AT command based on the ESP-AT project. It uses the AT+TEST
command as an example to show the sample code for each step.
Customizing a basic and well-functioned command requires at least the two steps below:
• Define AT Commands
• Register AT Commands
This step checks how the newly defined command works out.
• Give it a try
The remaining steps are for relatively complex AT commands and are optional depending on your needs.
• Define Return Values
• Access Command Parameters
• Omit Command Parameters
• Block Command Execution
• Access Input Data from AT Command Port
The source code of AT command set is not open-source, and is provided in the form of library file . It is also the
basis to parse user-defined AT commands.
Before defining any AT command, you should first decide on the name and type of the command.
Command naming rules:
• It should start with the + character.
• Alphabetic characters (A~Z, a~z), numeric characters (0~9), and some other characters (!, %, -, ., /, :,
_) are supported. See AT Command Types for more information.
Command types:
Each AT command can have up to four types: Test Command, Query Command, Set Command, and Execute Com-
mand. See AT Command Types for more information.
Then, define desired type of command. Assuming that AT+TEST supports all the four types. Below is the sample
code to define each type.
Test Command:
return ESP_AT_RESULT_CODE_OK;
}
Query Command:
return ESP_AT_RESULT_CODE_OK;
}
Set Command:
snprintf((char *)buffer, 64, "this cmd is setup cmd and cmd num is: %u\r\n",␣
,→ para_num);
esp_at_port_write_data(buffer, strlen((char *)buffer));
memset(buffer, 0, 64);
snprintf((char *)buffer, 64, "first parameter is: %d\r\n", para_int_1);
esp_at_port_write_data(buffer, strlen((char *)buffer));
memset(buffer, 0, 64);
snprintf((char *)buffer, 64, "second parameter is: %s\r\n", para_str_2);
(continues on next page)
return ESP_AT_RESULT_CODE_OK;
}
Execute Command:
return ESP_AT_RESULT_CODE_OK;
}
Finally, call esp_at_cmd_struct to define the name and type(s) that your AT command supports. The sample
code below defined the name +TEST (omitting AT) and all the four types.
};
Call API esp_at_custom_cmd_array_regist() to register your AT command. Below is the sample code
to register AT+TEST:
If you have finished the above two steps, the command should work after you build the ESP-AT project and flash the
firmware to your device. Give it a try!
Below is how AT+TEST works out.
Test Command:
AT+TEST=?
Response:
AT+TEST=?
this cmd is test cmd: +TEST
OK
Query Command:
AT+TEST?
Response:
AT+TEST?
this cmd is query cmd: +TEST
OK
Set Command:
AT+TEST=1,"espressif"
Response:
AT+TEST=1,"espressif"
this cmd is setup cmd and cmd num is: 2
first parameter is: 1
second parameter is: espressif
OK
Execute Command:
AT+TEST
Response:
AT+TEST
this cmd is execute cmd: +TEST
OK
ESP-AT has defined return values in esp_at_result_code_string_index. See AT Messages for more
return values.
In addition to output return values through the return mode, you can also use API
esp_at_response_result() to output the execution result of the command.
ESP_AT_RESULT_CODE_SEND_OK and ESP_AT_RESULT_CODE_SEND_FAIL can be used with the
API in code.
For example, when you send data to the server or MCU with the Execute Command of AT+TEST, you can use
esp_at_response_result() to output the sending result, and the return mode to output the command exe-
cution result. Below is the sample code:
uint8_t at_exe_cmd_test(uint8_t *cmd_name)
{
uint8_t buffer[64] = {0};
// output SEND OK
(continues on next page)
return ESP_AT_RESULT_CODE_OK;
}
AT+TEST
this cmd is execute cmd: +TEST
SEND OK
OK
Let s say you want to make <param_2> and <param_3> of AT+TEST optional. <param_2> is a digital
parameter, and <param_3> a string parameter.
AT+TEST=<param_1>[,<param_2>][,<param_3>],<param_4>
snprintf((char *)buffer, 64, "this cmd is setup cmd and cmd num is: %u\r\n",␣
,→ para_num);
esp_at_port_write_data(buffer, strlen((char *)buffer));
return ESP_AT_RESULT_CODE_OK;
}
Let s say you want to make the string parameter <param_3> of AT+TEST optional, which is also the last parameter.
AT+TEST=<param_1>,<param_2>[,<param_3>]
snprintf((char *)buffer, 64, "this cmd is setup cmd and cmd num is: %u\r\n",␣
,→ para_num);
esp_at_port_write_data(buffer, strlen((char *)buffer));
if (num_index == para_num) {
memset(buffer, 0, 64);
snprintf((char *)buffer, 64, "third parameter is omitted\r\n");
esp_at_port_write_data(buffer, strlen((char *)buffer));
} else {
parse_result = esp_at_get_para_as_str(num_index++, ¶_str_3);
if (parse_result != ESP_AT_PARA_PARSE_RESULT_OMITTED) {
if (parse_result != ESP_AT_PARA_PARSE_RESULT_OK) {
return ESP_AT_RESULT_CODE_ERROR;
} else {
// sample code
// user needs to customize the operation
memset(buffer, 0, 64);
snprintf((char *)buffer, 64, "third parameter is: %s\r\n", para_
,→str_3);
return ESP_AT_RESULT_CODE_OK;
}
Sometimes you want to block the execution of one command to wait for another execution result, and the system may
return different values according to the result.
Generally, this kind of command needs to synchronize the results of other tasks.
semaphore is recommended to handle synchronization.
The sample code is as follows:
// sample code
// users don't have to create semaphores here
at_operation_sema = xSemaphoreCreateBinary();
assert(at_operation_sema != NULL);
return ESP_AT_RESULT_CODE_OK;
}
ESP-AT supports accessing input data from AT Command port. It provides two APIs for this purpose.
• esp_at_port_enter_specific() sets the callback function which will be called by AT port after
receiving the input data.
• esp_at_port_exit_specific() deletes the callback function set by
esp_at_port_enter_specific.
Approaches to access the data vary depending on whether the data length has been specified or not.
Assuming that you have specified the data length in <param_1> as follows:
AT+TEST=<param_1>
Below is the sample to access the input data of <param_1> length from AT Command Port:
static xSemaphoreHandle at_sync_sema = NULL;
void wait_data_callback(void)
{
xSemaphoreGive(at_sync_sema);
}
// sample code
// users don't have to create semaphores here
if (!at_sync_sema) {
at_sync_sema = xSemaphoreCreateBinary();
assert(at_sync_sema != NULL);
}
// set the callback function which will be called by AT port after receiving␣
,→ the input data
esp_at_port_enter_specific(wait_data_callback);
if (specified_len == received_len) {
esp_at_port_exit_specific();
// sample code
// output received data
memset(buffer, 0, 64);
snprintf((char *)buffer, 64, "\r\nreceived data is: ");
esp_at_port_write_data(buffer, strlen((char *)buffer));
esp_at_port_write_data(buf, specified_len);
break;
}
}
free(buf);
return ESP_AT_RESULT_CODE_OK;
}
So, if you set AT+TEST=5 and the input data is 1234567890, the ESP-AT output is as follows.
AT+TEST=5
>67890
received data is: 12345
OK
This scenario is similar to the Wi-Fi Passthrough Mode. You do not specify the data length.
AT+TEST
Assuming that ESP-AT ends the execution of the command and returns the execution result, the sample code is as
follows:
void wait_data_callback(void)
{
xSemaphoreGive(at_sync_sema);
}
// sample code
// users don't have to create semaphores here
if (!at_sync_sema) {
at_sync_sema = xSemaphoreCreateBinary();
assert(at_sync_sema != NULL);
}
// set the callback function which will be called by AT port after receiving␣
,→ the input data
esp_at_port_enter_specific(wait_data_callback);
// sample code
// if the remaining data length > 0, it means that there is still data␣
,→left in the buffer to be processed
break;
} else if (received_len > 0) {
// sample code
// users can customize the operation to process the received data
// here is just a simple print received data
memset(buffer, 0, 64);
snprintf((char *)buffer, 64, "\r\nreceived data is: ");
esp_at_port_write_data(buffer, strlen((char *)buffer));
free(buf);
return ESP_AT_RESULT_CODE_OK;
}
So, if the first input data is 1234567890, and the second input data is +++, the ESP-AT output is as follows:
AT+TEST
>
received data is: 1234567890
OK
By default, UART is used for communication between ESP-AT and the host MCU, so the maximum throughput
speed will not exceed its default configuration, that is, 115200 bps. If users want ESP-AT to achieve high throughput,
it is necessary to understand this document and choose the appropriate configuration method. Taking ESP32-C3 as
an example, this document introduces how to improve the throughput performance of ESP-AT.
Note: This document describes general methods to improve TCP/UDP/SSL throughput performance when ESP-AT
is in Passthrough Mode.
Users could choose one of the following methods to improve throughput performance:
• [Simple] Quick Configuration
• [Recommended] Understand Data Stream and Make the Precise Configuration
# System
CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=4096
CONFIG_FREERTOS_UNICORE=n
CONFIG_FREERTOS_HZ=1000
CONFIG_ESP32C3_DEFAULT_CPU_FREQ_240=y
CONFIG_ESP32C3_DEFAULT_CPU_FREQ_MHZ=240
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
# LWIP
CONFIG_LWIP_TCP_SND_BUF_DEFAULT=65534
CONFIG_LWIP_TCP_WND_DEFAULT=65534
CONFIG_LWIP_TCP_RECVMBOX_SIZE=12
CONFIG_LWIP_UDP_RECVMBOX_SIZE=12
CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=64
# Wi-Fi
CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=16
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=64
CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=64
CONFIG_ESP32_WIFI_TX_BA_WIN=32
CONFIG_ESP32_WIFI_RX_BA_WIN=32
CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y
CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
AT+CWMODE=1
AT+CWJAP="ssid","password"
AT+UART_CUR=3000000,8,1,0,3
AT+CIPSTART="TCP","192.168.105.13",3344
AT+CIPSEND
// data transmission
This simple and quick configuration method can improve the throughput to a certain extent, but sometimes it might
not meet the expectations of users. In addition, some configurations may not hit the bottleneck of throughput. Higher
configurations may sacrifice memory resources or power consumption. Therefore, users could also familiarize them-
selves with the following recommended method and make the precise configuration.
5.4.2 [Recommended] Understand Data Stream and Make the Precise Configuration
The factors that generally affect ESP-AT throughput are illustrated in the following figure:
Note: The following configurations are based on sufficient available memory. Users can query the available memory
through the AT command: AT+SYSRAM.
1. G0 throughput optimization
G0 is a part of the system that can be optimized. The recommended configuration is as follows:
CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=4096
CONFIG_FREERTOS_UNICORE=n
CONFIG_FREERTOS_HZ=1000
CONFIG_ESP32C3_DEFAULT_CPU_FREQ_240=y
CONFIG_ESP32C3_DEFAULT_CPU_FREQ_MHZ=240
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
AT+CWMODE=1
AT+CWJAP="ssid","password"
AT+UART_CUR=3000000,8,1,0,3
AT+CIPSTART="TCP","192.168.105.13",3344
AT+CIPSEND
// data transmission
Note: The user needs to ensure that the UART of the host MCU can support such a high rate, and the UART
connection between the host MCU and ESP-AT is as short as possible.
Note: If the user expects the throughput rate to be greater than or close to 5 Mbps, then SPI, SDIO, Socket or other
methods can be considered. Please refer to:
• SPI: SPI AT Guide
• Socket: Socket AT Guide
This document explains how to generate a customized ESP-AT factory parameter bin file (fac-
tory_MODULE_NAME.bin) for your module. For example, you may want to self-define the country code,
RF restriction, or UART pins in your ESP-AT firmware. The two tables below allow you to define such parameters.
• factory_param_type.csv
• factory_param_data.csv
The following describes how to generate a customized factory parameter bin by modifying the two tables.
• Add a Customized Module
• Add a Customized Parameter
• Modify Factory Parameter Data on an Existing Module
5.5.1 factory_param_type.csv
The factory_param_type.csv table lists all the parameters that you can define as well as the offset, type, and size of
each parameter. It is located in customized_partitions/raw_data/factory_param/factory_param_type.csv.
param_name Note
description Additional information of the module, which is prompted when you are building the ESP-AT
project.
magic_flag The value must be 0xfcfc.
version The version of factory parameter management for internal use. The current version is 3. It is
not recommended to modify it.
reserved1 Reserved.
tx_max_power Wi-Fi maximum tx power for ESP32-C3: [40,84]. See ESP32-C3 tx power setting range for
details.
uart_port The UART port that is used to send AT commands and receive AT responses.
start_channel Wi-Fi start channel.
channel_num The total channel number of Wi-Fi.
country_code Country code.
uart_baudrate UART baudrate.
uart_tx_pin UART tx pin.
uart_rx_pin UART rx pin.
uart_cts_pin UART cts pin; it should be set to -1 if not used.
uart_rts_pin UART rts pin; it should be set to -1 if not used.
tx_control_pin For some boards, the tx pin needs to be separated from MCU when power on; it should be set
to -1 if not used.
rx_control_pin For some boards, the rx pin needs to be separated from MCU when power on; it should be set
to -1 if not used.
reserved2 Reserved.
platform The platform (or called chip series) that the current firmware runs on.
module_name The module that the current firmware runs on.
5.5.2 factory_param_data.csv
This factory_param_data.csv table holds the values for all the parameters defined in factory_param_type.csv. It covers
the modules of ESP32-C3 series. You can customize your factory parameter bin by modifying the values in the table.
It is located in customized_partitions/raw_data/factory_param/factory_param_data.csv.
This section demonstrates how to add a customized module in factory_param_data.csv and generate the factory pa-
rameter bin for it with an example. Assuming that you want to generate the factory parameter bin for an ESP32-C3
module named as MY_MODULE, its country code is JP, Wi-Fi channel is from 1 to 14, and other parameters stay the
same with MINI-1 module of PLATFORM_ESP32C3, you can do as follows:
• Modify factory_param_data.csv
• Modify esp_at_module_info Structure
• Recompile the Project and Select the Customized Module
Modify factory_param_data.csv
• description: MY_DESCRIPTION
• magic_flag: 0xfcfc
• version: 3
• reserved1: 0
• tx_max_power: 78
• uart_port: 1
• start_channel: 1
• channel_num: 14
• country_code: JP
• uart_baudrate: 115200
• uart_tx_pin: 17
• uart_rx_pin: 16
• uart_cts_pin: 15
• uart_rts_pin: 14
• tx_control_pin: -1
• rx_control_pin: -1
The modified factory_param_data.csv file is as follows.
platform,module_name,description,magic_flag,version,reserved1,tx_max_power,uart_
,→port,start_channel,channel_num,country_code,uart_baudrate,uart_tx_pin,uart_rx_
,→pin,uart_cts_pin,uart_rts_pin,tx_control_pin,rx_control_pin
PLATFORM_ESP32,WROOM-32,,0xfcfc,3,0,78,1,1,13,CN,115200,17,16,15,14,-1,-1
...
PLATFORM_ESP32C3,MY_MODULE,MY_DESCRIPTION,0xfcfc,3,0,78,1,1,14,JP,115200,17,16,15,
,→14,-1,-1
If you do not want to use OTA features, member 2 ota_token and member 3 ota_ssl_token should be set to
NULL. Member 1 module_name must correspond to the field module_name in the factory_param_data.csv file.
The modified esp_at_module_info structure is as follows:
static const esp_at_module_info_t esp_at_module_info[] = {
#if defined(CONFIG_IDF_TARGET_ESP32)
{"WROOM-32", CONFIG_ESP_AT_OTA_TOKEN_WROOM32, CONFIG_ESP_AT_OTA_
,→SSL_TOKEN_WROOM32 }, // default:ESP32-WROOM-32
{"WROOM-32", CONFIG_ESP_AT_OTA_TOKEN_WROOM32, CONFIG_ESP_AT_OTA_
,→SSL_TOKEN_WROOM32 }, // ESP32-WROOM-32
{"WROVER-32", CONFIG_ESP_AT_OTA_TOKEN_WROVER32, CONFIG_ESP_AT_OTA_
,→SSL_TOKEN_WROVER32 }, // ESP32-WROVER
{"PICO-D4", CONFIG_ESP_AT_OTA_TOKEN_ESP32_PICO_D4, CONFIG_ESP_AT_OTA_
,→SSL_TOKEN_ESP32_PICO_D4}, // ESP32-PICO-D4
{"SOLO-1", CONFIG_ESP_AT_OTA_TOKEN_ESP32_SOLO_1, CONFIG_ESP_AT_OTA_
,→SSL_TOKEN_ESP32_SOLO_1 }, // ESP32-SOLO-1
{"MINI-1", CONFIG_ESP_AT_OTA_TOKEN_ESP32_MINI_1, CONFIG_ESP_AT_OTA_
,→SSL_TOKEN_ESP32_MINI_1 }, // ESP32-MINI-1
{"ESP32-D2WD", NULL, NULL }, // ESP32-D2WD
{"ESP32_QCLOUD", CONFIG_ESP_AT_OTA_TOKEN_ESP32_QCLOUD, CONFIG_ESP_AT_OTA_
,→SSL_TOKEN_ESP32_QCLOUD }, // ESP32-QCLOUD
(continues on next page)
#if defined(CONFIG_IDF_TARGET_ESP32C3)
{"MINI-1", CONFIG_ESP_AT_OTA_TOKEN_ESP32C3_MINI, CONFIG_ESP_AT_
,→OTA_SSL_TOKEN_ESP32C3_MINI },
#endif
};
#if defined(CONFIG_IDF_TARGET_ESP32C3)
...
#define CONFIG_ESP_AT_OTA_TOKEN_MY_MODULE CONFIG_ESP_AT_OTA_TOKEN_DEFAULT
...
#define CONFIG_ESP_AT_OTA_SSL_TOKEN_MY_MODULE CONFIG_ESP_AT_OTA_SSL_TOKEN_
,→DEFAULT
After adding the customized module information, recompile the whole project according to Compile ESP-AT Project
and select the customized module when configuring the project:
Platform name:
1. PLATFORM_ESP32
2. PLATFORM_ESP32C3
choose(range[1,2]):1
Module name:
1. WROOM-32
2. WROVER-32
3. PICO-D4
4. SOLO-1
5. MINI-1 (description: ESP32-U4WDH chip inside)
6. ESP32-D2WD (description: 2MB flash, No OTA)
7. ESP32_QCLOUD (description: QCLOUD TX:17 RX:16)
8. MY_MODULE (description: MY_DESCRIPTION)
choose(range[1,8]):8
You can find the factory parameter bin generated in esp-at/build/customized_partitions folder after
the build is completed.
This section demonstrates how to add a customized parameter with an example. Assuming that you want to add the
parameter date for MY_MODULE and set it to 20210603, you should do as follows:
• Modify factory_param_type.csv
• Modify factory_param_data.csv
• Process a Customized Parameter
• Recompile the Project
Modify factory_param_type.csv
date 88 String 9
Modify factory_param_data.csv
In the factory_param_data.csv, insert a column named as date to the right of the last column, then set its value to
20210603 for MY_MODULE.
The modified CSV table is as follows:
platform,module_name,description,magic_flag,version,reserved1,tx_max_power,uart_
,→port,start_channel,channel_num,country_code,uart_baudrate,uart_tx_pin,uart_rx_
,→pin,uart_cts_pin,uart_rts_pin,tx_control_pin,rx_control_pin,date
PLATFORM_ESP32,WROOM-32,,0xfcfc,3,0,78,1,1,13,CN,115200,17,16,15,14,-1,-1
...
PLATFORM_ESP32C3,MY_MODULE,MY_DESCRIPTION,0xfcfc,3,0,78,1,1,14,JP,115200,17,16,15,
,→14,-1,-1,20210603
You can customize processing functions to process the customized parameter date. This section is just a simple
output:
static void esp_at_factory_parameter_date_init(void)
{
const esp_partition_t * partition = esp_at_custom_partition_find(0x40, 0xff,
,→"factory_param");
if (!partition) {
printf("factory_parameter partition missed\r\n");
return;
}
free(data);
return;
}
// sample code
// users can customize the operation of processing date
// here is just a simple print out of the date parameter
(continues on next page)
free(data);
return;
}
Assuming that you need to modify the factory parameter data of an existing module in factory_param_data.csv, you
choose one of the following options:
,→LOG_FILE
• Replace PLATFORM with the platform of your module. It must correspond to the platform in the fac-
tory_param_data.csv.
• Replace MODULE with your module name. It must correspond to the module_name in the fac-
tory_param_data.csv.
• Replace DEFINE_FILE with the relative path of factory_param_type.csv.
• Replace MODULE_FILE with the relative path of factory_param_data.csv.
• Replace BIN_NAME with factory parameter bin file name.
• Replace LOG_FILE with the file name stored the module name.
Below is the example command for MY_MODULE:
python tools/factory_param_generate.py --platform PLATFORM_ESP32C3 --module MY_
,→MODULE --define_file components/customized_partitions/raw_data/factory_param/
(continues on next page)
,→factory_param_type.csv --module_file components/customized_partitions/raw_data/
,→factory_parameter.log
Espressif Systems 276 Release v2.3.0.0-esp32c3-156-g205b068
Submit Document Feedback
Chapter 5. How to Compile and Develop Your Own AT Project
After the above command is executed, the three files will be generated in the current directory:
• factory_param.bin
• factory_parameter.log
• factory_param_MY_MODULE.bin
Download the new factory_param_MY_MODULE.bin into flash. ESP-AT provides esptool.py to do it. Execute
the following command under the root directory of ESP-AT project and replace some parameters:
• Replace FILEDIRECTORY with the relative path of the factory parameter bin.
Below is the example command to flash the generated factory parameter bin to MY_MODULE:
Open the factory parameter bin with a binary tool, and directly modify the parameters in the corresponding position
according to the parameters offset in factory_param_type.csv.
Download the new factory_param.bin into flash (see Downloading Guide).
This document describes how to customize Bluetooth LE services on your ESP32-C3 with the Bluetooth LE service
source file provided by ESP-AT.
The Bluetooth LE services are defined as a multivariate array of GATT structures, and the array contains at least one
primary service whose attribute type is defined as 0x2800. Each service always consists of a service definition and
several characteristics. Each characteristic always consists of a value and optional descriptors. Please refer to Part
Generic Attribute Profile (GATT) of Bluetooth Core Specification for more information.
The ESP-AT project creates Bluetooth LE services based on its Bluetooth LE service source file. It is located in
customized_partitions/raw_data/ble_data/example.csv. The table below shows the default source file.
• The first line of table is the service definition with a UUID of 0xA002.
• The second line is the declaration of a characteristic. UUID 0x2803 means the characteristic declaration.
The value 2 sets the permission. The length of permission is 8 bits, and each bit represents permission for an
operation. 1 indicates that the operation is supported, and 0 indicates not supported.
Bit Permission
0 BROADCAST
1 READ
2 WRITE WITHOUT RESPONSE
3 WRITE
4 NOTIFY
5 INDICATE
6 AUTHENTICATION SIGNED WRITES
7 EXTENDED PROPERTIES
• The third line defines a characteristic of the service. UUID of this line is the characteristic s UUID, and value
is the characteristic s value.
• The fourth line defines a descriptor of the characteristic (optional).
For more information about UUID, please refer to Bluetooth Special Interest Group (SIG) Assigned Numbers.
If you use the default source file on your ESP32-C3 without any modification and establish a Bluetooth LE connection,
you will get the following result after querying the server service on the client side.
If you want to customize the Bluetooth LE services, follow the steps below.
You can define more than one service. For example, if you want to define three services (Server_A, Server_B
and Server_C), these three services need to be arranged in order. Since the definition of each service is similar,
here we define one service as an example, and then you can define others one by one accordingly.
1. Add the service definition.
In this example, we define a primary service with a value of 0xFF01.
After the above steps, the customized Bluetooth LE service has been defined as follows.
Generate ble_data.bin
Download ble_data.bin
You can download ble_data.bin in either of the following ways, corresponding to the ways to generate bin files in the
Generate ble_data.bin section.
• Download recompiled ESP-AT firmware. See Step 7. Flash onto the Device for more information.
• Download ble_data.bin only. This way only updates the ble_data area in the device.
You can execute the following command in the root directory of ESP-AT to download ble_data.bin.
esptool.py --chip auto --port PORTNAME --baud 921600 --before default_reset --
,→after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_
Replace PORTNAME with your port name and replace ADDRESS with download ble_data.bin address. The
ble_data.bin has different addresses in different modules.
– ESP32-C3: 0x1F000
– ESP32-C3 QCLOUD: 0x21000
After the download is complete, re-establish the Bluetooth LE connection. Query the server service on the client side
as follows:
This document describes how to customize the partitions in your ESP32-C3 by modifying the at_customize.csv table
provided by ESP-AT. There are two partition tables: the primary partition and the secondary partition table.
The primary partition table partitions_at.csv is for system usage, based on which the partitions_at.bin file is generated.
If the primary partition table goes wrong, the system will fail to startup. Therefore, it is not recommended to modify
the partitions_at.csv.
ESP-AT provides a secondary partition table at_customize.csv that you can customize to store self-defined blocks of
data. It is based on the primary partition table.
To modify the partition in your ESP32-C3, please follow the first three steps. The fourth section illustrates the three
steps with an example.
• Modify at_customize.csv
• Generate at_customize.bin
• Flash at_customize.bin into ESP32-C3 Device
• Example
Find the at_customize.csv for your module with reference to the following table.
After having modified the at_customize.csv, you can either recompile the ESP-AT project to generate the
at_customize.bin file, or use the python script gen_esp32part.py.
If you use the script, execute the following command under the root directory of ESP-AT project and replace INPUT
and OUTPUT:
• Replace INPUT with the path to at_customize.csv or the binary file to parse.
• Replace OUTPUT with the path to output converted binary or CSV file. Stdout will be used if omitted.
Download the at_customize.bin into flash. Please refer to Flash AT Firmware into Your Device for how to flash bin
files into ESP32-C3 device and the following table for the download address for your module.
There are cases where at_customize.bin must be downloaded to flash in order to use certain AT commands:
• AT+SYSFLASH: Query/Set User Partitions in Flash
• AT+FS: Filesystem Operations
• SSL server relevant commands
• BLE server relevant commands
5.7.4 Example
The section demonstrates how to add a 4 KB partition named test into the ESP32-C3-MINI-1 module.
Firstly, find the at_customize.csv table for ESP32-C3-MINI-1 and set the Name, Type, Subtype, Offset, and
Size of the new partition:
# Name,Type,SubType,Offset,Size
... ...
test,0x40,15,0x3E000,4K
fatfs,data,fat,0x47000,100K
Secondly, recompile the ESP-AT project, or execute the python script in the ESP-AT root directory to generate
at_customize.bin.
The ESP-AT project supports multiple modules, and provides configuration for them in the factory_param_data.csv
table and the files in the module_config folder. See the table below for the supported platforms (chip series) and
modules, as well as locations of the default configuration files.
ESP32 WROVER-32
• module_config/module_wrover-32/sdkconfig.defaults
• module_config/module_wrover-32/sdkconfig_silence.defaults
ESP32 ESP32-D2WD
• module_config/module_esp32-d2wd/sdkconfig.defaults
• module_config/module_esp32-d2wd/sdkconfig_silence.defaults
ESP32 ESP32_QCLOUD
• module_config/module_esp32_qcloud/sdkconfig.defaults
• module_config/module_esp32_qcloud/sdkconfig_silence.defaults
ESP32- MINI-1
• module_config/module_esp32c3_default/sdkconfig.defaults
C3
• module_config/module_esp32c3_default/sdkconfig_silence.defaults
ESP32- ESP32C3_QCLOUD
• module_config/module_esp32c3_qcloud/sdkconfig.defaults
C3
• module_config/module_esp32c3_qcloud/sdkconfig_silence.defaults
Note:
• When the silence mode in ./build.py menuconfig is 0, the default sdkconfig corresponding to
the module is sdkconfig.defaults.
• When the silence mode in ./build.py menuconfig is 1, the default sdkconfig corresponding to
the module is sdkconfig_silence.defaults.
If you want to add support for an ESP32-C3 module in your ESP-AT project, you need to modify those configuration
files. The ESP32-C3 module here means:
• Modules that the ESP-AT project has not supported yet, including those of supported platform and not sup-
ported platform. However, adding support for the latter requires extra huge work, thus not recommended and
not explained in this document.
• Modules that the ESP-AT project supports, but you want to modify the default configuration.
The document uses an example to explain how to add support for an ESP32-C3 module in the ESP-AT project. The
example module is ESP32-WROOM-32 that uses SDIO instead of the default UART interface.
Open your local factory_param_data.csv , insert a new row at the end, set the parameters as needed. In the example,
we set platform to PLATFORM_ESP32, module_name to WROOM32-SDIO, as well as other parameters as
follows (see factory_param_type.csv for what each parameter represents):
• platform: PLATFORM_ESP32
• module_name: WROOM32-SDIO
• description:
• magic_flag: 0xfcfc
• version: 3
• reserved1: 0
• tx_max_power: 78
• uart_port: 1
• start_channel: 1
• channel_num: 13
• country_code: CN
• uart_baudrate: -1
• uart_tx_pin: -1
• uart_rx_pin: -1
• uart_cts_pin: -1
• uart_rts_pin: -1
• tx_control_pin: -1
• rx_control_pin: -1
Firstly, enter module_config folder, and create a new folder to store all the configuration files for your module.
Note that the folder name should be in lower case. Then, add the configuration files in the new folder: IDF_VERSION,
at_customize.csv, partitions_at.csv, sdkconfig.defaults, and sdkconfig_silence.defaults.
In this example, we copy the module_esp32_default folder as well as the files within it and rename it as
module_wroom32-sdio. The copied IDF_VERSION, at_customize.csv, and partitions_at.csv do not need any
modification in our case. We only need to modify the sdkconfig.defaults and sdkconfig_silence.defaults:
• Modify the two files to use the partition table in the module_wroom32-sdio folder as follows:
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="module_config/module_wroom32-sdio/
,→partitions_at.csv"
CONFIG_PARTITION_TABLE_FILENAME="module_config/module_wroom32-sdio/partitions_
,→at.csv"
CONFIG_AT_CUSTOMIZED_PARTITION_TABLE_FILE="module_config/module_wroom32-sdio/
,→at_customize.csv"
• Modify the two files to use the SDIO configuration and remove the UART configuration as follows:
– Remove the UART configuration
CONFIG_AT_BASE_ON_UART=n
CONFIG_AT_BASE_ON_SDIO=y
After finishing the above steps, you can recompile the ESP-AT project to generate the firmware for your module. In
this example, we choose PLATFORM_ESP32 and WROOM32-SDIO when configuring the project to generate the
firmware for it.
• Overview
• How to Use SPI AT?
• SPI AT Throughput
5.9.1 Overview
SPI AT is based on ESP-AT project and uses SPI protocol for data communication. When SPI AT is used, MCU
works as SPI master and ESP32-C3 AT device works as SPI slave. Both sides of communication exchange data based
on AT command through SPI protocol.
ESP-AT project uses UART protocol for data communication by default, but UART protocol is not applicable in
some application scenarios that need high-speed data transmission. In this case, the SPI protocol which supports a
higher transmission rate is a better choice.
You can configure and enable SPI AT through the following steps:
1. ./build.py menuconfig -> Component config -> AT -> communicate method for AT
command -> AT through HSPI to enable SPI AT.
2. ./build.py menuconfig -> Component config -> AT -> communicate method for AT
command -> AT SPI Data Transmission Mode to choose the SPI data transmission mode.
3. ./build.py menuconfig -> Component config -> AT -> communicate method for AT
command -> AT SPI GPIO settings to change the default pin assignments for SPI AT.
4. ./build.py menuconfig -> Component config -> AT -> communicate method for AT
command -> AT SPI driver settings to choose the SPI slave mode, and config the buffer size for
data transmission.
5. Recompile the esp-at project(see Compile ESP-AT Project), download AT bin into flash.
Note 1: QUADWP and QUADHD signals are only used for 4-bit (qio/qout) transactions.
You can change the default pin assignments by ./build.py menuconfig > Component config > AT >
communicate method for AT command > AT through HSPI > AT SPI GPIO settings and
compile the project (see Compile ESP-AT Project).
When SPI AT is used, ESP32-C3 works in SPI half-duplex mode as a slave. Usually, when SPI protocol works in
half-duplex mode, it is the SPI master that starts the read/write operation. However, when AT command is used for
data interaction, ESP32-C3 (slave) is required to actively report some information. Therefore, we add a handshake
line between SPI master and slave to realize the purpose. The specific methods of using handshake line are as follows:
• When master sends AT commands to slave via SPI, the workflow with an extra handshake line is as follows:
1. The master sends a request for data transmission to the slave, and then waits for the signal sent by the
slave to the handshake line to allow data transmission.
2. After the master detects the permission signal sent by the slave on the handshake line, it starts to send
data.
3. After sending the data, the master notifies slave that the data transmission is finished.
• When slave sends AT responses to master via SPI, the workflow with an extra handshake line is as follows:
1. The slave sends a signal through the handshake line to inform the master to start receiving data.
2. The master receives data and notifies slave that the data transmission is finished after receiving all data.
Communication Formats
The communication format used by SPI AT is CMD+ADDR+DUMMY+DATA (Read or Write). When using SPI
AT, some communication messages used by SPI master are described as follows:
• The message used by the master to send data to slave:
• The message used by the master to inform the slave all data has been sent:
• The message used by the master to receive data from the slave:
• The message used by the master to inform the slave all data has been received:
The 4-byte length data_info contains the information about the packet to be sent. The specific format is as
follows:
1. 0~15 bits: the length of the data that the master want to send to the slave.
2. 16~23 bits: the sequence number of the packet sent by the master to the slave.
3. 24~31 bits: the magic num, and default value is 0xFE.
• After receiving the signal from the handshake line, the master can send the message to query the read or write
status of the slave:
After sending the query request, the slave s status returned will be stored in the 4-byte length slave_status,
the specific format is as follows:
1. 0~15 bits: the length of the data the slave wants to send to the master. This field is valid only when the slave is
readable.
2. 16~23 bits: the sequence number of the packet to be sent. The maximum sequence number is 0xFF, and if
the number is reached, the sequence number is incremented by 1 from 0.
3. 24~31 bits: the slave status (readable/writable). 0x1 means readable, and 0x2 means writable.
SPI AT Workflow
SPI AT is used as the SPI slave. For a code example of communication between the SPI master and the SPI slave,
please refer to at_spi_master/spi/esp32_c_series.
Note 1. Before developing with MCU, it is highly recommended to run this example using ESP32-C3 or ESP32
emulated MCU as SPI master to make it easier to debug problems.
• An ESP32 or ESP32-C3 development board is been used as SPI master. The application runs in the board can
be found under the directory at_spi_master/spi/esp32_c_series of the ESP-AT project. Some related configu-
rations are described below:
1. Hardware configuration: The frequency of CPU is 240 MHz, flash SPI mode is in QIO mode with 40 MHz.
2. Software configuration: The ESP-IDF version is v4.3. The size of streambuffer is 8192 bytes.
• An ESP32-C3-DevKitC development board is been used as SPI slave. Please refer to Compile ESP-AT Project
to build your own ESP-AT project and flash the generated binary files into the board. The board works in the
TCP passthrough mode, and some related configurations are described below:
1. Hardware configuration: The frequency of CPU is 160 MHz.
2. Software configuration: The size of streambuffer is 8192 bytes, the sdkconfig is sdkconfig.defaults.esp32c3.
Reference Results
The table below shows the throughput results we got in a shield box.
Note 1: When SPI clock frequency is high, due to the limitation of upper network components, the communication
rate of Dual or Quad mode is not significantly improved compared with Standard mode.
Note 2: For more information about SPI communication, please refer to the Technical Reference Manuals.
This document introduces how to implement OTA upgrade on ESP32-C3 series of modules. Currently, ESP-AT pro-
vides the following three OTA commands targeting at different scenarios. You could choose one command according
to your needs.
1. AT+USEROTA
2. AT+CIUPDATE
3. AT+WEBSERVER
The structure of this document is as follows:
• Comparison Among OTA Commands and Their Application Scenarios
• Perform OTA Upgrade with ESP-AT OTA Commands
AT+USEROTA
This command implements OTA upgrade through a URL. You can upgrade to the firmware placed on the HTTP
server. Currently, the command only supports the upgrade of app partitions. For more information on this command,
please refer to AT+USEROTA for more details.
Since this command is a user-defined command, you can modify the implementation of this command by modifying
the at/src/at_user_cmd.c source code.
The application scenarios of this command are as follows:
1. You have your own HTTP server.
2. You need to specify the URL.
Important:
• If the firmware you upgrade is not officially released by Espressif, you may no longer be able to use
AT+CIUPDATE command to upgrade after the upgrade is complete, unless you create your own device ac-
cording to OTA Upgrade with AT+CIUPDATE.
AT+CIUPDATE
This command uses iot.espressif.cn as the default HTTP server. It can upgrade both the app partition and the user-
defined partitions that are defined in the at_customize.csv. If you are using the version released by Espressif,
it will only upgrade to the version released by Espressif. For more information on this command, please refer to
AT+CIUPDATE for more details.
To upgrade the customized bin file with this command, please select one of the following ways.
1. replace iot.espressif.cn with the your own HTTP server and implement the interactive process. For how
to implement your own AT+CIUPDATE command, please refer to at/src/at_ota_cmd.c.
2. create a devices on iot.espressif.cn and upload customized AT firmware on it. (The premise is that the
firmware running in the module already corresponds to the device you created on the Espressif server.)
For more information, please refer to OTA Upgrade with AT+CIUPDATE.
The application scenarios of this command are as follows:
1. You only use the firmware released by Espressif, and only want to upgrade to the firmware released by
Espressif.
2. You want to upgrade the customized bin file, but do not have an HTTP server.
3. You have your own HTTP server. In addition to the app partition, you also want to upgrade the user-
defined partitions in at_customize.csv.
AT+WEBSERVER
This command upgrades AT firmware with a browser or WeChat applet. Currently, this command only supports
the upgrade of app partitions. Before starting the upgrade, please enable the web server command and copy the AT
firmware to the computer or mobile phone in advance. For more information, you can refer to AT+WEBSERVER and
Web Server AT Example.
To implement your own HTML page, please refer to the example of fs_image/index.html. To implement your own
AT+WEBSERVER command, please refer to the example of at/src/at_web_server_cmd.c.
The application scenarios of this command are as follows:
1. You need a more convenient and faster OTA upgrade that does not rely on network status.
Important:
• If the firmware you upgrade is not officially released by Espressif, you may no longer be able to use
AT+CIUPDATE command to upgrade after the upgrade is complete, unless you create your own device ac-
cording to OTA Upgrade with AT+CIUPDATE.
To upgrade the customized bin file with AT+CIUPDATE command, the first thing to do is to upload the bin file to the
iot.espressif.cn and obtain the token value. The following steps describe how to create a device on iot.espressif.cn
and upload the bin file to it.
1. Open the website http://iot.espressif.cn or https://iot.espressif.cn.
2. Click Join in the upper right corner of the webpage, and enter your name, email address, and password.
Note:
• The Join function is currently not open to new users. If you want to use it, please contact Espressif.
3. Click on Device in the upper left corner of the webpage, and click on Create to create a device.
4. A key is generated when the device is successfully created, as the figure below shows.
5. Use the key to compile your own OTA bin file. The process of configuring the AT OTA token key is as follows:
Note:
• If using SSL OTA, the option The SSL token for AT OTA also needs to be configured.
6. Click on Product to enter the webpage, as shown below. Click on the device created. Enter version and
corename under ROM Deploy . Rename the bin file in Step 5 as ota.bin and save the configuration.
Note:
• If you want to upgrade the user-defined partition defined in the at_customize.csv, just replace
ota.bin with the bin of the user-defined partition.
• For the field corename, the purpose of this field is only to help you distinguish bin files.
8. Run the command AT+USEROTA on the ESP32-C3. If the network is connected, OTA upgrade will begin.
Important:
• When setting the name of bin files uploaded to the iot.espressif.cn, please follow the rules below:
– If you upgrade app partitions, set the bin file name to ota.bin.
– If you upgrade a user-defined partition, set the bin file name as the Name field in the at_customize.
csv. For example, if you upgrade factory_Param partition, please set it to factory_ param.
bin.
• ESP-AT stores the new firmware in a spare OTA partition. In this way, even if OTA fails due to unexpected
reasons, the original ESP-AT firmware can still run. But for user-defined partitions, because ESP-AT has no
backup measures, please upgrade it carefully.
• If you intend to upgrade only customized bin file at the beginning, please set the OTA token to your
own token value when the initial version is released.
Please refer to AT+WEBSERVER and Web Server AT Example for more details.
ESP-AT firmware is based on the Espressif IoT Development Framework (ESP-IDF), and each version of ESP-AT
firmware corresponds to a specific ESP-IDF version. It is strongly recommended to use the default ESP-IDF version
of the ESP-AT project, and NOT recommended to update it, because the inconsistency between the underlying
ESP-IDF versions of libesp32c3_at_core.a and the ESP-AT project may cause incorrect operation of the firmware.
However, in some special cases, a minor updated ESP-IDF version may be also able to work with the ESP-AT project.
In case you should update it, this document can be a reference.
The ESP-IDF version that a specific ESP-AT firmware corresponds to is recorded in the IDF_VERSION
files, which are distributed in different module folders under the module_config folder. The file describes
the branch, commit ID, and repository URL of the ESP-IDF that a module firmware is based on. For ex-
ample, the IDF_VERSION of the MINI-1 module of PLATFORM_ESP32C3 platform is located at mod-
ule_config/module_esp32c3_default/IDF_VERSION.
If you want to update the ESP-IDF version for your ESP-AT firmware, please follow the steps:
• Find the IDF_VERSION file for your module.
• Update the branch, commit ID, repository as needed.
• Delete the original esp-idf under the esp-at root directory, so that the ESP-IDF of the version specified
in IDF_VERSION will be cloned first in the next compilation.
• Recompile the ESP-AT project.
Note that when the ESP-AT version and the ESP-IDF version do not match, the following error will be reported when
compiling:
Please wait for the update to complete, which will take some time
This document compares the differences among AT firmwares of a certain ESP32-C3 series in terms of the supported
commands set, hardware, and supported modules.
This section describes the differences among AT firmwares of ESP32-C3 series, including
• ESP32-C3-MINI-1_AT_Bin (referred to as MINI-1 Bin in this section);
• ESP32-C3-QCLOUD_AT_BIN (referred to as QCLOUD Bin in this section).
The table lists which command set is supported by default in the official AT firmware applicable to ESP32-C3 series
of modules (marked with ), which is not supported by default but can be supported after configuration of the ESP-
AT project (marked with ), and which is not supported at all (marked with ). Note that the command set that
is not shown in this table is not supported either. Applicable firmware that has not been officially released requires
compilation by yourself. Those self-compiled firmware cannot be upgraded OTA from Espressif official server.
Hardware Differences
Supported Modules
The table lists the ESP32-C3 modules or chips that each AT firmware supports.
As ESP-AT enables CI (Continuous Integration) on GitHub, temporary versions of ESP-AT firmware is generated
every time when the code is pushed to GitHub.
1 UART pins can be customized. See How to Set AT Port Pins for details.
Attention: The temporary version of AT firmware is only for testing, and Espressif is not responsible for
it. You need to test functions what you need by yourself.
Please save the firmware and download link, for possible issue location in your follow-ups.
The following steps guide you on how to download the latest temporary version of AT firmware from GitHub.
1. Sign in your GitHub account
Before you start, please sign in your GitHub account, as you need login permission to download firmware.
2. Open the website https://github.com/espressif/esp-at
Note: If you do not find the firmware of the corresponding module on the Artifacts page, you can refer
to ESP-AT Firmware Differences to select a similar firmware to download.
ESP-AT provides python script BLEService.py to convert customized Bluetooth LE services into ble_data.
bin. For more information on customizing Bluetooth LE services, please refer to How to Customize Bluetooth® LE
Services.
• Script Generation
• Generation During Compilation
Script Generation
The path of BLEService.py is tools/BLEService.py. You can get help information of the script through the -h
option. You can also generate ble_data.bin directly through the following commands.
python <SCRIPT_PATH> [-t TARGET_FILE_NAME] <source_file>
• SCRIPT_PATH: the path the script. If you re in tools folder of ESP-AT project, SCRIPT_PATH is
BLEService.py.
• TARGET_FILE_NAME: the target file which you want to save the generated bin (absolute address or relative
address of the target file); if not specified, it will generate ATBleService.bin in the same directory with
source_file.
• source_file: the source file which you defines your Bluetooth LE GATT services (absolute address or
relative address of the source file).
For example, you can execute the following directory to generate ble_data.bin in the tools directory:
python BLEService.py -t ble_data.bin ../components/customized_partitions/raw_data/
,→ble_data/example.csv
The script BLEService.py is only responsible for converting example.csv file to bin file. You can download
bin files to the corresponding flash partition in the following ways:
1. Download bin file with tools
1. Windows
Please download Flash Download Tools for Windows.
For more details about the Tools, please see readme.pdf or the doc folder in the zip folder.
2. Linux or macOS
Please use esptool.py.
You can refer to How to Customize Bluetooth® LE Services for more details.
esptool.py --chip auto --port PORTNAME --baud 921600 --before default_reset --
,→after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_
Replace PORTNAME with your port name. Replace ADDRESS with the the download address. Replace
FILEDIRECTORY with the file directory of the bin.
2. Update bin file with commands
1. AT+SYSFLASH
Taking ESP32-C3 module as an example, you can execute the following command to upgrade the ble_data
partition. Please refer to AT+SYSFLASH for more details.
1. Query user partitions in flash
Command:
AT+SYSFLASH?
Response:
+SYSFLASH:"ble_data",64,1,0x21000,0x3000
+SYSFLASH:"server_cert",64,2,0x24000,0x2000
+SYSFLASH:"server_key",64,3,0x26000,0x2000
+SYSFLASH:"server_ca",64,4,0x28000,0x2000
+SYSFLASH:"client_cert",64,5,0x2a000,0x2000
+SYSFLASH:"client_key",64,6,0x2c000,0x2000
+SYSFLASH:"client_ca",64,7,0x2e000,0x2000
+SYSFLASH:"factory_param",64,8,0x30000,0x1000
+SYSFLASH:"wpa2_cert",64,9,0x31000,0x2000
+SYSFLASH:"wpa2_key",64,10,0x33000,0x2000
+SYSFLASH:"wpa2_ca",64,11,0x35000,0x2000
+SYSFLASH:"mqtt_cert",64,12,0x37000,0x2000
+SYSFLASH:"mqtt_key",64,13,0x39000,0x2000
+SYSFLASH:"mqtt_ca",64,14,0x3b000,0x2000
+SYSFLASH:"fatfs",1,129,0x70000,0x90000
OK
AT+SYSFLASH=0,"ble_data"
Response:
OK
AT+SYSFLASH=1,"ble_data",0,6487
Response:
>
If the operator is write, wrap return > after the write command, then you can send the data
that you want to write. The length should be parameter <length>. When the write operation is
completed, the system will prompt the following information.
OK
2. AT+CIUPDATE
For example, you can execute the following command to upgrade the ble_data partition (The premise is
that you must use the Wi-Fi function). Please refer to AT+CIUPDATE for more details.
Important: If you want to update the ble_data partition in this way, you must implement your own OTA
device, please refer to How to Implement OTA Upgrade.
AT+CIUPDATE=1,"v2.2.0.0","ble_data"
Note: You must ensure that the download address is correct, otherwise the ESP-AT firmware may not work. The
simplest way to view the download address is to execute the command AT+SYSFLASH?.
ESP-AT provides python script AtPKI.py to convert SSL server certificates, SSL client certificates, MQTT cer-
tificates, and WPA2 certificates files (including CA, cert, and private key files) into bin files.
In addition to converting the certificate file into a bin file, the script AtPKI.py adds some additional information to
the bin file.
When converting a single certificate file, the script will add 12 bytes in little-endian format to the header and 4 bytes
aligned at the end.
Field Description
magic code (2 bytes) 0xF1 0xF1
list size (2 bytes) the number of certificate files
length (4 bytes) remaining file size = total file size - magic code size - list size -
length size
type (1 bytes)
ca: 0x01
certificate: 0x02
key: 0x03
Taking the client_cert.bin generated in the Generate Certificate Bin Files section as an example, the 12 bytes
in little-endian format at the beginning of the file are:
Field Description
magic code (2 bytes) 0xF1 0xF1
list size (2 bytes) 0x02 0x00
length (4 bytes) 0x20 0x09 0x00 0x00
type (1 bytes) 0x02
ID (1 bytes) 0x00
content len (2 bytes) 0x8C 0x04
When converting multiple certificate files, the script AtPKI.py inserts 4 bytes at the beginning of every file except
the first one. The 4 bytes in little-endian format at the beginning of the file are:
Field Description
type (1 bytes)
ca: 0x01
certificate: 0x02
key: 0x03
Taking the client_cert.bin generated in the Generate Certificate Bin Files section as an example, the 4 bytes
in little-endian format at the beginning of the file are:
Field Description
type (1 bytes) certificate: 0x02
ID (1 bytes) 0x01
content len (2 bytes) 0x8C 0x04
• Script Generation
• Generation During Compilation
Script Generation
The path of AtPKI.py is tools/AtPKI.py. You can get help information of the script through the -h option. You
can also generate bin files directly through the following commands.
• SCRIPT_PATH: the path the script. If you re in tools folder of ESP-AT project, SCRIPT_PATH is
AtPKI.py.
• OUTPUT_BIN_NAME: the target file which you want to save the generated bin (absolute address or relative
address of the target file); if -b OUTPUT_BIN_NAME is omitted, it will generate PKI.bin in the current
directory.
• PKI_LIST: must be equal to one of ca, cert, key.
• source_file: the certificate source file which you want to convert (absolute address or relative address of
the source file).
Taking the SSL client certificate files of ESP-AT as an example, you can execute the following command to generate
client_cert.bin in the tools directory:
,→partitions/raw_data/client_cert/client_cert_01.crt
cert certificate in the client_cert directory with your own cert certificate, and the private key in the
client_ key directory with your own private key.
If you have multiple sets of certificate files, please place them in the corresponding directory according to your
certificate chain. It is recommended that you end the file name with a number to ensure the parsing order of the
certificate files.
After replacement, You can refer to Compile ESP-AT Project to compile the ESP-AT project.
The script AtPKI.py is only responsible for converting the certificate files to bin files. You can download bin files
to the corresponding flash partition in one of the following ways:
• Windows
Please download Flash Download Tools for Windows.
For more details about the Tools, please see readme.pdf or the doc folder in the zip folder.
• Linux or macOS
Please use esptool.py.
You can execute the following command in the root directory of ESP-AT to download bin files.
Replace PORTNAME with your port name. Replace ADDRESS with the the download address. Replace
FILEDIRECTORY with the file directory of the bin.
• AT+SYSFLASH
Taking ESP32-C3 module as an example, you can execute the following command to upgrade the
client_cert partition. Please refer to AT+SYSFLASH for more details.
1. Query user partitions in flash
Command:
AT+SYSFLASH?
Response:
+SYSFLASH:"ble_data",64,1,0x1f000,0x6000
+SYSFLASH:"server_cert",64,2,0x25000,0x2000
+SYSFLASH:"server_key",64,3,0x27000,0x2000
+SYSFLASH:"server_ca",64,4,0x29000,0x2000
+SYSFLASH:"client_cert",64,5,0x2b000,0x2000
+SYSFLASH:"client_key",64,6,0x2d000,0x2000
+SYSFLASH:"client_ca",64,7,0x2f000,0x2000
+SYSFLASH:"factory_param",64,8,0x31000,0x1000
+SYSFLASH:"wpa2_cert",64,9,0x32000,0x2000
+SYSFLASH:"wpa2_key",64,10,0x34000,0x2000
+SYSFLASH:"wpa2_ca",64,11,0x36000,0x2000
+SYSFLASH:"mqtt_cert",64,12,0x38000,0x2000
+SYSFLASH:"mqtt_key",64,13,0x3a000,0x2000
+SYSFLASH:"mqtt_ca",64,14,0x3c000,0x2000
+SYSFLASH:"fatfs",1,129,0x47000,0x19000
OK
AT+SYSFLASH=0,"client_cert"
Response:
OK
AT+SYSFLASH=1,"client_cert",0,2344
Response:
>
If the operator is write, wrap return > after the write command, then you can send the data
that you want to write. The length should be parameter <length>. When the write operation is
completed, the system will prompt the following information.
OK
• AT+CIUPDATE
For example, you can execute the following command to upgrade the client_ca partition. Please refer to
AT+CIUPDATE for more details.
Important: If you want to update the client_ca partition in this way, you must implement your own OTA
device, please refer to How to Implement OTA Upgrade.
AT+CIUPDATE=1,"v2.2.0.0","client_ca"
Note: You must ensure that the download address is correct, otherwise the ESP-AT firmware may not work. The
simplest way to view the download address is to execute the command AT+SYSFLASH?.
• components/at/include/esp_at_core.h
5.16.2 Functions
Returns
• ESP_AT_PARA_PARSE_RESULT_OK : succeed
• ESP_AT_PARA_PARSE_RESULT_FAIL : fail
• ESP_AT_PARA_PARSE_RESULT_OMITTED : this parameter is OMITTED
esp_at_para_parse_result_type esp_at_get_para_as_str(int32_t para_index, uint8_t **result)
Parse string parameter from command string.
Parameters
• para_index the index of parameter
• result the pointer that point to the result.
Returns
• ESP_AT_PARA_PARSE_RESULT_OK : succeed
• ESP_AT_PARA_PARSE_RESULT_FAIL : fail
• ESP_AT_PARA_PARSE_RESULT_OMITTED : this parameter is OMITTED
void esp_at_port_recv_data_notify_from_isr(int32_t len)
Calling the esp_at_port_recv_data_notify_from_isr to notify at module that at port received data. When re-
ceived this notice,at task will get data by calling get_data_length and read_data in esp_at_device_ops. This
function MUST be used in isr.
Parameters len data length
bool esp_at_port_recv_data_notify(int32_t len, uint32_t msec)
Calling the esp_at_port_recv_data_notify to notify at module that at port received data. When received this
notice,at task will get data by calling get_data_length and read_data in esp_at_device_ops. This function MUST
NOT be used in isr.
Parameters
• len data length
• msec timeout time,The unit is millisecond. It waits forever,if msec is port-
MAX_DELAY.
Returns
• true : succeed
• false : fail
void esp_at_transmit_terminal_from_isr(void)
terminal transparent transmit mode,This function MUST be used in isr.
void esp_at_transmit_terminal(void)
terminal transparent transmit mode,This function MUST NOT be used in isr.
bool esp_at_custom_cmd_array_regist(const esp_at_cmd_struct *custom_at_cmd_array, uint32_t
cmd_num)
regist at command set, which defined by custom,
Parameters
• custom_at_cmd_array at command set
• cmd_num command number
void esp_at_device_ops_regist(esp_at_device_ops_struct *ops)
regist device operate functions set,
Parameters ops device operate functions set
bool esp_at_custom_net_ops_regist(int32_t link_id, esp_at_custom_net_ops_struct *ops)
uint32_t esp_at_get_version(void)
get at module version number,
Returns at version bit31~bit24: at main version bit23~bit16: at sub version bit15~bit8 : at test
version bit7~bit0 : at custom version
void esp_at_response_result(uint8_t result_code)
response AT process result,
Parameters result_code see esp_at_result_code_string_index
int32_t esp_at_port_write_data(uint8_t *data, int32_t len)
write data into device,
Parameters
• data data buffer to be written
• len data length
Returns
• >= 0 : the real length of the data written
• others : fail.
int32_t esp_at_port_read_data(uint8_t *data, int32_t len)
read data from device,
Parameters
• data data buffer
• len data length
Returns
• >= 0 : the real length of the data read from device
• others : fail
bool esp_at_port_wait_write_complete(int32_t timeout_msec)
wait for transmitting data completely to peer device,
Parameters timeout_msec timeout time,The unit is millisecond.
Returns
• true : succeed,transmit data completely
• false : fail
int32_t esp_at_port_get_data_length(void)
get the length of the data received,
Returns
• >= 0 : the length of the data received
• others : fail
bool esp_at_base_cmd_regist(void)
regist at base command set. If not,you can not use AT base command
bool esp_at_user_cmd_regist(void)
regist at user command set. If not,you can not use AT user command
bool esp_at_wifi_cmd_regist(void)
regist at wifi command set. If not,you can not use AT wifi command
bool esp_at_net_cmd_regist(void)
regist at net command set. If not,you can not use AT net command
bool esp_at_mdns_cmd_regist(void)
regist at mdns command set. If not,you can not use AT mdns command
bool esp_at_driver_cmd_regist(void)
regist at driver command set. If not,you can not use AT driver command
bool esp_at_wps_cmd_regist(void)
regist at wps command set. If not,you can not use AT wps command
bool esp_at_smartconfig_cmd_regist(void)
regist at smartconfig command set. If not,you can not use AT smartconfig command
bool esp_at_ping_cmd_regist(void)
regist at ping command set. If not,you can not use AT ping command
bool esp_at_http_cmd_regist(void)
regist at http command set. If not,you can not use AT http command
bool esp_at_mqtt_cmd_regist(void)
regist at mqtt command set. If not,you can not use AT mqtt command
bool esp_at_ble_cmd_regist(void)
regist at ble command set. If not,you can not use AT ble command
bool esp_at_ble_hid_cmd_regist(void)
regist at ble hid command set. If not,you can not use AT ble hid command
bool esp_at_blufi_cmd_regist(void)
regist at blufi command set. If not,you can not use AT blufi command
bool esp_at_bt_cmd_regist(void)
regist at bt command set. If not,you can not use AT bt command
bool esp_at_bt_spp_cmd_regist(void)
regist at bt spp command set. If not,you can not use AT bt spp command
bool esp_at_bt_a2dp_cmd_regist(void)
regist at bt a2dp command set. If not,you can not use AT bt a2dp command
bool esp_at_fs_cmd_regist(void)
regist at fs command set. If not,you can not use AT fs command
bool esp_at_eap_cmd_regist(void)
regist at WPA2 Enterprise AP command set. If not,you can not use AT EAP command
bool esp_at_eth_cmd_regist(void)
regist at ethernet command set. If not,you can not use AT ethernet command
bool esp_at_custom_cmd_line_terminator_set(uint8_t *terminator)
Set AT command terminator, by default, the terminator is \r\n You can change it by calling this function,
but it just supports one character now.
Parameters terminator the line terminator
Returns
• true : succeed,transmit data completely
• false : fail
uint8_t *esp_at_custom_cmd_line_terminator_get(void)
Get AT command line terminator,by default, the return string is \r\n .
Returns the command line terminator
const esp_partition_t *esp_at_custom_partition_find(esp_partition_type_t type,
esp_partition_subtype_t subtype, const char
*label)
Find the partition which is defined in at_customize.csv.
Parameters
• type the type of the partition
Parameters callback which will be called when received data from AT port
void esp_at_port_exit_specific(void)
Exit AT core as specific status.
const uint8_t *esp_at_get_current_cmd_name(void)
Get current AT command name.
5.16.3 Structures
struct esp_at_cmd_struct
esp_at_cmd_struct used for define at command
Public Members
char *at_cmdName
at command name
struct esp_at_device_ops_struct
esp_at_device_ops_struct device operate functions struct for AT
Public Members
int32_t (*get_data_length)(void)
get the length of data received
struct esp_at_custom_net_ops_struct
esp_at_custom_net_ops_struct custom socket callback for AT
Public Members
void (*connect_cb)(void)
callback when socket connection is built
void (*disconnect_cb)(void)
callback when socket connection is disconnected
struct esp_at_custom_ble_ops_struct
esp_at_custom_ble_ops_struct custom ble callback for AT
Public Members
void (*connect_cb)(void)
callback when ble connection is built
void (*disconnect_cb)(void)
callback when ble connection is disconnected
struct esp_at_custom_ops_struct
esp_at_ops_struct some custom function interacting with AT
Public Members
void (*pre_deepsleep_callback)(void)
callback before enter deep sleep
void (*pre_restart_callback)(void)
callback before restart
5.16.4 Macros
at_min(x, y)
at_max(x, y)
ESP_AT_ERROR_NO(subcategory, extension)
ESP_AT_CMD_ERROR_OK
No Error
ESP_AT_CMD_ERROR_NON_FINISH
terminator character not found ( \r\n expected)
ESP_AT_CMD_ERROR_NOT_FOUND_AT
Starting AT not found (or at, At or aT entered)
ESP_AT_CMD_ERROR_PARA_LENGTH(which_para)
parameter length mismatch
ESP_AT_CMD_ERROR_PARA_TYPE(which_para)
parameter type mismatch
ESP_AT_CMD_ERROR_PARA_NUM(need, given)
parameter number mismatch
ESP_AT_CMD_ERROR_PARA_INVALID(which_para)
the parameter is invalid
ESP_AT_CMD_ERROR_PARA_PARSE_FAIL(which_para)
parse parameter fail
ESP_AT_CMD_ERROR_CMD_UNSUPPORT
the command is not supported
ESP_AT_CMD_ERROR_CMD_EXEC_FAIL(result)
the command execution failed
ESP_AT_CMD_ERROR_CMD_PROCESSING
processing of previous command is in progress
ESP_AT_CMD_ERROR_CMD_OP_ERROR
the command operation type is error
5.16.6 Enumerations
enum esp_at_status_type
esp_at_status some custom function interacting with AT
Values:
enumerator ESP_AT_STATUS_NORMAL
Normal mode.Now mcu can send AT command
enumerator ESP_AT_STATUS_TRANSMIT
Transparent Transmition mode
enum esp_at_module
module number,Now just AT module
Values:
enumerator ESP_AT_MODULE_NUM
AT module
enum esp_at_error_code
subcategory number
Values:
enumerator ESP_AT_SUB_OK
OK
enumerator ESP_AT_SUB_COMMON_ERROR
reserved
enumerator ESP_AT_SUB_NO_TERMINATOR
terminator character not found ( \r\n expected)
enumerator ESP_AT_SUB_NO_AT
Starting AT not found (or at, At or aT entered)
enumerator ESP_AT_SUB_PARA_LENGTH_MISMATCH
parameter length mismatch
enumerator ESP_AT_SUB_PARA_TYPE_MISMATCH
parameter type mismatch
enumerator ESP_AT_SUB_PARA_NUM_MISMATCH
parameter number mismatch
enumerator ESP_AT_SUB_PARA_INVALID
the parameter is invalid
enumerator ESP_AT_SUB_PARA_PARSE_FAIL
parse parameter fail
enumerator ESP_AT_SUB_UNSUPPORT_CMD
the command is not supported
enumerator ESP_AT_SUB_CMD_EXEC_FAIL
the command execution failed
enumerator ESP_AT_SUB_CMD_PROCESSING
processing of previous command is in progress
enumerator ESP_AT_SUB_CMD_OP_ERROR
the command operation type is error
enum esp_at_para_parse_result_type
the result of AT parse
Values:
enumerator ESP_AT_PARA_PARSE_RESULT_FAIL
parse fail,Maybe the type of parameter is mismatched,or out of range
enumerator ESP_AT_PARA_PARSE_RESULT_OK
Successful
enumerator ESP_AT_PARA_PARSE_RESULT_OMITTED
the parameter is OMITTED.
enum esp_at_result_code_string_index
the result code of AT command processing
Values:
enumerator ESP_AT_RESULT_CODE_OK
OK
enumerator ESP_AT_RESULT_CODE_ERROR
ERROR
enumerator ESP_AT_RESULT_CODE_FAIL
ERROR
enumerator ESP_AT_RESULT_CODE_SEND_OK
SEND OK
enumerator ESP_AT_RESULT_CODE_SEND_FAIL
SEND FAIL
enumerator ESP_AT_RESULT_CODE_IGNORE
response nothing, just change internal status
enumerator ESP_AT_RESULT_CODE_PROCESS_DONE
response nothing, just change internal status
enumerator ESP_AT_RESULT_CODE_OK_AND_INPUT_PROMPT
enumerator ESP_AT_RESULT_CODE_MAX
• components/at/include/esp_at.h
5.16.8 Functions
5.16.9 Macros
ESP_AT_PORT_TX_WAIT_MS_MAX
ESP_AT_FACTORY_PARAMETER_SIZE
Please refer to . The English version is not provided since the firmware and commands are applicable to the Chinese
market (Tencent).
ESP32-C3
• TODO
321
Chapter 6. Customized AT Commands and Firmware
AT FAQ
• AT Firmware
– There is no released firmware for my module. Where can I get the firmware for it?
– How to get the source code of AT firmware?
– How to download the AT firmware on Espressif s official website?
– How to combine all the bin files compiled by ESP-AT?
– Does the AT firmware shipped in modules support flow control?
• AT Commands and Responses
– What is the reason why AT prompts busy?
– Why does the ESP-AT firmware always return the following message after the I powered up the device
and sent the first command?
– What commands are supported by the default ESP-AT firmware on different modules, and from which
version are they supported?
– When the host MCU sends an AT command to the ESP32-C3 device, there is no response. What is the
reason?
– Do AT commands support ESP-WIFI-MESH?
– Does AT support websocket commands?
– Can AT command set Bluetooth LE transmit power?
– How to support commands that are not supported by the default firmware but can be supported after
configuring and compiling the ESP-AT project?
– How to handle special characters in AT commands?
– Can the serial port baudrate be modified in AT Commands? (Default: 115200)
– After ESP32-C3 enters the passthrough mode using AT commands, can ESP32-C3 give a message if the
connected hotspot is disconnected?
– How to set ADV broadcast parameters after it exceeds 32 bytes?
• Hardware
– How big is the chip flash required for ESP-AT firmware on different modules?
– How to view the error log of AT firmware?
– The UART1 communication pin used by ESP-AT on the ESP32-C3 module is inconsistent with the default
UART1 pin described in the ESP32-C3 module s datasheet?
• Performance
– How long does it take for the AT to connect to Wi-Fi?
– Is it possible to change the TCP send window size in AT firmware?
– How to test and optimize the throughput of ESP32-C3 AT?
• Other
– What interfaces of ESP32-C3 chips can be used to transmit AT commands?
– How does ESP-AT conduct BQB certification?
– How do I specify the TLS protocol version for ESP32-C3 AT?
– How to modify the number of TCP connections in AT?
323
Chapter 7. AT FAQ
7.1 AT Firmware
7.1.1 There is no released firmware for my module. Where can I get the firmware for it?
If there is no released fimware for your module in the AT Binary Lists chapter, please consider the following options:
• Use the firmware for the module that has the same hardware configuration as yours (see ESP-AT Firmware
Differences for which module has the same configuration).
• Create a factory parameter bin and compile the firmware for your module by yourself.
ESP-AT firmware is partially open-source. See esp-at for the open-source repository.
You can use the combine button of the Flash Download Tools.
• The busy prompt indicates that the previous command is being executed, and the system cannot respond
to the current input. The processing mechanism of the AT commands is serial, i.e. one command at a time.
• Any input through serial ports is considered to be a command input, so the system will also prompt busy
or ERROR when there is any extra invisible character input.
– Serial input AT+GMR (change character CR LF) (space character), because AT+GMR (change character
CR LF) is already a complete AT command, the system will execute the command. At this time, if the
system has not completed the AT+GMR operation, it has received the following space character, which
will be regarded as a new command input, and the system will prompt busy . But if the system has
completed the AT+GMR operation, and then receives the following space character, the space character
will be regarded as an error command, and the system will prompt ERROR .
– After the MCU sends AT+CIPSEND and receives the busy p.. response, the MCU needs to resend the
data. Because busy p.. represents the previous command is being executed, the current input is invalid. It
is recommended to wait for the response of the last AT command before the MCU sends a new command
again.
7.2.2 Why does the ESP-AT firmware always return the following message after the I
powered up the device and sent the first command?
ERR CODE:0x010b0000
busy p...
7.2.3 What commands are supported by the default ESP-AT firmware on different mod-
ules, and from which version are they supported?
• To learn what commands are supported by the default ESP-AT firmware on different modules, please refer to
ESP-AT Firmware Differences.
• To learn from which version a command is supported and what issues are fixed in each version, please refer to
release notes.
7.2.4 When the host MCU sends an AT command to the ESP32-C3 device, there is no
response. What is the reason?
A terminator ( ATrn ) must be added after an AT command when the host MCU sending AT commands
to an ESP32-C3 device. Please see Check Whether AT Works.
Yes, the AT+RFPOWER command can set Bluetooth LE transmit power. ESP32-C3 Wi-Fi and Blue-
tooth LE share the same antenna.
7.2.8 How to support commands that are not supported by the default firmware but can
be supported after configuring and compiling the ESP-AT project?
For example, if you need to support the WPA2 Enterprise function on the ESP32-C3 series, configure
and compile the firmware by yourself. Open the WPA2 Enterprise function in menuconfig when compil-
ing: ./build.py menuconfig > Component config > AT > [*]AT WPA2 Enterprise
command support.
Please refer to the escape character syntax described in the AT Command Types section.
7.2.10 Can the serial port baudrate be modified in AT Commands? (Default: 115200)
Yes, you can use either of the two ways below to modify it:
• Use the command AT+UART_CUR or AT+UART_DEF.
• Re-compile the AT firmware: establish the compiling environment and change the UART baudrate.
7.2.11 After ESP32-C3 enters the passthrough mode using AT commands, can ESP32-C3
give a message if the connected hotspot is disconnected?
• Yes, you can configure it with AT+SYSMSG, i.e., set AT+SYSMSG=4. In this way, the serial port will report
WIFI DISCONNECTrn when the connected hotspot is disconnected.
• Note that this command is added after AT v2.1.0. It is not available for v2.1.0 and earlier versions.
The AT+BLEADVDATA command supports up to 32 bytes of ADV broadcast parameters. If you need
to set a bigger parameter, please use command AT+BLESCANRSPDATA.
7.3 Hardware
7.3.1 How big is the chip flash required for ESP-AT firmware on different modules?
• For ESP32-C3, the error log is output through the download port. By default, UART0 is GPIO21
and GPIO20.
• See Hardware Connection for more details.
7.3.3 The UART1 communication pin used by ESP-AT on the ESP32-C3 module is incon-
sistent with the default UART1 pin described in the ESP32-C3 module s datasheet?
• ESP32-C3 supports IO matrix. When compiling ESP-AT, you can configure UART1 pins in menuconfig, so
they may be inconsistent with the pins described in the module datasheet.
• See factory_param_data.csv for more details.
7.4 Performance
• In an office scenario, the connection time is 5 seconds. However, in actual practice, Wi-Fi connection time
depends on the router performance, network environment, module antenna performance, etc.
• The maximum timeout time can be set by the <jap_timeout> parameter of AT+CWJAP.
• Currently, it cannot be changed by AT commands, but you can configure and compile the ESP-AT project to
generate a new firmware.
• You can configure the menuconfig parameter: Component config > LWIP > TCP > Default send
buffer size.
• Many factors are affecting the AT throughput test. It is recommended to use the iperf example in esp-idf for
testing. While testing, please use the passthrough mode, adjust the data length to 1460 bytes, and send data
continuously.
• If the test rate does not meet your requirements, please refer to How to Improve ESP-AT Throughput Perfor-
mance.
7.5 Other
7.5.3 How do I specify the TLS protocol version for ESP32-C3 AT?
When compiling the esp-at project, you can disable the unwanted versions in the ./build.py menuconfig
-> Component config -> mbedTLS.
Index of Abbreviations
• After sending the AT+CIPSEND set command successfully and returns >.
• After sending the AT+CIPSEND execute command successfully and returns >.
• After sending the AT+CIPSENDL set command successfully and returns >.
• After sending the AT+CIPSENDEX set command successfully and returns >.
• After sending the AT+SAVETRANSLINK set command successfully and sending the AT+RST command
and restart the module.
• After sending the AT+BLESPP execute command successfully and returns >.
In the data mode, send the +++ command, AT will exit from Data Mode and enter the Command Mode.
AT AT AT
AT AT
• AT+CIPSEND >
• AT+CIPSEND >
• AT+CIPSENDL >
• AT+CIPSENDEX >
329
Chapter 8. Index of Abbreviations
• AT+SAVETRANSLINK (AT+RST)
• AT+BLESPP >
+++
Data Mode In the data mode, any character received by the AT command port will be treated as data (except for
special +++) instead of the AT command, and these data will be sent to the opposite end without modification.
AT enters Data Mode from Command Mode in the following cases.
• After sending the AT+CIPSEND set command successfully and returns >.
• After sending the AT+CIPSEND execute command successfully and returns >.
• After sending the AT+CIPSENDL set command successfully and returns >.
• After sending the AT+CIPSENDEX set command successfully and returns >.
• After sending the AT+SAVETRANSLINK set command successfully and sending the AT+RST command
and restart the module.
• After sending the AT+BLESPP execute command successfully and returns >.
In the data mode, send the +++ command, AT will exit from Data Mode and enter the Command Mode.
AT +++ AT
AT
• AT+CIPSEND >
• AT+CIPSEND >
• AT+CIPSENDL >
• AT+CIPSENDEX >
• AT+SAVETRANSLINK AT+RST
• AT+BLESPP >
+++
DHCP Dynamic Host Configuration Protocol
opposite end of transmission will also be returned to MCU through AT command port with additional prompt:
+IPD.
During a normal transmission, if the connection breaks, ESP32-C3 will give a prompt and will not attempt to
reconnect.
More details are in Transmission Mode Shift Diagram.
AT AT+CIPSEND AT
MCU AT MCU
+IPD
ESP32-C3
Transmission Mode Shift Diagram
Passthrough Mode Also called as Passthrough Sending & Receiving Mode .
In passthrough mode, users cannot send AT commands except special +++ command. All MCU data received
by AT command port will be sent to the opposite end of transmission without any modification; and the data
received from the opposite end of transmission will also be returned to MCU through AT command port
without any modification.
During the Wi-Fi passthrough transmission, if the connection breaks, ESP32-C3 (as client) will keep trying to
reconnect until +++ is input to exit the passthrough transmission; ESP32-C3 (as server) will shutdown the old
connection and listen new connection until +++ is input to exit the passthrough transmission.
More details are in Transmission Mode Shift Diagram.
AT +++ AT MCU
AT
MCU
Wi-Fi ESP32-C3
+++ ESP32-C3
+++
Transmission Mode Shift Diagram
Transmission Mode Shift Diagram
AT AT AT
MCU Transmission Mode Shift Diagram
PBC Push Button Configuration
PCI Authentication Payment Card Industry Authentication. In ESP-AT project, it refers to all Wi-Fi authentication
modes except OPEN and WEP.
RTC Real Time Controller. A group of circuits in SoC that keeps working in any chip mode and at any time.
SoC
SMP Security Manager Protocol
About
This is documentation of ESP-AT, a solution developed by Espressif to quickly and easily interface with ESP32-C3
products.
Espressif Wi-Fi and Bluetooth chipsets are often used as add-on modules to seamlessly integrate wireless connectivity
features into new and existing products. In an effort to facilitate this and cut down on engineering costs, Espressif
Systems has developed AT firmware as well as a rich set of AT commands that can be used to interface with Espressif
products.
333
Chapter 9. About
A ESP_AT_CMD_ERROR_NON_FINISH (C macro),
A2DP, 329 315
ADC, 329 ESP_AT_CMD_ERROR_NOT_FOUND_AT (C macro),
ALPN, 329 315
AT, 329 ESP_AT_CMD_ERROR_OK (C macro), 315
AT command port, 329 ESP_AT_CMD_ERROR_PARA_INVALID (C macro),
AT log port, 329 315
AT port, 329 ESP_AT_CMD_ERROR_PARA_LENGTH (C macro),
AT , 329 315
AT , 329 ESP_AT_CMD_ERROR_PARA_NUM (C macro), 315
AT , 329 ESP_AT_CMD_ERROR_PARA_PARSE_FAIL (C
at_max (C macro), 315 macro), 315
at_min (C macro), 315 ESP_AT_CMD_ERROR_PARA_TYPE (C macro), 315
esp_at_cmd_struct (C++ struct), 313
B esp_at_cmd_struct::at_cmdName (C++
member), 313
Bluetooth LE, 329
esp_at_cmd_struct::at_exeCmd (C++ mem-
BluFi, 329
ber), 313
C esp_at_cmd_struct::at_queryCmd (C++
member), 313
Command Mode, 329 esp_at_cmd_struct::at_setupCmd (C++
member), 313
D esp_at_cmd_struct::at_testCmd (C++
Data Mode, 330 member), 313
DHCP, 330 esp_at_custom_ble_ops_regist (C++ func-
DNS, 330 tion), 310
DTIM, 330 esp_at_custom_ble_ops_struct (C++ struct),
314
E esp_at_custom_ble_ops_struct::connect_cb
esp_at_base_cmd_regist (C++ function), 311 (C++ member), 314
esp_at_ble_cmd_regist (C++ function), 312 esp_at_custom_ble_ops_struct::disconnect_cb
esp_at_ble_hid_cmd_regist (C++ function), (C++ member), 314
312 esp_at_custom_ble_ops_struct::recv_data
esp_at_blufi_cmd_regist (C++ function), 312 (C++ member), 314
esp_at_board_init (C++ function), 318 esp_at_custom_cmd_array_regist (C++
esp_at_bt_a2dp_cmd_regist (C++ function), function), 310
312 esp_at_custom_cmd_line_terminator_get
esp_at_bt_cmd_regist (C++ function), 312 (C++ function), 312
esp_at_bt_spp_cmd_regist (C++ function), esp_at_custom_cmd_line_terminator_set
312 (C++ function), 312
ESP_AT_CMD_ERROR_CMD_EXEC_FAIL (C esp_at_custom_net_ops_regist (C++ func-
macro), 315 tion), 310
ESP_AT_CMD_ERROR_CMD_OP_ERROR (C macro), esp_at_custom_net_ops_struct (C++ struct),
316 314
ESP_AT_CMD_ERROR_CMD_PROCESSING (C esp_at_custom_net_ops_struct::connect_cb
macro), 316 (C++ member), 314
ESP_AT_CMD_ERROR_CMD_UNSUPPORT (C esp_at_custom_net_ops_struct::disconnect_cb
macro), 315
335
Index
L �
LwIP, 330 , 330
LWT, 330 , 331
M �
MAC, 330 , 331
mDNS, 330 , 331
MSB, 330
MTU, 330
N
Normal Transmission Mode, 330
NVS, 330
P
Passthrough Mode, 331
Passthrough Receiving Mode, 331
PBC, 331
PCI Authentication, 331