+
+ int main()
+ {
+ for(int i = 0; i < 10; i++){
+ printf("%d\n", i);
+ }
+ }
+ ```
+
+ ## 使用 Python 语言
+
+ ```python
+ for i in range(0, 10):
+ print(i)
+ ```
+
+作为一种解释型语言,Python 具备较好的可移植性,可在多种不同软硬件平台上运行。使用 Python 编写的程序不需提前编译成二进制代码,可以直接从源代码运行。此外,Python 具有脚本语言中最丰富和强大的功能库。这些库覆盖了文件 IO、GUI、网络编程、数据库访问等绝大部分应用场景。用 Python 语言开发程序时,许多功能可以通过调用库实现,开发者通常无需从零编写。当前,Python 语言因其语法简单、功能丰富的特点,已被广泛应用于服务器、数据库、图像处理、人工智能等领域。
+
+
+
+
+
+ 使用几行 Python 代码就可以实现人脸识别
+
+
+
+MicroPython 是 Python 语言的精简高效实现,可理解为一个可以运行在微处理器上的 Python 解释器。它使得用户可以编写 Python 脚本来控制硬件。MicroPython 继承了 Python 的完备的 REPL 交互功能,可以通过 REPL 串口随时输入代码执行,便于测试。MicroPython 还内置了文件系统,用户可以随意向设备端上传任意文件内容,并对目录结构进行修改。基于这一点,设备端可以同时储存多个程序脚本和其他文件,用户可根据需要手动选择并运行,类似于手机 App 的机制,极为灵活。此外,得益于 Python 解释型语言的特性,用户在使用 MicroPython 进行开发时,无需因为代码的更改而反复编译代码和烧录固件,仅需将修改过的代码重新上传至设备内即可。
+
+.. details:: 关于解释器
+ :open: false
+
+ 解释器(Interpreter)是一个和编译器(Compiler)相对的概念。作为一种解释型语言,Python 的源码是在运行中(而非运行前)被转换为机器可识别和执行的二进制形式。实现这一流程的工具称为解释器。
+
+
+
+
+
+ 解释型语言和编译型语言的执行流程差异
+
+
+
+ 对于初学者而言,解释器可以粗略地理解为 Python 脚本的运行环境。目前,在电脑端,CPython 是最为常用的 Python 解释器。绝大部分资料和工具中涉及的“Python”默认指的就是 CPython。在嵌入式领域,除了 MicroPython,CircuitPython、PikaPython 等解释器也受到国内开发者的欢迎。
+
+ 关于 Python 代码执行机制的更多讲解,可以参考 [编译器与解释器的区别和工作原理](https://zhuanlan.zhihu.com/p/39141067)、[浅谈字节码 + 虚拟机](https://blog.csdn.net/qq_39478403/article/details/106298611) 等在线资料,或是阅读 Python 的专业书籍。
+
+.. details:: 关于 REPL
+ :open: false
+
+ REPL,全称 Read-Eval-Print Loop,即“读取-求值-输出”循环,是一种简单的交互式编程环境。REPL 通常会提供一个 CLI(Command-Line Interface,命令行界面),接收用户的输入,解析并执行后,再将结果返回给用户。从功能和使用方法上,它类似于 Windows 的命令提示符(CMD)或 macOS / Linux 的 Shell。
+
+
+
+
+
+ Python 的 REPL 环境
+
+
+
+ REPL 的优势在于可以使得探索性的编程和调试更加便捷,因为“读取-求值-输出”循环通常会比经典的“编辑-编译-运行-调试”模式要更加方便快捷。REPL 对于学习一门新的编程语言具有很大的帮助,因为它能立刻对初学者的尝试做出回应。
+
+
+
+
+
+ 使用 MicroPython 开发 Raspberry Pi Pico
+
+
+
+目前,MicroPython 已经支持在包括 STM32、Raspberry Pi Pico、ESP32 在内的数十种硬件平台上运行。
+
+## 认识 QuecPython
+
+
+
+
+
+移远将 MicroPython 移植到了多款 4G 和 NB-IoT 模块上,并增加了大量与无线通信相关的功能库,称之为 QuecPython。在 [前文](./wireless-modules.md) 中,我们介绍了基于脚本语言的模块二次开发方式,QuecPython 正是这样的一种开发方式。基于 QuecPython,用户可以使用 Python 脚本对移远通信模块进行快速便捷的二次开发,轻松实现远程控制、数据上云等常用物联网功能。
+
+与传统的单片机开发和 QuecOpen(CSDK)开发相比,QuecPython 开发的最大优势在于其简便性。下图分别展示了传统开发方式和 QuecPython 开发方式的大致流程。不难看出,QuecPython 由于采用了脚本语言,只需要在首次开发时前模块内烧录专门的 QuecPython 固件,此后当代码编写和修改完成时即可立即运行,无需繁琐的编译和烧录步骤,显著提升了代码调试的速度。
+
+
+
+
+
+ 基于 QuecOpen 和 QuecPython 的模块开发流程对比
+
+
+
+QuecPython 的另一优势在于内置了丰富而实用的各类功能库。除了 MicroPython 的核心标准库外,QuecPython 还提供了包括语音通话、短信、MQTT、基站定位等在内的一系列与物联网相关的功能库,并实现了针对阿里云、腾讯云等主流云平台的支持。用户仅需不到 20 行代码就可以实现与阿里云的简单对接。
+
+
+
+
+
+ 基于 QuecPython 开发的典型产品
+
+
+
+目前,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 开发的差异
+
+
+
+
+
+ QuecPython 与 QuecOpen 在系统架构上的差异示意图
+
+
+
+- **开发难度**:与 QuecOpen 相比,QuecPython 开发门槛低,资料丰富且开放,入门快速。开发过程中无需反复编译和烧录固件,易于调试。同时内置大量成品功能库,基础功能无需自行开发,整体开发周期显著短于 QuecOpen,开发成本也较低。
+- **性能**:从架构上看,QuecPython 在 QuecOpen 的基础上移植了 MicroPython 解释器,作为底层系统上的一个任务运行。实际的用户脚本在 MicroPython 解释器中进行解析和执行。这一机制使得 QuecPython 的性能低于 QuecOpen。
+- **资源和灵活性**:QuecPython 由于屏蔽了底层的各类细节,在降低了编程的难度和复杂度的同时,也使得开发的灵活性有所下降。用户可接触到的资源和功能数量少于 QuecOpen,也无法直接对内置的功能组件进行修改和自定义。
+- **外设接口**:QuecPython 与 QuecOpen 在外设接口(如 GPIO、I2C 等)的数量、编号、初始电平等方面有所差异。在查阅《硬件设计手册》《兼容设计手册》等资料时应尤为注意,避免将 QuecOpen 的相关数据直接应用于 QuecPython 开发中。QuecPython 开发请以在线文档为准。
+
+### 和标准 AT 开发的差异
+
+QuecPython 开发和传统 AT 指令开发的差别,我们已经在 [前文](./wireless-modules.md) 中进行了详细的介绍。简而言之,两者可视作两种相互独立的开发方式,是”二选一“而非共存的关系。
+
+- 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 在 [官方文档](https://docs.micropython.org/en/latest/genrst/index.html) 中系统阐述了这些差异,但是并不完整。一些细节区别需要在开发过程中才可能经历到。
+- 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 开发中。
diff --git a/docs/Getting_started/zh/background/iot-and-low-code.md b/docs/Getting_started/zh/background/iot-and-low-code.md
new file mode 100644
index 0000000000000000000000000000000000000000..2f312a2cc4ebbd01c351e7bc8195fb9f492d8624
--- /dev/null
+++ b/docs/Getting_started/zh/background/iot-and-low-code.md
@@ -0,0 +1,230 @@
+# 物联网和低代码开发
+
+## 初识物联网
+
+### 物联网的概念
+
+20 世纪末,随着计算机网络和通信技术的兴起,互联网开始走进并融入人们的生活。传统互联网通常以人作为主体,数据的产生和传输都在人的控制下进行,数据的应用结果也在具体的人身上得到反映。以网络短视频为例,拍摄、上传和观看等环节都离不开用户的主动参与,而短视频平台对用户产生的数据进行分析和处理后,再根据偏好情况推送相关内容,最终受影响的依旧是用户本身。可以看出,传统物联网的大部分流程都是围绕人在运行和发展的。
+
+
+
+
+
+ 以人为主体的传统互联网
+
+
+
+随着技术的不断演进,物与物之间信息传输和交换的需求日趋增加,物联网(Internet of Things, IoT)的概念应运而生。
+
+现代物联网在本质上属于互联网的延伸。它将传统互联网的基础设施作为信息传递的载体,打破了时间和空间的限制,让“物”成为了数据产生和消费的主体,极大地拉近了“人与物”“物与物”的距离。以智慧农业灌溉为例,土壤中预埋的湿度传感器将土壤水分信息定时地上传到云端平台,当平台的程序监测到土壤缺水时,按照预设的规则,远程启动田间的灌溉设备,从而控制土壤含水量在合适水平。在这个场景中,无需人的参与,所有的流程都是靠物与物之间的交互完成,涉及的数据也是与“物”本身直接相关的。
+
+
+
+
+
+ 以物为主体的物联网
+
+
+
+当前,物联网的涵义和外延仍在不断的变化和发展中,因此还没有一个清晰准确的定义。不过,从上面的介绍中,可以大致看出物联网的特点:物联网是以“物”为主体的互联网,在形式和内容上处处体现着“物”的特征。因此,物联网应用的整体架构和开发方式也与传统的互联网应用有着显著的区别。
+
+如今,随着经济和科技的快速发展,20 多年前关于“万物互联”的幻想开始走入现实。从身边的各类智能设备、智能家居,到智慧地球和“元宇宙”的最新概念,物联网为这些技术变革提供了坚实有力的支撑。
+
+### 物联网的体系结构
+
+“下班前,打开手机中的开关,控制空调启动,到家后,即可享受舒适的室内温度。”这是日常生活中司空见惯的物联网应用场景。大部分物联网应用都和远程开空调一样,在用户层面的感知十分简单纯粹。但实际上,要实现这样一个简单的物联网应用,并不是一件容易的事。
+
+一个完整的物联网应用,需要涉及到较多的技术、环节和角色。从数据流向和功能角度,物联网生态系统的体系结构可被大致分成四个层级。各层级执行属于自身的特定的功能,同时也通过各种渠道与其他层级之间进行互动,进而实现完整的物联网功能。
+
+#### 终端层
+
+终端层(Terminal Layer),又称感知层(Perception Layer)或感知控制层,是物联网体系中最基础的一层。终端层的核心功能是与物理世界的交互,进而实现对现实对象(环境参数、设备状态等)的感知和对具体设备的控制。
+
+
+
+
+
+ 当代智能家居中的典型终端:智能灯泡
+
+
+
+终端层是绝大部分物联网实体设备(如传感器)的所在地。传感器通过将现实世界的物理量转换为电信号,实现信息采集和识别的重要作用。实际的物联网设备中,除了传感器,通常还具备用于协调和控制所有功能和部件运行的主控和用于网络接入的通信模块等部件。
+
+#### 网络层
+
+网络层(Network Layer)是负责将终端层的设备收集的数据传输到平台层,以及将平台层的控制指令发送回终端层的双向通信的桥梁。从功能维度,网络层又可分为接入层(Access Layer)和传输层(Transport Layer)。
+
+接入层主要涉及传统 OSI 模型中的物理层和数据链路层的功能,简单来说,就是设备接入网络、实现互联的各种方式。从介质上,可分为有线网络接入和无线网络接入两类。有线网络接入方式包括以太网、串行通信(如 RS-232、RS-485 等)和 USB 等。无线网络接入方式包括 Wi-Fi、蓝牙、蜂窝网络等。物联网无线通信的相关概念将在下一节进行详细阐述。
+
+
+
+
+
+ 在很多场景中,无线路由器是网络的入口
+
+
+
+传输层建立在接入层之上,包括了数据上报和下发的通信协议。与互联网终端相比,目前大部分物联网终端设备在处理性能、存储容量、网络速率等方面的可用资源较少,因而在通信时倾向于选择占用资源更少的通信协议,如 MQTT(Message Queuing Telemetry Transport)和 CoAP(Constrained Application Protocol)等。
+
+#### 平台层
+
+平台层(Platform Layer)是物联网架构的中间层,是数据被处理、存储和分析的地方。在过去,这一层一般由独立的服务器构成。随着微服务和云计算等技术的发展,现代的物联网平台层通常包括了基于云的系统性平台、数据分析引擎和中间件,使开发者能够在物联网基础设施之上构建和部署应用程序。
+
+
+
+
+
+ ThingsBoard 平台的微服务架构
+
+
+
+平台层在功能上作为承接设备和行业应用的中间服务,在整个物联网体系架构中起着承上启下的作用,承载了抽象化的业务逻辑和标准化的核心数据模型。一个典型的平台层不但可以实现设备的快速接入,还可以提供强大的模块化能力,满足行业应用场景下的各类需求。
+
+除了提供基本的设备接入和管理功能外,成熟的物联网平台层通常还包括安全管理、监控运维等功能,为实际应用提供更多的方便。
+
+#### 应用层
+
+应用层(Application Layer)是物联网架构的顶层,是物联网数据真正产生价值的地方,也是物联网与人产生直接关联的层次。应用层包括网络和移动应用程序、仪表板和其他用户界面,使用户能够监测和控制设备,访问数据,并执行其他任务。在大部分场景中,应用层承接平台层的数据并进行分析和处理,再将结果应用于各类自动化流程,或是在与用户的交互中予以呈现。应用层还可以包括机器学习和人工智能算法,使系统能够从数据中不断学习,并随着时间的推移而对结果进行优化。
+
+### 典型的物联网工程
+
+为了更好地让读者理解物联网的体系结构和相关技术,我们再次以前文中提到的远程开启空调为例,介绍一个典型的物联网工程的内容和开发流程。
+
+#### 需求分析
+
+对于大部分工程项目,了解和细化需求是开发的第一步。在没有充分理解需求的基础上盲目启动开发工作往往会影响开发效率和最终效果,甚至造成不可挽回的损失。
+
+在空调这个项目里,最初了解到的需求也许只有“远程开空调”这一项。面对这种需求,大部分人会设想的场景和流程是:
+
+> 在手机或平板电脑上按下某个 App 中的按键,App 发送指令给服务器,服务器再发送命令给用户家中的某个本地设备,本地设备控制空调启动。
+
+
+
+
+
+ 设想中的空调远程控制
+
+
+
+显然,其中包含的信息过于模糊,并含有大量先入为主的猜测,并不足以支持一个完整项目的开发。因此,需要通过与需求者(客户)的深入沟通,对内容和整体流程进行细化。对于这种类型的项目而言,要了解的内容包括但不限于:
+
+- 远程控制所用的设备:Android 智能手机 / iPhone / 普通 PC / ……
+- 用户交互所用的软件:专门的 App / 微信小程序 / 网页控制 / ……
+- 空调的型号及控制方式:红外 / 蓝牙 / ……
+- 云平台的类型:公有云 / 私有云 / 独立服务器 / ……
+- “本地设备”的类型:智能插座 / 家庭网关 / ……
+- “本地设备”的通信方式:Wi-Fi / 蓝牙 / Matter / 4G / ……
+- 用户的其他功能需求:定时开关 / 自动开关机 / 自动省电 / ……
+- ……
+
+经过细化,最终的业务流程可能会变成:
+
+> 用户通过操作 Android 智能手机上安装的独立 App,远程向部署在阿里云平台上的云端程序发送包括直接启动、定时开关等指令。云端程序根据不同的用户指令,直接或定时发送信息给部署于用户房间内的智能插座。智能插座通过 Wi-Fi 网络接收信息,然后通过红外遥控的形式,控制 xx 型号空调开启对应的工作模式。
+
+乍一看,开发难度好像增加了不少。但需求细节的增加,为实际的开发指明了更加清晰完整的路径。
+
+#### 框架建立
+
+结合上文介绍的物联网四层架构和刚刚梳理的需求细节,开发者可以开始构建起大概的工程框架。可以看出,这个工程的主要开发工作量集中在以下三个板块。
+
+1. 终端层(智能硬件):开发一个智能插座,负责实现与云平台的交互和对空调的控制。
+2. 平台层(核心逻辑):部署相应的平台,并在其上实现相应的判断和控制算法。
+3. 应用层(手机 App):通过智能手机 App 完成对空调的远程控制,并能通过 App 轻松查询空调运行的实时状态。
+
+事实上,大部分物联网工程的开发内容也都包括这三个方面。通俗地说,物联网工程开发,很多时候就是数据的“两头”(数据的产生侧和消费测)和“中间”(整体逻辑)的开发。
+
+
+
+
+
+ 常见的物联网应用结构
+
+
+
+#### 开发内容梳理
+
+在工程的整体框架清晰之后,就可以针对每一个部分的功能进行进一步的分析,整理出具体的开发路径和开发内容。
+
+对于设备端的开发,从总体上看是实现一个基于 Wi-Fi 的智能插座。所以,在开发过程中,开发者需要通过控制 Wi-Fi 芯片或模块实现智能插座应有的网络配置、连接以及与云平台双向通信的功能。此外,这个智能插座还需要实现对空调的红外遥控,因此开发者需要在其中集成红外发射管,并对其发射功率、安装角度等进行考量,同时对空调的红外编码进行研究。
+
+
+
+
+
+ 典型的智能插座的结构
+
+
+
+应用端的开发相对来说更为简单。基于 Android 系统开发智能手机 App,给用户提供图形化的操作界面,接收用户指令并发送到云端,同时从云端获取状态信息并在界面上进行显示。这个流程与普通的 App 开发相比没有显著差异。
+
+云端的开发是整个项目的核心。具体来说,需要设计完备的机制,实现设备的接入以及各类数据和指令的上传、下发和存储,同时还需要提供智能手机 App 可访问的设备操作 API。此外,应用的核心控制逻辑,如定时启停等操作,一般也都在云端实现。好在目前大部分现有的商业云平台都已经搭建了成熟的基础架构,让用户可以方便地实现物联网数据上云操作。
+
+需要注意的是,本节为了便于读者理解,只介绍了构成完整物联网业务逻辑的最核心的开发内容。一个真正成熟可商用的物联网项目,在开发过程中还会涉及到更多的功能,如设备监控、固件更新等等,开发工作量通常也远大于业余项目。
+
+#### 实际开发流程
+
+实际开发通常从硬件设计开始。在明确功能需求的基础上,对元件和其他物料进行选型,然后进行 PCB 设计和制造。对于一个智能插座而言,除了满足基本的功能需要,整体的体积、抗干扰能力等也是需要考虑的范畴。因此,硬件设计本身是一项门槛较高、专业性较强的工作。
+
+之后,需要对物联网云平台进行配置。正如前文所言,大部分现有的商业云平台都已经搭建了成熟的基础架构,开发者需要根据不同平台的说明,创建相应的产品和(虚拟)设备,并完成属性和接口的配置,便于后期将设备与平台进行对接。
+
+完成云平台配置后,就进入了真正的代码开发阶段。包括设备端的嵌入式软件开发和手机端的 App 开发。对于一般的嵌入式软件而言,除了实现设备所需的各类功能外,通常还需要根据实际需求,对功耗、稳定性等方面进行不断的迭代和优化。
+
+最后,在所有软硬件开发结束,并完成最终产品的装配后,进入测试阶段。在这一阶段,一般会根据产品的功能和相关规范进行相关的量产测试,如设备功能测试、老化测试、射频测试等。对于业余项目而言,测试通常是非必须的,但对于商业项目,只有经过充分的测试,才能尽可能地规避内在风险,减少产品上市后出现问题的可能性。
+
+## 低代码开发
+
+从前文的介绍可以看出,对于物联网项目开发而言,涉及的专业知识较多,开发工作量也较大。如何降低开发难度,让更多人参与到物联网开发中来,低代码开发无疑是最好的选择。
+
+### 低代码开发的由来
+
+低代码(Low-Code)开发是近年来流行的一种全新的软件开发方式。在低代码开发过程中,开发者可以使用预先生成的模板、组件和其他工具来创建软件应用程序,显著降低人工编写的代码总量和代码的复杂度。与传统的开发模式相比,这类方法使开发者能够更快、更省力地完成项目开发。
+
+低代码开发的概念起源于解决传统软件开发的挑战的需要。传统的软件开发往往需要专业的编程知识和大量的资源来完成。低代码开发的诞生是为了简化应用程序开发过程,使其更容易被包括编程经验有限的非专业用户在内的多数开发者所接受和实现。
+
+低代码开发的核心思想是让开发者只关注业务逻辑,而不需要把精力浪费在非业务层面。有过 Microsoft Visual Basic / Visual C++ 或工业组态软件使用经验的用户通常很容易理解这一点。在 Microsoft Visual Basic 中,通过简单的拖拽就可以绘制完备的用户界面。开发者只需开发事件处理相关的业务代码,而无需关注界面相关代码。在组态软件中,除了界面可以通过拖拽绘制外,很多的业务逻辑也被包装为功能块的形式,开发者通过拖拽和简单配置即可实现完整的系统功能。这些“积木式开发”的方式其实就反映了低代码开发的核心思想。
+
+
+
+
+
+ 使用组态工具管理网络设备
+
+
+
+低代码开发的最显著的特点在于对项目开发的加速作用。在项目开发中引入低代码技术后,传统的、需要消耗大量时间完成的冗长的编程工作将大幅减少,开发者因而可以更快、更省力地创建应用程序。这一特点使得低代码在快速迭代和原型设计中得到广泛应用,开发者可以便捷地修改和测试新的想法,而无需花费大量时间和精力。
+
+低代码开发的另一重要优势在于保证了程序的质量。“积木式开发”中,开发者实际做的是对于各类预先开发的功能模块的串联和排布,通常不会涉及到具体的技术细节的修改,因而可以从源头上规避开发者主观因素导致的程序质量问题。对于一般的开发者来说,只要低代码运行环境和各功能模块的质量有所保证,利用低代码开发方式开发的应用在可靠性上会远高于传统开发方式开发的应用。
+
+当前,低代码开发在包括网络和移动应用开发、流程自动化和数据集成等在内的多个领域中已经得到广泛应用。在网络和移动应用开发中,低代码开发可用于创建自定义用户界面、工作流程和数据模型。在流程自动化中,低代码开发可用于自动化重复性任务和简化业务流程。在数据集成方面,低代码开发可用于创建不同系统和应用程序之间的自定义集成。
+
+
+
+
+
+ Node-RED,一种已经在物联网领域得到广泛应用的低代码平台
+
+
+
+此外,低代码开发在实体企业中也受到了越来越广泛的欢迎。低代码开发可以帮助企业以较低的成本实现传统生产系统的现代化,并加速数字化转型工作。通过赋予非专业用户创建应用程序和自动化流程的能力,低代码开发技术可以帮助组织变得更加灵活,对不断变化的业务需求做出反应。
+
+### 物联网和低代码
+
+低代码开发技术目前已经在物联网生态系统的平台层和应用层得到了广泛的使用。借助低代码开发技术,平台开发者和用户可以轻松地对物联网数据在云端的流向进行控制(即“云组态”),并快速构建包括手机 App 在内的各种终端应用方式。随着各类编程框架的发展,低代码开发也开始在终端层,即具体的物联网设备开发中得到使用。
+
+在实际的物联网项目落地和推广应用过程中,普遍存在着开发量和成本之间的矛盾。对于一个具体的物联网应用场景,如智能养殖,需要接入云端的传感器和智能仪表数量和种类繁多,物理链路多样,通信协议各有不同,显著增加了开发周期和开发成本,同时大量的设备对于长期维护来说也带来了挑战。而大部分物联网场景对于系统的整体成本较为敏感。这一矛盾为物联网项目的快速落地实施带来了巨大的阻碍。而低代码开发凭借其低成本、短周期、高稳定性的优势,成为了解决这一问题的钥匙。
+
+从技术层面而言,物联网设备开发通常属于嵌入式系统(Embedded System)开发的范畴,在传统理念中,通常需要掌握多个领域的知识才能胜任。低代码开发技术的引入极大地降低了这一门槛,使得非专业用户也可以参与到开发中来。同时,模块化的开发方式也降低了开发者犯错的可能性,并为后续的维护提供了便利。随着物联网应用数量的不断增加,碎片化程度不断加深,人们对于能实现从端到云的物联网全链条开发的全栈工程师的需求也愈发迫切。低代码开发将进一步在这一领域展现其不可替代的价值。
+
+### 常见的低代码编程语言和框架
+
+物联网设备的低代码开发通常指的是使用简易的程序语言(如脚本语言)将各个模块和功能粘接在一起,以个性化、定制化的方式去快速实现开发者的需求。目前,在物联网领域常用的低代码框架种类较多,如基于 C++ 语言的 Arduino,基于 JavaScript 语言的 Johnny-Five,基于 Lua 语言的 NodeMCU,基于 Python 语言的 MicroPython 等。尽管它们在基础语法上存在较大差异,但它们的开发特性都是类似的:采用面向对象的思想进行代码设计,屏蔽了硬件、网络等方面的底层细节;同时赋予了灵活调用现有功能模块的能力。
+
+
+
+
+
+ 在 ESP8266 模块上使用 MicroPython 点亮 OLED 屏幕
+
+
+
+以 GPIO(General Purpose Input/Output,通用输入输出)开发为例,开发者通常无需查看原理图,理解电路层面的连接关系;不需要了解各类引脚的类型和速度模式,也不需要搞清楚电平上下拉等知识;更不需要手动编写传统嵌入式开发必不可少的时钟配置和系统初始化等代码。开发者只需按照实际的业务需求直接编写 GPIO 状态控制逻辑即可,开发门槛和代码量都得到了显著降低。
diff --git a/docs/Getting_started/zh/background/wireless-modules.md b/docs/Getting_started/zh/background/wireless-modules.md
new file mode 100644
index 0000000000000000000000000000000000000000..9d03fee5bef16270bd79706c7d5892ca606e7a68
--- /dev/null
+++ b/docs/Getting_started/zh/background/wireless-modules.md
@@ -0,0 +1,249 @@
+
+# 无线通信模块简介
+
+QuecPython 是运行在无线通信模块上的开发框架。对于首次接触物联网开发的用户而言,无线通信模块可能是一个相对陌生的概念。本文主要针对模块的概念、特性和开发方式进行简要的介绍。
+
+对于首次接触物联网开发的初学者,建议展开阅读下面关于无线通信和蜂窝网络的简介。
+
+.. details:: 关于通信
+ :open: false
+
+ 在 [前文](./iot-and-low-code.md) 中,我们介绍了物联网的四层结构。其中的网络层承担着设备接入和数据传输的重要功能。由于物联网设备数量较多,分布的空间范围极大,采用有线以太网方式接入网络显然无法满足需要。因此,大部分物联网设备都具备了无线通信的功能,即通过无线电波作为载体进行信号传输。当前,常用的物联网无线通信方式包括 Wi-Fi、蓝牙等十余种,不同方式的通信速率和通信距离存在显著差异。
+
+ 物联网无线通信的种类繁多,面向场景多样,因此在具体的功能结构和技术细节上存在较大的差异,但他们的基本流程和模式是类似的。为了便于理解,我们不妨使用人和人之间的通信进行类比。
+
+ 设想这样一个场景,在没有现代电子科技的情况下,位于两座相邻的山顶上的两人如何实现互相通信?
+
+
+
+
+
+ 两座孤单的山头
+
+
+
+ 显然,互相喊叫是最容易想到的答案。但当两人的距离远到一定程度时,靠声音传播信息显然已不太可行,通过视觉信号进行交流是更好的方式。因此,两人可以使用彩色旗帜或火把传递信息。不过,这一方法还有一个前提:双方都需要建立一种共识,了解并遵守不同的旗帜或者火光所代表的含义。这样,两人就可以在相距较远的山头实现低效但相对可靠的通信了。
+
+
+
+
+
+ 使用旗语传递求救信号
+
+
+
+ 与这个简陋的双人通信流程一样,现代通信同样包含类似的环节。有过使用电话线进行拨号上网经历的用户对于“猫”(Modem,调制解调器)应该不会感到陌生。电话线及电话网络是被设计成用于传输 300 Hz 到 3400 Hz 的模拟音频信号的,并不适合直接传输网络数据。要使得计算机之间可以通过电话线实现双向通信,需要满足两个基本条件:
+
+ - 通过操作系统和网卡,实现用户原始数据与可在网络设备间互相传输和辨识的标准数据形式之间的相互转换。
+ - 通过“猫”,实现数字信号与可通过电话线传输的模拟信号之间的相互转换。
+
+ 对于前者,这种通过规范化数据格式,使之符合某一标准或共识,从而提升信息传输效率和系统有效性的方法通常称为编码(Coding),在接收端则称为解码(Decoding)。对于后者,这种通过对原始信号进行各种转换,使之能借助不同的通信介质(或载体)进行传播的方法通常称为调制(Modulation),在接收端则称之为解调(Demodulation)。
+
+ 无线通信同样包含类似的环节。只不过与有线通信相比,其中的步骤更多、细节更为复杂。当然,作为用户和普通开发者,我们无需了解太多细节,各类无线终端设备和模块已经帮助我们处理好了一切。我们需要关注的,只是具体通信方式的选择和使用方法。
+
+
+
+
+
+ 无线通信系统简略框图
+
+
+
+ > 需要注意的是,为降低入门难度,本节的讲解并不全面和严谨。对于无线通信原理以及各类物联网无线通信方式的具体内容,本文不做系统介绍。有兴趣的读者可以自行参考《通信原理》《无线通信原理与应用》《物联网》等教材进行自学。
+
+.. details:: 关于蜂窝网络
+ :open: false
+
+ 蜂窝网络(Cellular Network,又称移动网络 Mobile Network)是构成现代移动电话和个人通信系统的基础无线通信技术架构之一。蜂窝通信的概念在上世纪 70 年代由贝尔实验室提出,最初是为了移动语音电话业务开发的。它将移动电话的服务区域根据地形和无线接收特性分为一个个小区(Cell),在每个小区内设一套基站系统。在传统理论中,这些小区被设计为六边形、圆形或正方形,以六边形最为常见。小区之间彼此连接,实现区域的完整覆盖,形如蜂巢,这也是该项技术被译为蜂窝网络的原因。如今,在实际场景中,很多基站的覆盖区域已经不再是蜂窝形状,但这个称谓依旧流传了下来。
+
+
+
+
+
+ 5G 毫米波蜂窝网络结构示意图
+
+
+
+ 如上图所示,与传统的通信方式相比,采用蜂窝通信方式的移动设备间不再通过无线信号直接相连,而是经由基站完成。这种方式在显著缩短通信距离和提升通信速率的同时,也减小了移动设备的体积和功耗。从诞生起,蜂窝网络和相关技术就一直在为无线通信注入革命性的推动和创新力量。
+
+
+
+
+
+ 从 1G 到 5G 的演进
+
+
+
+ 蜂窝移动通信技术发展到今天已经经历了五代,每一代都对应着不同的技术和标准,为用户提供了更高的数据传输速度,更好的语音通话质量,以及一系列新特性和新功能。从 1G 的模拟语音通信,到 5G 的全场景互联,蜂窝网络为已经成为现代社会运转的必不可少的信息基础设施之一。与其他无线通信方式相比,蜂窝通信依托电信运营商的已有网络,无需手动在应用现场进行网络部署,显著降低了联网的难度和工作量。在农业、环保、安防等物联网应用领域,蜂窝网络已成为首选的无线通信方式之一。
+
+## 初识模块
+
+无线通信模块,简称模块(Module,亦称模组或单元),是实现数据上云和远程通信的必不可少的组件,在各类物联网场景中已经得到了极为广泛的应用。从功能上看,它是在本地设备和网络之间构建连接的桥梁。像电脑插上 USB 网卡就可以开始上网一样,在嵌入式系统中加入了模块,系统就具有了连接无线网络的可能性。
+
+
+
+
+
+ 搭载移远 EC20 模块的某物联网产品主板
+
+
+
+很多初次接触模块的用户会对模块这样一个被金属壳笼罩着的奇怪器件感到陌生,它与传统的芯片和分立器件存在很大的不同。实际上,模块的本质就是一种小型的 PCBA(Printed Circuit Board Assembly,组装电路板)。当我们去掉模块表面的金属屏蔽罩,其内部依旧是熟悉(但更为密集)的 PCB 电路结构。
+
+
+
+
+
+ 某 4G 模块的内部图像
+
+
+
+有过嵌入式系统开发经验的用户对于“核心板”或者 SoM(System on Module)应该不会陌生。模块同样可理解为一种将无线通信所需的各类器件集成在一起,用于完成本地电路与云端服务的通信功能的高密度、小体积、带屏蔽罩的“核心板”。在本文开头的关于通信的介绍中,我们讲到了编码 / 解码和调制 / 解调的概念。在无线通信,尤其是蜂窝通信中,这些步骤往往会演变和拓展得极为复杂。模块的作用即是帮助我们完成这些复杂的步骤,实现简单高效的通信。
+
+模块的内部结构较为复杂。如下图所示,可以看到包含主芯片(高通 MDM9607)、存储器、电源管理芯片、功率放大器、射频前端等多种集成器件,以及大量密集分布的小尺寸封装的电阻、电容等元件。显然,模块的复杂度和精密度是远超传统电路板的。
+
+
+
+
+
+ EC20 Mini PCIe 模块的元件组成
+
+
+
+主芯片(Main Chip),部分厂家称之为基带(Baseband)芯片或调制解调器(Modem)芯片,是整个模块的核心。它的角色、功能和特性与手机中的 SoC(System on Chip,片上系统)十分相似。随着技术的发展和芯片制造工艺的提升,在现代模块中,主芯片通常已经集成了应用处理器(Application Processor,AP)、基带和射频的相关功能,运行着完备的操作系统(RTOS 或 Linux),对外提供包括 GPIO、USB 等在内的各种接口,并能够根据需求完成各类通信操作。从这个意义上看,模块既像一台没有屏幕和电池的手机,又像一种功能较为复杂的单片机。
+
+
+
+
+
+ 高通最新的 QCX216 4G Modem 芯片功能框图
+
+
+
+## 模块的应用模式
+
+对于同一台 Android 手机,不同人有不同的用法。一些用户会安分地使用出厂自带的系统和功能,另一些则热衷于解锁、刷机、root 等操作,更进一步地去开发和挖掘设备的潜力。和手机类似,模块也有这样的两类应用模式:标准模式和二次开发模式。
+
+### 标准模式
+
+和普通手机一样,模块在出厂时通常都会内置操作系统和应用程序。对于许多用户来说,直接使用模块出厂预置功能就可以满足大部分的网络通信需求。这种无需对模块进行开发和调整,直接作为成品功能单元进行使用的方式称为标准模式或传统模式,是当前应用最普遍的模块使用方式。
+
+
+
+
+
+ 标准模式示意图
+
+
+
+如上图所示,在标准模式中,模块与主控(MCU,如 STM32)之间通过 UART 或 USB 接口相连接,基于 AT 指令进行双向交互。不难看出,MCU 是整套系统的核心,通信模块是作为 MCU 的一个独立的功能外设的角色而存在的。系统的主要业务逻辑(用户应用,App)在 MCU 中运行,其他外设(图中的 External Devices)通过 UART、I2C 等接口与 MCU 相连,受 MCU 控制。
+
+.. details:: 关于 AT 指令
+ :open: false
+
+ AT 指令是目前业界历史最悠久,使用领域最广泛的通讯指令集之一。它构建起了一套用户和模块间的完备的双向通信机制:用户(或 MCU)通过向模块发送 AT 指令,控制模块执行包括联网、通话、定位等在内的各类功能,模块则将执行结果和状态返回给用户。这种“一发一收”的机制和相对单一的处理方式非常适合在资源有限的嵌入式环境中使用。如今,市面上的绝大多数模块在出厂时都内置了 AT Server 程序,可以接收、解析和执行特定的 AT 指令。
+
+
+
+
+
+ AT 指令的运行模式
+
+
+
+对于开发者而言,在基于标准模式使用模块时,主要的开发工作量在于主控中运行的用户 App。其业务代码中需要包含较为复杂的 AT 指令发送和返回值解析功能,例如对 URC(Unsolicited Result Code,非请求结果码)的处理等,因而对于初学者难度较大。
+
+除了 AT 指令功能,模块在标准模式下还可以作为无线网卡,为主控或其他上位机提供包括 PPP 拨号上网在内的一系列网络服务,此处不做赘述。
+
+### 二次开发模式
+
+在前文中我们曾提到,模块就像是功能较为复杂的单片机。事实上,模块所搭载的主芯片为了满足无线通信的需要,通常具有较高的性能和较多的资源,同时也配备了包括 GPIO、ADC、I2C 等在内的丰富的外设接口,只不过在标准模式下,这些资源对于用户通常不是直接可用的。如果能够“解锁”这一限制,模块的应用潜力将极大提升,这就需要对模块进行二次开发。
+
+二次开发的本意是在软件本身提供的一些基本功能和接口的基础上,进行组合和扩展,开发出新的功能来满足用户的特殊需求。具体到模块开发上,二次开发模式允许开发者在底层操作系统的基础上调用 API 编写并运行自己的应用,充分调用模块的各种资源,实现更多的可能性。
+
+
+
+
+
+ 二次开发模式示意图
+
+
+
+二次开发最重要的意义在于使模块在一定程度上具备了取代标准模式中的主控的能力,因而这种模式又被称为 OpenCPU 或 OpenMCU(不同厂家可能有不同的专门称呼,如移远称之为 QuecOpen)。如上图所示,与标准模式相比,OpenCPU 模式由于将模块本身作为主控使用,用户应用(App)直接置于模块内部运行,外设(图中的 External Devices)与模块直接相连,整个系统中无需外部处理器(MCU)或只需简单的外部芯片(图中的 Simple Microchip),因而可以有效地达到精简硬件设计、降低器件成本、缩小产品尺寸的目的。在单片机价格居高不下的当下,OpenCPU 方案受到了众多公司的青睐。
+
+但是,OpenCPU 方案也具有较为明显的局限性。由于这一模式通常需要用户直接在模块底层运行的操作系统的基础上进行开发,技术门槛较高,传统的、不具备系统级开发经验的单片机开发者很难适应。其次,由于 OpenCPU 技术支持难度大,模块厂家通常只向大客户提供相关的工具和资料,入门较为不便。最后,不同厂家、不同型号的模块,其 OpenCPU 开发环境和开发工具存在较大差别,用户编写的程序在不同模块间的移植存在一定的难度。
+
+### 使用脚本语言开发模块
+
+传统的 OpenCPU 开发通常使用 C 语言,因此也被称作 CSDK 开发。用户需要直接修改和控制底层的操作系统,具有较高的难度和一定的风险性。在 [前文](./iot-and-low-code.md) 中,我们介绍了低代码开发方式和它在物联网领域的应用。目前,已经有部分模块厂商通过在 CSDK 的基础上移植解释器 / 虚拟机的方式,使得用户可以使用 Lua、Python 等脚本语言对模块进行二次开发。
+
+与 C 语言相比,脚本语言在语法和使用方式上普遍较为简单,开发者无需花费太多时间和精力即可掌握,并可相对轻松地实现业务逻辑,便于项目的快速开发和功能迭代。同时,对于低代码开发方式而言,开发者通常无需考虑内存回收、基础任务调度等底层细节,显著降低了模块二次开发的技术门槛。最后,对于不同型号的模块,只要它们运行的是同一种脚本语言解释器,用户编写的程序通常只需少量修改(甚至无需修改)即可完成移植。
+
+如下的示例分别是在 EC100Y-CN 模块上使用 C 语言和 Python 语言实现 LED 闪灯的代码。可以看出,脚本语言更加简单直观,易于编写、便于理解。
+
+.. tabset:: LED 闪灯代码
+
+ ## 使用 QuecOpen(CSDK)
+
+ ```c
+ #include "ql_application.h"
+ #include "ql_gpio.h"
+ #include
+
+ static quec_gpio_cfg_t led_gpio_cfg[] =
+ {
+ {GPIO_PIN_NO_75, PIN_DIRECTION_OUT, PIN_NO_EDGE, PIN_PULL_DISABLE, PIN_LEVEL_LOW}
+ };
+
+ static void led_test(void *argv)
+ {
+ ql_gpio_init(led_gpio_cfg[0].gpio_pin_num, led_gpio_cfg[0].pin_dir, led_gpio_cfg[0].pin_pull, led_gpio_cfg[0].pin_level);
+
+ while (1)
+ {
+ ql_gpio_set_level(led_gpio_cfg[0].gpio_pin_num, PIN_LEVEL_LOW);
+ ql_rtos_task_sleep_s(1);
+ ql_gpio_set_level(led_gpio_cfg[0].gpio_pin_num, PIN_LEVEL_HIGH);
+ ql_rtos_task_sleep_s(1);
+ }
+ }
+
+ application_init(led_test, "led_test", 2, 2);
+ ```
+
+ ## 使用 QuecPython
+
+ ```python
+ from machine import Pin
+ import utime as time
+
+ led = Pin(Pin.GPIO15, Pin.OUT, Pin.PULL_DISABLE, 0)
+
+ def led_test():
+ while 1:
+ led.write(0)
+ time.sleep(1)
+ led.write(1)
+ time.sleep(1)
+
+ if __name__ == "__main__":
+ led_test()
+ ```
+
+当然,由于使用脚本语言开发时屏蔽了很多底层细节,因而在灵活性和可控性上不如传统的 C 语言开发。此外,脚本语言与 C 语言相比,本身性能相对较差、执行速度较慢,因而在部分对于性能和实时性要求较高的场景下不适合使用。
+
+## 选择合适的开发方式
+
+下表比较了标准模式,CSDK 二次开发和脚本二次开发在多个维度的差异。用户可根据实际需求选择最适合自己的开发方式。
+
+| 特性 | 标准模式 | 二次开发(CSDK) | 二次开发(脚本语言) | 备注 |
+| :------: | :------: | :--------------: | :------------------: | :----------------------------------------------------------- |
+| 物料成本 | ⭐⭐ | ⭐ | ⭐ | - 二次开发时,可将模块作为系统主控使用,节省单片机部分的成本。
|
+| 上手门槛 | ⭐ | ⭐⭐⭐ | ⭐ | - 模块厂商通常只面向大客户提供 CSDK 开发技术支持和其他相关服务。
|
+| 开发难度 | ⭐ | ⭐⭐⭐ | ⭐ | - CSDK 开发需要开发者拥有 RTOS 或 Linux 开发经验,普通单片机开发者很难快速掌握。
- 标准模式仅需用户掌握单片机串口通信和字符串处理方法,无特殊要求。
- 脚本语言开发方式仅需用户掌握基础语法,无特殊要求。
|
+| 开发周期 | ⭐ | ⭐⭐⭐ | ⭐ | - CSDK 开发的复杂度决定了其较长的开发周期和较高的开发成本。
|
+| 维护成本 | ⭐⭐ | ⭐⭐⭐ | ⭐ | - 脚本语言的模块化开发的特性有助于保证其长期运行的稳定性,同时普遍内置了 OTA 功能,便于执行远程升级。
|
+| 灵活性 | ⭐ | ⭐⭐⭐ | ⭐⭐ | - 标准模式下,开发者通常只能调用串口、ADC 等有限的功能。
- 使用脚本语言开发时,开发者可以通过内置的功能库调用大部分的模块资源。
- 使用 CSDK 开发时,开发者可以根据自身需求和想法直接控制所有可用资源。
|
+| 性能 | - | ⭐⭐⭐ | ⭐⭐ | - 脚本语言的性能远低于 C 语言,因此在对于运行速度、时间精度(时序)、资源数量等要求较高的少部分场合,不建议采用脚本语言开发。
|
+| 功耗 | ⭐ | ⭐⭐ | ⭐⭐ | - 一般的 4G 模块在自主休眠时的功耗水平在 mA 级别。
- 在标准模式下,可以通过使用系统主控切断模块供电的方式实现最大限度的省电,最低功耗可达前者的 1/10。
|
+| 生态系统 | ⭐⭐⭐ | ⭐ | ⭐⭐⭐ | - 标准 AT 指令开发和脚本开发在网络上都具有较多的公开资料和教程。
- CSDK 开发通常不具备开放生态。
|
diff --git a/docs/Getting_started/zh/hardware-basic/wdt.md b/docs/Getting_started/zh/hardware-basic/wdt.md
new file mode 100644
index 0000000000000000000000000000000000000000..1fdd953897d5bcee0dc235476405691ccc72893e
--- /dev/null
+++ b/docs/Getting_started/zh/hardware-basic/wdt.md
@@ -0,0 +1,50 @@
+# WDT - 看门狗
+
+本文主要介绍看门狗功能的使用
+
+## 看门狗简介
+
+### 什么是看门狗
+
+看门狗,全称WatchDog Timer,即看门狗计时器。看门狗是一种电子或软件定时器,用于检测计算机故障,并从计算机故障中恢复。在正常操作期间,计算机会定期重置看门狗计时器,以防止其丢失或“计时”。 如果由于硬件故障或程序错误而导致计算机无法重置看门狗,则计时器将丢失并生成超时信号, 超时信号会被用于启动一个或多个纠正措施。 纠正措施通常包括将计算机系统置于安全状态并恢复系统的正常运行。
+
+### 看门狗工作原理
+
+看门狗是一个计数器,其基本原理是先给计数器设定一个数值(溢出值),程序开始运行后,看门狗定时器开始计数,程序正常运行时,会周期发出指令将计数器置零(喂狗),重新开始计数,而如果长时间没有清零,计数器增加到设定值(定时器溢出),计数器会认为程序出现了异常,强制系统复位。
+
+## 看门狗应用
+
+示例代码
+
+```py
+from machine import WDT
+import utime
+
+
+if __name__ == '__main__':
+ wdt = WDT(5) # 启动看门狗,间隔时长5s
+ for i in range(0, 4):
+ wdt.feed()
+ print("喂狗: {}".format(i))
+ utime.sleep(4)
+ print("循环喂狗结束 接下来将触发看门狗复位")
+
+```
+
+运行结果
+
+```py
+>>> example.exec("/usr/test.py")
+
+喂狗: 0
+
+喂狗: 1
+
+喂狗: 2
+
+喂狗: 3
+
+循环喂狗结束 接下来将触发看门狗复位
+>>>
+```
+
diff --git a/docs/Getting_started/zh/iot-basic/http.md b/docs/Getting_started/zh/iot-basic/http.md
new file mode 100644
index 0000000000000000000000000000000000000000..0e786c314d7a082fa0937385e002782491722dbe
--- /dev/null
+++ b/docs/Getting_started/zh/iot-basic/http.md
@@ -0,0 +1,130 @@
+# HTTP通信(待完善)
+
+## 简介
+
+HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,它是万维网交换信息的基础,它允许将HTML(超文本标记语言)文档从Web服务器传送到Web浏览器。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP使用(Request)/应答(Response)模型,Web浏览器向Web服务器发送请求时,Web服务器处理请求并返回适当的应答。
+
+## GET示例
+
+get请求的http中最常见的请求方式,以下是示例代码
+
+```py
+import request
+import checkNet
+
+
+PROJECT_NAME = "request_get_exam"
+PROJECT_VERSION = "1.0.0"
+
+checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION)
+
+
+url = "http://httpbin.org/get"
+
+if __name__ == '__main__':
+ stagecode, subcode = checknet.wait_network_connected(30)
+ if stagecode == 3 and subcode == 1:
+ print('Network connection successful!')
+ resp = request.get(url) # 发起http GET请求
+ print(resp.json()) # 以json方式读取返回
+ else:
+ print('Network connection failed! stagecode = {}, subcode = {}'.format(stagecode, subcode))
+```
+
+运行结果
+
+```py
+>>> example.exec("/usr/test.py")
+
+Network connection successful!
+
+{'url': 'http://httpbin.org/get', 'headers': {'X-Amzn-Trace-Id': 'Root=1-6435a2ad-2d76fb8e753acad616d99a05', 'Host': 'httpbin.org'}, 'args': {}, 'origin': '39.144.15.119'}
+```
+
+## POST示例
+
+POST常用于客户端向服务端推送消息使用
+
+示例代码
+
+```py
+import request
+import checkNet
+
+
+PROJECT_NAME = "request_post_exam"
+PROJECT_VERSION = "1.0.0"
+
+checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION)
+
+
+url = "http://httpbin.org/post"
+data = {"key1": "value1", "key2": "value2", "key3": "value3"}
+
+
+if __name__ == '__main__':
+ stagecode, subcode = checknet.wait_network_connected(30)
+ if stagecode == 3 and subcode == 1:
+ print('Network connection successful!')
+ resp = request.post(url, data=ujson.dumps(data)) # 发起http POST请求
+ print(resp.json()) # 以json方式读取返回
+ else:
+ print('Network connection failed! stagecode = {}, subcode = {}'.format(stagecode, subcode))
+```
+
+运行结果
+
+```py
+>>> example.exec("/usr/test.py")
+
+Network connection successful!
+
+{'files': {}, 'headers': {'X-Amzn-Trace-Id': 'Root=1-6435a368-68dc753a6d709e625c35741f', 'Host': 'httpbin.org', 'Content-Length': '54'}, 'args': {}, 'form': {}, 'origin': '39.144.15.119', 'json': {'key2': 'value2', 'key3': 'value3', 'key1': 'value1'}, 'data': '{"key3": "value3", "key1": "value1", "key2": "value2"}', 'url': 'http://httpbin.org/post'}
+```
+
+## DELETE示例
+
+delete请求用于客户端请求删除服务端数据,不常用。
+
+示例代码
+
+```py
+import request
+import checkNet
+
+
+PROJECT_NAME = "request_delete_exam"
+PROJECT_VERSION = "1.0.0"
+
+checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION)
+
+
+url = "http://httpbin.org/delete"
+
+
+if __name__ == '__main__':
+ stagecode, subcode = checknet.wait_network_connected(30)
+ if stagecode == 3 and subcode == 1:
+ print('Network connection successful!')
+ resp = request.delete(url) # 发起http DELETE请求
+ print(resp.json()) # 以json方式读取返回
+ else:
+ print('Network connection failed! stagecode = {}, subcode = {}'.format(stagecode, subcode))
+```
+
+运行结果
+
+```py
+>>> example.exec("/usr/test.py")
+
+Network connection successful!
+
+{'files': {}, 'headers': {'X-Amzn-Trace-Id': 'Root=1-6435a431-08d97eb8539a76e068ea8bd9', 'Host': 'httpbin.org'}, 'args': {}, 'form': {}, 'origin': '39.144.15.119', 'json': None, 'data': '', 'url': 'http://httpbin.org/delete'}
+```
+
+## PUT示例
+
+用于更新服务器资源,不常用
+
+
+
diff --git a/docs/Getting_started/zh/media/background/about-qpy/compiler-and-interpreter.png b/docs/Getting_started/zh/media/background/about-qpy/compiler-and-interpreter.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e694ad4d8b262d908d4d5bc3a3e3382f7b7f6a2
Binary files /dev/null and b/docs/Getting_started/zh/media/background/about-qpy/compiler-and-interpreter.png differ
diff --git a/docs/Getting_started/zh/media/background/about-qpy/csdk-and-qpy-dev-steps.png b/docs/Getting_started/zh/media/background/about-qpy/csdk-and-qpy-dev-steps.png
new file mode 100644
index 0000000000000000000000000000000000000000..edea3217b6aea9de6a2a59ac9c59fadd40514d72
Binary files /dev/null and b/docs/Getting_started/zh/media/background/about-qpy/csdk-and-qpy-dev-steps.png differ
diff --git a/docs/Getting_started/zh/media/background/about-qpy/mpy-and-rpi-pico.png b/docs/Getting_started/zh/media/background/about-qpy/mpy-and-rpi-pico.png
new file mode 100644
index 0000000000000000000000000000000000000000..40aab3893eba6db101727ec76fe80fd7740c0758
Binary files /dev/null and b/docs/Getting_started/zh/media/background/about-qpy/mpy-and-rpi-pico.png differ
diff --git a/docs/Getting_started/zh/media/background/about-qpy/python-opencv.png b/docs/Getting_started/zh/media/background/about-qpy/python-opencv.png
new file mode 100644
index 0000000000000000000000000000000000000000..44f9a337ad69418ed6481159f658993cbaa17a18
Binary files /dev/null and b/docs/Getting_started/zh/media/background/about-qpy/python-opencv.png differ
diff --git a/docs/Getting_started/zh/media/background/about-qpy/python-repl.gif b/docs/Getting_started/zh/media/background/about-qpy/python-repl.gif
new file mode 100644
index 0000000000000000000000000000000000000000..a23486a55333cea838e8c6cca0b5e05d08a5a900
Binary files /dev/null and b/docs/Getting_started/zh/media/background/about-qpy/python-repl.gif differ
diff --git a/docs/Getting_started/zh/media/background/about-qpy/qpy-advances.png b/docs/Getting_started/zh/media/background/about-qpy/qpy-advances.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d8a3590fb2ff0b7fd392cc2dfe4e68f5df454fa
Binary files /dev/null and b/docs/Getting_started/zh/media/background/about-qpy/qpy-advances.png differ
diff --git a/docs/Getting_started/zh/media/background/about-qpy/qpy-intro.png b/docs/Getting_started/zh/media/background/about-qpy/qpy-intro.png
new file mode 100644
index 0000000000000000000000000000000000000000..2eedfde72468c94b7093ffcb11fb8f8596a79a84
Binary files /dev/null and b/docs/Getting_started/zh/media/background/about-qpy/qpy-intro.png differ
diff --git a/docs/Getting_started/zh/media/background/about-qpy/qpy-solutions.png b/docs/Getting_started/zh/media/background/about-qpy/qpy-solutions.png
new file mode 100644
index 0000000000000000000000000000000000000000..07d028c1686a1be235d1c8d5992d1d55f172db33
Binary files /dev/null and b/docs/Getting_started/zh/media/background/about-qpy/qpy-solutions.png differ
diff --git a/docs/Getting_started/zh/media/background/about-qpy/quecopen-and-quecpython.png b/docs/Getting_started/zh/media/background/about-qpy/quecopen-and-quecpython.png
new file mode 100644
index 0000000000000000000000000000000000000000..3fe007ef661fbf3201814b5039f679df58aac87c
Binary files /dev/null and b/docs/Getting_started/zh/media/background/about-qpy/quecopen-and-quecpython.png differ
diff --git a/docs/Getting_started/zh/media/background/iot-and-low-code/configuration-software.png b/docs/Getting_started/zh/media/background/iot-and-low-code/configuration-software.png
new file mode 100644
index 0000000000000000000000000000000000000000..17d1b54bdff251dca6c5b7b4ed9c72ac3c18c503
Binary files /dev/null and b/docs/Getting_started/zh/media/background/iot-and-low-code/configuration-software.png differ
diff --git a/docs/Getting_started/zh/media/background/iot-and-low-code/internet-of-human.png b/docs/Getting_started/zh/media/background/iot-and-low-code/internet-of-human.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd2aba282adc17de0ddd56862b1374c3a890f55d
Binary files /dev/null and b/docs/Getting_started/zh/media/background/iot-and-low-code/internet-of-human.png differ
diff --git a/docs/Getting_started/zh/media/background/iot-and-low-code/internet-of-things.png b/docs/Getting_started/zh/media/background/iot-and-low-code/internet-of-things.png
new file mode 100644
index 0000000000000000000000000000000000000000..a985e1c7bfec0b990afe3d973de5f40c452e53ee
Binary files /dev/null and b/docs/Getting_started/zh/media/background/iot-and-low-code/internet-of-things.png differ
diff --git a/docs/Getting_started/zh/media/background/iot-and-low-code/iot-application-structure.png b/docs/Getting_started/zh/media/background/iot-and-low-code/iot-application-structure.png
new file mode 100644
index 0000000000000000000000000000000000000000..3363c14296d7956ef60f3aa3337807d5a9350724
Binary files /dev/null and b/docs/Getting_started/zh/media/background/iot-and-low-code/iot-application-structure.png differ
diff --git a/docs/Getting_started/zh/media/background/iot-and-low-code/mpy-oled.gif b/docs/Getting_started/zh/media/background/iot-and-low-code/mpy-oled.gif
new file mode 100644
index 0000000000000000000000000000000000000000..765f493a6a51d31b4125ecf2979078c798cf8575
Binary files /dev/null and b/docs/Getting_started/zh/media/background/iot-and-low-code/mpy-oled.gif differ
diff --git a/docs/Getting_started/zh/media/background/iot-and-low-code/node-red.png b/docs/Getting_started/zh/media/background/iot-and-low-code/node-red.png
new file mode 100644
index 0000000000000000000000000000000000000000..a93bc12f18d182dc3aa1ab8782e0ce51920e915e
Binary files /dev/null and b/docs/Getting_started/zh/media/background/iot-and-low-code/node-red.png differ
diff --git a/docs/Getting_started/zh/media/background/iot-and-low-code/router.png b/docs/Getting_started/zh/media/background/iot-and-low-code/router.png
new file mode 100644
index 0000000000000000000000000000000000000000..de613d77d54fc46065e9f40bdb1cfd2b4785d250
Binary files /dev/null and b/docs/Getting_started/zh/media/background/iot-and-low-code/router.png differ
diff --git a/docs/Getting_started/zh/media/background/iot-and-low-code/smart-home-light.png b/docs/Getting_started/zh/media/background/iot-and-low-code/smart-home-light.png
new file mode 100644
index 0000000000000000000000000000000000000000..93adf6c7912266ba4fa517c4f682be3fe32f0917
Binary files /dev/null and b/docs/Getting_started/zh/media/background/iot-and-low-code/smart-home-light.png differ
diff --git a/docs/Getting_started/zh/media/background/iot-and-low-code/smart-plug.png b/docs/Getting_started/zh/media/background/iot-and-low-code/smart-plug.png
new file mode 100644
index 0000000000000000000000000000000000000000..28c0cb597e354f679e722b7596a1db93b2a1b6f4
Binary files /dev/null and b/docs/Getting_started/zh/media/background/iot-and-low-code/smart-plug.png differ
diff --git a/docs/Getting_started/zh/media/background/iot-and-low-code/temperature-remote-control.png b/docs/Getting_started/zh/media/background/iot-and-low-code/temperature-remote-control.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac9d753ff0a026e638265dcd46a965f6a2cd10f7
Binary files /dev/null and b/docs/Getting_started/zh/media/background/iot-and-low-code/temperature-remote-control.png differ
diff --git a/docs/Getting_started/zh/media/background/iot-and-low-code/thingsboard-architecture.png b/docs/Getting_started/zh/media/background/iot-and-low-code/thingsboard-architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..a556843b17fb32e9431fcd710b53a63882a59479
Binary files /dev/null and b/docs/Getting_started/zh/media/background/iot-and-low-code/thingsboard-architecture.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/5g-evolution.png b/docs/Getting_started/zh/media/background/wireless-modules/5g-evolution.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fc43b55527156ccc928ac21901f7fa7a10b9c3a
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/5g-evolution.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/at-command-architecture.png b/docs/Getting_started/zh/media/background/wireless-modules/at-command-architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..666bc048945301489eed3942200bc2f7f185fb9e
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/at-command-architecture.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/cellular-network-architecture.png b/docs/Getting_started/zh/media/background/wireless-modules/cellular-network-architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f05d5a6afe84d061e012a8a816fd23125092838
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/cellular-network-architecture.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/device-with-ec20.png b/docs/Getting_started/zh/media/background/wireless-modules/device-with-ec20.png
new file mode 100644
index 0000000000000000000000000000000000000000..50ae805534d5f582a5985496959f22b72097edd3
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/device-with-ec20.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/ec20-inner-components.png b/docs/Getting_started/zh/media/background/wireless-modules/ec20-inner-components.png
new file mode 100644
index 0000000000000000000000000000000000000000..5268c877bba34c1938a97cdb37a3176cf6df303d
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/ec20-inner-components.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/ec20-naked-top.png b/docs/Getting_started/zh/media/background/wireless-modules/ec20-naked-top.png
new file mode 100644
index 0000000000000000000000000000000000000000..70bac6034c32a2c016b2db1aac0dc875421e8fdb
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/ec20-naked-top.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/help-signal-shown-flag.png b/docs/Getting_started/zh/media/background/wireless-modules/help-signal-shown-flag.png
new file mode 100644
index 0000000000000000000000000000000000000000..8bf4622a9dea46b8467d2211ada3975a8608cc67
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/help-signal-shown-flag.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/open-mode-module.png b/docs/Getting_started/zh/media/background/wireless-modules/open-mode-module.png
new file mode 100644
index 0000000000000000000000000000000000000000..32fa5c46c19194177b839f20d280440793c71778
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/open-mode-module.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/qcx216-diagram.png b/docs/Getting_started/zh/media/background/wireless-modules/qcx216-diagram.png
new file mode 100644
index 0000000000000000000000000000000000000000..7fb34344585125263e383bf12fe3d1e6451b78fd
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/qcx216-diagram.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/standard-mode-module.png b/docs/Getting_started/zh/media/background/wireless-modules/standard-mode-module.png
new file mode 100644
index 0000000000000000000000000000000000000000..6926f0b945661b13c5e9543d4fa0b1c135593a29
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/standard-mode-module.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/two-hills.png b/docs/Getting_started/zh/media/background/wireless-modules/two-hills.png
new file mode 100644
index 0000000000000000000000000000000000000000..f91785e51a038ac9fc1d7b5efa7ce228a5f9f76c
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/two-hills.png differ
diff --git a/docs/Getting_started/zh/media/background/wireless-modules/wireless-communication-route.png b/docs/Getting_started/zh/media/background/wireless-modules/wireless-communication-route.png
new file mode 100644
index 0000000000000000000000000000000000000000..e79108443932ac68caf30829fd8fdca7bd08b0c1
Binary files /dev/null and b/docs/Getting_started/zh/media/background/wireless-modules/wireless-communication-route.png differ
diff --git a/docs/Getting_started/zh/os/files.md b/docs/Getting_started/zh/os/files.md
new file mode 100644
index 0000000000000000000000000000000000000000..5c92257da4ab9c4bbbeb8708ebeb83fa15961b37
--- /dev/null
+++ b/docs/Getting_started/zh/os/files.md
@@ -0,0 +1,218 @@
+# 文件管理
+
+本文主要介绍如何使用`QuecPython`的文件系统。
+
+## POSIX API
+
+在QuePython上操作文件可直接使用POSIX的接口进行开发
+
+1. 打开文件
+
+ ```py
+ open(file, mode="r")
+ ```
+
+ - file: 文件路径(**在QuecPython里,用户文件路径在/usr下,所以用户创建读取文件都要在此目录下进行**)
+
+ - mode: 打开模式,可选,默认为只读
+
+ | 模式 | 描述 |
+ | ---- | ------------------------------------------------------------ |
+ | w | 以**只写**方式打开文件。如果该文件已存在则打开文件,并从开头开始编辑,**即原有内容会被删除**。如果该文件不存在,创建新文件。 |
+ | r | 以**只读**方式打开文件。文件的指针将会放在文件的开头。 |
+ | w+ | 以**读写**方式打开文件。如果该文件已存在则打开文件,并从开头开始编辑,**即原有内容会被删除**。如果该文件不存在,创建新文件。 |
+ | r+ | 以**读写**方式打开文件。该文件必须存在。文件的指针将会放在文件的开头。 |
+ | wb | 以**只写**方式打开**二进制**文件。如果该文件已存在则打开文件,并从开头开始编辑,**即原有内容会被删除**。如果该文件不存在,创建新文件。 |
+ | rb | 以**只读**方式打开**二进制**文件。文件的指针将会放在文件的开头。 |
+ | wb+ | 以**读写**方式打开**二进制**文件。如果该文件已存在则打开文件,并从开头开始编辑,**即原有内容会被删除**。如果该文件不存在,创建新文件。 |
+ | rb+ | 以**读写**方式打开**二进制**文件。该文件必须存在。文件的指针将会放在文件的开头。 |
+ | a | 打开一个文件用于**追加**。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
+ | a+ | 打开一个文件用于**读写**。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行读写。 |
+ | ab | 打开一个二进制文件用于**追加**。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
+ | ab+ | 打开一个二进制文件用于**读写**。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行读写。 |
+
+2. 写入文件
+
+ ```py
+ write(str)
+ ```
+
+ - str: 要写入的数据
+
+ 该函数返回成功写入的字符串长度
+
+3. 读取文件
+
+ ```py
+ read(size)
+ ```
+
+ - size:要读取的长度,单位字节
+
+ 该函数返回成功读到的数据
+
+4. 读取文件的一行
+
+ ```py
+ readline(size)
+ ```
+
+ - size:要读取的长度,单位字节
+
+ 调用此方法会根据结束符自动读取,并返回一个等于size长度的字符串,如果size为-1则返回整行。
+
+5. 读取文件所有行
+
+ ```py
+ readlines()
+ ```
+
+ 调用此方法会根据结束符自动分行读取,并返回一个包含所有分行的列表。
+
+6. 移动文件指针
+
+ ```py
+ seek(offset, whence)
+ ```
+
+ - offset: 开始的偏移量,也就是代表需要移动偏移的字节数
+ - whence: 可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
+
+7. 关闭文件
+
+ ```py
+ close()
+ ```
+
+ 调用后关闭文件,不再继续操作该文件。
+
+综合示例
+
+```py
+# 创建一个test.txt文件,注意路径在/usr下
+f = open("/usr/test.txt", "w+")
+i = f.write("hello world\n")
+i = i + f.write("hello quecpython\n")
+print("成功写入了{}个字节".format(i))
+f.seek(0)
+str = f.read(10)
+print("读取10个字节:{}".format(str))
+f.seek(0)
+str = f.readline()
+print("读取一行:{}".format(str))
+f.seek(0)
+str = f.readlines()
+print("读取所有行:{}".format(str))
+f.close()
+# del f # 非必须操作,系统gc的时候会自动回收
+print("文件关闭 测试结束")
+```
+
+运行结果
+
+```py
+>>> import example
+>>> example.exec("/usr/test.py")
+
+成功写入了29个字节
+读取10个字节:hello worl
+读取一行:hello world
+读取所有行:['hello world\n', 'hello quecpython\n']
+文件关闭 测试结束
+>>>
+```
+
+## UOS API
+
+当进行文件高级操作的时候,需要调用uos库进行操作,以下是综合示例。
+
+```py
+import uos
+
+def main():
+
+ # 创建文件 此处并没有对文件进行写入操作
+ f = open("/usr/uos_test","w")
+ f.close()
+ del f
+
+ # 查看文件是否存在
+ t = uos.listdir("/usr")
+ print("检查usr路径的文件:{}".format(t))
+
+ if "uos_test" not in t:
+ print("新建文件不存在 测试失败")
+ return
+
+ # 查看文件状态
+ a = uos.stat("/usr/uos_test")
+ print("文件占用了{}字节".format(a[6]))
+
+ # 重命名文件
+ uos.rename("/usr/uos_test", "/usr/uos_test_new")
+ t = uos.listdir("/usr")
+ print("已经重命名测试文件 检查usr路径的文件:{}".format(t))
+
+ if "uos_test_new" not in t:
+ print("重命名文件不存在 测试失败")
+ return
+
+ # 删除文件
+ uos.remove("/usr/uos_test_new")
+ t = uos.listdir("/usr")
+ print("已经删除测试文件 检查usr路径的文件:{}".format(t))
+
+ if "uos_test_new" in t:
+ print("删除文件失败 测试失败")
+ return
+
+ # 目录操作
+ t = uos.getcwd()
+ print("当前路径是:{}".format(t))
+ uos.chdir("/usr")
+ t = uos.getcwd()
+ print("当前路径是:{}".format(t))
+ if "/usr" != t:
+ print("文件夹切换失败")
+ return
+
+ uos.mkdir("testdir")
+ t = uos.listdir("/usr")
+ print("创建测试文件夹 检查当前路径的文件:{}".format(t))
+
+ if "testdir" not in t:
+ print("文件夹创建失败")
+ return
+
+ uos.rmdir("testdir")
+ t = uos.listdir("/usr")
+ print("删除测试文件夹 检查当前路径的文件:{}".format(t))
+
+ if "testdir" in t:
+ print("文件夹删除失败")
+ return
+
+if __name__ == "__main__":
+ main()
+```
+
+示例输出
+
+```py
+>>> example.exec("/usr/test.py")
+
+检查usr路径的文件:['test.py', 'system_config.json', 'uos_test']
+文件占用了0字节
+
+已经重命名测试文件 检查usr路径的文件:['test.py', 'system_config.json', 'uos_test_new']
+已经删除测试文件 检查usr路径的文件:['test.py', 'system_config.json']
+
+当前路径是:/
+当前路径是:/usr
+
+创建测试文件夹 检查当前路径的文件:['test.py', 'system_config.json', 'testdir']
+
+删除测试文件夹 检查当前路径的文件:['test.py', 'system_config.json']
+>>>
+```
+
diff --git a/docs/Getting_started/zh/os/power.md b/docs/Getting_started/zh/os/power.md
new file mode 100644
index 0000000000000000000000000000000000000000..a64aa486e6407728cbf320d0382352fc5607665f
--- /dev/null
+++ b/docs/Getting_started/zh/os/power.md
@@ -0,0 +1,35 @@
+# 电源管理
+
+Quecpython的电源管理分为NET控制和PM控制两部分。
+
+## 工作模式切换
+
+模块的工作状态可分为,全功能开启(默认),全功能关闭,飞行模式。
+
+```py
+# 获取工作模式
+import net
+net.getModemFun()
+
+# 设置飞行模式
+net.setModemFun(4)
+```
+
+注意:开启飞行模式时,射频将会被关闭,此时模块处于断网阶段,无法进行任何网络通信。
+
+
+
+## 低功耗控制
+
+### Cat1的PM
+
+在Quecpython中,低功耗的配置是基于锁的,即有锁则不休眠,无锁则自动休眠。此方法在使用过程中常用于锁住业务,当业务执行时,对锁进行上锁操作,防止芯片进入休眠状态,当业务结束后对锁进行解锁操作,通知底层用户业务已结束,可以调度休眠以降低功耗。
+
+调用示例可参考API Reference.
+
+### NBIOT的PM
+
+因为NBIOT网络结构的特殊性,所以NB模块的休眠设置会更加繁琐一些,NBIOT的休眠寻呼模式有三种,分别是PSM EDRX DRX,三者的功耗是上升排列,Quecpython目前支持PSM模式的休眠控制,即用户只需要去设置PSM相关定时器就可以完成模块的在网休眠。
+
+PSM模式休眠有两个休眠控制定时器需要用户来配置,一个是TAU(T3412),另一个是ACT(T3324),ACT是终端在idle态的超时时间,TAU是终端在PSM态的超时时间,当TAU超时后,终端将进入connect态进行联网寻呼。
+