【OpenCPU】ML307A-DCLN|UDP及TCP使用介绍

菩禔看科技 2024-04-24 00:39:45

UDP及TCP使用

UDP/TCP是物联网通信中常用的一种基础通信协议,是TCP/IP协议的核心。其中TCP是面向连接、可实现端到端可靠数据包发送;UDP是无连接的,无超时重发机制,数据流传输不完全可靠,但传输速度比TCP更快。本文从使用流程、SDK demo测试、TCP测试示例和常见问题四个方面介绍了如何快速实现ML307A模组的UDP/TCP双向通信功能。

一、UDP/TCP通信示例流程

二、SDK demo测试

SDK本身有UDP/TCP测试示例,下面我们通过烧录demo固件进行测试演示。

2.1 连接服务器

(1) 模组上电开机,等待初始化完成。当串口打印”please input cmds:”后,通过串口输入:

CM:ASOCKET:OPEN:0

其中,OPEN后面的参数0代表测试TCP连接;如果配置其它非0值则代表测试UDP连接。

(2) 上述指令执行后,通过串口可以观察到模组开始运行TCP测试用例,日志如下:

__on_eloop_cmd_OPEN_recv_event type=0

sock(3) open

sock(3) open request success, wait connect...

sock(3) connect_ok

sock(3) recv_ind: recv_avail=38, recv_len=38, data=

221.178.126.121:31893 CONNECTED OK

其中,sock括号中的3代表socket id值。

2.2 向服务器上报数据

(1) 服务器连接成功后,通过串口输入:

CM:ASOCKET:SEND:3

其中,3代表上面创建的socket id,即向该socket发送数据。

(2) 上述指令执行后,通过串口可以观察到模组开始运行TCP测试用例,日志如下:

CM:ASOCKET:SEND:3

cm_test_asocket_cmd len=4

cmd[0]=CM,cmd[1]=ASOCKET,cmd[2]=SEND

__on_cmd_SEND sock=3

OK

please input cmds:

__on_eloop_cmd_SEND_recv_event sock=3

sock(3) send len=5

sock(3) send_ind

其中,send_len代表发送数据内容长度为5,因为demo调用的发送数据示例是cm_asocket_send(sock, "hello", 5, 0)。

(3) 通过TCP服务器观察模组上报的数据,内容如下:

2.3 服务器下发数据

(1) 通过TCP服务器给模组下发数据,数据内容为ABCD:

(2) 通过串口可以观察到模组打印服务器下发数据,内容如下:

sock(3) recv_ind: recv_avail=4, recv_len=4, data=ABCD

三、TCP 测试示例介绍

本小节通过建立TCP连接、向服务器发数据、接收服务器下行数据为例,进行代码举例说明。

3.1 建立TCP连接

(1) 创建socket

(2) 配置TCP服务器IP和端口

(3) 建立TCP连接

(4) 运行结果

tcp init begins:

socket_id3 create sucess!

[TCPCLIENT]tcp connect ok

receiving data...

data received ...

socket3 Data Arrives:36

218.204.253.98:3940 CONNECTED OK

3.2 向TCP服务器上报数据

(1) 通过select阻塞检测TCP事件

(2) 当检测到tcp_writefds,同时error没有错误,代表可以向服务器发送数据

其中,上述代码获取队列数据,队列数据通过串口3输入,并将数据通过cm_custom_tcp_send发出。

(3) cm_custom_tcp_send函数实现

(4) 运行结果

通过串口输入Hello,Word!

服务器打印[2023-5-13 20:47:081 Hello.Word!

3.3 接收TCP服务器下行数据

(1) 通过select阻塞检测TCP事件

(2) 当检测到tcp_readfds,进入cm_socket_receive_callback回调处理数据

(3) cm_socket_recive_callback通过recvfrom接口处理下行数据

其中,代码增加了数据双重判断以提高数据接收完整性。

(4) 运行结果

通过TCP服务器下发数据This is a TCP test!

模组主串口打印:

receiving data...

data received ...

socket3 Data Arrives:19

This is a TCP test!

四、常见问题

1、哪些情况会导致连接TCP服务器失败?

(1) 模组没有注册上4G网络时,发起TCP连接会失败;

(2) 专网卡默认只能连接定向IP和端口,使用专网卡连接其他TCP服务器会失败。

2、服务器下发2K数据,为什么模组会分2包打印?

TCP是以段为单位发送数据的。建立TCP连接后,有一个最大消息长度(MSS),如果应用层数据包超过MSS,就会把应用层数据拆分,分成两个段来发送。这种情况下,应用层要拼接这两个TCP包才能正确处理数据。一般TCP的MSS为1460字节。

3、选用select接口判断socket状态,为什么会出现其它线程无法执行现象,例如上行数据无法发送,或者串口线程无法接收数据?

select接口的第五个参数为timeout超时时间,如果设定为NULL(custom_tcp_result = select(socket_id + 1, &tcp_readfds, &tcp_writefds, &tcp_errorfds, NULL)),线程会快速重复遍历socket接收、发送和错误状态,这种情况下CPU会一直执行select接口,无法释放CPU资源,因此导致其他线程无法执行。针对此现象,可以通过在select执行完后增加osDelay系统延时解决。





转载自中移物联网,仅供模组品牌对应于中移物联网模组体系参考。

声明:《菩禔物联》所发表内容均为原创,所有原创内容仅用于交流,不代表任何立场和观点。极少数优才文章注明来源的,版权归原出处所有(无法查证版权的或未注明出处的均来源于网络搜集)。如有侵权,请联系我们删除或更改。内容的真实性、准确性和合法性由原作者负责。转载内容(视频、文章、广告等)只以信息传播为目的,仅供参考,不代表本平台认同其观点和立场。

The content published in the Bodhi Union of Things is original, and all original content is for communication purposes only and does not represent any position or viewpoint. A very small number of excellent talent articles indicate their source, and the copyright belongs to the original source (those that cannot be verified or whose source is not indicated are all collected online). If there is any infringement, please contact us to delete or make changes. The authenticity, accuracy, and legality of the content are the responsibility of the original author. The reprinted content (videos, articles, advertisements, etc.) is only for the purpose of information dissemination and is for reference only. It does not mean that this platform agrees with its views and positions.

0 阅读:0

菩禔看科技

简介:感谢大家的关注