ML307R_APP_DEMO_SDK TCP/UDP使用介绍

server/2024/10/18 22:31:05/

ML307R_APP_DEMO_SDK是在ML307R_OpenCPU_Standard_SDK标准代码基础上,新增了面向用户APP层的demo示例,标准代码中examples的示例代码不同,app_demo实现了联网自动化,数据透传,各功能可独立自动运行,并对用户常用参数进行提取,用户只需简单修改参数后即可实现数据透传、FOTA升级等功能。

本篇文章介绍了ML307R_APP_DEMO_SDK中关于TCP/UDP连接实现部分,主要从代码框架、demo测试和常见问题三个方面介绍了如何快速实现ML307R模组的UDP/TCP双向通信功能。

一、代码框架

TCP/UDP使用流程主要参考SDK中hal_asocket.h、hal_asocket.c、app_demo_asocket.h、app_demo_asocket.c相关文件,实现方式为将ML307R原生cm开头的asocket相关函数抽象和封装到hal中间层文件里,再基于中间件完成app_demo应用层开发。

函数

功能

hal_asocket.h

中间件文件,基本函数介绍

hal_asocket.c

中间件文件,功能函数调用

app_demo_asocket.h

应用层文件,建立asocket透传接口

app_demo_asocket.c

应用层文件,介绍具体透传示例

以下是对TCP/UDP的基本流程代码的介绍。

    1. asocket初始化

1、调用hal_asocket_init进行asocket初始化,先创建s_asocket_mutex互斥锁保护资源不被占用,确保初始化的完成。接着对socket_number进行遍历查找,选定最终需要建立的socket_number号。如果没有其他socket建立,默认从0路开始。

2、初始化消息队列和任务线程用于任务通信和处理socket消息。配置socket连接初始参数,如服务器地址、类型、端口号、超时时间和重连时间等。

3、创建eloop连接事件,添加到事件循环,最后释放互斥锁完成socket初始化操作。

cm_asocket_eloop()底层已经为asocket创建了eloop线程,无需自行创建

eloop功能:可以理解为底层为上层应用开发的一个事件组,用户的操作放入eloop可以安全地被执行,eloop为异步执行。

1.2 建立asocket连接

调用hal_asocket_event_connect建立ascocket连接,主要实现方式如下

  1. param转换为指针socket_info便于后续判断操作,校验确定socket_number不小于0,然后调用inet_aton函数对服务器地址server进行转换。

2、如果转换成功返回值大于0,则说明该地址为数字IP地址,可进行后续socket_open_event事件发布,建立socket连接;如转换返回0,则说明该地址为域名,此时需要调用hal_asocket_event_dns进行DNS解析,解析成功后再建立socket连接。

1.3 数据发送

1、调用hal_asocket_send函数进行数据发送操作,首先对asocket的连接参数进行检查,检查完毕后使用cm_malloc对socket_data进行内存分配,接着配置内存初始化。

2、将socket_data放入send_queue消息队列中并注册事件socket_send_event,这一步作用为在事件循环中调用hal_asocket_event_send 函数并传参,最后将 socket_send_event 发布到事件循环,完成整个数据发送操作。

1.4 事件处理

hal_asocket_event部分主要处理asocket连接过程中出现的各种事件,主要为连接成功、连接失败、接收数据的回调等,主要如下

连接成功:停止重连定时器,并通知连接成功。

连接失败:通知连接失败,并启动重连定时器。

接收数据:调用 cm_asocket_ioctl 获取可读数据长度,并调用 cm_asocket_recv 接收数据如果接收成功,调用回调函数进行数据接收如果接收失败且部分错误上报,则忽略错误;如果是其他报错,则断开asocket连接。

1.5 数据接收

下行数据接收部分参考app_demo_asocket.c文件中的app_deal_asocket_data函数,主要实现方式为使用hal_info_log函数记录日志并在debug口打印,同时通过cm_uart_write函数将接收到的数据在串口发送,确保数据能够被其他设备接收处理,实现外部通讯。

二、Demo测试

2.1 搭载测试环境

步骤1:在app_demo_main.c文件中将APP_ASOCKET_DEMO_TEST置1开启功能测试,配置后续透传TCP/UDP数据用到的串口,此处默认为UART0

步骤2:在app_demo_socket.c文件中配置TCP/UDP连接方式、服务器地址以及端口号。

