六 Direct Socket (命令行)模式
在直接套接字模式下,可以很方便的实现一对多通信,作为服务器的模块可以开两个监听端口,并且每个端口允许最多10个客户端进行连接。因为我手头上只有两个模块,只能进行一个服务器与一个客户端进行数据通信,
将模块A设置成服务器,将模块B设置成客户端 ,
6.1 服务器端设置
第一步:
在一对多模式下,服务器端首先打开监听端口,打开监听端口的命令是AT+iLTCP:<port>,<backlog> 在本地IP地址和指定端口<port>上打开一个TCP监听端口。<backlog>设定允许同时通过监听套接口的远程连接的最大数目。参数:<port> = 0..65535 <backlog> = 1..10
命令选项:
<port> 在连接到Internet控制器上时远程系统使用的监听端口。
<backlog> 设定通过监听套接口建立的活跃的最大同时连接数。一旦监听套接口打开,它将自动接受远程系统的连接请求,直到达到所允许的最大数目。当一个远程系统通过监听套接口建立连接的时候,在内部将产生一个新的TCP套接口,并且准备接收和发送数据。参阅AT+iLSST命令以获取有关重新获取通过监听套接口连接的活跃套接口的句柄的详细信息。当连接套接口关闭的时候,监听套接口将允许新的连接代替它。模块打开监听端口1024,设置同时能有三个客户端连接监听端口,设置如下:
AT+iLTCP:1024,3
I/010
结果代码:
I/<sock handle> 在成功打开一个TCP监听套接口后,将返回一个套接口句柄。该套接口句柄<sock handle>范围是10..11并用于在后面的所有套接口命令中引用该套接口。可以再打开一个监听端口,返回监听套接口,如果010已经分配,则分配011,设置如下:
AT+iLTCP:1024,3
I/011
第二步:
设置完监听端口,获得监听套接口之后,就可以进一步获取一个监听端口的活跃连接状态,通过命令AT+iLSST:<hn> ,获取通过<hn>设定的套接口建立的活跃的套接口连接的句柄。
<hn>就是AT+iLSST命令返回的套接口,如10或者11,对模块A获取活跃的套接口的连接句柄如下:
AT+iLSST:10
I/(-1,-1,-1)
结果代码:I/(<hn1>,…,<hnBacklog>) 活跃套接口句柄列表。该列表包括所有<backlog>元素。<backlog>用于在打开<hn>识别的监听套接口之时。<hni> >= 0:活跃的连接的套接口句柄。= -1:无连接建立。上面返回的三个活动连接句柄都没有建立客户连接,如果有一个客户端已经连接上服务器,返回如下:
AT+iLSST:10
I/(000,-1,-1)
如果有多个客户端连接到服务器的监听端口,比如有三个客户端套接口连接到监听端口,如下:
AT+iLSST:11
I/(000,001,002)
可以通过AT+iGPNM命令根据连接的套接口获取客户端的IP和连接的端口,如下:
AT+iGPNM:0
I/(192.0.0.2:1249)
连接的套接口0的客户端的IP是192.0.0.2:,端口是1249,连接的套接口2的IP和端口如下:
AT+iGPNM:2
I/(192.0.0.2:1251)
套接口2的客户端的IP是192.0.0.2,端口是1251。
通过以上两个步骤,打开监听端口,获得客户端连接的套接字接口,然后再通过AT+iSST和AT+iSCS这两个命令查询套接口的状态和连接状态,如果这两个状态满足要求,就可以与客户端进行通信了。AT+iSST和AT+iSCS这两个命令同样适用于客户端,故在下面客户端设置的时候讲解。
6.2 客户端设置
第一步:
客户端首先打开一个tcp套接口或者UDP套接口,去连接服务器端的监听接口,在这里我们打开一个TCP套接口去连接服务器模块A的套接口,打开一个TCP套接口的命令是AT+iSTCP:<host>,<port>[,<lport>],该命令是打开一个TCP(传输控制协议)客户端套接口并尝试将它连接到<host>指定的服务器的指定<port>。<host> =目标服务器的逻辑名称或主机的IP地址。<port> = 0..65535,目标端口,<host> 服务器名可以是任何合法的Internet服务器名,它可以被Internet控制器的DNS(域名服务器)解析。服务器名也可以设定为DOT表格中指定的绝对IP地址。<port> 假定服务器系统正在“监听”某个端口
如果服务器端的监听端口没有打开,则会返回错误207或者074,如下:
AT+iSTCP:192.0.0.2,1024
I/ERROR (207)
该错误是Error creating socket,或者如下的错误
AT+iSTCP:192.0.0.1,1024
I/ERROR (074)
该错误是Modem connection with ISP lost -or WLAN connection lost,可以通过ping命令,去ping服务器是否能ping得通,如下:
AT+iPING:192.0.0.1
I/(0004)
AT+iPING命令而等待答复n毫秒,以上的返回是等待返回用了4毫秒,如果ping不同,如下:
AT+iPING:192.0.0.4
I/ERROR (571)
返回值571,是没有接收到应答。
如果服务器监听接口已经打开,并且连接的服务器IP和端口都是正确的,连接上服务器,则会如下:
AT+iSTCP:192.0.0.1,1024
I/000
返回的结果:I/<sock handle> 成功打开TCP端口并将它连接到<host>:<port>之后将返回一个套接口句柄。套接口句柄<sock handle>的适用范围是从0到9,并用于在后面所述套接口命令中引用这些套接口。一个客户端可以同时开启10个套接口与服务器相连,这10个端口可以与不同是服务器相连。比如继续用
AT+iSTCP:192.0.0.1,1024与服务器相连,依次会打开1~9的端口,如下:
AT+iSTCP:192.0.0.1,1024
I/001
继续打开一个套接口:
AT+iSTCP:192.0.0.1,1024
I/002
第二步:
当客户端打开一个套接口后,就可以进一步获取这个套接口的活跃状态,在满足要求的情况下,就可以向服务器端发送,接收数据了,需要满足套接口存在,并且套接口连接存在,无错误。第一个条件是查询一个套接口的状态,命令是AT+iSST:<hn> 重新获取一个单个套接口的状态报告。它是总AT+iRP4报告命令的子集。参数:<hn> = 一个TCP/UDP套接口句柄。<hn>就是AT+iSTCP命令的返回结果,如上正确返回的是I/000,则<hn>就是0,命令如下:
AT+iSST:0
I/(000)
结果代码::I/(<sockstat>) 其中,<sockstat> >= 0:套接口<hn>的输入缓冲中未决字节数, < 0 : 套接口错误代码。I/ERROR 如果出错。000表明是输入缓冲区没有未决字节数。如果返回值小于0,比如-200,则所指定的套接口不存在,比如:
AT+iSST:2
I/(-200)
上面的是套接口2不存在。可以继续查看套接口1或者2的情况:
AT+iSST:1
I/(000)
查看所有套接口的0~9的情况,用命令AT+iRP4,如下:
AT+iRP4
I/(000,000,000,-200,-200,-200,-200,-200,-200,-200)
以上的结果显示打开了0,1,2三个套接口,并且三个套接口未决字节数都是0。
第三步:
在获得一个单独的套接口状态之后,需要继续查询这个套接口的连接状态,查询一个套接口的连接状态的命令是AT+iSCS:<hn> ,获取一个套接口的连接状态报告。<hn>必须在当前Internet模式会话期间被前一个AT+iSTCP或AT+iSUDP命令获取。或一个被监听套接口接受的套接口。在客户端用AT+iSTCP或AT+iSUDP,因为我们是用TCP套接口,所以是AT+iSTCP的返回值,比如查询套接口0的连接状态,如下:
AT+iSCS:0
I/(000)
结果代码:I/(<sockstat>) 其中,<sockstat> = 000:套接口被连接并且没有出现相关错误。 < 0:套接口错误代码。
获取套接口1的连接状态如下:
AT+iSST:1
I/(000)
通过以上三步,获得TCP套接口,并查询套接口和套接口的连接状态,满足条件,之后就可以进行数据通信了。
6.3 服务器和客户端的数据通信
服务器通过命令AT+iLTCP打开监听端口,并通过AT+iLSST获得监听端口的连接套接字情况,客户端通过命令AT+iSTCP建立连接服务器端口的套接字,服务器和客户端都通过AT+iSST和 AT+iSCS获得套接字状态和连接状态。状态满足条件就可以互相发送数据了。对于一个模块既可以做为为服务器,也可以作为客户端,也可以同时作为服务器和客户端。
以下的数据发送接收命令对于服务器和客户端来说都是相同的。
数据发送命令:
向套接口发送字节流的命令是:AT+iSSND[%]:<hn>,<sz>:<stream>,向套接口句柄<hn>指定的套接口发送一个<sz>大小的字节流,参数:
<hn> = 一个打开的套接口的TCP/UDP套接口句柄
<sz> = 其后的字节流的具体大小。
<stream> = 发送给指定套接口的<sz>大小的字节流。
<hn>必须在当前Internet模式会话期间被前一个AT+iSTCP或AT+iSUDP命令获取。或一个被监听套接口接受的套接口。
<sz> 0..4GB.
<stream> 一个8位<sz>大小的字节流。如果<sz>大于256字节,Internet控制器将采取主机流控制。根据FLW参数的设置,流控制模式或是软件或是硬件。在软件流控制模式下,主机处理器必须响应Internet控制器的流控制字符。软件流控制和硬件流控制可以参看模块的datasheet,
‘%’ 标记 当自动刷新(‘%’)标记被设定的时候,套接口在接收到<stream>后立即自动刷新。否则,数据将只在达到指定MTU(最大传输单元)的量或者当发出AT+iSFSH命令的时候才被传输到Internet上。
为了让套机口收到字节流后自动发送,我们使用AT+iSSND%命令,比如通过套接口0发送5个字节的字节流apple,如下:
AT+iSSND%:0,5:apple
AT+iSSND%:0,5:I/OK
结果代码:
I/OK 在<sz>大小的字节被成功传送到套接口的输出缓冲之后。
接收的对方可以通过AT+iRP4获得套接口未处理的字节数,如下:
AT+iRP4
I/(005,000,000,000,-200,-200,-200,-200,-200,-200)
以上返回的5,表明套接口0有5个字节的数据未处理。如果再通过套接字2给对方发送4个字节的字节流wang,如下:
AT+iSSND%:2,4:wang
AT+iSSND%:2,4:I/OK
接收端查询会得到:
AT+iRP4
I/(005,000,004,000,-200,-200,-200,-200,-200,-200)
如果通过AT+iSSND不带%相套接口发送数据,套接口是不会把数据通过无线发送出去的,必须通过AT+iSFSH才能将套接口缓冲区的数据发送出去。AT+iSFSH详细如下:
AT+iSFSH[%]:<hn> 立即输出套接口输出缓冲中积累的所有数据。
参数:<hn> = 一个打开的套接口的TCP/UDP套接口句柄。
命令选项:
<hn>必须在当前Internet模式会话期间被前一个AT+iSTCP或AT+iSUDP命令获取。或一个被监听套接口接受的套接口 。‘%’标记 当清除并确认(‘%’)标记被设定并且<hn>是一个TCP套接口句柄之时,Internet控制器将立即发出并等待对等机对所有
输出数据的接收确认。
例如通过命令AT+iSSND将数据发送给套机口,这时数据并未通过无线将数据发送出去,就可以利用AT+iSFSH或者AT+iSFSH%将数据发送出去,带有%的命令是等待输出数据的接收确认。
如下通过套接口3将13个字节的wangtingguang发送到套接口的缓冲区,如下:
AT+iSSND:3,13:wangtingguang
AT+iSSND:3,13:I/OK
通过AT+iSFSH发送,如下:
AT+iSFSH:3
I/OK
接收方查询3套接口的状态如下:
AT+iSST:3
I/(013)
表明接收到13个字节的数据,并且未处理。下面讲解如何接收数据。
数据接收命令:
当通过AT+iSST或AT+iRP4获得套接口中有未处理的数据时,可以通过AT+iSRCV接收数据,从套接口的输入缓冲接收字节流:AT+iSRCV:<hn>[,<max>] 从套接口句柄<hn>指定的TCP/UDP套接口接收字节流。只有当在发出该命令的时候接收数据已经存在于Internet控制器的套接口输入缓冲中,该数据才是有效的。
参数:
<hn> = 一个打开的套接口的TCP/UDP套接口句柄。
<max> = 可选择地设定要传输的最大字节。执行本命令之后多余字节将停留在套接口输入缓冲中。
命令选项:
<hn>必须在当前Internet模式会话期间被前一个AT+iSTCP或AT+iSUDP命令获取。或一个被监听套接口接受的套接口。
<max> 如果<max>尚未设定,所有存在于套接口输入缓冲中的可用字节都将被返回。
例如接收套接口0缓冲区中的数据如下:
AT+iSRCV:0
I/5:apple
返回结果:I/<sz>[:<binary data stream>] 其中,<sz>是二进制数据流的准确大小。如果套接口输入缓冲是空的,Internet控制器将返回I/0。在这种情况下‘:’和<binary data stream>被忽略。
关闭套接口:
当套接口不用时,关闭套接口的命令是:AT+i[!]SCLS:<hn> 关闭一个TCP/UDP套接口。如果该套接口是唯一打开的套接口,并且没有设定保持在线标记(‘!’),Internet控制器将终止Internet会话并下线。
参数:<hn> = 一个打开的套接口的TCP/UDP套接口句柄。
命令选项:
<hn> 必须在当前Internet模式会话期间被前一个AT+iSTCP或AT+iSUDP命令获取。或一个被监听套接口接受的套接口。套接口将总在关闭之前清空。TCP套接口将按顺序从远程主机服务器断开连接。! 完成命令之后保持在线。
例如关闭套接口1的如下:
AT+iSCLS:1
I/OK
I/ONLINE
查询套接口的状态如下:
AT+iRP4
I/(000,-200,000,013,-200,-200,-200,-200,-200,-200)
-200说明套接口1已经关闭
两模块的命令传输模式的调试窗口如下: