本文将从 Python 语言本身讲起,对 QuecPython 的起源、结构和特性进行阐述。通过本文的介绍,用户可以对 QuecPython 拥有相对全面的了解。
从 Python 到 MicroPython
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。作为一种代表极简主义的编程语言,和传统的 C/C++、Java、C# 等语言相比,Python 对代码格式的要求相对宽松。在开发 Python 程序时,可以专注于解决问题本身,而不用顾虑语法的细枝末节。
下面举个例子对比 Python 语言和 C 语言对循环打印功能实现方式的区别。
C语言实现循环打印:
#include<stdio.h>
int main()
{
for(int i = 0; i < 10; i++){
printf(“%d”, i);
}
}
Python语言实现循环打印
for i in range(10):
print(i)
可以看出,Python语法相较于C语言更为简洁,易于掌握,可读性更高。
作为一种解释型语言,Python具备较好的可移植性,可在多种不同软硬件平台上运行。使用Python编写的程序不需提前编译成二进制代码,可以直接从源代码运行。此外,Python具有脚本语言中最丰富和强大的功能库。这些库覆盖了文件IO、GUI、网络编程、数据库访问等绝大部分应用场景。用Python语言开发程序时,许多功能可以通过调用库实现,开发者通常无需从零编写。当前,Python语言因其语法简单、功能丰富的特点,已被广泛应用于服务器、数据库、图像处理、人工智能等领域。使用几行Python代码就可以实现人脸识别。
MicroPython是Python语言的精简高效实现,可理解为一个可以运行在微处理器上的Python解释器。它使得用户可以编写Python脚本来控制硬件。MicroPython继承了Python的完备的REPL交互功能,可以通过REPL串口随时输入代码执行,便于测试。MicroPython还内置了文件系统,用户可以随意向设备端上传任意文件内容,并对目录结构进行修改。基于这一点,设备端可以同时储存多个程序脚本和其他文件,用户可根据需要手动选择并运行,类似于手机App的机制,极为灵活。此外,得益于Python解释型语言的特性,用户在使用MicroPython进行开发时,无需因为代码的更改而反复编译代码和烧录固件,仅需将修改过的代码重新上传至设备内即可。
认识QuecPython
移远将MicroPython移植到了多款4G和NB-IoT模块上,并增加了大量与无线通信相关的功能库,称之为QuecPython。在前文中,我们介绍了基于脚本语言的模块二次开发方式,QuecPython正是这样的一种开发方式。基于QuecPython,用户可以使用Python脚本对移远通信模块进行快速便捷的二次开发,轻松实现远程控制、数据上云等常用物联网功能。
与传统的单片机开发和QuecOpen(CSDK)开发相比,QuecPython开发的最大优势在于其简便性。下图分别展示了传统开发方式和QuecPython开发方式的大致流程。不难看出,QuecPython由于采用了脚本语言,只需要在首次开发时前模块内烧录专门的QuecPython固件,此后当代码编写和修改完成时即可立即运行,无需繁琐的编译和烧录步骤,显著提升了代码调试的速度。
QuecPython的另一优势在于内置了丰富而实用的各类功能库。除了MicroPython的核心标准库外,QuecPython还提供了包括语音通话、短信、MQTT、基站定位等在内的一系列与物联网相关的功能库,并实现了针对阿里云、腾讯云等主流云平台的支持。用户仅需不到20行代码就可以实现与阿里云的简单对接。
目前,QuecPython方案已经在智能家电、工业控制、智慧交通等场景得到应用,各类公司基于QuecPython方案推出的产品包括车载定位器、DTU、4G对讲机等数十种。同时,因为QuecPython上手难度低、开发周期短的特性,它也非常适合用于产品快速原型验证和课程实验等领域。
QuecPython和传统开发方式的差异
很多QuecPython的初学者此前曾有过各类软硬件平台的开发经验。但QuecPython作为一类全新的物联网开发方式,与传统开发方式之间存在着较大的差异。在正式上手开发前,有必要了解这些差异。
和传统单片机开发的差异
原理和特性差异
-
QuecPython与传统的单片机(如STM32)开发不同,并不是裸机开发,而是建立在完备的操作系统之上的。裸机开发的大部分经验无法直接适用于QuecPython开发,开发者应避免被过往经验误导。
-
QuecPython作为脚本开发方式,屏蔽了大量的底层细节,传统单片机开发中涉及的堆栈、寄存器、DMA、NVIC等概念在QuecPython开发中通常不会出现。
-
QuecPython由于采用脚本语言开发,其实际执行速度较慢,因此对于一些对性能和时间精度(时序)要求较高的场合,如脉冲计数、ADC波形采集、单总线传感器(如DS18B20)操作等,传统单片机可以实现,但QuecPython无法胜任。
-
QuecPython的执行速度受语言本身影响较大,因此无需过度关注芯片主频等因素。但脚本运行过程中,剩余的运行内存(RAM)是会动态变化的,开发和调试时应密切关注可用内存,避免内存溢出导致程序崩溃。
开发流程差异
与单片机开发相比,QuecPython更类似于手机App的开发方式。一般的Android应用开发需要首先准备一台刷入了Android系统的手机,然后在电脑端编写应用APK,最后将APK拷贝到手机里运行。QuecPython也有着与之相似的流程。
-
环境搭建:QuecPython作为脚本语言开发方式,不存在传统意义上的SDK,无需构建专门的开发环境。用户仅需在模块内手动烧入专门的包含有QuecPython脚本语言解释器的固件即可进行开发。
-
代码编写:QuecPython 无需Keil等专用IDE,代码(脚本文件)的编写可在VSCode、PyCharm乃至记事本等普通文本编辑器中完成。
-
程序下载:脚本文件编写完成后,无需编译,也无需使用单独的烧录器和仿真器,直接通过USB线缆将脚本文件拷贝到模块内即可调试和运行,和U盘拷文件一样极为简单。像手机一样,模块内可同时存储多个脚本(App)和其他资源文件,用户可根据需求对脚本文件进行非常灵活的调用和运行。
-
调试运行:QuecPython并不具备传统单片机的断点、单步运行、内存分析等调试手段,而是通过脚本执行的效果(或报错信息)来判断其状态。
和 QuecOpen 开发的差异
-
开发难度:与QuecOpen相比,QuecPython开发门槛低,资料丰富且开放,入门快速。开发过程中无需反复编译和烧录固件,易于调试。同时内置大量成品功能库,基础功能无需自行开发,整体开发周期显著短于QuecOpen,开发成本也较低。
-
性能:从架构上看,QuecPython在QuecOpen的基础上移植了MicroPython解释器,作为底层系统上的一个任务运行。实际的用户脚本在MicroPython解释器中进行解析和执行。这一机制使得QuecPython的性能低于QuecOpen。
-
资源和灵活性:QuecPython由于屏蔽了底层的各类细节,在降低了编程的难度和复杂度的同时,也使得开发的灵活性有所下降。用户可接触到的资源和功能数量少于QuecOpen,也无法直接对内置的功能组件进行修改和自定义。
-
外设接口:QuecPython与QuecOpen在外设接口(如GPIO、I2C等)的数量、编号、初始电平等方面有所差异。在查阅《硬件设计手册》《兼容设计手册》等资料时应尤为注意,避免将QuecOpen的相关数据直接应用于QuecPython开发中。QuecPython开发请以在线文档为准。
和标准 AT 开发的差异
QuecPython开发和传统AT指令开发的差别,简而言之,两者可视作两种相互独立的开发方式,是”二选一“而非共存的关系。
-
QuecPython并不是在AT指令开发的基础上增加的新功能,而是一种基于脚本语言的针对模块的二次开发(OpenCPU)方式。
-
QuecPython固件中仅保留了最基础的AT指令交互功能,而且需要通过特殊方式(USB虚拟AT串口、特定的硬件串口或部分固件中内置的atcmd库)才能使用,大部分功能性AT指令都会失效或返回异常结果。
-
在给模块烧录完QuecPython固件后,继续使用 AT 指令控制模块很可能导致QuecPython程序运行发生异常。因此在大部分情况下,当模块烧录完QuecPython固件后,请勿继续使用AT开发。
-
可以通过给模块重新烧录标准固件的方式恢复其内置的AT功能。
和电脑端 Python 的差异
QuecPython移植自MicroPython,而MicroPython作为一种面向资源有限的嵌入式环境所开发的编程语言,在许多方面与在电脑端运行的CPython存在差异。
语法和设计理念差异
-
QuecPython(MicroPython)与Python的3.4版本在核心语法上保持兼容性,但在一些高级用法和内置类型的属性上与Python存在区别。MicroPython在官方文档中系统阐述了这些差异,但是并不完整。一些细节区别需要在开发过程中才可能经历到。
-
MicroPython面向资源受限的环境做了很多精简设计。其中一个典型的设计理念是,用户可以在已有功能库的基础上自行实现的功能,则不再集成到系统内。例如,在电脑端的Python开发中,用户普遍使用 datetime 库实现格式化的日期时间输出。而在MicroPython中,作者认为用户可以基于utime库提供的日期和时间信息,自行拼凑和格式化,完成输出,因此不再内置类似datetime库的功能。
功能库差异
-
和传统的电脑端Python(CPython)开发不同,QuecPython虽然也内置了时间设置、文件管理等一系列基础的功能库(标准库),但数量远少于CPython。这些标准库的名称和使用方法也存在很多区别,并不能完全兼容。例如,用于解析JSON文件的json库,在QuecPython 中被ujson库取代,内置的函数(方法)也只有dump()dumps()load()loads()四种。因此,在电脑端 Python 开发中涉及到库的经验,几乎都无法直接应用于QuecPython开发。
-
除了基础库外,QuecPython还内置了许多与模块硬件、物联网等相关的功能库。这些库中绝大部分都需要依赖模块底层的功能,因此只能在模块中运行。
-
QuecPython没有内置pip功能,无法实现功能库的快速在线安装,只能手动移植。
-
电脑端Python开发中常用的功能较为复杂的库,如OpenCV、PyQt、Flask、NumPy、Scrapy等,都不支持在QuecPython环境中直接运行。
开发工具差异
-
由于QuecPython和CPython在语法细节上存在差异,且QuecPython的大部分功能库无法在电脑端运行,因此,在QuecPython程序开发过程中,电脑端的各类工具,如VSCode和PyCharm等,只能起到简单的代码编辑作用,编写完成的脚本需要手动下载到模块内才能实现运行和调试。
-
目前VSCode和PyCharm等工具内置的语法提示和补全功能都是以CPython为基础的,可能不一定适用于 QuecPython,因此对于从未接触过Python语言的初学者而言,不建议在编写代码时使用过于智能的IDE工具,避免这些内置提示造成误导。
和 MicroPython 的差异
QuecPython本质上是运行于移远通信模块之上的MicroPython。由于MicroPython缺少完善的统一规范,根据开发者和硬件平台的不同,其内置的功能(库)数量和各类功能函数的用法均可能存在差异。部分QuecPython用户此前曾有过使用MicroPython开发ESP32、ESP8266、STM32等芯片的经验。为了便于这类用户完成平台迁移,将QuecPython与MicroPython的已知差异罗列如下。
-
部分MicroPython的标准库或专用库,如framebuf、network等,在QuecPython中未实现或未内置。
-
部分MicroPython标准库,如utime等,在QuecPython中的实现方式和功能完整度可能与ESP32等平台不同,致使性能或其他细节特性存在差异。
-
QuecPython的部分功能排布与MicroPython不同。例如,ADC功能在MicroPython中普遍包含于 machine 库内,而在QuecPython中则包含于misc库内。
-
涉及具体硬件接口,如UART、I2C、SPI的API,在MicroPython和QuecPython中有较大差异,不能直接混用。
-
QuecPython目前尚未内置upip功能,无法实现功能库的快速在线安装,只能手动移植。
-
QuecPython不保证与Thonny、uPyCraft等MicroPython上位机工具之间的兼容性。
综上所述,能在ESP32等平台上正常运行的MicroPython代码,通常无法在不经任何修改的情况下直接复制到移远的QuecPython环境中运行。因此,应避免将其他MicroPython硬件平台的资料和开发经验直接代入到QuecPython开发中。