步骤3:配置需要发送的数据内容。

步骤4:编译APP_DEMO固件并烧录到模组,该步骤可以参考文章《ML307R OpenCPU丨APP_DEMO_SDK使用介绍》。

2.2 开机运行demo程序

1、模组上电,连接UART0串口,自动向所配置TCP/UDP服务器数据上报数据。

2、在UART口配置发送数据,透传发送到服务器侧,完成数据上报。

3、服务器进行下行数据回执,该数据会在串口打印。

三、常见问题

问1:模组支持多路TCP/UDP连接吗?

答:支持,可通过增加app_demo中的s_asocket_number进行相关配置,配置多路端口号并与不同的服务器同时建立TCP/UDP连接。最多可配置0~5路链接,可在app_uart_data_callback串口回调中对不同链路的数据内容做区分。

问2:TCP如何做长连接功能?

答:使用cm_asocket_setsockopt可以配置keepalive参数 打开TCP底层心跳功能,首先在连接前打开SO_KEEPALIVE。

连接成功后,同样使用cm_asocket_setsockopt配置TCP_KEEPIDLE 等参数。

问3:TCP/UDP连接失败是什么原因?

答:如果TCP/UDP连接失败,首先检查网络通讯状态,确保hal_modem_pdp_active参数PDP激活成功,激活成功后再找到对应位置的DEBUG口打印,查找具体失败的是哪一步骤以及报错原因,是否为服务器拒绝接入、连接超时等,也可用PC端TC/UDP调试工具进行对比测试。


http://www.ppmy.cn/server/105442.html

相关文章

CodeLLDB的快速安装

1、CodeLLDB很难安装 ‌‌CodeLLDB插件是一个基于‌LLDB的调试器插件,专为‌Visual Studio Code设计,旨在提供类似于传统集成开发环境(IDE)的调试体验。‌ 它支持‌C、‌C和‌Objective-C程序的调试,包括设置断点、查…

Springboot整合mongodb和mysql两个数据库,mysql无法连接

一、问题 在日常开发中,难免需要用到mongodb和mysql数据库 当我在mongodb正常连接使用的时候,切换回mysql,发现无法连接 二、原因分析 1、端口查看被占用 winr打开命令提示符(cmd),可以使用以下命令&…

AI绘图:艺术与科技的未来交响

目录 一、AI绘图:艺术与科技的邂逅二、AI绘图的原理与技术三、AI绘图的应用与影响1.艺术创作与设计行业:2.教育领域:3.娱乐与文化产业: 四、AI绘图的挑战与思考1.艺术价值的界定:2.版权问题与伦理道德: 五、…

简单实现进度条效果(vue2)

如果用echarts或者其他图表来写个进度条有点大材小用&#xff0c;所以直接简单html、js写一下就可以&#xff1b; 以下代码基于vue2&#xff0c; 部分代码来自国内直连GPT/Claude镜像站 <template><div class"progress-container"><div class"p…

设计模式笔记01(java版)

文章目录 设计模式概述学习设计模式的必要性设计模式分类创建型模式结构型模式行为型模式 UML类图概述类图的作用类图表示法类的表示方式类与类之间关系的表示方式1&#xff0c;单向关联2&#xff0c;双向关联3&#xff0c;自关联聚合关系组合关系依赖关系继承关系实现关系 软件…

redis基础与进阶(二)

一、redis数据类型 1.1 list&#xff08;数组&#xff09; 队列&#xff0c;列表的子成员类型为string lpush key value rpush key value linsert key after|before 指定元素 value lindex key index lrange key start stop lset key index value lrem key count value 1.1.1…

STM32常用C语言知识总结

目录 一、引言 二、C 语言基础 1.数据类型 2.变量与常量 3.控制结构 4.数组与指针 5.字符串 6. extern变量声明 7.内存管理 三、STM32 中的 C 语言特性 1.位操作 2.寄存器操作 一、引言 STM32 作为一款广泛应用的微控制器&#xff0c;其开发离不开 C 语言的支持。C …

做项目过程中问题小汇总 | vue3 elementplus js

el-card去除阴影 <el-card style"box-shadow: none;"> </el-card>el-button按钮加图标 <el-button type"primary" size"default" icon"Plus"click"addRole">添加职位</el-button>el-table表头的文…