先前的文章 人生苦短,用 RT-Thread MicroPython 享受编程的乐趣中已经介绍了 MicroPython 在应用开发中的优势,So,MicroPython 能在蜂窝模块里大展身手吗?
图片来源:骑士智能(已取得授权)
应用背景
蜂窝模块一直就是开发的噩梦,门槛高、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 的开发优势一目了然,还不来试试吗?
End
拓展阅读
RT-Thread 近期活动
现在报名即享三重福利,1、报名即可以领取往期能力认证培训资料大礼包 2、参与新能力认证考前培训 3、学生优惠价168元 4、企业团体报名优惠,198/人(企业报名请加QQ:2433970767)
扫码报名
企业人才服务:
在这个特殊时期,针对人才服务RT-Thread将开放更多的资源,如果你的企业在招聘嵌入式相关人才,可提交职位信息说明,RT-Thread将会通过微信公众号免费发布相关职位信息(要求RT-Thread技能的职位优先发布)
请详细登记您的职位信息,我们将尽快联系你确认岗位描述信息,安排发布
扫码即可提交需求
你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群!
RT-Thread
让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。
长按二维码,关注我们
点击阅读原文,进入RT-Thread GitHub
你点的每个“在看”,我都认真当成了喜欢