热度 14
2021-11-25 14:38
2028 次阅读|
0 个评论
本文分享自中移OneOS微信公众号《 应用MoLink框架快速实现网络连接 》,作者:柏灵。 MoLink简介 1.1 MoLink是什么 Molink即ModuleLinkKit (模组连接套件)。MoLink是一整套针对嵌入式模组开发套件。MoLink提供了模组多实例管理、模组功能适配并向开发者提供统一易用的API(应用程序接口)。 同时,OneOS OpenCPU模组方案完全兼容Molink API接口,通过统一的API接口实现MCU+模组和模组OpenCPU方案间应用代码 的无缝迁移。 1.2 传统嵌入式模组适配开发难点及不便 1)需要关注到具体的指令收发和解析并参与管理: · 模组适配工作量大 · 调试复杂维护不便 2)不同厂商、型号间AT指令集存在差异: · 切换不同模组周期长,工作量大 · 优化升级十分困难 1.3 MoLink对嵌入式模组适配开发的帮助 管理方便:提供统一的模组管理,支持多模组多线程。 开发简单:接口简明易用,专注业务功能开发。 上手即用:适配主流模组,免除繁杂适配工作。 功能丰富:适配云平台连接等复杂功能。 快速切换:统一应用程序接口,模组一键切换。 提供套接字编程接口(部分)。 框架及能力介绍 2.1 MoLink框架介绍 MoLink框架从上至下分为4层,分别为: 1)抽象接口层:提供通用控制、网络服务、网络连接、套接字、Wi-Fi管理等多种接口的定义及高层实现 2)核心层:提供Molink模组对象定义、模组实例的管理及其他关键部分实现 3)模组适配层:提供各种型号通信模组的抽象接口层各种接口的适配函数实 4)AT 解析器:可选模块,MCU架构下的模组适配通过AT解析器接管串口等设备并与与通信模组进行AT指令通信 2.1 MoLink能力介绍 MoLink代码结构目录如下: MoLink拥有以下能力: 1)实例的管理功能,包括创建、获取、删除等功能; 2)通用控制功能,包括获取IMEI号码,获取ICCID号码等功能; 3)网络服务功能,包括附着、注网、获取信号质量等功能; 4)TCP/IP,包括基础的TCP/UDP连接的创建、连接、发送、接受、断开连接等功能; 5)Soker套接字功能,基于TCP/IP相关接口的基础,封装套接字接口,向上可由net/socket组件开启并支持标准BSD socker接口; 6)调试功能,包括ifconfig、ping等操作。 应用MoLink快速实现网络连接 3.1前期准备 硬件支持 本次开发使用的是正点原子潘多拉开发板,采用超低功耗高性能的主控制器 STM32L475,板载1.3寸 TFT显示屏,集成STLink,多样化的扩展接口使其可连接多种模块如蓝牙、Lora、GPS等,硬件资源丰富。 模组选择的是ML302,ML302 是中国移动最新推出的 LTE Cat.1 模块。ML302 支持 TD- LTE/FDD- LTE 通信制式,具有丰富的 Internet 协议、行业标准接口和功能,支持 Windows、Linux 和 Android 驱动。 本实验中,潘多拉开发板的UART2和ML302的AT串口通过杜邦线相连(选杜邦线的原因真的是因为方便哈,并不是因为穷, 虽然小编确实很穷 ≥﹏≤)。 软件获取 OneOS是中国移动针对物联网领域推出的轻量级操作系统,具有可裁剪、跨平台、低功耗、高安全等特点,支持ARM Cortex-M/R/A、MIPS、RISC-V等主流CPU架构,兼容POSIX、CMSIS等标准接口,支持Micropython语言开发,提供图形化开发工具,能够有效提高开发效率并降低开发成本,帮助客户开发稳定可靠、安全易用的物联网应用。小伙伴们可以通过码云下载代码体验。链接如下: CMCC-OneOS OneOS-Cube 3.2配置与编译 OneOS-Cube配置 MoLink 组件相对独立,在使用时,只需要在menuconfig中开启Molink组件即可。在Components → Network → Molink→ Modules中,选择4G CAT1 Modules 中的ML302模组。 (Top) → Components → Network → Molink → Enable IoT modules support → Modules → 4G CAT1 Modules Su→ ML302 → ML302 ConfigConfig Enable ML302 Module Object Auto Create -*- Enable ML302 Module General Operates -*- Enable ML302 Module Network Service Operates Enable ML302 Module Ping Operates Enable ML302 Module Ifconfig Operates Enable ML302 Module Network TCP/IP Operates Enable ML302 Module BSD Socket Operates 我们看到,进入ML302 Module选项后,第一个就是自动创建模组选项;在一般情况下,选择自动创建模组,配置好串口号,波特率,最大AT命令接收长度选项; Enable ML302 Module Object Auto Create (uart2) ML302 Interface Device Name (115200) ML302 Interface Device Rate (512) The maximum length of AT command data accepted 可是,也晓得有的小伙伴就是不想自动创建模组,要自己动手,丰衣足食,那么直接撸代码,创建一个模组对象。 首先,我们要调用 os_device_find() 函数,找到对应的串口,然后再配置波特率、最大AT命令接收长度选项等选项,最后调用 mo_create() 来创建模组。 test_device = os_device_find("uart2"); if (OS_NULL == test_device) { LOG_E(ATEST_TAG,"Can not find interface device uart2uart2!"); } uart_config.baud_rate = 115200; os_device_control(test_device, OS_DEVICE_CTRL_CONFIG, &uart_config); parser_config.parser_name = "ml302"; parser_config.parser_device = test_device; parser_config.recv_buff_len = 512; os_device_control(test_device, OS_DEVICE_CTRL_CONFIG, &uart_config); if (OS_NULL == test_module) { test_module = mo_create(ModulesPara.ModuleName,ModulesPara.Type, &parser_config); } 同时,打开Molink 目录下的Tools,里面有我们调试的小工具,有ifconfig 、ping、socket stat等功能,后面有用到哦。 (Top) → Components → Network → Molink → Enable IoT modules support → Tools Enable AT module network debug functions Enable molink ifconfig features Enable molink ping features (50) The maximum times of molink ping cmd config Enable molink socket stat feature 编译与下载 进入 projects\stm32l475-atk-pandora 目录,打开OneOS-Cube命令行,执行命令 scons --ide=mdk5 生成并更新keil项目工程文件,双击 project.uvprojx ,打开MDK工程,点击左上角的 Build 按钮,等待编译完成。当看到 0 Error(s), 0 Warning(s) 的输出时说明编译完成。 确保潘多拉开发板已和电脑相连接。此时点击左上角的 Download 按钮,将程序下载到开发板中。但看到 Programming Done. Flash Load finished 则表明程序已经烧写成功。 这时,小伙伴们就可以使用Molink组件的功能啦。我们可以直接在自己的应用程序中调用接口,也可以使用我们提供的shell命令。 3.3 MoLink快速联网 入网检测 当程序下载成功后,把程序跑起来;通过串口助手连接潘多拉的调试串口,可以发现了Molink的第一个特点:屏蔽底层模组,在创建模组对象后自动驻网。 I/ml302: Module ml302 network is registered I/ml302: Auto create ml302 module object success! 所以,不管你是自动 创建模组对象,还是手动创建,都是创建时自动驻网,就不需要你对着模组AT手册一步一步的发送AT指令去驻网了,是不是很棒呢? 当然,我们要确定模组是不是真的驻网成功,还可以通过小工具校验,这就是我们上面选择tools的小工具哦。可以通过ifconfig,查看模组是否获取到本地IP,还可以查看信号强度,模组IMEI等信息。 ifconfig LIST AT MODULE INFORMATION -------------------------------------------------------------------------------- Module Name : ml302 IMEI Number : 863293057223775 ICCID Number : 898604640119C1755639 Signal Quality : rssi(28), ber(99) IPv4 Address : 10.112.250.233 -------------------------------------------------------------------------------- ping的功能也很好用哦,是查看网络畅通与否的最佳小助手。 ping www.baidu.com Ping statistics for 183.232.231.172 : Packets: Sent = 4, Received = 4, Lost = 0, Mintime = 73 ms, Maxtime = 145 ms, Avgtime = 104 ms 快速连网 入网成功后,要开始连网。这里也有两种选择,调用Molink的原生接口,或者走socket接口。如果要走socket接口,注意在Module选项里勾选BSD socket相关选项哦。 如果调用Molink的原生接口,首先调用 mo_netconn_create() 创建连接对象,接着调用 mo_netconn_connecte() 与对应的IP和端口建立连接,此时连网完成。验证一下发送和接受功能,调用 mo_netconn_send() 发送数据,再调用 mo_netconn_recv() 接受数据,两相比较,发送数据和接受数据一致,通过验证,该网络链路可以正常使用,快速连网完成。 (PS:为了方便验证,此次我们测试的IP端口是接收什么消息就回复相同消息,小伙伴们可以作参考哦) test_netconn = mo_netconn_create(test_module, NETCONN_TYPE_UDP); tp_assert_not_null(test_netconn); os_err_t result = mo_netconn_connect(test_module, test_netconn, server_addr, TEST_SERVER_TCP_PORT); tp_assert_true(OS_EOK == result); os_size_t sent_size = mo_netconn_send(test_module, test_netconn, TEST_MSG, strlen(TEST_MSG)); 0); result = mo_netconn_recv(test_module, test_netconn, &data_ptr, &data_size, OS_WAIT_FOREVER); tp_assert_true(OS_EOK == result); tp_assert_true(data_size == strlen(TEST_MSG)); 如果使用socket接口,首先调用 mo_socket() 创建socket,接着调用 mo_connecte() 与对应的IP和端口建立连接,并且调用 mo_setsockopt() 接口设置接收超时时间,此时连网完成。 测试代码与上面代码相同,只是发送和接受函数略有变化,小伙伴可以自行研究其中的奥秘哦。 struct sockaddr_in addr = {0}; addr.sin_family = AF_INET; addr.sin_port = htons(TEST_TCP_PORT); h_addr); memset(&(addr.sin_zero), 0, sizeof(addr.sin_zero)); int socket_id = mo_socket(test_module, AF_INET, SOCK_STREAM, 0); = 0); os_int32_t result = mo_connect(test_module, socket_id, (struct sockaddr *)&addr, sizeof(struct sockaddr)); tp_assert_true(0 == result); result = mo_setsockopt(test_module, socket_id, SOL_SOCKET, SO_RCVTIMEO, &recv_time, sizeof(recv_time)); sent_size = mo_send(test_module, socket_id, TEST_MSG, strlen(TEST_MSG), 0); 0); recv_size = mo_recv(test_module, socket_id, recv_buff, strlen(TEST_MSG), 0); 0); 常见问题 Q): 如果模组创建后驻网失败怎么办? A): 模组创建时候会主动驻网,但如果因为网络环境较差,或者其他原因没有驻网成功,可以使用以下步骤进行重新驻网哦。其中test_module是创建的模组对象,cid是你打算激活的第几路id,一般默认为1。 tp_assert_true(OS_EOK == ret); tp_assert_true(OS_EOK == ret); ret = mo_set_attach(test_module, 1); tp_assert_true(OS_EOK == ret); ret = mo_set_cgact(test_module, cid, 1); tp_assert_true(OS_EOK == ret); Q): Molink传输速率如何? A): Molink的传输速率主要和两个因素有关。第一个是串口波特率,一般串口波特率默认为9600,或者115200,所以导致在高速4G网络传输情况下,因为串口速率满足不了而导致丢失数据;第二就是模 组本身特性,如NB模组本身就是应对低速率的环境,高速速率传输问题较大。 Q): 是否适配或者计划适配5G模 组? A): 5G模组适配已经纳入规划。因为目前Molink走 的都是串口通信,5G网络的高速率无法通过串口实现;目前正在计划使用USB做AT通信,小伙伴们请拭目以待哦。 Q):Molink 默认配置下存在数据丢失 情况? A): 在OneOS操作系统中串口缓存区的大 小默认为64bytes,如果使用Molink组件则建议将串口缓冲区调大(建议调为2048)。 Serial Enable serial drivers (2048) Set RX buffer size Serial 更多关于MoLink的介绍,可以去 OneOS学院 查看哦!