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