Socket AT 命令集
备注
Socket AT 命令集默认未启用。
参考 配置 SDK(menuconfig) 进入
CONFIG AT CMD
配置,勾选Enable Socket
来启用 Socket AT 命令集。
AT+SKTCFG
功能说明
配置 TCP/UDP/SSL 套接字全局选项参数
命令格式
AT+SKTCFG=[<so_sndtimeo>],[<so_rcvtimeo>],[<tcp_nodelay>],[<so_keepalive>],[<tcp_keepidle>],[<tcp_keepintvl>],[<tcp_keepcnt>]
响应格式
成功响应:
OK
错误响应:
ERROR: <error_no>
参数
- <so_sndtimeo>:
设置
SO_SNDTIMEO
选项以使套接字发送操作在 <so_sndtimeo> 超时时间内返回,无论成功或失败。单位: 毫秒
非负整数
默认值: 0
- <so_rcvtimeo>:
设置
SO_RCVTIMEO
选项以使套接字接收操作在 <so_rcvtimeo> 超时时间内返回,无论成功或失败。单位: 毫秒
非负整数
默认值: 0
- <tcp_nodelay>:
为套接字设置
TCP_NODELAY
选项,以启用或禁用 TCP 连接中的 Nagle 算法。默认值: 0
0: 启用 Nagle 算法
1: 禁用 Nagle 算法
- <so_keepalive>:
为套接字设置
SO_KEEPALIVE
选项,以启用或禁用 TCP 连接中的 keepalive 功能。默认值: 0
0: 禁用套接字保活功能
1: 启用套接字保活功能
- <tcp_keepidle>:
设置
TCP_KEEPIDLE
选项以配置在发送第一个 keepalive 探测包之前的空闲时间,以检查连接是否仍然活跃。单位: 秒
取值范围: [0,7200], 正整数
默认值: 0
- <tcp_keepintvl>:
设置
TCP_KEEPINTVL
选项以配置在未收到响应时,连续 keepalive 探测包之间的时间间隔。单位:秒
取值范围:[0,75], 正整数
默认值: 0
- <tcp_keepcnt>:
设置
TCP_KEEPCNT
选项,以确定在宣布断开连接之前发送多少个未收到响应的探测包。取值范围:[0,10], 正整数
默认值: 0
错误代码
1: 输入参数错误
示例
配置全局选项参数:
AT+SKTCFG=2000,2000,,1,60,10,3
OK
AT+SKTQUERY
功能说明
查询套接字全局选项配置
命令格式
AT+SKTQUERY
响应格式
标准响应:
Global SOCKET configuration:
so_sndtimeo: <套接字发送超时时间>
so_rcvtimeo: <套接字接收超时时间>
tcp_nodelay: <禁用/启用 Nagle 算法>
so_keepalive: <禁用/启用套接字保活功能>
tcp_keepidle: <TCP 保活探测起始时间>
tcp_keepintvl: <TCP 保活探测间隔>
tcp_keepcnt: <TCP 保活探测次数>
OK
错误代码
1: 无需输入参数
示例
查询套接字全局选项默认配置值:
AT+SKTQUERY
Global SOCKET configuration:
so_sndtimeo: 0
so_rcvtimeo: 0
tcp_nodelay: 0
so_keepalive: 0
tcp_keepidle: 0
tcp_keepintvl: 0
tcp_keepcnt: 0
OK
AT+SKTSERVER
功能说明
配置 TCP/UDP/SSL 服务器监听服务
命令格式
AT+SKTSERVER=<link_id>,<conn_type>[,<cert_index>],<src_port>,<auto_rcv>
响应格式
成功响应:
OK
错误响应:
ERROR: <error_no>
参数
- <link_id>:
由用户指定的连接 ID
取值范围: [0, MEMP_NUM_NETCONN-1], 当前在 lwip 库里
MEMP_NUM_NETCONN
被配置成 20
- <conn_type>:
连接类型
0: 基于 UDP 的套接字服务器
1: 基于 TCP 的套接字服务器
2: 基于 TLS 的套接字服务器(提供服务器证书以供客户端验证)
3: 基于 TLS 的套接字服务器(提供服务器证书以供客户端验证, 并且使用 CA 证书来验证客户端证书)
- <cert_index>:
安全证书套件索引编号, 参考 AT 安全证书
取值范围: [1-10]
仅当 <conn_type> 是 2 或 3 时要求输入此参数
- <src_port>:
将要创建的服务器所监听的本地端口
取值范围: [1, 65535]
- <auto_rcv>:
启用/不启用自动接收功能
0: 不启用
1: 启用
错误代码
1: 输入参数错误
2: 创建 TCP 服务端失败
3: 创建自动接收 TCP 客户端连接及自动接收来自所有 TCP 客户端的数据的任务失败
4: 创建 UDP 服务端失败
5: 创建自动接收 UDP 客户端数据的任务失败
6: 从 Flash 中获取 SERVER_CERT/SERVER_KEY/SERVER_CA 失败
7: 内存分配失败
8: 执行 mbedtls_ssl_config_defaults 失败
9: 执行 mbedtls_x509_crt_parse 失败
10: 执行 mbedtls_ssl_conf_own_cert 失败
11: 执行 mbedtls_net_bind 失败
12: 创建自动接收 TLS 客户端连接及自动接收来自所有 TLS 客户端的数据的任务失败
示例
在连接 ID 是 1, 端口号是 1234 上创建带有自动接收功能的 TCP 服务端:
AT+SKTSERVER=1,1,,1234,1
OK
在连接 ID 是 2, 端口号是 4321 上创建不带有自动接收功能的 UDP 服务端:
AT+SKTSERVER=2,0,,4321,0
OK
在连接 ID 是 0, 端口号是 4433 上创建带有自动接收功能的 TLS 服务端(连接类型是 3, 证书索引是 1):
AT+SKTSERVER=0,3,1,4433,1
OK
如果有客户端连接到此 TLS 服务器,日志窗口将弹出未经请求的消息:
[$][SKT][EVENT]: A client[link_id:1,seed,tls,dst_address:192.168.0.103,dst_port:49946] connected to server[link_id:0]
AT+SKTCLIENT
功能说明
建立 TCP/UDP/SSL 客户端连接
命令格式
AT+SKTCLIENT=<link_id>,<conn_type>[,<cert_index>],<dst_host>,<dst_port>[,<src_port>],<auto_rcv>
响应格式
成功响应:
OK
错误响应:
ERROR: <error_no>
参数
- <link_id>:
由用户指定的连接 ID
取值范围: [0, MEMP_NUM_NETCONN-1], 当前在 lwip 库里
MEMP_NUM_NETCONN
被配置成 20
- <conn_type>:
连接类型
0: 基于 UDP 的套接字客户端
1: 基于 TCP 的套接字客户端
2: 基于 TLS 的套接字客户端(不校验证书)
3: 基于 TLS 的套接字客户端(用 CA 证书验证服务器证书)
4: 基于 TLS 的套接字客户端(提供客户端证书以供服务器验证)
5: 基于 TLS 的套接字客户端(双向认证, 包括 3 和 4)
- <cert_index>:
安全证书套件索引编号, 参考 AT 安全证书
取值范围: [1-10]
仅当 <conn_type> 是 3、4 或 5 时要求输入此参数
- <dst_host>:
远程服务器地址
支持 IPv4 地址或域名格式 (例如: 192.168.1.100 或 www.example.com)
域名最大长度是 255 个字符
- <dst_port>:
远程服务器端口
取值范围: [1, 65535]
- <src_port>:
UDP 客户端绑定的本地端口(仅用于 UDP)
取值范围: [1, 65535]
- <auto_rcv>:
启用/不启用自动接收功能
0: 不启用
1: 启用
错误代码
1: 输入参数错误
2: 创建 TCP 客户端失败
3: 创建作为 TCP 客户端自动接收 TCP 数据的任务失败
4: 创建 UDP 客户端失败
5: 创建作为 UDP 客户端自动接收 UDP 数据的任务失败
6: 从 Flash 中获取 CLIENT_CERT/CLIENT_KEY/CLIENT_CA 失败
7: 内存分配失败
8: 执行 mbedtls_ssl_config_defaults 失败
9: 执行 mbedtls_x509_crt_parse 失败
10: 执行 mbedtls_ssl_conf_own_cert 失败
11: 执行 mbedtls_ssl_setup 失败
12: 执行 inet_ntoa_r 失败
13: 执行 mbedtls_net_connect 失败
14: 执行 mbedtls_ssl_handshake 失败
15: 创建作为 TLS 客户端自动接收 TLS 数据的任务失败
示例
在连接 ID 是 1 上创建带有自动接收功能的 TCP 客户端, 去连接 TCP 服务器(IPv4 地址: 192.168.0.100, 端口号: 6666):
AT+SKTCLIENT=1,1,,192.168.0.100,6666,,1
OK
在连接 ID 是 0 上创建带有自动接收功能的 UDP 客户端(端口号: 12345), 连接到 UDP 服务器(IPv4 地址: 192.168.1.10, 端口号: 6666):
AT+SKTCLIENT=0,0,,192.168.1.10,6666,12345,1
OK
在连接 ID 是 5 上创建带有自动接收功能的 TLS 客户端(不校验证书), 去连接 TLS 服务器(IPv4 地址: 192.168.1.10, 端口号: 4433):
AT+SKTCLIENT=5,2,,192.168.1.10,4433,,1
OK
AT+SKTSEND
功能说明
通过指定的连接 ID 发送数据
命令格式
AT+SKTSEND=<link_id>,<data_size>[,<dst_ip>,<dst_port>],<data>
响应格式
成功响应:
OK
错误响应:
ERROR: <error_no>
参数
- <link_id>:
已经成功创建的连接 ID
取值范围: [0, MEMP_NUM_NETCONN-1], 当前在 lwip 库里
MEMP_NUM_NETCONN
被配置成 20
- <data_size>:
用户想要发送的数据字节数
最大值: 由
UART_LOG_CMD_BUFLEN
减去 <data> 域前面的字符数所决定,UART_LOG_CMD_BUFLEN
最大值是 2000, 参考 配置 SDK(menuconfig) 进入CONFIG AT CMD
配置并且勾选Enable Longer CMD
, 参考 命令长度 了解指令长度相关介绍
- <dst_ip>:
目标 IPv4 地址(仅用于 UDP 服务器)
例如: 192.168.1.100
- <dst_port>:
目标端口号(仅用于 UDP 服务器)
取值范围: [1, 65535]
- <data>:
要发送的实际数据,长度由 <data_size> 指定
错误代码
1: 输入参数错误
2: 发送数据失败
示例
TCP 客户端(连接 ID 是 0)发送数据给 TCP 服务器:
AT+SKTSEND=0,6,,,Hello!
OK
UDP 服务器(连接 ID 是 3)发送数据给 UDP 客户端(IPv4 地址: 192.168.1.101, 端口号: 61409):
AT+SKTSEND=3,10,192.168.1.101,61409,Lwip_Test!
OK
TLS 服务器(连接 ID 是 1)发送数据给 TLS 客户端(连接 ID 是 2):
AT+SKTSEND=2,5,,,12345
OK
AT+SKTREAD
功能说明
从指定连接 ID 读取缓存数据
命令格式
AT+SKTREAD=<link_id>,<data_size>
响应格式
成功响应:
+SKTREAD:<link_id>,<actual_recv_size>[,<udp_dstip>,<udp_dstport>],<data>
OK
错误响应:
ERROR: <error_no>
参数
- <link_id>:
已经成功创建的连接 ID
取值范围: [0, MEMP_NUM_NETCONN-1], 当前在 lwip 库里
MEMP_NUM_NETCONN
被配置成 20
- <data_size>:
用户想要读取的数据字节数
- <actual_recv_size>:
实际读取到的数据字节数
- <udp_dstip>:
目标 UDP 客户端/服务器的 IPv4 地址(仅用于 UDP)
例如: 192.168.1.100
- <dst_port>:
目标 UDP 客户端/服务器的端口号(仅用于 UDP)
取值范围: [1, 65535]
- <data>:
已经读取到的实际数据,长度由 <actual_recv_size> 给出
错误代码
1: 输入参数错误
2: 内存分配失败
3: select()失败
4: 读取数据失败
示例
TCP 服务器(连接 ID 是 0)从 TCP 客户端(连接 ID 是 1)读取数据:
AT+SKTREAD=1,10
+SKTREAD:1,6,Hello!
OK
UDP 服务器(连接 ID 是 3)从 UDP 客户端(IPv4 地址: 192.168.1.101, 端口号: 61409)读取数据:
AT+SKTREAD=3,10
+SKTREAD:3,5,192.168.1.101,61409,12345
OK
TLS 客户端(连接 ID 是 2)从 TLS 服务器读取数据:
AT+SKTREAD=2,10
+SKTREAD:2,3,ABC
OK
AT+SKTSENDRAW
功能说明
在透传模式下通过指定的连接 ID 发送数据
参考 配置 SDK(menuconfig) 进入 CONFIG AT CMD
,配置并且勾选 Host Control Mode
,接着参考关于 透传(TT)模式 的介绍。
备注
这条指令仅支持在 主控控制模式 下使用。
命令格式
AT+SKTSENDRAW=<link_id>,<data_size>[,<dst_ip>,<dst_port>]
响应格式
成功响应:
>>>
<data>
OK
错误响应:
ERROR: <error_no>
参数
- <link_id>:
已经成功创建的连接 ID
取值范围: [0, MEMP_NUM_NETCONN-1], 当前在 lwip 库里
MEMP_NUM_NETCONN
被配置成 20
- <data_size>:
用户想要发送的数据字节数
用户任意指定的数据大小
- <dst_ip>:
目标 IPv4 地址(仅用于 UDP 服务器)
例如: 192.168.1.100
- <dst_port>:
目标端口号(仅用于 UDP 服务器)
取值范围: [1, 65535]
- <data>:
要发送的实际数据,长度由 <data_size> 指定
错误代码
1: 输入参数错误
2: 发送数据失败
3: 内存分配失败
4: 在透传(TT)模式下获取数据失败
示例
TCP 客户端(连接 ID 是 0)发送数据给 TCP 服务器:
AT+SKTSENDRAW=0,6
>>>
Hello!
OK
UDP 服务器(连接 ID 是 3)发送数据给 UDP 客户端(IPv4 地址: 192.168.0.103, 端口号: 61468):
AT+SKTSENDRAW=3,10,192.168.0.103,61468
>>>
Lwip_Test!
OK
TLS 服务器(连接 ID 是 1)发送数据给 TLS 客户端(连接 ID 是 2):
AT+SKTSENDRAW=2,5
>>>
12345
OK
AT+SKTSTATE
功能说明
查询所有激活的连接 ID 状态信息
命令格式
AT+SKTSTATE
响应格式
标准响应:
link_id:<link_id>,<role>,<protocol>,src_address:<ip>,src_port:<port>,dst_address:<ip>,dst_port:<port>,socket_fd:<fd>
OK
参数
- <link_id>:
已经成功创建的连接 ID
取值范围: [0, MEMP_NUM_NETCONN-1], 当前在 lwip 库里
MEMP_NUM_NETCONN
被配置成 20
- <role>:
字符串格式
server
client
seed
- <protocol>:
字符串格式, 对应连接 ID 所使用的协议
tcp
udp
tls
- <ip>:
IPv4 地址(例如: 192.168.1.100)
- <port>:
端口号
取值范围: [1, 65535]
- <fd>:
由 lwip 库创建的 socket fd 值
示例
假设创建了一个 TCP 服务器(连接 ID 是 0)及连接到此服务器的 TCP 客户端(连接 ID 是 3),一个 UDP 服务器(连接 ID 是 1),一个 TLS 客户端(连接 ID 是 2):
AT+SKTSTATE
link_id:0,server,tcp,src_address:192.168.0.109,src_port:6666,dst_address:0.0.0.0,dst_port:0,socket_fd:0
link_id:3,seed,tcp,src_address:0.0.0.0,src_port:0,dst_address:192.168.0.103,dst_port:49941,socket_fd:3
link_id:1,server,udp,src_address:192.168.0.109,src_port:12345,dst_address:0.0.0.0,dst_port:0,socket_fd:1
link_id:2,client,ssl,src_address:0.0.0.0,src_port:0,dst_address:192.168.0.103,dst_port:4433,socket_fd:2
OK
AT+SKTDEL
功能说明
删除指定的连接 ID
假设连接 ID 对应于一个客户端,这条指令的执行仅仅只会删除连接 ID 本身
假设连接 ID 对应于一个服务器,这条指令的执行会删除此连接 ID 对应的服务器以及连接到此服务器的所有客户端
命令格式
AT+SKTDEL=<link_id>
响应格式
成功响应:
OK
错误响应:
ERROR: <error_no>
参数
- <link_id>:
已经成功创建的连接 ID
取值范围: [0, MEMP_NUM_NETCONN-1], 当前在 lwip 库里
MEMP_NUM_NETCONN
被配置成 20
错误代码
1: 输入参数错误
示例
假设创建了一个 TCP 服务器(连接 ID 是 0)及连接到此服务器的 TCP 客户端(连接 ID 是 3),一个 UDP 服务器(连接 ID 是 1),一个 TLS 客户端(连接 ID 是 2):
AT+SKTSTATE
link_id:0,server,tcp,src_address:192.168.0.109,src_port:6666,dst_address:0.0.0.0,dst_port:0,socket_fd:0
link_id:3,seed,tcp,src_address:0.0.0.0,src_port:0,dst_address:192.168.0.103,dst_port:49941,socket_fd:3
link_id:1,server,udp,src_address:192.168.0.109,src_port:12345,dst_address:0.0.0.0,dst_port:0,socket_fd:1
link_id:2,client,ssl,src_address:0.0.0.0,src_port:0,dst_address:192.168.0.103,dst_port:4433,socket_fd:2
OK
现在用户想要删除连接 ID 是 0 的 TCP 服务器,然后使用 AT+SKTSTATE 去查看连接状态,可以看到连接到此服务器的客户端(连接 ID 是 3)也被一起删除:
AT+SKTDEL=0
OK
AT+SKTSTATE
link_id:1,server,udp,src_address:192.168.0.109,src_port:12345,dst_address:0.0.0.0,dst_port:0,socket_fd:1
link_id:2,client,ssl,src_address:0.0.0.0,src_port:0,dst_address:192.168.0.103,dst_port:4433,socket_fd:2
OK