应用MoLink框架快速实现网络连接

智能硬件 创建于:2022-11-13

本文分享自中移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的第一个特点:屏蔽底层模组,在创建模组对象后自动驻网。

sh>[588] I/ml302: Module ml302 network is registered [ml302_netserv_at_init][183]
[588] I/ml302: Auto create ml302 module object success! [ml302_auto_create][359]

所以,不管你是自动创建模组对象,还是手动创建,都是创建时自动驻网,就不需要你对着模组AT手册一步一步的发送AT指令去驻网了,是不是很棒呢?

当然,我们要确定模组是不是真的驻网成功,还可以通过小工具校验,这就是我们上面选择tools的小工具哦。可以通过ifconfig,查看模组是否获取到本地IP,还可以查看信号强度,模组IMEI等信息。

sh>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的功能也很好用哦,是查看网络畅通与否的最佳小助手。

sh>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));
tp_assert_true(sent_size > 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);
addr.sin_addr   = *((struct in_addr *)host->h_addr);
memset(&(addr.sin_zero), 0, sizeof(addr.sin_zero));

int socket_id = mo_socket(test_module, AF_INET, SOCK_STREAM, 0);
tp_assert_true(socket_id >= 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);
tp_assert_true(sent_size > 0);

recv_size = mo_recv(test_module, socket_id, recv_buff, strlen(TEST_MSG), 0);
tp_assert_true(recv_size > 0);

常见问题

Q): 如果模组创建后驻网失败怎么办?

A): 模组创建时候会主动驻网,但如果因为网络环境较差,或者其他原因没有驻网成功,可以使用以下步骤进行重新驻网哦。其中test_module是创建的模组对象,cid是你打算激活的第几路id,一般默认为1。

os_err_t ret = mo_set_cfun(test_module, 0);
tp_assert_true(OS_EOK == ret);

os_err_t ret = mo_set_cfun(test_module, 1);
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)。

Top->Drivers->Serial
[*]    Enable serial drivers
(2048)    Set RX buffer size
(64)      Set TX buffer sizeTop->Drivers->Serial

更多关于MoLink的介绍,可以去OneOS学院查看哦!

 

原文地址:https://my.oschina.net/u/5443273/blog/5324772

免责声明:本文来源于互联网,版权归合法拥有者所有,如有侵权请公众号联系管理员

* 本站提供的一些文章、资料是供学习研究之用,如用于商业用途,请购买正版。

中移物联OneOS