先前的文章 人生苦短,用 RT-Thread MicroPython 享受编程的乐趣中已经介绍了 MicroPython 在应用开发中的优势,So,MicroPython 能在蜂窝模块里大展身手吗?

 

【炫技】MicroPython 在  MT2625/NB-IoT 上的应用_#include

图片来源:骑士智能(已取得授权)

应用背景

蜂窝模块一直就是开发的噩梦,门槛高、SDK 庞大,大部分模块厂家都还是仅提供 AT 指令的开发方式,大大限制了应用开发的灵活性,蜂窝模块基本上会遇到以下开发难题:

  • AT 指令方式开发繁琐,还需要外加一颗 MCU

  • OpenCPU SDK 过度封装(基本都是库)

  • OpenCPU SDK 开发环境搭建复杂,经常遇到无解问题

  • 应用代码不能复用

  • 学习成本高

基于以上问题,RT-Thread 基于中移 M5311 NBIOT 模块移植了 RT-Thread 系统,基于 RT-Thread 版本的 NBIOT SDK,开发者无需关注 NBIOT 网络本身,直接使用熟悉的 scons 工具和 menuconfig 工具进行编译构建,使用 BSD socket 进行网络应用开发,能够使用几乎所有的 RT-Thread 软件包,跟基于以太网应用的开发方式没有任何的区别

RT-Thread 版本的 NBIOT SDK 已经解决了上述开发难题,更好的消息是 RT-Thread 在 NBIOT 上引入了 MicroPython 开发

接下来,本文基于 TCP 示例带大家体验 RT-Thread BSD socket 开发方式和 MicroPython 开发方式的差异,感受 MicroPython 给应用开发带来的便利。

传统 C 语言 SOCKET 开发方式

该示例程序与 www.rt-thread.com 服务器建立 tcp 通讯,并拉去服务器内容。

通过 tcp 构建 HTTP GET 请求,本示例将请求 www.rt-thread.com 服务器的 rt-thread.txt 资源,请求内容如下:

1static const char *req_data = "GET /service/rt-thread.txt HTTP/1.1\r\nHost: www.rt-thread.com\r\nUser-Agent: rtthread/4.0.1 rtt\r\n\r\n";

废话不说,直接上完整代码:

 1#include <rtthread.h>
 2
 3#ifdef RT_USING_SAL
 4#include <sys/socket.h> 
 5#include <netdb.h>
 6#include "sal_tls.h"
 7#include "sys/time.h"
 8#else
 9#include "lwip/sockets.h"
10#include "lwip/netdb.h"
11#include "lwip/sys.h"
12#include "lwip/inet.h"
13#endif /* RT_USING_SAL */
14
15#define TCP_TEST_HOST    "www.rt-thread.com"
16#define TCP_TEST_PORT    (80u)
17#define TEST_BUFSZ       (1024u)
18
19static const char *req_data = "GET /service/rt-thread.txt HTTP/1.1\r\nHost: www.rt-thread.com\r\nUser-Agent: rtthread/4.0.1 rtt\r\n\r\n";
20static char recv_data[TEST_BUFSZ];
21
22static void nb_tcp_demo(int argc, char** argv)
23{
24    int ret;
25    int sock = -1;
26    struct hostent *host;
27    struct sockaddr_in server_addr;
28    int bytes_received;
29
30    host = gethostbyname(TCP_TEST_HOST);
31    if (!host) { return; }
32
33    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
34    {
35        goto __exit;
36    }
37
38    server_addr.sin_family = AF_INET;
39    server_addr.sin_port = htons(TCP_TEST_PORT);
40    server_addr.sin_addr = *((struct in_addr *)host->h_addr);
41    rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
42
43    if ((ret = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))) < 0)
44    {
45        goto __exit;
46    }
47
48    ret = send(sock, req_data, rt_strlen(req_data), 0);
49    if (ret <= 0)
50    {
51        goto __exit;
52    }
53    rt_kprintf("send len: %d\r\n", ret);
54
55    rt_memset(recv_data, 0x0, sizeof(recv_data));
56    bytes_received = recv(sock, recv_data, TEST_BUFSZ  - 1, 0);
57    if (bytes_received <= 0)
58    {
59        goto __exit;
60    }
61
62    rt_kprintf("received data: \n");
63    for (int i = 0; i < bytes_received; i++)
64    {
65        rt_kprintf("%c", recv_data[i]);
66    }
67    rt_kprintf("\r\n");
68
69__exit:
70    if (sock >= 0)
71    {
72        closesocket(sock);
73        sock = -1;
74    }
75
76    rt_kprintf("TCP demo end\r\n");
77}
78#ifdef FINSH_USING_MSH
79MSH_CMD_EXPORT_ALIAS(nb_tcp_demo, demo_tcp, nbiot tcp test);
80#endif /* FINSH_USING_MSH */

好在 RT-Thread 支持 BSD socket 进行网络开发,方便许多,在 MSH 串口命令行的加持下,可以直接像 Linux 一样直接在命令行运行程序。

这里请注意代码量,与后面的 MicroPython 进行对比。

程序运行和结果请观看文末的视频!

MicroPython 开发方式

不扯别的,只看代码:

 1import usocket
 2
 3req_url = 'www.rt-thread.com'
 4req_port = 80
 5req_data = 'GET /service/rt-thread.txt HTTP/1.1\r\nHost: www.rt-thread.com\r\nUser-Agent: rtthread/4.0.1 rtt\r\n\r\n'
 6
 7client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
 8client.connect(usocket.getaddrinfo(req_url, req_port)[0][-1])
 9ret = client.send(req_data.encode())
10print("send len:%d" % (ret))
11
12recv_data = client.recv(1024)
13print("received data: %s" % (recv_data.decode()))
14
15client.close()
16print("TCP DEMO END")

额,就这么点代码?

是的,同样的功能,MicroPython 程序就仅有 12 行代码,美滋滋!

相比 C 语言实现的 70 行代码,MicroPython 的 12 行代码不要太爽!

同时,基于 RT-Thread 提供的 MicroPython VSCode 插件,MicroPython 在硬件上的开发更便捷,不信来看下面的视频,刷新你的认识。

程序运行和结果请观看文末的视频!

完整的演示视频

【炫技】MicroPython 在  MT2625/NB-IoT 上的应用_#include_02

RT-Thread


让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。

长按二维码,关注我们