开发者学堂课程【嵌入式之 RFID 开发与应用2020版:NB-IoT 通信之 TCP 收发数据 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11194
NB-IoT 通信之 TCP 收发数据
内容介绍:
一、 TCP 发送数据
二、 TCP 接收数据
三、小结
一、TCP 发送数据
直接看这个数据手册中 TCP 的发送流程:TCP 通信是在 UDP 的基础上只需要改动一些内容。首先 AT+NSOCR 是一样的,只需要把后半部分改为 STREAM,协议号改为 6;端口无具体要求, TCP 和 UDP 的端口是不冲突的,后面的还是设置只能接收。
对于 TCP 通信和 UDP 通信来说,学过网络编程的都知道,它最大的区别就是 TCP 是面向连接的,在发送数据之前一定要先连接上去。所以需要有一个连接指令,连接指令
就是 AT+NSOCO=? 。这里暂时写作 AT+NSOCO=1。把已有的连接的服务器、端口号 171.216.69.114.8088 给复制一下单独拿出来。
该情况下表示连接成功:如果返回的这个值为 connect ok 就表示连上了,连上了之后才能够去发数据。而且这个时候发的数据用户指令叫做 NSOSD 。IP 就不要了,因为在连接的时候已经指定过IP和端口了,连接之后就只写数据就好。
TCP 会用的多一些,因为 UDP 不太可靠, 相比较而言 TCP 是可靠的。
1.发送 TCP 数据
向目的 TCP 地址发送数据使用 +NSOSD 命令,发送之前需要首先保证与远程服务器的连接成功, AT 命令如下,
AT+NSOSD=,<length>,<data>[,<flag>[,sequence]]
例如:
AT+NSOSD=110.303132333435363738394
//发送数据 0123456789, 发送号为 4
1,10 1# Socket 成功发送 10 BvtesTCP 数据
OK
这里两个参数可以不用填,打两个逗号省略掉就可以;还有一个就是发送的序列号,序列号填5、填6、填7、填8都可以,只是建议大家每包数据中不要填成一样的,就是要有所区分。
TCP 的接收数据的过程跟 UDP 是一样的,这里就不再重复,包括关闭也都是一样的,会了 UDP , TCP 自然而然就也会了。
接下来看看 TCP 的 server,server 不是今天要讨论的重点,UDP server 在发送数据的时候,独立发数据就有点问题。对于 TCP 也是一样的,创建套节制,然后监听这个端口,绑定然后设置监听队列,其中这里最多监听同时接入 30 个设备;接下来就开始鉴定了,提取连接的客户端 accept。首先是把它放到队列,然后把这个连接的客户端的信息给打印出来,比如说客户端的具体 IP、端口。
有关连接的客户端的数据收发,就交给了一个线程去做。
pthread create &threadid NULLclient process (void*)&
connfd);
pthread detach(thread id);/*
那 process 处理户端的这个数据,比如处理的时候从这个队列当中提取出一个文件描述符,然后去接收这个客户端的数据,接收之后把数据给打印出来,接下来把收到的数据以原样的形式再发回去。但是如果收到的数据是 bye bye,那就表示这个客户端就不能再出现了,即服务器断开了。但服务器是不断开的,这个跟 UDP 不太一样, UDP 是谁都可以给他发,哈因为他是面向无连接的,发完就不认识了。但是 TCP 的话,是有三次握手的,必须要说分才分,不说分是不分开的,一直建立起这种同性关系,即会有一个断开连接的过程.
同理,把这个服务器跑起来,刚才没有去讲编译,因为编译很简单,即 gcc-o;tcp_server; tcp _server.c-lpthread
变完后直接运行,跑一下就可以了。
二、TCP 接收数据
再来看另一边,首先第一步要创建套接字,点一下后又返为 1,也就是它这个系统ID 还是 1;第二步是连接服务器,连接跟发送据是两回事,稍等一下再看服务器这边,服务器这边还没有,能够看到 connect ok 则说明连接成功了,而服务器这边也打印出连接终端的信息。
TCP 的连接的这个时间就比 UDP 要长一些,这就是因为他要有三次握手,所需的时间就要长一点。当终端看到 CONNECT OK 的时候才能发出去,如果没有耐心的等待这段时间,数据是发不出去的。修改一下数据,改成 33 和 34。这里还是三个字节,然后这里后边的 5 是序列号。点一下发送,即发送了三个字节,新的 ID 是1。另一边收到了 34,其中必须要有这个提示 NSONMI,表示收到了三个字节,只有通过了这个新的 ID 维系,才能够点这个去接收。
本条是来自于这个服务器的端口。那这就是 TCP 的,通过这个方式一样可以断开。先不断开,再改一个内容,我们的服务器它可以收到 exit ,exit 的值可以查一下:
首先,e 为 16 进制 65;x 为 78;i 为 69;t 则是 74。即长度为 Exit 四个字节加一个结束符,一共五个字节。那这个序列号就改成 6,就跟上层包数据有个区分。再一次发送五个字节的数据。发完这个之后就退出了,就 break 了,然后就 close connect,服务器就断开了。再次确认,通过我们的信道 ID1 发了 5 个字节,看看服务器这边什么时候能收到这 5 个字节。而且收到了之后它就断开了,即再发数据就会失败。收到 exit 而且打印了 bye bye ,那也就是说服务器跟客户端这个时候就已经断开了,而且其实 NSOCLI 即为断开标志。已经断开了,再发数据就是错的,即 error了。点和不点都是可以的,就是都表示已经跟服务器断开,但是服务器跟客户端断开了,并不代表这个服务器不能接受别的数据。比如再创建再连接,还是可以的,服务器还是在运行着的。
三、小结
这就是 TCP 的通信, UDP 通信基本上就是三步; TCP 通信就多了一步,而且 TCP 通信更可靠一些。PPT 上没有专门讲,直接看这个数据手册就好。中途如果说希望看到更多的调试信息的话,j即可按照以下指令输入:
1. AT+CMEE=1 (开启详细错误提示
>返回: OK
2. AT+NSMI=1(数据发送成功通知)
>返回: OK
3. >AT+NCDP=120.55.96.180,5683 (连接云平台申请成功的服务器,一般运营商会将此信息发送到申请者邮箱)
4. AT+NCDP?( 查看连接成功的IP和端口)
>返回:连接成功的 IP 和端口 120.55.96.180,5683
5. AT+NMGS=3,464748 (向服务器发送3字节数据
6. AT+NQMGS (查询发送状态)
>返回: PENDING=0,SENT=7,ERROR=0 呢就要把这个加上 At 加上 CM1 的东西