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