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