原创 OneOS 产品功能 | 应用MoLink框架快速实现网络连接

2021-11-25 14:38 270 1 分类: 物联网 文集: OneOS应用案例
本文分享自中移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模组。

  1. (Top) → Components → Network → Molink → Enable IoT modules support → Modules → 4G CAT1 Modules Su→ ML302 → ML302 ConfigConfig
  2. [ ] Enable ML302 Module Object Auto Create
  3. -*- Enable ML302 Module General Operates
  4. -*- Enable ML302 Module Network Service Operates
  5. Enable ML302 Module Ping Operates
  6. Enable ML302 Module Ifconfig Operates
  7. Enable ML302 Module Network TCP/IP Operates
  8. [ ] Enable ML302 Module BSD Socket Operates

我们看到,进入ML302 Module选项后,第一个就是自动创建模组选项;在一般情况下,选择自动创建模组,配置好串口号,波特率,最大AT命令接收长度选项;

  1. Enable ML302 Module Object Auto Create
  2. (uart2) ML302 Interface Device Name
  3. (115200) ML302 Interface Device Rate
  4. (512) The maximum length of AT command data accepted

可是,也晓得有的小伙伴就是不想自动创建模组,要自己动手,丰衣足食,那么直接撸代码,创建一个模组对象。

首先,我们要调用os_device_find()函数,找到对应的串口,然后再配置波特率、最大AT命令接收长度选项等选项,最后调用mo_create()来创建模组。

  1. test_device = os_device_find("uart2");
  2. if (OS_NULL == test_device)
  3. {
  4. LOG_E(ATEST_TAG,"Can not find interface device uart2uart2!");
  5. }
  6. uart_config.baud_rate = 115200;
  7. os_device_control(test_device, OS_DEVICE_CTRL_CONFIG, &uart_config);
  8. parser_config.parser_name = "ml302";
  9. parser_config.parser_device = test_device;
  10. parser_config.recv_buff_len = 512;
  11. os_device_control(test_device, OS_DEVICE_CTRL_CONFIG, &uart_config);
  12. if (OS_NULL == test_module)
  13. {
  14. test_module = mo_create(ModulesPara.ModuleName,ModulesPara.Type, &parser_config);
  15. }

同时,打开Molink 目录下的Tools,里面有我们调试的小工具,有ifconfig 、ping、socket stat等功能,后面有用到哦。

  1. (Top) → Components → Network → Molink → Enable IoT modules support → Tools
  2. Enable AT module network debug functions
  3. Enable molink ifconfig features
  4. Enable molink ping features
  5. (50) The maximum times of molink ping cmd config
  6. 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的第一个特点:屏蔽底层模组,在创建模组对象后自动驻网。

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

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

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

  1. sh>ifconfig
  2. LIST AT MODULE INFORMATION
  3. --------------------------------------------------------------------------------
  4. Module Name : ml302
  5. IMEI Number : 863293057223775
  6. ICCID Number : 898604640119C1755639
  7. Signal Quality : rssi(28), ber(99)
  8. IPv4 Address : 10.112.250.233
  9. --------------------------------------------------------------------------------

ping的功能也很好用哦,是查看网络畅通与否的最佳小助手。

  1. sh>ping www.baidu.com
  2. Ping statistics for 183.232.231.172 :
  3. 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端口是接收什么消息就回复相同消息,小伙伴们可以作参考哦)

  1. test_netconn = mo_netconn_create(test_module, NETCONN_TYPE_UDP);
  2. tp_assert_not_null(test_netconn);
  3. os_err_t result = mo_netconn_connect(test_module, test_netconn, server_addr, TEST_SERVER_TCP_PORT);
  4. tp_assert_true(OS_EOK == result);
  5. os_size_t sent_size = mo_netconn_send(test_module, test_netconn, TEST_MSG, strlen(TEST_MSG));
  6. tp_assert_true(sent_size > 0);
  7. result = mo_netconn_recv(test_module, test_netconn, &data_ptr, &data_size, OS_WAIT_FOREVER);
  8. tp_assert_true(OS_EOK == result);
  9. tp_assert_true(data_size == strlen(TEST_MSG));

如果使用socket接口,首先调用mo_socket()创建socket,接着调用mo_connecte()与对应的IP和端口建立连接,并且调用mo_setsockopt()接口设置接收超时时间,此时连网完成。

测试代码与上面代码相同,只是发送和接受函数略有变化,小伙伴可以自行研究其中的奥秘哦。

  1. struct sockaddr_in addr = {0};
  2. addr.sin_family = AF_INET;
  3. addr.sin_port = htons(TEST_TCP_PORT);
  4. addr.sin_addr = *((struct in_addr *)host->h_addr);
  5. memset(&(addr.sin_zero), 0, sizeof(addr.sin_zero));
  6. int socket_id = mo_socket(test_module, AF_INET, SOCK_STREAM, 0);
  7. tp_assert_true(socket_id >= 0);
  8. os_int32_t result = mo_connect(test_module, socket_id, (struct sockaddr *)&addr, sizeof(struct sockaddr));
  9. tp_assert_true(0 == result);
  10. result = mo_setsockopt(test_module, socket_id, SOL_SOCKET, SO_RCVTIMEO, &recv_time, sizeof(recv_time));
  11. sent_size = mo_send(test_module, socket_id, TEST_MSG, strlen(TEST_MSG), 0);
  12. tp_assert_true(sent_size > 0);
  13. recv_size = mo_recv(test_module, socket_id, recv_buff, strlen(TEST_MSG), 0);
  14. tp_assert_true(recv_size > 0);

常见问题

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

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

  1. tp_assert_true(OS_EOK == ret);
  2. tp_assert_true(OS_EOK == ret);
  3. ret = mo_set_attach(test_module, 1);
  4. tp_assert_true(OS_EOK == ret);
  5. ret = mo_set_cgact(test_module, cid, 1);
  6. 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)。

  1. Top->Drivers->Serial
  2. Enable serial drivers
  3. (2048) Set RX buffer size
  4. (64) Set TX buffer sizeTop->Drivers->Serial

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

作者: OneOS, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3976404.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
相关推荐阅读
OneOS 2021-11-29 17:00
OneOS 定位功能测评+开发详解
本文分享自中移OneOS微信公众号《定位功能测评+开发详解》。本期严同学为了给大家展现OnePos定位服务能力复现地铁轨迹线路坐了大半天的地铁老辛苦了这期视频大家一定要看看喔点此跳转展示视频想要一比一...
OneOS 2021-11-22 15:08
OneOS文字转语言组件实操 | 当万耦遇上chaoTTS
本文分享自中移OneOS微信公众号《当万耦遇上chaoTTS》,作者:柏灵。大家好,柏灵又又又来啦!!相信大家已经开始在寒冷的冬季种植鲜嫩的豌豆尖,火锅里烫上豌豆尖,从此打工人有了豌豆尖自由!(还没有...
OneOS 2021-11-18 15:50
OneOS 基于端云融合能力 | “种植环境监测器”技术细节
在冷冷的冬天火锅配上豌豆尖想想就很美那就赶快行动起来跟我们学习如何利用OneOS的端云融合能力种出更茂盛的豌豆尖吧~准备工具:万耦创世开发板*1土壤湿度传感器*1 OneOS嵌入式操作系统O...
广告
我要评论
0
1
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /1 下一条