diff --git a/config/config_zh.json b/config/config_zh.json
index 2e67d147a93550fd1ddb5b9f2aafd0f33ed1f9bc..dc00f7ef0e161e9cac27309838bc4ddf1c9e74a8 100644
--- a/config/config_zh.json
+++ b/config/config_zh.json
@@ -27,22 +27,15 @@
"url": "/API_reference/zh/index.html",
"label": "API参考手册"
},
- {
- "url": "/development_guide/zh/index.html",
- "label": "开发指南"
- },
- {
- "url": "/development_tool_tutorial/zh/index.html",
- "label": "工具使用教程"
+ {
+ "url": "/Getting_started/zh/index.html",
+ "label": "快速开始"
},
{
- "url": "/advanced_tutorial/zh/index.html",
- "label": "高级教程"
- },
- {
- "url": "/solutions/zh/index.html",
- "label": "解决方案"
+ "url": "/Application_guide/zh/index.html",
+ "label": "开发指南"
},
+
{
"url": "/FAQ/zh/index.html",
"label": "FAQ"
@@ -51,7 +44,7 @@
}
]
},
- "footer":{
+ "footer":{
"top":[
{
"label": "链接",
@@ -84,4 +77,4 @@
}
]
}
-}
\ No newline at end of file
+}
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/math.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/math.md"
index 61e22885ef0a56830395b55295764d4ea3029a12..a79d4dacb7ea5deafc4d690e353d2c4e10495cdc 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/math.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/math.md"
@@ -14,8 +14,8 @@ math.pow(x, y)
**参数描述**
-* `x`:浮点数
-* `y`:浮点数
+* `x`:任意实数类型
+* `y`:任意实数类型
**返回值描述**
浮点数:`x`的 `y`次方
@@ -40,7 +40,7 @@ math.acos(x)
**参数描述**
-* `x`:浮点数,是-1~1之间的数,包括-1和1,如果小于-1或者大于1,会产生错误。
+* `x`:任意实数类型,是-1~1之间的数,包括-1和1,如果小于-1或者大于1,会产生错误。
**返回值描述**
浮点数:`x`的反余弦弧度值
@@ -65,7 +65,7 @@ math.asin(x)
**参数描述**
-* `x`:浮点数,是-1~1之间的数,包括-1和1,如果小于-1或者大于1,会产生错误。
+* `x`:任意实数类型,是-1~1之间的数,包括-1和1,如果小于-1或者大于1,会产生错误。
**返回值描述**
浮点数:`x`的反正弦弧度值
@@ -90,7 +90,7 @@ math.atan(x)
**参数描述**
-* `x`:浮点数
+* `x`:任意实数类型
**返回值描述**
浮点数:`x`的反正切弧度值
@@ -117,8 +117,8 @@ math.atan2(x, y)
**参数描述**
-* `x`:浮点数
-* `y`:浮点数
+* `x`:任意实数类型
+* `y`:任意实数类型
**返回值描述**
浮点数:坐标 (`x` ,`y`)的反正切值
@@ -145,10 +145,10 @@ math.ceil(x)
**参数描述**
-* `x`:浮点数
+* `x`:任意实数类型
**返回值描述**
-整数:`x`的上入整数
+整数:`x`:大于等于入参的最小整数
**示例:**
@@ -170,8 +170,8 @@ math.copysign(x, y)
**参数描述**
-* `x`:浮点数
-* `y`:浮点数
+* `x`:任意实数类型
+* `y`:任意实数类型
**返回值描述**
浮点数,把 `y`的正负号加到 `x`前面
@@ -200,7 +200,7 @@ math.cos(x)
**参数描述**
-* `x`:浮点数
+* `x`:任意实数类型
**返回值描述**
浮点数,`x`的弧度的余弦值,范围-1~1之间
@@ -225,7 +225,7 @@ math.degrees(x)
**参数描述**
-* `x`:浮点数
+* `x`:任意实数类型
**返回值描述**
浮点数,弧度 `x`转换为角度
@@ -258,7 +258,7 @@ math.exp(x)
**参数描述**
-* `x`:浮点数
+* `x`:任意实数类型
**返回值描述**
浮点数,`e`的 `x`次幂
@@ -285,7 +285,7 @@ math.fabs(x)
**参数描述**
-* `x`:浮点数
+* `x`:任意实数类型
**返回值描述**
浮点数,`x`的绝对值
@@ -310,10 +310,10 @@ math.floor(x)
**参数描述**
-* `x`:浮点数
+* `x`:任意实数类型
**返回值描述**
-浮点数,`x`的下舍整数
+整数,`x`:小于等于入参的最大整数
**示例:**
@@ -339,9 +339,10 @@ math.fmod(x, y)
**参数描述**
-* `x`:浮点数
-* `y`:浮点数
- **返回值描述**
+* `x`:任意实数类型
+* `y`:任意实数类型
+
+**返回值描述**
`x`/`y`的余数,浮点数
**示例:**
@@ -366,8 +367,10 @@ math.modf(x)
**参数描述**
-* `x`:浮点数
- **返回值描述**
+* `x`:任意实数类型
+
+
+**返回值描述**
`x`/`y`的余数,浮点数
**示例:**
@@ -380,10 +383,10 @@ math.modf(x)
## 返回一个元组(m,e)
-### `math.modf`
+### `math.frexp`
```python
-math.modf(x)
+math.frexp(x)
```
返回一个元组(m,e)
@@ -391,8 +394,9 @@ math.modf(x)
**参数描述**
* `x`:浮点数
- **返回值描述**
- 返回一个元组 `(m,e)`,其计算方式为:`x`分别除0.5和1,得到一个值的范围,`2e`的值在这个范围内,`e`取符合要求的最大整数值,然后 `x/(2e)`,得到 `m`的值。如果 `x`等于0,则 `m`和 `e`的值都为0,`m`的绝对值的范围为(0.5,1)之间,不包括0.5和1。
+
+**返回值描述**
+返回一个元组 `(m,e)`, 以 (m, e) 对的形式返回 x 的尾数和指数。 m 是一个浮点数, e 是一个整数,正好是 x == m * 2**e 。 如果 x 为零,则返回 (0.0, 0) ,否则返回 0.5 <= abs(m) < 1
**示例:**
@@ -414,7 +418,7 @@ math.isfinite(x)
**参数描述**
-* `x`,浮点数
+* `x`,任意实数类型
**返回值描述**
@@ -440,7 +444,7 @@ math.isinf(x)
**参数描述**
-* `x`,浮点数
+* `x`,任意实数类型
**返回值描述**
@@ -462,15 +466,15 @@ False
pymath.isnan(x)
```
-判断是否数字
+判断是否非数字(NaN)
**参数描述**
-* `x`,浮点数
+* `x`,任意实数类型
**返回值描述**
-如果 `x`不是数字,返回 `True`,否则返回 `False`。
+如果 `x`为非数字,返回 `True`,否则返回 `False`。
**示例:**
@@ -488,11 +492,11 @@ False
math.ldexp(x, exp)
```
-**返回x*(2**i)的值
+**返回x*(2^i)的值**
**参数描述**
-* `x`,浮点数
+* `x`,任意实数类型
**返回值描述**
@@ -518,7 +522,7 @@ math.log(x)
**参数描述**
-* `x`,浮点数,小于0会报错
+* `x`,任意实数类型,小于0会报错
**返回值描述**
@@ -550,7 +554,7 @@ math.radians(x)
**参数描述**
-* `x`,浮点数
+* `x`,任意实数类型
**返回值描述**
@@ -576,7 +580,7 @@ math.sin(x)
**参数描述**
-* `x`,浮点数
+* `x`,任意实数
**返回值描述**
@@ -600,11 +604,11 @@ math.sin(x)
math.sqrt(x)
```
-返回x弧度的平方根
+返回x的平方根
**参数描述**
-* `x`,浮点数
+* `x`,任意实数类型
**返回值描述**
@@ -632,7 +636,7 @@ math.tan(x)
**参数描述**
-* `x`,浮点数
+* `x`,任意实数类型
**返回值描述**
@@ -658,7 +662,7 @@ math.trunc(x)
**参数描述**
-* `x`,浮点数
+* `x`,任意实数类型
**返回值描述**
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/sys.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/sys.md"
index bca15578f5e75a7b1eeed9520fa3025939899887..3bb3bf88275a28f0fe626055aa7effc440e71448 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/sys.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/sys.md"
@@ -24,8 +24,25 @@ except ImportError:
返回当前microPython版本信息。对于MicroPython,它具有以下属性:
- name - 字符串“ micropython”
+
- version - 元组(主要,次要,微型),例如(1、7、0)
+- _mpy - mpy文件的版本信息,解析方法如下,mpy_cross生成mpy时需要与此版本信息相适配
+
+```python
+import sys
+sys_mpy = sys.implementation._mpy
+arch = [None, 'x86', 'x64',
+ 'armv6', 'armv6m', 'armv7m', 'armv7em', 'armv7emsp', 'armv7emdp',
+ 'xtensa', 'xtensawin'][sys_mpy >> 10]
+print('mpy version:', sys_mpy & 0xff)
+print('mpy sub-version:', sys_mpy >> 8 & 3)
+print('mpy flags:', end='')
+if arch:
+ print(' -march=' + arch, end='')
+print()
+```
+
建议使用此对象来将MicroPython与其他Python实现区分开。
### `sys.maxsize`
@@ -34,7 +51,7 @@ except ImportError:
### `sys.modules`
-已载入模块的字典。
+以字典形式返回当前Python环境中已经导入的模块。
### `sys.platform`
@@ -50,11 +67,11 @@ MicroPython运行的平台。
### `sys.version`
-MicroPython 语言版本,字符串格式。
+MicroPython 版本,字符串格式。
### `sys.version_info`
-MicroPython 语言版本,整数元组格式。
+MicroPython 版本,整数元组格式。
## **方法**
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ubinascii.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ubinascii.md"
index 6aa5c4e56e6b426c9c6e39d343fa732e2b571eba..7966accf9ee3ff351826dc2db717db20a6387d16 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ubinascii.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ubinascii.md"
@@ -4,7 +4,7 @@
本文阐述了QuecPython的ubinascii模块的用法,描述了ubinascii模块最新版本的特性。
```
-ubinascii 模块实现了二进制数据与各种ASCII编码之间的转换(双向)。该模块实现相应CPython模块的子集,更多信息请参阅阅CPython文档:[binascii](https://docs.python.org/3.5/library/binascii.html#module-binascii)
+该模块实现了二进制数据与各种ASCII编码之间的转换(双向)。该模块实现相应CPython模块的子集,更多信息请参阅阅CPython文档:[binascii](https://docs.python.org/3.5/library/binascii.html#module-binascii)
## 构造函数
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ucollections.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ucollections.md"
index e3c2b1af51935958376404be93cee36035f5977e..082ffba69d23fb150addd6a79401e6d6dcea7019 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ucollections.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ucollections.md"
@@ -1,7 +1,7 @@
# ucollections - 集合和容器类型
-模块功能:ucollections 模块可以创建一个新的容器类型,用于保存各种对象。该模块实现了CPython模块相应模块的子集。更多信息请参阅阅CPython文档:[collections](https://docs.python.org/3/library/collections.html)
+模块功能:ucollections 模块可以创建一个新的容器类型,用于保存各种对象。该模块实现了CPython模块相应模块的子集。更多信息请参阅CPython文档:[collections](https://docs.python.org/3/library/collections.html)
## `ucollections`方法
### `ucollections.namedtuple`
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uhashlib.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uhashlib.md"
index 38aba70145ff47043d3d29b41a73cf573a146d02..444876f0652b81946ea892976474eb4ce6dd411f 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uhashlib.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uhashlib.md"
@@ -4,7 +4,7 @@
本文阐述了QuecPython的uhashlib模块的用法,描述了uhashlib模块最新版本的特性。
```
-ubinascii 模块实现二进制数据散列算法。
+该模块实现二进制数据散列算法。
> 注意:目前仅支持sha256,sha1,MD5。
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ujson.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ujson.md"
index cdc962fd555fc7998043b6a9fb2e10f7a3d34bf1..486053779a1086cdb773aedddfe844bf1c2b15fa 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ujson.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ujson.md"
@@ -1,10 +1,10 @@
-# `ujson` - JSON编码和解码
-`ujson`模块实现在Python数据对象和JSON数据格式之间进行转换的功能。该模块实现相应CPython模块的子集。更多信息请参阅阅CPython文档:[json](https://docs.python.org/3.5/library/json.html#module-json)
+# ujson - JSON编码和解码
+`ujson`模块实现在Python数据对象和JSON数据格式之间进行转换的功能。该模块实现相应CPython模块的子集。更多信息请参阅CPython文档:[json](https://docs.python.org/3.5/library/json.html#module-json)
## 编码json数据
-主要将`Python`对象编码成json字符串
+将`Python`对象编码成json字符串
### `ujson.dump`
@@ -24,7 +24,7 @@ ujson.dumps(obj)
## 解码json数据
-主要将JSON数据解码成`Python`对象。
+将JSON数据解码成`Python`对象。
### `ujson.load`
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uos.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uos.md"
index 04e470797c9814de24f3fdf25afc3e890519be03..a1768a3479a7d1f88d9e22b08234888854804bb9 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uos.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uos.md"
@@ -1,6 +1,6 @@
# uos - 基本系统服务
-`uos`模块包含文件系统访问和挂载构建,该模块实现了CPython模块相应模块的子集。更多信息请参阅阅CPython文档:[os](https://docs.python.org/3.5/library/os.html#module-os)
+`uos`模块包含文件系统访问和挂载构建,该模块实现了CPython模块相应模块的子集。更多信息请参阅CPython文档:[os](https://docs.python.org/3.5/library/os.html#module-os)
## 删除文件
@@ -81,7 +81,7 @@ uos.mkdir(path)
**参数描述**
-* `path`表示准备创建的目录名。
+* `path`表示准备创建的目录名,为所在目录的相对路径。
**示例:**
@@ -124,7 +124,7 @@ uos.rmdir(path)
**参数描述**
-* `path`,字符串,表示目录名。
+* `path`,字符串,表示目录名,为所在目录的相对路径。
**示例:**
@@ -275,7 +275,7 @@ uos.uname2()
该接口与micropython官方接口返回值形式一致。注意与上面uos.uname()接口返回值的区别,返回值形式为:
-`(sysname, nodename, release, version, machine, qpyver=)`
+`(sysname, nodename, release, version, machine, qpyver)`
* `sysname` – 底层系统的名称,string类型
* `nodename` – 网络名称(可以与 sysname 相同) ,string类型
@@ -304,11 +304,11 @@ uos.uname2()
uos.urandom(n)
```
-返回具有*n个*随机字节的bytes对象,只要有可能,它就会由硬件随机数生成器生成。
+返回具有*n个*随机字节的bytes对象,如果模组搭载了硬件随机数生成器,它就会由硬件随机数生成器生成。
**参数描述**
-* `n`,整形,随机字节的个数
+* `n`,整型,随机字节的个数
**返回值描述**
@@ -337,11 +337,25 @@ uos.VfsFat(spi_port, spimode, spiclk, spics)
**参数描述**
* `spi_port`,int,通道选择[0,1]
-* `spimode`,int,PI 的工作模式(模式0最常用):`
`0 : CPOL=0, CPHA=0 1 : CPOL=0, CPHA=12: CPOL=1, CPHA=0 3: CPOL=1, CPHA=1
-
+* `spimode`,int,SPI 的工作模式(模式0最常用):
+|参数|工作模式|
+| ---- | ---- |
+| 0 |CPOL=0, CPHA=0|
+| 1 | CPOL=0, CPHA=1|
+| 2 |CPOL=1, CPHA=0|
+| 3 |CPOL=1, CPHA=1|
> 时钟极性CPOL: 即SPI空闲时,时钟信号SCLK的电平(0:空闲时低电平; 1:空闲时高电平)
-* `spiclk`, int, 时钟频率 0 : 812.5kHz 1 : 1.625MHz 2 : 3.25MHz 3 : 6.5MHz 4 : 13MHz
+* `spiclk`, int
+
+|参数|时钟频率|
+| ---- | ---- |
+| 0 |812.5kHz|
+| 1 |1.625MHz|
+| 2 |3.25MHz|
+| 3 |6.5MHz|
+| 4 |13MHz|
+
* `spics`,int,指定CS片选引脚为任意GPIO,硬件CS可以接这里指定的脚,也可以接默认的SPI CS脚
> 1-n:指定Pin.GPIO1-Pin.GPIOn为CS脚
@@ -402,8 +416,8 @@ uos.set_det(vfs_obj.GPIOn,mode)
**参数描述**
-* `vfs_obj.GPIOn`,int类型,用于sd卡插拔卡检测的GPIO引脚号,参照Pin模块的定义
-* `mode`,int类型 `
0`:sd卡插上后,检测口为低电平;sd卡取出后,检测口为高电平 `
1`:sd卡插上后,检测口为高电平;sd卡取出后,检测口为低电平
+* `vfs_obj.GPIOn`,int类型,用于sd卡插拔卡检测的GPIO引脚号,参照[Pin](../QuecPython类库/machine.Pin.md)模块的定义
+* `mode`,int类型
0:sd卡插上后,检测口为低电平;sd卡取出后,检测口为高电平
1:sd卡插上后,检测口为高电平;sd卡取出后,检测口为低电平
**返回值描述**
@@ -484,16 +498,24 @@ uos.VfsLfs1(readsize,progsize,lookahead,pname,spi_port,spi_clk)
**参数描述**
-* readsize,int类型,预留,暂未使用
-* progsize,int类型,预留,暂未使用
-* lookahead,int类型,预留,暂未使用
-* pname,str类型,固定为“ext_fs”。后续扩展
-* spi_port,int类型,支持的端口参照SPI章节说明
-* spi_clk,int类型 `
`时钟频率:`
`0:6.25M 1:12.5M 2:25M 3:50M 4:3.125M 5:1.5625M 6:781.25K
-
+* `readsize`,int类型,预留,暂未使用
+* `progsize`,int类型,预留,暂未使用
+* `lookahead`,int类型,预留,暂未使用
+* `pname`,str类型,固定为“ext_fs”。后续扩展
+* `spi_port`,int类型,支持的端口参照SPI章节说明
+* `spi_clk`,int类型
+|参数|时钟频率|
+| ---- | ---- |
+| 0 |6.25MHz|
+| 1 |12.5MHz|
+| 2 |25MHz|
+| 3 |50MHz|
+| 4 |3.125MHz|
+| 5 |1.5625MHz|
+| 6 |781.25KHz|
**返回值描述**
-成功则返回VfsLfs1 object,失败则 OSError 19。
+成功则返回VfsLfs1 object,失败则返回 OSError 19。
**示例:**
@@ -524,8 +546,8 @@ uos.mount(vfs_obj, path)
**参数描述**
-* vfs_obj,vfs object,文件系统对象
-* path,str类型,文件系统的根目录
+* `vfs_obj`,vfs object,文件系统对象
+* `path`,str类型,文件系统的根目录
**示例:**
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/urandom.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/urandom.md"
index f6c3ba72be82b2c47cc5b89d810d7b9e70bb317a..ff35609e224fd6361402025a6df0531a3ef79265 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/urandom.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/urandom.md"
@@ -151,7 +151,7 @@ urandom.seed(sed)
**参数描述**
-* `sed`,int类型,区间最小值
+* `sed`,int类型
**示例**:
@@ -193,7 +193,7 @@ urandom.uniform(start, end)
**返回值描述**
-浮点数类型,在 `start `到 `end` 之间的随机整数
+浮点数类型,在 `start `到 `end` 之间的随机数
**示例**:
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/usocket.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/usocket.md"
index d8f14419d3ddbad43eef66e2b079016fd96cb100..838ebd34f6f938a022453a62429b6eab012a3322 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/usocket.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/usocket.md"
@@ -4,7 +4,7 @@
本文阐述了QuecPython的usocket模块的用法,描述了usocket模块最新版本的特性。
```
-usocket 模块提供对BSD套接字接口的访问。该模块实现相应CPython模块的子集。更多信息请参阅阅CPython文档:[socket](https://docs.python.org/3.5/library/socket.html#module-socket)
+该模块提供对BSD套接字接口的访问。该模块实现相应CPython模块的子集。更多信息请参阅阅CPython文档:[socket](https://docs.python.org/3.5/library/socket.html#module-socket)
**示例:**
@@ -110,7 +110,7 @@ DNS域名解析,将主机域名(host)和端口(port)解析为用于创
## 方法
-### socket.bind
+### `socket.bind`
```python
socket.bind(address)
@@ -132,7 +132,7 @@ socket.bind(("192.168.0.1",80))
socket.bind(("",0))
```
-### socket.listen
+### `socket.listen`
```python
socket.listen(backlog)
@@ -144,7 +144,7 @@ socket.listen(backlog)
- `backlog` - 接受套接字的最大个数,至少为0。
-### socket.accept
+### `socket.accept`
```python
socket.accept()
@@ -158,7 +158,7 @@ socket.accept()
- `address` - 连接到服务器的客户端地址。
- `port` - 连接到服务器的客户端端口。
-### socket.connect
+### `socket.connect`
```python
socket.connect(address)
@@ -176,7 +176,7 @@ socket.connect(address)
socket.connect(("192.168.0.1",80))
```
-### socket.read
+### `socket.read`
```python
socket.read( [ size ] )
@@ -184,7 +184,7 @@ socket.read( [ size ] )
该方法用于从套接字中读取size字节数据,返回一个字节对象。如果没有指定size,则会从套接字读取所有可读数据,直到读取到数据结束,此时作用和 `socket.readall()` 相同。
-### socket.readinto
+### `socket.readinto`
```python
socket.readinto(buf, [ , nbytes ])
@@ -192,7 +192,7 @@ socket.readinto(buf, [ , nbytes ])
该方法用于从套接字读取字节到缓冲区buf中。如果指定了nbytes,则最多读取nbytes数量的字节;如果没有指定nbytes,则最多读取len(buf)字节。返回值是实际读取的字节数。
-### socket.readline
+### `socket.readline`
```python
socket.readline()
@@ -200,7 +200,7 @@ socket.readline()
该方法用于从套接字按行读取数据,遇到换行符结束,返回读取的数据行。
-### socket.write
+### `socket.write`
```python
socket.write(buf)
@@ -208,7 +208,7 @@ socket.write(buf)
该方法用于套接字发送缓冲区的数据,buf为待发送的数据,返回实际发送的字节数。
-### socket.send
+### `socket.send`
```python
socket.send(bytes)
@@ -220,7 +220,7 @@ socket.send(bytes)
- `bytes` - bytes型数据。
-### socket.sendall
+### `socket.sendall`
```python
socket.sendall(bytes)
@@ -233,7 +233,7 @@ socket.sendall(bytes)
- `bytes` - bytes型数据。
-### socket.sendto
+### `socket.sendto`
```python
socket.sendto(bytes, address)
@@ -246,7 +246,7 @@ socket.sendto(bytes, address)
- `bytes` - bytes型数据。
- `address` - 包含地址和端口号的元组或列表。
-### socket.recv
+### `socket.recv`
```python
socket.recv(bufsize)
@@ -258,7 +258,7 @@ socket.recv(bufsize)
- `bufsize` - 一次接收的最大数据量。
-### socket.recvfrom
+### `socket.recvfrom`
```python
socket.recvfrom(bufsize)
@@ -275,7 +275,7 @@ socket.recvfrom(bufsize)
- `bytes` :接收数据的字节对象。
- `address` :发送数据的套接字的地址。
-### socket.close
+### `socket.close`
```python
socket.close()
@@ -283,7 +283,7 @@ socket.close()
该方法用于将套接字标记为关闭并释放所有资源。
-### socket.setsockopt
+### `socket.setsockopt`
```python
socket.setsockopt(level, optname, value)
@@ -305,7 +305,7 @@ socket.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1)
socket.setsockopt(usocket.SOL_SOCKET, usocket.TCP_KEEPALIVE, 1)
```
-### socket.setblocking
+### `socket.setblocking`
```python
socket.setblocking(flag)
@@ -325,7 +325,7 @@ socket.setblocking(flag)
`socket.setblocking(False)` 相当于 `socket.settimeout(0)`
```
-### socket.settimeout
+### `socket.settimeout`
```python
socket.settimeout(value)
@@ -337,7 +337,7 @@ socket.settimeout(value)
- `value` - 可以是表示秒的非负浮点数,也可以是None。如果给定零,则将套接字置为非阻塞模式,否则套接字将处于阻塞模式。
-### socket.makefile
+### `socket.makefile`
```python
socket.makefile(mode='rb')
@@ -345,7 +345,7 @@ socket.makefile(mode='rb')
该方法用于返回与套接字关联的文件对象,返回值类型与指定的参数有关。仅支持二进制模式 (rb和wb)。
-### socket.getsocketsta
+### `socket.getsocketsta`
```python
socket.getsocketsta()
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ustruct.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ustruct.md"
index 41546224ece6b9858e89ed6b29a8b30678eb60de..002dafab9ee959cfa98a2fe2548bf38bc82c8c14 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ustruct.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/ustruct.md"
@@ -1,12 +1,12 @@
# ustruct - 打包和解压原始数据类型
-模块功能:`ustruct`模块实现相应CPython模块的子集。更多信息请参阅阅CPython文档:[struct](https://docs.python.org/3.5/library/struct.html#module-struct)
+模块功能:`ustruct`模块实现相应CPython模块的子集。更多信息请参阅CPython文档:[struct](https://docs.python.org/3.5/library/struct.html#module-struct)
## 格式字符串
-格式字符串是用来在打包和解包数据时指定预期布局的机制。 其使用指定被打包/解包数据类型的`格式字符`进行构建。 此外,还有一些特殊字符用来控制`字节顺序`,`大小`和`对齐方式`。
+格式字符串是用来在打包和解包数据时指定预期布局的机制。 其使用指定被打包/解包数据类型的格式字符进行构建。 此外,还有一些特殊字符用来控制字节顺序,大小和对齐方式。
### **字节顺序,大小和对齐方式**
@@ -82,12 +82,21 @@ ustruct.pack(fmt, v1, v2, ...)
**参数描述:**
- `fmt` - 格式字符的类型,详情见上文格化式字符表
+- `v1`, `v2`, `...` - 是需要进行数据转换的变量名或值
**返回值描述:**
- 返回参数编码后的字节对象。
+**示例:**
+
+```python
+>>> import ustruct
+>>> ustruct.pack('ii', 7, 9) # 打包两个整数
+b'\x07\x00\x00\x00\t\x00\x00\x00'
+
+```
### `ustruct.unpack`
@@ -110,10 +119,10 @@ ustruct.unpack(fmt, data)
```python
>>> import ustruct
->>> ustruct.pack('ii', 7, 9) #打包两个整数
-b'\x07\x00\x00\x00\t\x00\x00\x00'
->>> ustruct.unpack('ii', b'\x07\x00\x00\x00\t\x00\x00\x00') #解压两个整数
+
+>>> ustruct.unpack('ii', b'\x07\x00\x00\x00\t\x00\x00\x00') # 解压之前打包的两个整数
(7, 9)
+
```
@@ -131,7 +140,26 @@ ustruct.pack_into(fmt, buffer, offset, v1, v2, ...)
- `fmt` - 格式字符的类型,详情见上文格化式字符表
- `buffer` - 可写数据缓冲区
- `offset` - 写入的起始位置
+- `v1`, `v2`, `...` - 需要写入缓冲区的数据
+
+**示例:**
+
+```python
+>>> import ustruct
+# 定义格式字符串
+>>> fmt = "3sB"
+# 定义一个字符串和一个整数
+>>> name = "Tom"
+>>> age = 25
+
+# 将两个值按指定格式打包,并写入bytes类型的空缓冲区中
+>>> buf = bytearray(8) # 创建容量为8字节的缓冲区
+>>> ustruct.pack_into(fmt, buf, 0, name.encode(), age) # 将"name"编码成bytes类型并写入三个字符(占3个字节),后面紧跟着一个占1个字节的整数"age"
+
+>>> print(buf) # 输出:bytearray(b'Tom\x19\x00\x00\x00')
+bytearray(b'Tom\x19\x00\x00\x00\x00')
+```
### `ustruct.unpack_from`
@@ -146,8 +174,25 @@ ustruct.unpack_from(fmt, data, offset=0)
- `fmt` - 格式字符的类型,详情见上文格化式字符表
- `data` - 数据缓冲区(缓冲区大小以字节为单位)
-- `offset` - 解压的起始位置
+- `offset` - (可选)解压的起始位置,默认为零
**返回值描述:**
- 返回解压值的元组(即使只包含一个项)。
+
+**示例:**
+
+```python
+>>> import ustruct
+
+# 定义格式字符串
+>>> fmt = "3sB"
+# 定义要解包的字节序列
+>>> data = bytearray(b'Tom\x19\x00\x00\x00\x00')
+
+# 从字节序列的第一个字节开始解包
+>>> result = ustruct.unpack_from(fmt, data, 0)
+>>> print(result) # 输出:(b'Tom', 25)
+(b'Tom', 25)
+
+```
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/utime.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/utime.md"
index 8384e77101caf79a8e4b684307a4aac586501dcf..5bc3df486c52622fd9090581d948af9762976b52 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/utime.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/utime.md"
@@ -5,24 +5,9 @@
**示例**:
```python
-'''
-@Author: Baron
-@Date: 2020-06-17
-@LastEditTime: 2020-06-17 17:06:08
-@Description: example for module utime
-@FilePath: example_utime_loacltime_file.py
-'''
import utime
import log
-
-'''
-下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值
-'''
-PROJECT_NAME = "QuecPython_localtime_example"
-PROJECT_VERSION = "1.0.0"
-
-
# 设置日志输出级别
log.basicConfig(level=log.INFO)
time_log = log.getLogger("LocalTime")
@@ -62,13 +47,13 @@ utime.localtime(secs)
**返回值描述:**
-- `(year, month, mday, hour, minute, second, weekday, yearday)`-类型为元组,包含了年、月、日、时、分、秒、星期、一年中第几天。当提供参数`secs`时,返回转换后的时间。当参数`secs`没有提供时,则返回本地RTC的时间。返回值含义如下:
+- `(year, month, day, hour, minute, second, weekday, yearday)`-类型为元组,包含了年、月、日、时、分、秒、星期、一年中第几天。当提供参数`secs`时,返回转换后的时间。当参数`secs`没有提供时,则返回本地RTC的时间。返回值含义如下:
-| 元组成员 | 范围 | 含义 |
+| 元组成员 | 范围及类型 | 含义 |
| -------- | ---------------------- | ---------------- |
| year | int型 | 年份 |
| month | int型,1~12 | 月份 |
-| mday | int型,1~31 | 日,当月多少号 |
+| day | int型,1~31 | 日,当月多少号 |
| hour | int型,0~23 | 小时 |
| minute | int型,0~59 | 分钟 |
| second | int型,0~59 | 秒 |
@@ -82,7 +67,7 @@ utime.localtime(secs)
>>> utime.localtime()
(2020, 9, 29, 8, 54, 42, 1, 273)
>>> utime.localtime(646898736)
-(2020, 7, 1, 6, 5, 36, 2, 183)
+(1990, 7, 2, 14, 5, 36, 0, 183)
```
### `utime.mktime`
@@ -99,7 +84,7 @@ utime.mktime(date)
**返回值描述:**
-- 以秒为单位的时间,类型为int。
+- int类型。
**示例**:
@@ -120,7 +105,7 @@ utime.time()
**返回值描述:**
-- 以秒为单位的时间,类型为int。
+- int类型。
### `utime.getTimeZone`
@@ -132,7 +117,7 @@ utime.getTimeZone()
**返回值描述:**
-- 单位小时,范围[-12, 12],负值表示西时区,正值表示东时区,0表示零时区。
+- int类型,单位小时,范围[-12, 12],负值表示西时区,正值表示东时区,0表示零时区。
### `utime.setTimeZone`
@@ -144,7 +129,11 @@ utime.setTimeZone(offset)
**参数描述:**
-- 单位小时,范围[-12, 12],负值表示西时区,正值表示东时区,0表示零时区。
+- int类型,单位小时,范围[-12, 12],负值表示西时区,正值表示东时区,0表示零时区。
+
+**返回值描述:**
+
+- int类型,成功返回0,失败抛异常。
## 测量时间间隔相关功能
@@ -158,7 +147,7 @@ utime.ticks_ms()
**返回值描述:**
-- 毫秒计数值,计数值本身无特定意义,只适合用在 `ticks_diff()`函数中。
+- int类型,毫秒计数值,计数值本身无特定意义,只适合用在 `ticks_diff()`函数中。
### `utime.ticks_us`
@@ -170,7 +159,7 @@ utime.ticks_us()
**返回值描述:**
-- 微秒计数值,计数值本身无特定意义,只适合用在 `ticks_diff()`函数中。
+- int类型,微秒计数值,计数值本身无特定意义,只适合用在 `ticks_diff()`函数中。
### `utime.ticks_cpu`
@@ -182,7 +171,7 @@ utime.ticks_cpu()
**返回值描述:**
-- 计数值,计数值本身无特定意义,只适合用在 `ticks_diff()`函数中。
+- int类型,计数值,计数值本身无特定意义,只适合用在 `ticks_diff()`函数中。
### `utime.ticks_diff`
@@ -194,16 +183,18 @@ utime.ticks_diff(ticks1, ticks2)
**参数描述:**
-- `ticks1`-第二次调用` ticks_ms`, `ticks_us`,或 `ticks_cpu`获取的tick值。
-- `ticks2`-第一次调用` ticks_ms`, `ticks_us`,或 `ticks_cpu`获取的tick值。
+- `ticks1`-int类型,第二次调用` ticks_ms`, `ticks_us`,或 `ticks_cpu`获取的tick值。
+- `ticks2`-int类型,第一次调用` ticks_ms`, `ticks_us`,或 `ticks_cpu`获取的tick值。
**返回值描述:**
-- 时间间隔,两次调用` ticks_ms`, `ticks_us`,或 `ticks_cpu`之间的时间间隔。单位和传入的`ticks2`和`ticks1`的单位一致。
+- int类型,时间间隔,两次调用` ticks_ms`, `ticks_us`,或 `ticks_cpu`之间的时间间隔。单位和传入的`ticks2`和`ticks1`的单位一致。
+
+
+
+> `ticks2`和`ticks1`的顺序不能颠倒,否则结果无法确定。且这个函数不要用在计算很长的时间间隔,具体限制为`ticks2`和`ticks1`的tick差值不能超过0x1FFFFFFF,否则结果无法确定。
-**注意**:
-`ticks2`和`ticks1`的顺序不能颠倒,否则结果无法确定。且这个函数不要用在计算很长的时间间隔,具体限制为`ticks2`和`ticks1`的tick差值不能超过0x1FFFFFFF,否则结果无法确定。
**示例**:
@@ -227,7 +218,7 @@ utime.sleep(seconds)
**参数描述:**
-- `seconds`-休眠的时长,单位秒。
+- `seconds`-int类型,休眠的时长,单位秒。
### `utime.sleep_ms`
@@ -239,7 +230,7 @@ utime.sleep_ms(ms)
**参数描述:**
-`ms`-休眠的时长,单位毫秒。
+`ms`-int类型,休眠的时长,单位毫秒。
### `utime.sleep_us`
@@ -251,8 +242,8 @@ utime.sleep_us(us)
**参数描述:**
-`us`-休眠的时长,单位微秒。
+`us`-int类型,休眠的时长,单位微秒。
+
-**注意**:
-`utime.sleep`、`utime.sleep_ms`及`utime.sleep_us`函数的调用会导致程序休眠阻塞。
\ No newline at end of file
+> `utime.sleep`、`utime.sleep_ms`及`utime.sleep_us`函数的调用会导致程序休眠阻塞。
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uzlib.md" "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uzlib.md"
index 399b845b2fd22c5a489c56dd4d504d412948bcbf..08c8641b125fc7d6d6723c66024118b4cc53318e 100644
--- "a/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uzlib.md"
+++ "b/docs/API_reference/zh/QuecPython\346\240\207\345\207\206\345\272\223/uzlib.md"
@@ -4,7 +4,7 @@
本文阐述了QuecPython的uzlib模块的用法,描述了uzlib模块最新版本的特性。
```
-uzlib 模块解压缩用[DEFLATE算法](https://en.wikipedia.org/wiki/DEFLATE)压缩的二进制数据 (通常在zlib库和gzip存档器中使用)。该模块实现相应CPython模块的子集,更多信息请参阅阅CPython文档:[zlib](https://docs.python.org/3.5/library/zlib.html#module-zlib)
+该模块解压缩用[DEFLATE算法](https://en.wikipedia.org/wiki/DEFLATE)压缩的二进制数据 (通常在zlib库和gzip存档器中使用)。该模块实现相应CPython模块的子集,更多信息请参阅阅CPython文档:[zlib](https://docs.python.org/3.5/library/zlib.html#module-zlib)
> 注意:1.压缩尚未实现。2.解压缩前,应检查模块内可使用的空间,确保有足够空间解压文件。
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/README.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/README.md"
index 9ea8865d7222711c18be7d86252565e15038926f..b3ee230eb8b7c2894dc239b1a609339ce5c498c8 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/README.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/README.md"
@@ -15,12 +15,16 @@
- [net - 网络相关功能](./net.md)
- [cellLocator - 基站定位](./cellLocator.md)
- [wifilocator - WiFi定位](./wifilocator.md)
-- [fota-固件升级相关功能](./fota.md)
-- [app_fota-用户文件升级相关功能](./app_fota.md)
+- [fota - 固件升级相关功能](./fota.md)
+- [app_fota - 用户文件升级相关功能](./app_fota.md)
+- [checkNet - 网络就绪检测](./checkNet.md)
+- [wifiScan - WiFi扫描](./wifiScan.md)
- [machine - 硬件相关功能](./machine.md)
- [misc - 其他](./misc.md)
- [qrcode - 二维码显示](./qrcode.md)
- [ethernet - 以太网相关功能](./ethernet.md)
+- [camera - 摄像头](./camera.md)
+- [audio - 音频播放](./audio.md)
- [WLAN - 无线局域网相关功能](./WLAN.md)
- [uping - 发送ping包](./uping.md)
- [pm - 低功耗相关功能](./pm.md)
@@ -28,5 +32,7 @@
- [quecgnss - 内置GNSS相关功能](./quecgnss.md)
- [gnss - GNSS相关功能](./gnss.md)
- [securedata - 安全数据区相关功能](./securedata.md)
+- [ble- 低功耗蓝牙相关功能](./ble.md)
+- [bt- 经典蓝牙相关功能](./bt.md)
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/WLAN.ESP8266.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/WLAN.ESP8266.md"
index 1096b97e2e9f8966f2d7cbdf8ad1eab42c92a701..74c673cd11a8a20a1f7254e6c717e4f5ac9a8282 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/WLAN.ESP8266.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/WLAN.ESP8266.md"
@@ -22,15 +22,42 @@ class ESP8266(uart=UART.UART1, mod=ESP8266.STA, callback=None)
- `content` - 用户回调,表示上报消息内容
**上报消息内容描述:**
-- `ota`信息上报:
- - `ota,begin` - ota升级开始
- - `ota,downloading,xx` - ota升级下载百分比
- - `ota,restart` - ota升级下载完成进行重启
- - `ota,err_code,1` - ota升级错误码
-- `station`网络连接变化上报:
- - `station, connected` - wifi已连接
- - `station, disconnected` - wifi未连接
+开启用户回调后,模组会在ota升级和sta模式连接变化时进行消息上报,以下是上报信息描述。
+
+`ota`信息上报:
+- `ota,begin` - ota升级开始
+- `ota,downloading,xx` - ota升级下载百分比
+- `ota,restart` - ota升级下载完成进行重启
+- `ota,err_code,x` - ota升级错误码,以下是对错误码(x)的描述:
+ - `1` - url解析失败
+ - `2` - 连接http服务器失败
+ - `3` - 为GET请求分配内存失败
+ - `4` - 发送GET请求到服务器失败
+ - `5` - 升级开始时错误
+ - `6` - 接收数据失败
+ - `7` - ota文件写入失败
+ - `8` - 升级结束时错误
+ - `9` - 设置boot分区失败
+
+`station`模式网络连接变化上报:
+- `station, connected` - wifi已连接
+- `station, disconnected` - wifi断开连接
+
+**示例:**
+
+```python
+# callback使用示例
+from usr.WLAN import ESP8266
+from machine import UART
+
+def cb(args):
+ content = args
+ print('wifi content:{}'.format(content))
+
+ESP8266 = ESP8266(UART.UART2, ESP8266.STA, cb)
+
+```
## 方法
@@ -44,6 +71,8 @@ ESP8266.status()
获取无线网卡状态信息,用以判断无线网卡当前工作模式。
**返回值描述:**
+
+返回int类型,枚举值,具体说明如下:
- `0` - esp8266 设备不存在
- `1` - esp8266 station模式已连接
- `2` - esp8266 station模式未连接
@@ -64,11 +93,11 @@ ESP8266.version()
**返回值描述:**
-- 返回字符串,格式为(sdk, model, version, time),具体描述如下:
- - `sdk` - sdk信息
- - `model` - 无线网卡型号
- - `version` - 版本号
- - `time` - 版本时间
+返回string类型,格式为(sdk, model, version, time),具体说明如下:
+- `sdk` - sdk信息
+- `model` - 无线网卡型号
+- `version` - 版本号
+- `time` - 版本时间
@@ -82,14 +111,14 @@ ESP8266.ipconfig()
**返回值描述:**
- - 返回tuple类型,格式为 (ip, subnet, gateway, mtu, primary_dns, secondary_dns),具体描述如下:
+ 返回tuple类型,格式为 (ip, subnet, gateway, mtu, primary_dns, secondary_dns),具体说明如下:
- - `ip` - ip地址
- - `subnet` - 子网掩码
- - `gateway` - 网关
- - `mtu` - 最大传输单元
- - `primary_dns` - DNS服务器主地址
- - `secondary_dns` - DNS服务器辅地址
+- `ip` - ip地址
+- `subnet` - 子网掩码
+- `gateway` - 网关
+- `mtu` - 最大传输单元
+- `primary_dns` - DNS服务器主地址
+- `secondary_dns` - DNS服务器辅地址
@@ -160,7 +189,7 @@ ESP8266.ota(url)
开启`ota`后,网卡将更新新版本固件
-> 注意:升级过程中只可查询当前状态,不可进行其他操作
+> 注意:当前仅支持sta模式下进行ota升级;且升级过程中只可查询当前状态,不可进行其他操作
**参数描述:**
@@ -170,13 +199,14 @@ ESP8266.ota(url)
- 执行成功返回`0`,执行失败返回其他值。
+
**示例:**
```python
url='http://www.example.com/fota.bin'
-esp8266.ota(url)
+ESP8266.ota(url)
```
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/WLAN.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/WLAN.md"
index 3c3fa1943baba7cb3111768cd41c73489f7be4a0..e65e60f472e2357777c15694c390db6079a0179d 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/WLAN.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/WLAN.md"
@@ -3,7 +3,7 @@
`WLAN`模块包含无线局域网控制及网络配置功能。主要是针对不同类型无线网卡提供统一的管理方式。
-> 当前仅支持ESP8266无线网卡
+> 当前功能支持模组:EC600N系列
当前功能支持网卡:ESP8266无线网卡
**示例:**
@@ -92,12 +92,12 @@
>>> from machine import UART
-# 初始化网卡,若使用web配置ap模式,需把模式字段设置为ESP8266.AP
+# 初始化网卡,以下为使用web配置sta模式;若使用web配置ap模式,需把模式字段设置为ESP8266.AP
>>> ESP8266 = ESP8266(UART.UART2, ESP8266.STA)
# 获取当前网卡状态
>>> ESP8266.status()
-1
+2
# 配置web配网模式热点的信息
>>> ESP8266.web_config('admin','adminpwd')
@@ -107,7 +107,7 @@
>>> ESP8266.status()
3
-# 此时可用其他终端设备连接热点,登录web界面进行网络配置
+# 此时可用其他终端设备连接配网热点,登录web界面(网址: 192.168.4.1)进行网络配置
```
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/app_fota.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/app_fota.md"
index e1bb5cdf95cc84aa7294bdb221d16739b01f8db4..e2ca42dc23a381b98788320a5b3ec50412d05779 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/app_fota.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/app_fota.md"
@@ -69,7 +69,7 @@ fota.bulk_download(info=[])
**返回值描述**:
-- 返回下载失败的列表,类型为list。
+- 下载失败时返回下载失败的列表,类型为list。下载成功时返回空。
**示例**:
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/atcmd.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/atcmd.md"
index 30a5669bf1407c05888744c16363a418db23ec62..d6c432b6dbb849572de03e6c974520600579fe9e 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/atcmd.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/atcmd.md"
@@ -1,6 +1,6 @@
# atcmd - 发送AT指令功能
-模块功能:提供发送AT指令的方法,使模组能够通过Python代码发送AT指令。
+该模块提供发送AT指令的方法,使模组能够通过Python代码发送AT指令。
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.Audio.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.Audio.md"
index 3b087ee1fb329ae4281382348ddfca3e4ae99633..deac90450a3954525fde6ec06296cb773d9df6d4 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.Audio.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.Audio.md"
@@ -1,33 +1,27 @@
+# class Audio - 音频播放
+该类提供音频播放功能。
-```
-本文阐述了QuecPython的audio.Audio类的用法,描述了audio.Audio类最新版本的特性。
-```
-
-
-
-# `class Audio`
-
-`Audio`对象提供音频播放功能。
-
-> 目前支持型号:EC600N系列、EC800N系列、EC600M-CN(LA、LE)、EC800M-CN(LA、LE、GA)、EC600U系列和EC200U系列、EG912U、EG915U、EG915N-EUAG
+> 目前支持型号:EC600N系列、EC800N系列、EC600M-CN(LA、LE)、EC800M-CN(LA、LE、GA)、EC600U系列、EC200U系列、EG912U、EG915U、EG915N-EUAG。
**示例:**
```python
+# -*- coding: UTF-8 -*-
import audio
from machine import Pin
+import utime
def audio_cb(event):
- if event == 0:
- print('audio-play start.')
- elif event == 7:
- print('audio-play finish.')
+ if event == 0:
+ print('audio-play start.')
+ elif event == 7:
+ print('audio-play finish.')
aud = audio.Audio(0)
aud.setCallback(audio_cb)
# 设置pa
-aud.set_pa(Pin.GPIO15)
+aud.set_pa(Pin.GPIO15,2)
# 播放MP3
aud.play(2, 1, 'U:/music.mp3')
aud.stop()
@@ -69,7 +63,7 @@ class audio.Audio(device)
- `device` - 输出通道,int类型,0表示听筒,1表示耳机,2表示喇叭。具体模块所支持通道详见下表。
-**模块输出通道对应表**
+**模块输出通道对应表:**
| 模块型号 | 听筒 | 耳机 | 喇叭 |
| --------------------- | ------ | ------ | ------ |
@@ -86,25 +80,24 @@ class audio.Audio(device)
## 方法
-### Audio.set_pa
+### `Audio.set_pa`
```python
-Audio.set_pa(gpio)
+Audio.set_pa(gpio,num)
```
-该方法用于设置输出pa的gpio,并开启pa功能目前支持AB类切D类,即两个上升沿的脉冲分别在1us<脉冲<12us。
+该方法用于设置输出pa的gpio。
-**参数描述**
+**参数描述:**
- `gpio` - 输出的gpio,int类型,参照[Pin](./machine.Pin.md)。
+- `num` - 上电脉冲数,int类型。
**返回值描述:**
-`1` 表示成功,
-
-`0`表示失败。
+`1` 表示成功,`0`表示失败。
-### Audio.play
+### `Audio.play`
```python
Audio.play(priority, breakin, filename)
@@ -116,10 +109,10 @@ Audio.play(priority, breakin, filename)
> **说明:**由于TTS和音频文件播放共用同一个播放队列,所以TTS中设置的播放优先级、打断模式不仅仅是和其他TTS播放任务比较,还会和音频文件播放任务的优先级和打断模式比较,反之,音频文件播放中设置的播放优先级与打断模式对TTS任务同样是有效的。
-**参数描述**
+**参数描述:**
- `priority` - 播放优先级,int类型。支持优先级0 ~ 4,数值越大优先级越高。
-- `breakin` - 打断模式,int类型。0表示不允许被打断,1表示允许被打断
+- `breakin` - 打断模式,int类型。0表示不允许被打断,1表示允许被打断。
- `filename` - 模式,string类型。待播放的文件名称,包含文件存放路径。点此查看文件播放路径的说明。
**返回值描述:**
@@ -136,21 +129,19 @@ Audio.play(priority, breakin, filename)
用户分区路径固定为’U:/‘开头,表示用户分区的根目录,如果用户在根目录下新建audio目录,并将音频文件存放在根目录下的audio目录,那么播放接口中,传入的路径参数应该是:'U:/audio/music.mp3'。
-### Audio.stop
+### `Audio.stop`
```python
Audio.stop()
```
-该方法用于停止音频文件播放。
+该方法用于停止当前正在播放的音频。
**返回值描述:**
-`0` 表示成功,
+`0` 表示成功,`-1`表示失败。
-`-1`表示失败。
-
-### Audio.stopAll
+### `Audio.stopAll`
```python
Audio.stopAll()
@@ -160,29 +151,34 @@ Audio.stopAll()
**返回值描述:**
-`0` 表示成功,
-
-`-1`表示失败。
+`0` 表示成功,`-1`表示失败。
-### Audio.setCallback
+### `Audio.setCallback`
```python
-Audio.setCallback(usrFun)
+Audio.setCallback(cb)
```
该方法用于注册用户的回调函数,用于通知用户音频文件播放状态。
-> **注意**,该回调函数中不要进行耗时以及阻塞性的操作,建议只进行简单、耗时短的操作。
+> 该回调函数中不要进行耗时以及阻塞性的操作,建议只进行简单、耗时短的操作。
-**参数描述**
+**参数描述:**
-- `usrFun` - 用户回调函数,function类型,函数原型:usrFun(event) -> None,点此查看回调函数参数event说明表。
+- `cb` - 用户回调函数,function类型,函数原型:
-**返回值描述:**
+ ```python
+ def cb(event):
+ pass
+ ```
+
+ **回调函数参数描述**:
+
+ - `event` - 播放状态,int类型,点此查看回调函数参数event说明表。
-`0` 表示成功,
+**返回值描述:**
-`-1`表示失败。
+`0` 表示成功,`-1`表示失败。
**回调函数参数event说明表**
@@ -191,7 +187,7 @@ Audio.setCallback(usrFun)
| 0 | 开始播放 |
| 7 | 播放完成 |
-### Audio.getState
+### `Audio.getState`
```python
Audio.getState()
@@ -201,41 +197,37 @@ Audio.getState()
**返回值描述:**
-`0` 表示audio初始化完成,
-
-`-1`表示audio初始化未完成。
+`0` 表示audio初始化完成,`-1`表示audio初始化未完成。
-### Audio.getVolume
+### `Audio.getVolume`
```python
Audio.getVolume()
```
-该方法用于获取当前播放音量大小,音量值为0 ~ 11,0表示静音,默认值7。
+该方法用于获取当前播放音量大小,音量值在区间[0 ~ 11],0表示静音,默认值7。
**返回值描述:**
-整型音量大小值,
+整型音量大小值。
-### Audio.setVolume
+### `Audio.setVolume`
```python
Audio.setVolume(vol)
```
-该方法用于设置播放音量大小,音量值应在0 ~ 11区间,0表示静音。
+该方法用于设置播放音量大小,音量值在区间[0 ~ 11],0表示静音。
-**参数描述**
+**参数描述:**
-- `vol` - 音量大小,int类型,区间0 ~ 11。
+- `vol` - 音量大小,int类型,区间[0 ~ 11]。
**返回值描述:**
-`0` 表示成功,
-
-`-1`表示失败。
+`0` 表示成功,`-1`表示失败。
-### Audio.playStream
+### `Audio.playStream`
```python
Audio.playStream(format, buf)
@@ -243,18 +235,16 @@ Audio.playStream(format, buf)
该方法用于音频流播放,支持mp3、amr和wav格式的音频流播放。
-**参数描述**
+**参数描述:**
- `format` - 音频流格式,int类型,`2` - `WAVPCM`,`3` - `MP3`,`4` - `AMRNB`。
- `buf` - 音频流内容,音频流二进制文件内容。
**返回值描述:**
-`0`表示播放成功,
+`0`表示播放成功,`-1`表示播放失败。
-`-1`表示播放失败。
-
-### Audio.stopPlayStream
+### `Audio.stopPlayStream`
```python
Audio.stopPlayStream()
@@ -262,17 +252,15 @@ Audio.stopPlayStream()
该方法用于停止音频流播放。
-**参数描述**
+**参数描述:**
无
**返回值描述:**
-`0` 表示成功,
-
-`-1`表示失败。
+`0` 表示成功,`-1`表示失败。
-### Audio.aud_tone_play
+### `Audio.aud_tone_play`
```python
Audio.aud_tone_play(tone, time)
@@ -280,20 +268,18 @@ Audio.aud_tone_play(tone, time)
该方法用于播放tone音,播放一段时间(time)后自动停止播放。
-> **注意**:EC600N/EC800N系列模组调用该接口为立即返回,EC600U/EC200U系列模组调用该接口为阻塞等待。
+> EC600N/EC800N系列模组调用该接口为立即返回,EC600U/EC200U系列模组调用该接口为阻塞等待。
-**参数描述**
+**参数描述:**
- `tone` - tone类型,int型,`0~15`:按键音(0~9、A、B、C、D、#、*),`16`:拨号音。
- `time` - 播放时长,单位ms,int型,`0` : 不停止一直播放。
**返回值描述:**
-`0` 表示播放成功,
-
-`-1`表示播放失败。
+`0` 表示播放成功,`-1`表示播放失败。
-### Audio.aud_tone_play_stop
+### `Audio.aud_tone_play_stop`
```python
Audio.aud_tone_play_stop()
@@ -303,6 +289,4 @@ Audio.aud_tone_play_stop()
**返回值描述:**
-`0` 表示停止播放成功,
-
-`-1`表示停止播放失败。
\ No newline at end of file
+`0` 表示停止播放成功,`-1`表示停止播放失败。
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.Record.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.Record.md"
index b526e11bed54ff1570b6a0619d8f40dd40dba38c..c93f25472dcf85b5d741516c9dfa26194e8d45d2 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.Record.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.Record.md"
@@ -1,20 +1,15 @@
-```
-本文阐述了QuecPython的audio.Record类的用法,描述了audio.Record类最新版本的特性。
-```
-
-
-
-# `class Record`
+# class Record - 录音
-`Record`对象提供录音功能。
+该类提供录音功能。
-> 目前支持型号:EC600N系列、EC800N系列、EC600M-CN(LA、LE)、EC800M-CN(LA、LE、GA)、EC600U系列和EC200U系列、EG912U、EG915U、EG915N-EUAG
+> 目前支持型号:EC600N系列、EC800N系列、EC600M-CN(LA、LE)、EC800M-CN(LA、LE、GA)、EC600U系列、EC200U系列、EG912U、EG915U、EG915N-EUAG。
**示例:**
```python
+# -*- coding: UTF-8 -*-
import utime
import audio
from machine import Pin
@@ -47,8 +42,8 @@ def record_callback(args):
flag = 0
record = audio.Record()
-audio.end_callback(record_callback)
-audio.start('recordfile.wav', 10)
+record.end_callback(record_callback)
+record.start('recordfile.wav', 10)
while 1:
if flag:
@@ -67,7 +62,7 @@ class audio.Record(device)
创建Record对象。
-> 注意:如果传参,请与audio.Audio(device)的参数保持一致。
+> 如果传参,请与audio.Audio(device)的参数保持一致。
**参数描述:**
@@ -92,7 +87,7 @@ class audio.Record(device)
## 方法
-### Record.start
+### `Record.start`
```python
audio.start(file_name,seconds)
@@ -100,28 +95,28 @@ audio.start(file_name,seconds)
该方法用于开始录音。
-**参数描述**
+**参数描述:**
- `file_name` - 录音文件名,string类型。
- `seconds` - 需要录制时长,单位:秒,int类型。
**返回值描述:**
-`0`表示成功;
+`0`表示成功。
-`-1`表示文件覆盖失败;
+`-1`表示文件覆盖失败。
-`-2`表示文件打开失败;
+`-2`表示文件打开失败。
-`-3`表示文件正在使用;
+`-3`表示文件正在使用。
-`-4`表示通道设置错误;
+`-4`表示通道设置错误。
-`-5`表示定时器资源申请失败;
+`-5`表示定时器资源申请失败。
`-6` 表示音频格式检测错误。
-### Record.stop
+### `Record.stop`
```python
Record.stop()
@@ -131,11 +126,9 @@ Record.stop()
**返回值描述:**
-`0` 表示播放成功;
+`0` 表示播放成功,`-1`表示播放失败。
-`-1`表示播放失败。
-
-### Record.getFilePath
+### `Record.getFilePath`
```python
Record.getFilePath(file_name)
@@ -143,19 +136,19 @@ Record.getFilePath(file_name)
该方法用于读取录音文件的路径。
-**参数描述**
+**参数描述:**
- `file_name` - 录音文件名,string类型。
**返回值描述:**
-成功返回string类型的录音文件路径;
+成功返回string类型的录音文件路径。
-`-1`表示目标文件不存在;
+`-1`表示目标文件不存在。
`-2`表示文件名长度为0。
-### Record.getData
+### `Record.getData`
```python
Record.getData(file_name, offset, size)
@@ -163,33 +156,33 @@ Record.getData(file_name, offset, size)
该方法用于读取录音数据。
-**参数描述**
+**参数描述:**
- `file_name` - 录音文件名,string类型。
- `offset` - 读取数据的偏移量,int类型。
-- `size` - 读取大小,单位 字节,int类型。注意 :需小于10K。
+- `size` - 读取大小,单位字节,int类型。注意 :需小于10K。
**返回值描述:**
-成功返回录音数据,bytearray类型;
+成功返回录音数据,bytearray类型。
失败返回值说明如下:
-`-1`表示读取数据错误;
+`-1`表示读取数据错误。
-`-2`表示文件打开失败;
+`-2`表示文件打开失败。
-`-3`表示偏移量设置错误;
+`-3`表示偏移量设置错误。
-`-4`表示文件正在使用;
+`-4`表示文件正在使用。
-`-5`表示设置超出文件大小(offset+size > file_size);
+`-5`表示设置超出文件大小(offset+size > file_size)。
-`-6`表示读取size 大于10K;
+`-6`表示读取size 大于10K。
-`-7`表示内存不足10K;
+`-7`表示内存不足10K。
-### Record.getSize
+### `Record.getSize`
```python
Record.getSize(file_name)
@@ -197,29 +190,27 @@ Record.getSize(file_name)
该方法用于读取录音文件大小。
-**参数描述**
+**参数描述:**
- `file_name` - 录音文件名,string类型。
**返回值描述:**
-若获取成功,返回文件大小 (EC600N系列、EC800N系列、EC800M系列、EC600M系列、EG915N不返回文件头),单位字节:
-
-wav格式时,此值会比返回callback返回值大44 bytes(44 bytes为文件头);
+若获取成功,返回文件大小 (EC600N系列、EC800N系列、EC800M系列、EC600M系列、EG915N不返回文件头),单位字节。
-amr格式时,此值会比返回callback返回值大6 bytes(6 bytes为文件头);
+> wav格式时,此值会比返回callback返回值大44 bytes(44 bytes为文件头);amr格式时,此值会比返回callback返回值大6 bytes(6 bytes为文件头)。
失败返回值如下:
-`-1`表示获取文件大小失败 ;
+`-1`表示获取文件大小失败。
-`-2`表示文件打开失败 ;
+`-2`表示文件打开失败。
-`-3`表示文件正在使用 ;
+`-3`表示文件正在使用 。
`-4`表示文件名长度为0。
-### Record.Delete
+### `Record.Delete`
```python
Record.Delete(file_name)
@@ -227,19 +218,19 @@ Record.Delete(file_name)
该方法用于删除录音文件。
-**参数描述**
+**参数描述:**
- `file_name` - 录音文件名,string类型。
**返回值描述:**
-`0`表示成功,
+`0`表示成功。
-`-1`表示文件不存在,
+`-1`表示文件不存在。
`-2`表示文件正在使用。
-### Record.exists
+### `Record.exists`
```python
Record.exists(file_name)
@@ -247,19 +238,17 @@ Record.exists(file_name)
该方法用于判断录音文件是否存在。
-**参数描述**
+**参数描述:**
- `file_name` - 录音文件名,string类型。
**返回值描述:**
-`true`表示文件存在,
+`true`表示文件存在。
-`false`表示文件不存在,
+`false`表示文件不存在。
-`-1`表示文件名长度为0。
-
-### Record.isBusy
+### `Record.isBusy`
```python
Record.isBusy()
@@ -269,27 +258,38 @@ Record.isBusy()
**返回值描述:**
-`0`表示不在录音,
-
-`1`表示正在录音。
+`0`表示不在录音,`1`表示正在录音。
-### Record.end_callback
+### `Record.end_callback`
```python
-Record.end_callback(callback)
+Record.end_callback(cb)
```
该方法用于设置录音结束回调。
-**参数描述**
+**参数描述:**
-- `callback` - 录音结束回调函数,function类型,函数原型:`callback(file_path, audio_len, audio_state) -> None`,回调函数参数`file_path`表示文件路径,`audio_len`表示录音长度,`audio_state`表示录音状态,点此查看回调函数参数audio_state说明表。
+- `cb` - 录音结束回调函数,function类型,函数原型:
+
+ ```python
+ def cb(audio_msg):
+ pass
+ ```
+
+ **回调函数参数描述**:
+
+ - `audio_msg` - 录音信息,list类型,其中元素如下:
+
+ `audio_msg[0]`:`file_path` ,文件路径,string类型。
+
+ `audio_msg[1]`:`audio_len` , 录音长度,int类型。
+
+ `audio_msg[2]`:`audio_state` ,录音状态,int类型,点此查看回调函数参数audio_state说明表。
**返回值描述:**
-`0` 表示成功,
-
-`-1`表示失败。
+`0` 表示成功,`-1`表示失败。
**audio_state说明表:**
@@ -299,7 +299,7 @@ Record.end_callback(callback)
| 0 | 录音开始 |
| 3 | 录音结束 |
-### Record.gain
+### `Record.gain`
```python
Record.gain(code_gain,dsp_gain)
@@ -309,18 +309,16 @@ Record.gain(code_gain,dsp_gain)
> 目前仅EC600N/EC800N系列模组支持该功能。
-**参数描述**
+**参数描述:**
-- `code_gain` - 上行编解码器增益,int型,`0~4`。
+- `code_gain` - 上行编解码器增益,int型,[0,4]。
- `dsp_gain` - 上行数字增益,int型,`-36~12` 。
**返回值描述:**
-`0` 表示成功,
-
-`-1`表示失败。
+`0` 表示成功,`-1`表示失败。
-### Record.amrEncDtx_enable
+### `Record.amrEncDtx_enable`
```python
Record.amrEncDtx_enable(on_off)
@@ -330,40 +328,38 @@ Record.amrEncDtx_enable(on_off)
> 目前仅EC600N/EC800N系列模组支持该功能。
-**参数描述**
+**参数描述:**
- `on_off` - 开关,int型,`1`:开启,`0`:关闭 。
- 不传参数 - 获取当前配置
**返回值描述:**
-不传参:返回当前配置
+不传参:返回当前配置。
传参:参数正确无返回,参数错误抛异常。
-### Record.stream_start
+### `Record.stream_start`
```python
Record.stream_start(format, samplerate, time)
```
-该方法用于开始录音音频流。注意:录制音频流的同时,应及时读取音频流。目前是采用循环buf,不及时读取,会导致数据丢失
+该方法用于开始录音音频流。注意:录制音频流的同时,应及时读取音频流。目前是采用循环buf,不及时读取,会导致数据丢失。
> 目前仅EC200U/EC600U系列模组支持该功能。
-**参数描述**
+**参数描述:**
-- `format` - 音频格式,int型,目前支持 amr 格式,见常量。
+- `format` - 音频格式,int型,目前支持 amr 格式,见常量。
- `samplerate` - 采样率,int型,目前支持8000 和 16000 。
- `time` - 录音时长,int型,单位 S (秒)。
**返回值描述:**
-`0` 表示成功,
+`0` 表示成功,`-1`表示失败。
-`-1`表示失败。
-
-### Record.stream_read
+### `Record.stream_read`
```python
Record.stream_read(read_buf, len)
@@ -375,17 +371,15 @@ Record.stream_read(read_buf, len)
**参数描述**
-- `read_buf` - 录音流buf,buf型 。
+- `read_buf` - 录音流buf,bytearray型 。
- `len` - 读取的长度,int类型。
**返回值描述:**
-成功返回实际读取的字节数,
-
-失败返回整型-1。
+成功返回实际读取的字节数,失败返回整型-1。
## 常量
-### Record.AMRNB
+### `Record.AMRNB`
amr 格式。
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.TTS.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.TTS.md"
index d94033d1d90bdd2d023da48f1e4d96fbde760eff..0c5e4811e30fd27f5a8619e94385a6f9bc6f2cc6 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.TTS.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.TTS.md"
@@ -1,20 +1,15 @@
-```
-本文阐述了QuecPython的audio.TTS类的用法,描述了audio.TTS类最新版本的特性。
-```
-
-
-
-# `class TTS`
+# class TTS - 文本到语音播放
-`TTS`对象提供从文本到语音播放功能。
+该类提供从文本到语音播放功能。
-> 目前支持型号:EC600N系列、EC800N系列、EC600M-CN(LA、LE)、EC800M-CN(LA、LE、GA)、EC600U-CN系列和EC200U-CN系列
+> 目前支持型号:EC600N系列、EC800N系列、EC600M-CN(LA、LE)、EC800M-CN(LA、LE、GA)、EC600U-CN系列、EC200U-CN系列。
**示例:**
```python
+# -*- coding: UTF-8 -*-
'''
@Description: example for class TTS
@FilePath: example_tts_file.py
@@ -34,17 +29,30 @@ PROJECT_VERSION = "1.0.0"
log.basicConfig(level=log.INFO)
tts_Log = log.getLogger("TTS")
+#定义回调函数
+def UsrFunc(event):
+ if event == 2:
+ print("开始播放")
+ elif event == 3:
+ print("停止播放")
+ elif event == 4:
+ print("播放完成")
if __name__ == '__main__':
# 参数1:device (0:听筒,1:耳机,2:喇叭)
tts = TTS(1)
+
+ #注册用户回调函数
+ tts.setCallback(UsrFunc)
+
# 获取当前播放音量大小
volume_num = tts.getVolume()
tts_Log.info("Current TTS volume is %d" %volume_num)
-
+
# 设置音量为6
volume_num = 6
tts.setVolume(volume_num)
+
# 参数1:优先级 (0-4)
# 参数2:打断模式,0表示不允许被打断,1表示允许被打断
# 参数3:模式 低四位:(1:UNICODE16(Size end conversion) 2:UTF-8 3:UNICODE16(Don't convert)),高四位:wtts_enable,wtts_ul_enable, wtts_dl_enable
@@ -68,7 +76,7 @@ class audio.TTS(device)
- `device` - 输出通道,int类型,0表示听筒,1表示耳机,2表示喇叭。具体模块所支持通道详见下表。
-**模块输出通道对应表**
+**模块输出通道对应表:**
| 模块型号 | 听筒 | 耳机 | 喇叭 |
| --------------------- | ------ | ------ | ------ |
@@ -80,12 +88,12 @@ class audio.TTS(device)
| EG912N | 支持 | 不支持 | 不支持 |
| EG912U | 支持 | 不支持 | 不支持 |
| EC200U系列 | 不支持 | 不支持 | 支持 |
-| EC600U系列 | 支持 | 支持 | 支持 |
+| EC600U-CN系列 | 支持 | 支持 | 支持 |
| EG915U | 支持 | 支持 | 不支持 |
## 方法
-### TTS.close
+### `TTS.close`
```python
TTS.close()
@@ -97,7 +105,7 @@ TTS.close()
`0` 表示关闭成功,`-1`表示关闭失败。
-### TTS.play
+### `TTS.play`
```python
TTS.play(priority, breakin, mode, str)
@@ -107,22 +115,22 @@ TTS.play(priority, breakin, mode, str)
支持优先级0 ~ 4,数字越大优先级越高,每个优先级组可同时最多加入10个播放任务;播放策略说明如下:
-1. 如果当前正在播放任务A,并且允许被打断,此时有高优先级播放任务B,那么会打断当前低优先级播放任务A,直接播放高优先级任务B;
+1. 如果当前正在播放任务A,并且允许被打断,此时有高优先级播放任务B,那么会打断当前低优先级播放任务A,直接播放高优先级任务B。
-2. 如果当前正在播放任务A,并且不允许被打断,此时有高优先级播放任务B,那么B播放任务将会加入到播放队列中合适的位置,等待A播放完成,再依次从队列中按照优先级从高到低播放其他任务;
+2. 如果当前正在播放任务A,并且不允许被打断,此时有高优先级播放任务B,那么B播放任务将会加入到播放队列中合适的位置,等待A播放完成,再依次从队列中按照优先级从高到低播放其他任务。
-3. 如果当前正在播放任务A,且不允许被打断,此时来了一个同优先级播放任务B,那么B会被加入到该优先级组播放队列队尾,等待A播放完成,再依次从队列中按照优先级从高到低播放其他任务;
+3. 如果当前正在播放任务A,且不允许被打断,此时来了一个同优先级播放任务B,那么B会被加入到该优先级组播放队列队尾,等待A播放完成,再依次从队列中按照优先级从高到低播放其他任务。
-4. 如果当前正在播放任务A,且允许被打断,此时来了一个同优先级播放任务B,那么会打断当前播放任务A,直接播放任务B;
+4. 如果当前正在播放任务A,且允许被打断,此时来了一个同优先级播放任务B,那么会打断当前播放任务A,直接播放任务B。
-5. 如果当前正在播放任务A,且任务A的优先级组播放队列中已经有几个播放任务存在,且该优先级组播放队列最后一个任务N是允许被打断的,此时如果来了一个同样优先级的播放任务B,那么任务B会直接覆盖掉任务N;也就是说,某个优先级组,只有最后一个元素是允许被打断的,即breakin为1,其他任务都是不允许被打断的;
+5. 如果当前正在播放任务A,且任务A的优先级组播放队列中已经有几个播放任务存在,且该优先级组播放队列最后一个任务N是允许被打断的,此时如果来了一个同样优先级的播放任务B,那么任务B会直接覆盖掉任务N;也就是说,某个优先级组,只有最后一个元素是允许被打断的,即breakin为1,其他任务都是不允许被打断的。
6. 如果当前正在播放任务A,不管任务A是否允许被打断,此时来了一个优先级低于任务A的请求B,那么将B加入到B对应优先级组播放队列。
-**参数描述**
+**参数描述:**
- `priority` - 播放优先级,int类型。支持优先级0 ~ 4,数值越大优先级越高。
-- `breakin` - 打断模式,int类型。0表示不允许被打断,1表示允许被打断
+- `breakin` - 打断模式,int类型。0表示不允许被打断,1表示允许被打断。
- `mode` - 模式,int类型。由低四位和高四位构成,其中低四位是编码模式,高四位是WTTS模式。点此查看TTS模式说明表。
- `str` - 待播放字符串,string类型。
@@ -141,7 +149,7 @@ TTS.play(priority, breakin, mode, str)
| 模式 | 说明 |
| -------- | ------------------------------------------------------------ |
| 编码模式 | 1 - UNICODE16(UTF-16大端模式)
2 - UTF-8
3 - UNICODE16(UTF-16小端模式) |
-| WTTS模式 | 仅600N系列支持VOLTE的版本支持,
wtts_enable - wtts总开关,
wtts_ul_enable - wtts上行使能,
wtts_dl_enable - wtts下行使能 |
+| WTTS模式 | 仅600N系列支持VOLTE的版本支持,
wtts_enable - wtts总开关
wtts_ul_enable - wtts上行使能
wtts_dl_enable - wtts下行使能 |
**TTS.play方法使用实例:**
@@ -203,7 +211,7 @@ TTS.play(priority, breakin, mode, str)
- **TTS播放中文示例:**
- 注意,python文件开头需要加上`# -*- coding: UTF-8 -*-`。
+ > python文件开头需要加上`# -*- coding: UTF-8 -*-`。
```python
# -*- coding: UTF-8 -*-
@@ -283,7 +291,7 @@ tts.play(4, 0, 2, str1)
-### TTS.stop
+### `TTS.stop`
```python
TTS.stop()
@@ -293,11 +301,9 @@ TTS.stop()
**返回值描述:**
-`0` 表示成功,
+`0` 表示成功,`-1`表示失败。
-`-1`表示失败。
-
-### TTS.stopAll
+### `TTS.stopAll`
```python
TTS.stopAll()
@@ -307,31 +313,36 @@ TTS.stopAll()
**返回值描述:**
-`0` 表示成功,
-
-`-1`表示失败。
+`0` 表示成功,`-1`表示失败。
-### TTS.setCallback
+### `TTS.setCallback`
```python
-TTS.setCallback(usrFun)
+TTS.setCallback(cb)
```
该方法用于注册用户的回调函数,用于通知用户TTS播放状态。
-> 注意,该回调函数中不要进行耗时以及阻塞性的操作,建议只进行简单、耗时短的操作。
+> 该回调函数中不要进行耗时以及阻塞性的操作,建议只进行简单、耗时短的操作。
-**参数描述**
+**参数描述:**
-- `usrFun` - 用户回调函数,function类型,函数原型:usrFun(event) -> None,点此查看回调函数参数event说明表。
+- `cb` - 用户回调函数,function类型,函数原型:
-**返回值描述:**
+ ```python
+ def cb(event):
+ pass
+ ```
+
+ **回调函数参数描述**:
+
+ - `event` - 播放状态,int类型,点此查看回调函数参数event说明表。
-`0` 表示成功,
+**返回值描述:**
-`-1`表示失败。
+`0` 表示成功,`-1`表示失败。
-**回调函数参数event说明表**
+**回调函数参数event说明表:**
| event | 表示状态 |
| ----- | -------- |
@@ -339,71 +350,63 @@ TTS.setCallback(usrFun)
| 3 | 停止播放 |
| 4 | 播放完成 |
-### TTS.getVolume
+### `TTS.getVolume`
```python
TTS.getVolume()
```
-该方法用于获取当前播放音量大小,音量值为0 ~ 9,0表示静音,默认值4。
+该方法用于获取当前播放音量大小,音量值在区间[0 ~ 9],0表示静音,默认值4。
**返回值描述:**
-成功则返回整型音量大小值,
+成功则返回整型音量大小值,`-1`表示失败。
-`-1`表示失败。
-
-### TTS.setVolume
+### `TTS.setVolume`
```python
TTS.setVolume(vol)
```
-该方法用于设置播放音量大小,音量值应在0 ~ 9区间,0表示静音。
+该方法用于设置播放音量大小,音量值应在区间[0 ~ 9],0表示静音。
-**参数描述**
+**参数描述:**
-- `vol` - 音量大小,int类型,区间0 ~ 9。
+- `vol` - 音量大小,int类型,区间[0 ~ 9]。
**返回值描述:**
-`0` 表示成功,
+`0` 表示成功,`-1`表示失败。
-`-1`表示失败。
-
-### TTS.getSpeed
+### `TTS.getSpeed`
```python
TTS.getSpeed()
```
-该方法用于获取当前播放速度,速度值为0 ~ 9,值越大,速度越快,默认值4。
+该方法用于获取当前播放速度,速度值在区间[0 ~ 9],值越大,速度越快,默认值4。
**返回值描述:**
-成功则返回整型音量大小值,
-
-`-1`表示失败。
+成功则返回整型音量大小值,`-1`表示失败。
-### TTS.setSpeed
+### `TTS.setSpeed`
```python
TTS.setSpeed(speed)
```
-该方法用于设置TTS播放速度,速度值应在0 ~ 9区间。
+该方法用于设置TTS播放速度,速度值应在区间[0 ~ 9]。
-**参数描述**
+**参数描述:**
-- `speed` - 速度值,int类型,区间0 ~ 9。
+- `speed` - 速度值,int类型,区间[0 ~ 9]。
**返回值描述:**
-`0` 表示成功,
+`0` 表示成功,`-1`表示失败。
-`-1`表示失败。
-
-### TTS.getState
+### `TTS.getState`
```python
TTS.getState()
@@ -413,6 +416,4 @@ TTS.getState()
**返回值描述:**
-`0` 表示当前无tts播放,
-
-`-1`表示当前有tts正在播放。
\ No newline at end of file
+`0` 表示当前无tts播放,`-1`表示当前有tts正在播放。
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.md"
index 68c5ac3dc9f0419ee09626f7a9a0df45f62e1974..b2d46e4613d3794217b153b83c7ca3fe3fb53975 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/audio.md"
@@ -1,33 +1,12 @@
+# audio - 音频播放
-
-```
-本文阐述了QuecPython的audio模块的用法,描述了audio模块最新版本的特性。
-```
-
-
-
-# `audio` - 音频播放相关功能
-
-`audio`模块包含音频播放相关的功能,支持TTS、mp3以及AMR文件播放。
-
-**示例:**
-
-```python
-import audio
-
-if __name__ == '__main__':
- tts = audio.TTS(1)
- tts.play(1, 1, 2, 'QuecPython') # 执行播放
- tts.close() # 关闭TTS功能
-```
-
-
+该模块包含各种音频功能,支持音频播放、TTS文本到语音播放、录音等功能。
## Classes
-- [class TTS](./audio.TTS.md)
+- [class TTS - 文本到语音播放](./audio.TTS.md)
-- [class Audio](audio.Audio.md)
+- [class Audio - 音频播放](audio.Audio.md)
-- [class Record](audio.Record.md)
+- [class Record - 录音](audio.Record.md)
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ble.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ble.md"
new file mode 100644
index 0000000000000000000000000000000000000000..dd8dca7e9fe7f3d0e6e4e11ba383515d350b2d4f
--- /dev/null
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ble.md"
@@ -0,0 +1,2338 @@
+# ble-低功耗蓝牙相关功能
+
+`ble`模块用于提供BLE GATT Server (从机)与 Client (主机)功能,基于BLE 4.2协议。
+
+**示例**:
+
+```python
+#BLE Server
+
+import ble
+import utime
+
+
+BLE_GATT_SYS_SERVICE = 0 # 0-删除系统默认的GAP和GATT服务 1-保留系统默认的GAP和GATT服务
+BLE_SERVER_HANDLE = 0
+_BLE_NAME = "Quectel_ble"
+
+
+event_dict = {
+ 'BLE_START_STATUS_IND': 0, # ble start
+ 'BLE_STOP_STATUS_IND': 1, # ble stop
+ 'BLE_CONNECT_IND': 16, # ble connect
+ 'BLE_DISCONNECT_IND': 17, # ble disconnect
+ 'BLE_UPDATE_CONN_PARAM_IND': 18, # ble update connection parameter
+ 'BLE_SCAN_REPORT_IND': 19, # ble gatt client scan and report other devices
+ 'BLE_GATT_MTU': 20, # ble connection mtu
+ 'BLE_GATT_RECV_WRITE_IND': 21, # when ble client write characteristic value or descriptor,server get the notice
+ 'BLE_GATT_RECV_READ_IND': 22, # when ble client read characteristic value or descriptor,server get the notice
+ 'BLE_GATT_RECV_NOTIFICATION_IND': 23, # client receive notification
+ 'BLE_GATT_RECV_INDICATION_IND': 24, # client receive indication
+ 'BLE_GATT_SEND_END': 25, # server send notification,and receive send end notice
+}
+
+class EVENT(dict):
+ def __getattr__(self, item):
+ return self[item]
+
+ def __setattr__(self, key, value):
+ raise ValueError("{} is read-only.".format(key))
+
+
+event = EVENT(event_dict)
+
+
+def ble_callback(args):
+ global BLE_GATT_SYS_SERVICE
+ global BLE_SERVER_HANDLE
+ event_id = args[0]
+ status = args[1]
+ print('[ble_callback]: event_id={}, status={}'.format(event_id, status))
+
+ if event_id == event.BLE_START_STATUS_IND: # ble start
+ if status == 0:
+ print('[callback] BLE start success.')
+ mac = ble.getPublicAddr()
+ if mac != -1 and len(mac) == 6:
+ addr = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(mac[5], mac[4], mac[3], mac[2], mac[1], mac[0])
+ print('BLE public addr : {}'.format(addr))
+ ret = ble_gatt_set_name()
+ if ret != 0:
+ ble_gatt_close()
+ return
+ ret = ble_gatt_set_param()
+ if ret != 0:
+ ble_gatt_close()
+ return
+ ret = ble_gatt_set_data()
+ if ret != 0:
+ ble_gatt_close()
+ return
+ ret = ble_gatt_set_rsp_data()
+ if ret != 0:
+ ble_gatt_close()
+ return
+ ret = ble_gatt_add_service()
+ if ret != 0:
+ ble_gatt_close()
+ return
+ ret = ble_gatt_add_characteristic()
+ if ret != 0:
+ ble_gatt_close()
+ return
+ ret = ble_gatt_add_characteristic_value()
+ if ret != 0:
+ ble_gatt_close()
+ return
+ ret = ble_gatt_add_characteristic_desc()
+ if ret != 0:
+ ble_gatt_close()
+ return
+ ret = ble_gatt_add_service_complete()
+ if ret != 0:
+ ble_gatt_close()
+ return
+ if BLE_GATT_SYS_SERVICE == 0:
+ BLE_SERVER_HANDLE = 1
+ else:
+ BLE_SERVER_HANDLE = 16
+ ret = ble_adv_start()
+ if ret != 0:
+ ble_gatt_close()
+ return
+ else:
+ print('[callback] BLE start failed.')
+ elif event_id == event.BLE_STOP_STATUS_IND: # ble stop
+ if status == 0:
+ print('[callback] ble stop successful.')
+ ble_status = ble.getStatus()
+ print('ble status is {}'.format(ble_status))
+ ble_gatt_server_release()
+ else:
+ print('[callback] ble stop failed.')
+ elif event_id == event.BLE_CONNECT_IND: # ble connect
+ if status == 0:
+ print('[callback] ble connect successful.')
+ connect_id = args[2]
+ addr = args[3]
+ addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5])
+ print('[callback] connect_id = {}, addr = {}'.format(connect_id, addr_str))
+
+ ret = ble_gatt_send_notification()
+ if ret == 0:
+ print('[callback] ble_gatt_send_notification successful.')
+ else:
+ print('[callback] ble_gatt_send_notification failed.')
+ ble_gatt_close()
+ return
+ else:
+ print('[callback] ble connect failed.')
+ elif event_id == event.BLE_DISCONNECT_IND: # ble disconnect
+ if status == 0:
+ print('[callback] ble disconnect successful.')
+ connect_id = args[2]
+ addr = args[3]
+ addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5])
+ ble_gatt_close()
+ print('[callback] connect_id = {}, addr = {}'.format(connect_id, addr_str))
+ else:
+ print('[callback] ble disconnect failed.')
+ ble_gatt_close()
+ return
+ elif event_id == event.BLE_UPDATE_CONN_PARAM_IND: # ble update connection parameter
+ if status == 0:
+ print('[callback] ble update parameter successful.')
+ connect_id = args[2]
+ max_interval = args[3]
+ min_interval = args[4]
+ latency = args[5]
+ timeout = args[6]
+ print('[callback] connect_id={},max_interval={},min_interval={},latency={},timeout={}'.format(connect_id, max_interval, min_interval, latency, timeout))
+ else:
+ print('[callback] ble update parameter failed.')
+ ble_gatt_close()
+ return
+ elif event_id == event.BLE_GATT_MTU: # ble connection mtu
+ if status == 0:
+ print('[callback] ble connect mtu successful.')
+ handle = args[2]
+ ble_mtu = args[3]
+ print('[callback] handle = {:#06x}, ble_mtu = {}'.format(handle, ble_mtu))
+ else:
+ print('[callback] ble connect mtu failed.')
+ ble_gatt_close()
+ return
+ elif event_id == event.BLE_GATT_RECV_WRITE_IND:
+ if status == 0:
+ print('[callback] ble recv successful.')
+ data_len = args[2]
+ data = args[3] # 这是一个bytearray
+ attr_handle = args[4]
+ short_uuid = args[5]
+ long_uuid = args[6] # 这是一个bytearray
+ print('len={}, data:{}'.format(data_len, data))
+ print('attr_handle = {:#06x}'.format(attr_handle))
+ print('short uuid = {:#06x}'.format(short_uuid))
+ print('long uuid = {}'.format(long_uuid))
+ else:
+ print('[callback] ble recv failed.')
+ ble_gatt_close()
+ return
+ elif event_id == event.BLE_GATT_RECV_READ_IND:
+ if status == 0:
+ print('[callback] ble recv read successful.')
+ data_len = args[2]
+ data = args[3] # 这是一个bytearray
+ attr_handle = args[4]
+ short_uuid = args[5]
+ long_uuid = args[6] # 这是一个bytearray
+ print('len={}, data:{}'.format(data_len, data))
+ print('attr_handle = {:#06x}'.format(attr_handle))
+ print('short uuid = {:#06x}'.format(short_uuid))
+ print('long uuid = {}'.format(long_uuid))
+ else:
+ print('[callback] ble recv read failed.')
+ ble_gatt_close()
+ return
+ elif event_id == event.BLE_GATT_SEND_END:
+ if status == 0:
+ print('[callback] ble send data successful.')
+ else:
+ print('[callback] ble send data failed.')
+ else:
+ print('unknown event id.')
+
+
+def ble_gatt_server_init(cb):
+ ret = ble.serverInit(cb)
+ if ret != 0:
+ print('ble_gatt_server_init failed.')
+ return -1
+ print('ble_gatt_server_init success.')
+ return 0
+
+
+def ble_gatt_server_release():
+ ret = ble.serverRelease()
+ if ret != 0:
+ print('ble_gatt_server_release failed.')
+ return -1
+ print('ble_gatt_server_release success.')
+ return 0
+
+
+def ble_gatt_open():
+ ret = ble.gattStart()
+ if ret != 0:
+ print('ble_gatt_open failed.')
+ return -1
+ print('ble_gatt_open success.')
+ return 0
+
+
+def ble_gatt_close():
+ ret = ble.gattStop()
+ if ret != 0:
+ print('ble_gatt_close failed.')
+ return -1
+ print('ble_gatt_close success.')
+ return 0
+
+
+def ble_gatt_set_name():
+ code = 0 # utf8
+ name = _BLE_NAME
+ ret = ble.setLocalName(code, name)
+ if ret != 0:
+ print('ble_gatt_set_name failed.')
+ return -1
+ print('ble_gatt_set_name success.')
+ return 0
+
+
+def ble_gatt_set_param():
+ min_adv = 0x300
+ max_adv = 0x320
+ adv_type = 0 # 可连接的非定向广播,默认选择
+ addr_type = 0 # 公共地址
+ channel = 0x07
+ filter_strategy = 0 # 处理所有设备的扫描和连接请求
+ discov_mode = 2
+ no_br_edr = 1
+ enable_adv = 1
+ ret = ble.setAdvParam(min_adv, max_adv, adv_type, addr_type, channel, filter_strategy, discov_mode, no_br_edr, enable_adv)
+ if ret != 0:
+ print('ble_gatt_set_param failed.')
+ return -1
+ print('ble_gatt_set_param success.')
+ return 0
+
+
+def ble_gatt_set_data():
+ adv_data = [0x02, 0x01, 0x05]
+ ble_name = _BLE_NAME
+ length = len(ble_name) + 1
+ adv_data.append(length)
+ adv_data.append(0x09)
+ name_encode = ble_name.encode('UTF-8')
+ for i in range(0, len(name_encode)):
+ adv_data.append(name_encode[i])
+ print('set adv_data:{}'.format(adv_data))
+ data = bytearray(adv_data)
+ ret = ble.setAdvData(data)
+ if ret != 0:
+ print('ble_gatt_set_data failed.')
+ return -1
+ print('ble_gatt_set_data success.')
+ return 0
+
+
+def ble_gatt_set_rsp_data():
+ adv_data = []
+ ble_name = _BLE_NAME
+ length = len(ble_name) + 1
+ adv_data.append(length)
+ adv_data.append(0x09)
+ name_encode = ble_name.encode('UTF-8')
+ for i in range(0, len(name_encode)):
+ adv_data.append(name_encode[i])
+ print('set adv_rsp_data:{}'.format(adv_data))
+ data = bytearray(adv_data)
+ ret = ble.setAdvRspData(data)
+ if ret != 0:
+ print('ble_gatt_set_rsp_data failed.')
+ return -1
+ print('ble_gatt_set_rsp_data success.')
+ return 0
+
+
+def ble_gatt_add_service():
+ primary = 1
+ server_id = 0x01
+ uuid_type = 1 # 短UUID
+ uuid_s = 0x180F
+ uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+ ret = ble.addService(primary, server_id, uuid_type, uuid_s, uuid_l)
+ if ret != 0:
+ print('ble_gatt_add_service failed.')
+ return -1
+ print('ble_gatt_add_service success.')
+ return 0
+
+
+def ble_gatt_add_characteristic():
+ server_id = 0x01
+ chara_id = 0x01
+ chara_prop = 0x02 | 0x10 | 0x20 # 0x02-可读 0x10-通知 0x20-指示
+ uuid_type = 1 # 短UUID
+ uuid_s = 0x2A19
+ uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+ ret = ble.addChara(server_id, chara_id, chara_prop, uuid_type, uuid_s, uuid_l)
+ if ret != 0:
+ print('ble_gatt_add_characteristic failed.')
+ return -1
+ print('ble_gatt_add_characteristic success.')
+ return 0
+
+
+def ble_gatt_add_characteristic_value():
+ data = []
+ server_id = 0x01
+ chara_id = 0x01
+ permission = 0x0001 | 0x0002
+ uuid_type = 1 # 短UUID
+ uuid_s = 0x2A19
+ uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+ for i in range(0, 244):
+ data.append(0x00)
+ value = bytearray(data)
+ ret = ble.addCharaValue(server_id, chara_id, permission, uuid_type, uuid_s, uuid_l, value)
+ if ret != 0:
+ print('ble_gatt_add_characteristic_value failed.')
+ return -1
+ print('ble_gatt_add_characteristic_value success.')
+ return 0
+
+
+def ble_gatt_add_characteristic_desc():
+ data = [0x00, 0x00]
+ server_id = 0x01
+ chara_id = 0x01
+ permission = 0x0001 | 0x0002
+ uuid_type = 1 # 短UUID
+ uuid_s = 0x2902
+ uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+ value = bytearray(data)
+ ret = ble.addCharaDesc(server_id, chara_id, permission, uuid_type, uuid_s, uuid_l, value)
+ if ret != 0:
+ print('ble_gatt_add_characteristic_desc failed.')
+ return -1
+ print('ble_gatt_add_characteristic_desc success.')
+ return 0
+
+
+def ble_gatt_send_notification():
+ global BLE_SERVER_HANDLE
+ data = [0x39, 0x39, 0x39, 0x39, 0x39] # 测试数据
+ conn_id = 0
+ attr_handle = BLE_SERVER_HANDLE + 2
+ value = bytearray(data)
+ ret = ble.sendNotification(conn_id, attr_handle, value)
+ if ret != 0:
+ print('ble_gatt_send_notification failed.')
+ return -1
+ print('ble_gatt_send_notification success.')
+ return 0
+
+
+def ble_gatt_add_service_complete():
+ global BLE_GATT_SYS_SERVICE
+ ret = ble.addOrClearService(1, BLE_GATT_SYS_SERVICE)
+ if ret != 0:
+ print('ble_gatt_add_service_complete failed.')
+ return -1
+ print('ble_gatt_add_service_complete success.')
+ return 0
+
+
+def ble_gatt_clear_service_complete():
+ global BLE_GATT_SYS_SERVICE
+ ret = ble.addOrClearService(0, BLE_GATT_SYS_SERVICE)
+ if ret != 0:
+ print('ble_gatt_clear_service_complete failed.')
+ return -1
+ print('ble_gatt_clear_service_complete success.')
+ return 0
+
+
+def ble_adv_start():
+ ret = ble.advStart()
+ if ret != 0:
+ print('ble_adv_start failed.')
+ return -1
+ print('ble_adv_start success.')
+ return 0
+
+
+def ble_adv_stop():
+ ret = ble.advStop()
+ if ret != 0:
+ print('ble_adv_stop failed.')
+ return -1
+ print('ble_adv_stop success.')
+ return 0
+
+
+def main():
+ ret = ble_gatt_server_init(ble_callback)
+ if ret == 0:
+ ret = ble_gatt_open()
+ if ret != 0:
+ return -1
+ else:
+ return -1
+ count = 0
+ while True:
+ utime.sleep(1)
+ count += 1
+ if count % 5 == 0:
+ print('##### BLE running, count = {}......'.format(count))
+ if count > 120:
+ count = 0
+ print('!!!!! stop BLE now !!!!!')
+ ble_gatt_close()
+ return 0
+
+
+if __name__ == '__main__':
+ main()
+
+```
+
+```python
+#BLE Client
+
+import ble
+import utime
+import _thread
+import checkNet
+from queue import Queue
+
+PROJECT_NAME = "QuecPython_BLE_Client_Example"
+PROJECT_VERSION = "1.0.0"
+checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION)
+
+event_dict = {
+ 'BLE_START_STATUS_IND': 0, # ble start
+ 'BLE_STOP_STATUS_IND': 1, # ble stop
+ 'BLE_CONNECT_IND': 16, # ble connect
+ 'BLE_DISCONNECT_IND': 17, # ble disconnect
+ 'BLE_UPDATE_CONN_PARAM_IND': 18, # ble update connection parameter
+ 'BLE_SCAN_REPORT_IND': 19, # ble gatt client scan and report other devices
+ 'BLE_GATT_MTU': 20, # ble connection mtu
+ 'BLE_GATT_RECV_NOTIFICATION_IND': 23, # client receive notification
+ 'BLE_GATT_RECV_INDICATION_IND': 24, # client receive indication
+ 'BLE_GATT_START_DISCOVER_SERVICE_IND': 26, # start discover service
+ 'BLE_GATT_DISCOVER_SERVICE_IND': 27, # discover service
+ 'BLE_GATT_DISCOVER_CHARACTERISTIC_DATA_IND': 28, # discover characteristic
+ 'BLE_GATT_DISCOVER_CHARA_DESC_IND': 29, # discover characteristic descriptor
+ 'BLE_GATT_CHARA_WRITE_WITH_RSP_IND': 30, # write characteristic value with response
+ 'BLE_GATT_CHARA_WRITE_WITHOUT_RSP_IND': 31, # write characteristic value without response
+ 'BLE_GATT_CHARA_READ_IND': 32, # read characteristic value by handle
+ 'BLE_GATT_CHARA_READ_BY_UUID_IND': 33, # read characteristic value by uuid
+ 'BLE_GATT_CHARA_MULTI_READ_IND': 34, # read multiple characteristic value
+ 'BLE_GATT_DESC_WRITE_WITH_RSP_IND': 35, # write characteristic descriptor
+ 'BLE_GATT_DESC_READ_IND': 36, # read characteristic descriptor
+ 'BLE_GATT_ATT_ERROR_IND': 37, # attribute error
+}
+
+gatt_status_dict = {
+ 'BLE_GATT_IDLE' : 0,
+ 'BLE_GATT_DISCOVER_SERVICE': 1,
+ 'BLE_GATT_DISCOVER_INCLUDES': 2,
+ 'BLE_GATT_DISCOVER_CHARACTERISTIC': 3,
+ 'BLE_GATT_WRITE_CHARA_VALUE': 4,
+ 'BLE_GATT_WRITE_CHARA_DESC': 5,
+ 'BLE_GATT_READ_CHARA_VALUE': 6,
+ 'BLE_GATT_READ_CHARA_DESC': 7,
+}
+
+class EVENT(dict):
+ def __getattr__(self, item):
+ return self[item]
+
+ def __setattr__(self, key, value):
+ raise ValueError("{} is read-only.".format(key))
+
+
+class BleClient(object):
+ def __init__(self):
+ self.ble_server_name = 'Quectel_ble' #目标设备ble名称
+ self.connect_id = 0
+ self.connect_addr = 0
+ self.gatt_statue = 0
+ self.discover_service_mode = 0 # 0-discover all service, 1-discover service by uuid
+
+ self.scan_param = {
+ 'scan_mode' : 1, # 积极扫描
+ 'interval' : 0x100,
+ 'scan_window' : 0x50,
+ 'filter_policy' : 0,
+ 'local_addr_type' : 0,
+ }
+
+ self.scan_report_info = {
+ 'event_type' : 0,
+ 'name' : '',
+ 'addr_type' : 0,
+ 'addr' : 0, # 初始化时, 用0表示无效值, 实际存放bytearray
+ 'rssi' : 0,
+ 'data_len' : 0,
+ 'raw_data' : 0,
+ }
+
+ self.target_service = {
+ 'start_handle' : 0,
+ 'end_handle' : 0,
+ 'uuid_type' : 1, # 短uuid
+ 'short_uuid' : 0x180F, # 电池电量服务
+ 'long_uuid' : bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+ }
+
+ self.characteristic_list = []
+ self.descriptor_list = []
+ self.characteristic_count = 0 # ql_ble_gatt_chara_count
+ self.chara_descriptor_count = 0 # ql_ble_gatt_chara_desc_count
+ self.characteristic_index = 0 # ql_ble_gatt_chara_desc_index
+ self.current_chara_index = 0 # ql_ble_gatt_cur_chara
+ self.current_desc_index = 0 # ql_ble_gatt_chara_cur_desc
+ self.ble_short_uuid_pair_len = 7
+ self.ble_long_uuid_pair_len = 21
+
+ ret = ble.clientInit(self.ble_client_callback)
+ if ret != 0:
+ print('ble client initialize failed.')
+ raise ValueError("BLE Client Init failed.")
+ else:
+ print('ble client initialize successful.')
+ print('')
+
+ @staticmethod
+ def gatt_open():
+ ret = ble.gattStart()
+ if ret != 0:
+ print('ble open failed.')
+ else:
+ print('ble open successful.')
+ print('')
+ return ret
+
+ @staticmethod
+ def gatt_close():
+ ret = ble.gattStop()
+ if ret != 0:
+ print('ble close failed.')
+ else:
+ print('ble close successful.')
+ print('')
+ return ret
+
+ @staticmethod
+ def gatt_get_status():
+ return ble.getStatus()
+
+ @staticmethod
+ def release():
+ ret = ble.clientRelease()
+ if ret != 0:
+ print('ble client release failed.')
+ else:
+ print('ble client release successful.')
+ print('')
+ return ret
+
+ def set_scan_param(self):
+ scan_mode = self.scan_param['scan_mode']
+ interval = self.scan_param['interval']
+ scan_time = self.scan_param['scan_window']
+ filter_policy = self.scan_param['filter_policy']
+ local_addr_type = self.scan_param['local_addr_type']
+ ret = ble.setScanParam(scan_mode, interval, scan_time, filter_policy, local_addr_type)
+ if ret != 0:
+ print('ble client set scan-parameters failed.')
+ else:
+ print('ble client set scan-parameters successful.')
+ print('')
+ return ret
+
+ @staticmethod
+ def start_scan():
+ ret = ble.scanStart()
+ if ret != 0:
+ print('ble client scan failed.')
+ else:
+ print('ble client scan successful.')
+ print('')
+ return ret
+
+ @staticmethod
+ def stop_scan():
+ ret = ble.scanStop()
+ if ret != 0:
+ print('ble client failed to stop scanning.')
+ else:
+ print('ble client scan stopped successfully.')
+ print('')
+ return ret
+
+ def connect(self):
+ print('start to connect.....')
+ addr_type = self.scan_report_info['addr_type']
+ addr = self.scan_report_info['addr']
+ if addr != 0 and len(addr) == 6:
+ addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5])
+ print('addr_type : {}, addr : {}'.format(addr_type, addr_str))
+ ret = ble.connect(addr_type, addr)
+ if ret != 0:
+ print('ble client connect failed.')
+ else:
+ print('ble client connect successful.')
+ print('')
+ return ret
+
+ def cancel_connect(self):
+ ret = ble.cancelConnect(self.scan_report_info['addr'])
+ if ret != 0:
+ print('ble client cancel connect failed.')
+ else:
+ print('ble client cancel connect successful.')
+ print('')
+ return ret
+
+ def disconnect(self):
+ ret = ble.disconnect(self.connect_id)
+ if ret != 0:
+ print('ble client disconnect failed.')
+ else:
+ print('ble client disconnect successful.')
+ print('')
+ return ret
+
+ def discover_all_service(self):
+ ret = ble.discoverAllService(self.connect_id)
+ if ret != 0:
+ print('ble client discover all service failed.')
+ else:
+ print('ble client discover all service successful.')
+ print('')
+ return ret
+
+ def discover_service_by_uuid(self):
+ connect_id = self.connect_id
+ uuid_type = self.target_service['uuid_type']
+ short_uuid = self.target_service['short_uuid']
+ long_uuid = self.target_service['long_uuid']
+ ret = ble.discoverByUUID(connect_id, uuid_type, short_uuid, long_uuid)
+ if ret != 0:
+ print('ble client discover service by uuid failed.')
+ else:
+ print('ble client discover service by uuid successful.')
+ print('')
+ return ret
+
+ def discover_all_includes(self):
+ connect_id = self.connect_id
+ start_handle = self.target_service['start_handle']
+ end_handle = self.target_service['end_handle']
+ ret = ble.discoverAllIncludes(connect_id, start_handle, end_handle)
+ if ret != 0:
+ print('ble client discover all includes failed.')
+ else:
+ print('ble client discover all includes successful.')
+ print('')
+ return ret
+
+ def discover_all_characteristic(self):
+ connect_id = self.connect_id
+ start_handle = self.target_service['start_handle']
+ end_handle = self.target_service['end_handle']
+ ret = ble.discoverAllChara(connect_id, start_handle, end_handle)
+ if ret != 0:
+ print('ble client discover all characteristic failed.')
+ else:
+ print('ble client discover all characteristic successful.')
+ print('')
+ return ret
+
+ def discover_all_characteristic_descriptor(self):
+ connect_id = self.connect_id
+ index = self.characteristic_index
+ start_handle = self.characteristic_list[index]['value_handle'] + 1
+
+ if self.characteristic_index == (self.characteristic_count - 1):
+ end_handle = self.target_service['end_handle']
+ print('[1]start_handle = {:#06x}, end_handle = {:#06x}'.format(start_handle - 1, end_handle))
+ ret = ble.discoverAllCharaDesc(connect_id, start_handle, end_handle)
+ else:
+ end_handle = self.characteristic_list[index+1]['handle'] - 1
+ print('[2]start_handle = {:#06x}, end_handle = {:#06x}'.format(start_handle - 1, end_handle))
+ ret = ble.discoverAllCharaDesc(connect_id, start_handle, end_handle)
+ self.characteristic_index += 1
+ if ret != 0:
+ print('ble client discover all characteristic descriptor failed.')
+ else:
+ print('ble client discover all characteristic descriptor successful.')
+ print('')
+ return ret
+
+ def read_characteristic_by_uuid(self):
+ connect_id = self.connect_id
+ index = self.current_chara_index # 根据需要改变该值
+ start_handle = self.characteristic_list[index]['handle']
+ end_handle = self.characteristic_list[index]['value_handle']
+ uuid_type = 1
+ short_uuid = self.characteristic_list[index]['short_uuid']
+ long_uuid = bytearray([0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00])
+
+ ret = ble.readCharaByUUID(connect_id, start_handle, end_handle, uuid_type, short_uuid, long_uuid)
+ if ret != 0:
+ print('ble client read characteristic by uuid failed.')
+ else:
+ print('ble client read characteristic by uuid successful.')
+ print('')
+ return ret
+
+ def read_characteristic_by_handle(self):
+ connect_id = self.connect_id
+ index = self.current_chara_index # 根据需要改变该值
+ handle = self.characteristic_list[index]['value_handle']
+ offset = 0
+ is_long = 0
+
+ ret = ble.readCharaByHandle(connect_id, handle, offset, is_long)
+ if ret != 0:
+ print('ble client read characteristic by handle failed.')
+ else:
+ print('ble client read characteristic by handle successful.')
+ print('')
+ return ret
+
+ def read_characteristic_descriptor(self):
+ connect_id = self.connect_id
+ index = self.current_desc_index # 根据需要改变该值
+ handle = self.descriptor_list[index]['handle']
+ print('handle = {:#06x}'.format(handle))
+ is_long = 0
+ ret = ble.readCharaDesc(connect_id, handle, is_long)
+ if ret != 0:
+ print('ble client read characteristic descriptor failed.')
+ else:
+ print('ble client read characteristic descriptor successful.')
+ print('')
+ return ret
+
+ def write_characteristic(self):
+ connect_id = self.connect_id
+ index = self.current_chara_index # 根据需要改变该值
+ handle = self.characteristic_list[index]['value_handle']
+ offset = 0
+ is_long = 0
+ data = bytearray([0x40, 0x00])
+ print('value_handle = {:#06x}, uuid = {:#06x}'.format(handle, self.characteristic_list[index]['short_uuid']))
+ ret = ble.writeChara(connect_id, handle, offset, is_long, data)
+ if ret != 0:
+ print('ble client write characteristic failed.')
+ else:
+ print('ble client read characteristic successful.')
+ print('')
+ return ret
+
+ def write_characteristic_no_rsp(self):
+ connect_id = self.connect_id
+ index = self.current_chara_index # 根据需要改变该值
+ handle = self.characteristic_list[index]['value_handle']
+ data = bytearray([0x20, 0x00])
+ print('value_handle = {:#06x}, uuid = {:#06x}'.format(handle, self.characteristic_list[index]['short_uuid']))
+ ret = ble.writeCharaNoRsp(connect_id, handle, data)
+ if ret != 0:
+ print('ble client write characteristic no rsp failed.')
+ else:
+ print('ble client read characteristic no rsp successful.')
+ print('')
+ return ret
+
+ def write_characteristic_descriptor(self):
+ connect_id = self.connect_id
+ index = self.current_desc_index # 根据需要改变该值
+ handle = self.descriptor_list[index]['handle']
+ data = bytearray([0x01, 0x02])
+ print('handle = {:#06x}'.format(handle))
+
+ ret = ble.writeCharaDesc(connect_id, handle, data)
+ if ret != 0:
+ print('ble client write characteristic descriptor failed.')
+ else:
+ print('ble client read characteristic descriptor successful.')
+ print('')
+ return ret
+
+ @staticmethod
+ def ble_client_callback(args):
+ global msg_queue
+ msg_queue.put(args)
+
+
+def ble_gatt_client_event_handler():
+ global msg_queue
+ old_time = 0
+
+ while True:
+ cur_time = utime.localtime()
+ timestamp = "{:02d}:{:02d}:{:02d}".format(cur_time[3], cur_time[4], cur_time[5])
+ if cur_time[5] != old_time and cur_time[5] % 5 == 0:
+ old_time = cur_time[5]
+ print('[{}]event handler running.....'.format(timestamp))
+ print('')
+ msg = msg_queue.get() # 没有消息时会阻塞在这
+ # print('msg : {}'.format(msg))
+ event_id = msg[0]
+ status = msg[1]
+
+ if event_id == event.BLE_START_STATUS_IND:
+ print('')
+ print('event_id : BLE_START_STATUS_IND, status = {}'.format(status))
+ if status == 0:
+ print('BLE start successful.')
+ ble_status = ble_client.gatt_get_status()
+ if ble_status == 0:
+ print('BLE Status : stopped.')
+ break
+ elif ble_status == 1:
+ print('BLE Status : started.')
+ else:
+ print('get ble status error.')
+ ble_client.gatt_close()
+ break
+
+ ret = ble_client.set_scan_param()
+ if ret != 0:
+ ble_client.gatt_close()
+ break
+ ret = ble_client.start_scan()
+ if ret != 0:
+ ble_client.gatt_close()
+ break
+ else:
+ print('BLE start failed.')
+ break
+ elif event_id == event.BLE_STOP_STATUS_IND:
+ print('')
+ print('event_id : BLE_STOP_STATUS_IND, status = {}'.format(status))
+ if status == 0:
+ print('ble stop successful.')
+ else:
+ print('ble stop failed.')
+ break
+ elif event_id == event.BLE_CONNECT_IND:
+ print('')
+ print('event_id : BLE_CONNECT_IND, status = {}'.format(status))
+ if status == 0:
+ ble_client.connect_id = msg[2]
+ ble_client.connect_addr = msg[3]
+ addr = ble_client.connect_addr
+ addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5])
+ print('connect_id : {:#x}, connect_addr : {}'.format(ble_client.connect_id, addr_str))
+ else:
+ print('ble connect failed.')
+ break
+ elif event_id == event.BLE_DISCONNECT_IND:
+ print('')
+ print('event_id : BLE_DISCONNECT_IND, status = {}'.format(status))
+ if status == 0:
+ ble_client.connect_id = msg[2]
+ ble_client.connect_addr = msg[3]
+ addr = ble_client.connect_addr
+ addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5])
+ print('connect_id : {:#x}, connect_addr : {}'.format(ble_client.connect_id, addr_str))
+ else:
+ print('ble disconnect failed.')
+ ble_client.gatt_close()
+ break
+ elif event_id == event.BLE_UPDATE_CONN_PARAM_IND:
+ print('')
+ print('event_id : BLE_UPDATE_CONN_PARAM_IND, status = {}'.format(status))
+ if status == 0:
+ connect_id = msg[2]
+ max_interval = msg[3]
+ min_interval = msg[4]
+ latency = msg[5]
+ timeout = msg[6]
+ print('connect_id={},max_interval={},min_interval={},latency={},timeout={}'.format(connect_id,max_interval,min_interval,latency,timeout))
+ else:
+ print('ble update parameter failed.')
+ ble_client.gatt_close()
+ break
+ elif event_id == event.BLE_SCAN_REPORT_IND:
+ if status == 0:
+ # print(' ble scan successful.')
+
+ ble_client.scan_report_info['event_type'] = msg[2]
+ ble_client.scan_report_info['name'] = msg[3]
+ ble_client.scan_report_info['addr_type'] = msg[4]
+ ble_client.scan_report_info['addr'] = msg[5]
+ ble_client.scan_report_info['rssi'] = msg[6]
+ ble_client.scan_report_info['data_len'] = msg[7]
+ ble_client.scan_report_info['raw_data'] = msg[8]
+
+ device_name = ble_client.scan_report_info['name']
+ addr = ble_client.scan_report_info['addr']
+ rssi = ble_client.scan_report_info['rssi']
+ addr_type = ble_client.scan_report_info['addr_type']
+ addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5])
+ if device_name != '' and rssi != 0:
+ print('name: {}, addr: {}, rssi: {}, addr_type: {}'.format(device_name, addr_str, rssi, addr_type))
+ print('raw_data: {}'.format(ble_client.scan_report_info['raw_data']))
+
+ if device_name == ble_client.ble_server_name: # 扫描到目标设备后就停止扫描
+ ret = ble_client.stop_scan()
+ if ret != 0:
+ ble_client.gatt_close()
+ break
+
+ ret = ble_client.connect()
+ if ret != 0:
+ ble_client.gatt_close()
+ break
+ else:
+ print('ble scan failed.')
+ ret = ble_client.stop_scan()
+ if ret != 0:
+ ble_client.gatt_close()
+ break
+ elif event_id == event.BLE_GATT_MTU:
+ print('')
+ print('event_id : BLE_GATT_MTU, status = {}'.format(status))
+ if status == 0:
+ handle = msg[2]
+ ble_mtu = msg[3]
+ print('handle = {:#06x}, ble_mtu = {}'.format(handle, ble_mtu))
+ else:
+ print('ble connect mtu failed.')
+ ble_client.gatt_close()
+ break
+ elif event_id == event.BLE_GATT_RECV_NOTIFICATION_IND:
+ print('')
+ print('event_id : BLE_GATT_RECV_NOTIFICATION_IND, status = {}'.format(status))
+ if status == 0:
+ data_len = msg[2]
+ data = msg[3]
+ print('len={}, data:{}'.format(data_len, data))
+ handle = (data[1] << 8) | data[0]
+ print('handle = {:#06x}'.format(handle))
+ else:
+ print('ble receive notification failed.')
+ break
+ elif event_id == event.BLE_GATT_RECV_INDICATION_IND:
+ print('')
+ print('event_id : BLE_GATT_RECV_INDICATION_IND, status = {}'.format(status))
+ if status == 0:
+ data_len = msg[2]
+ data = msg[3]
+ print('len={}, data:{}'.format(data_len, data))
+ else:
+ print('ble receive indication failed.')
+ break
+ elif event_id == event.BLE_GATT_START_DISCOVER_SERVICE_IND:
+ print('')
+ print('event_id : BLE_GATT_START_DISCOVER_SERVICE_IND, status = {}'.format(status))
+ if status == 0:
+ ble_client.characteristic_count = 0
+ ble_client.chara_descriptor_count = 0
+ ble_client.characteristic_index = 0
+ ble_client.gatt_statue = gatt_status.BLE_GATT_DISCOVER_SERVICE
+
+ if ble_client.discover_service_mode == 0:
+ print('execute the function discover_all_service.')
+ ret = ble_client.discover_all_service()
+ else:
+ print('execute the function discover_service_by_uuid.')
+ ret = ble_client.discover_service_by_uuid()
+ if ret != 0:
+ print('Execution result: Failed.')
+ ble_client.gatt_close()
+ break
+ else:
+ print('ble start discover service failed.')
+ ble_client.gatt_close()
+ break
+ elif event_id == event.BLE_GATT_DISCOVER_SERVICE_IND:
+ print('')
+ print('event_id : BLE_GATT_DISCOVER_SERVICE_IND, status = {}'.format(status))
+ if status == 0:
+ start_handle = msg[2]
+ end_handle = msg[3]
+ short_uuid = msg[4]
+ print('start_handle = {:#06x}, end_handle = {:#06x}, short_uuid = {:#06x}'.format(start_handle, end_handle, short_uuid))
+ if ble_client.discover_service_mode == 0: # discover service all
+ if ble_client.target_service['short_uuid'] == short_uuid: # 查找到所有服务后, 按指定uuid查找特征值
+ ble_client.target_service['start_handle'] = start_handle
+ ble_client.target_service['end_handle'] = end_handle
+ ble_client.gatt_statue = gatt_status.BLE_GATT_DISCOVER_CHARACTERISTIC
+ print('execute the function discover_all_characteristic.')
+ ret = ble_client.discover_all_characteristic()
+ if ret != 0:
+ print('Execution result: Failed.')
+ ble_client.gatt_close()
+ break
+ else:
+ ble_client.target_service['start_handle'] = start_handle
+ ble_client.target_service['end_handle'] = end_handle
+ ble_client.gatt_statue = gatt_status.BLE_GATT_DISCOVER_CHARACTERISTIC
+ print('execute the function discover_all_characteristic.')
+ ret = ble_client.discover_all_characteristic()
+ if ret != 0:
+ print('Execution result: Failed.')
+ ble_client.gatt_close()
+ break
+ else:
+ print('ble discover service failed.')
+ ble_client.gatt_close()
+ break
+ elif event_id == event.BLE_GATT_DISCOVER_CHARACTERISTIC_DATA_IND:
+ print('')
+ print('event_id : BLE_GATT_DISCOVER_CHARACTERISTIC_DATA_IND, status = {}'.format(status))
+ if status == 0:
+ data_len = msg[2]
+ data = msg[3]
+ pair_len = data[0]
+ print('pair_len={}, len={}, data:{}'.format(pair_len, data_len, data))
+ if data_len > 0:
+ if ble_client.gatt_statue == gatt_status.BLE_GATT_DISCOVER_CHARACTERISTIC:
+ i = 0
+ while i < (data_len - 1) / pair_len:
+ chara_dict = {
+ 'handle': (data[i * pair_len + 2] << 8) | data[i * pair_len + 1],
+ 'properties': data[i * pair_len + 3],
+ 'value_handle': (data[i * pair_len + 5] << 8) | data[i * pair_len + 4],
+ 'uuid_type': 0,
+ 'short_uuid': 0x0000,
+ 'long_uuid': bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+ }
+ print('handle={:#06x}, properties={:#x}, value_handle={:#06x}'.format(chara_dict['handle'], chara_dict['properties'], chara_dict['value_handle']))
+ if pair_len == ble_client.ble_short_uuid_pair_len:
+ chara_dict['uuid_type'] = 1
+ chara_dict['short_uuid'] = (data[i * pair_len + 7] << 8) | data[i * pair_len + 6]
+ print('short_uuid:{:#06x}'.format(chara_dict['short_uuid']))
+ elif pair_len == ble_client.ble_long_uuid_pair_len:
+ start_index = i * pair_len + 6
+ end_index = start_index + 16
+ chara_dict['uuid_type'] = 0
+ chara_dict['long_uuid'] = data[start_index : end_index]
+ print('long_uuid:{}'.format(chara_dict['long_uuid']))
+ i += 1
+ if ble_client.characteristic_count < 5:
+ ble_client.characteristic_list.append(chara_dict)
+ ble_client.characteristic_count = len(ble_client.characteristic_list)
+ print('characteristic_list len = {}'.format(ble_client.characteristic_count))
+ elif ble_client.gatt_statue == gatt_status.BLE_GATT_READ_CHARA_VALUE:
+ print('data_len = {}'.format(data_len))
+ print('pay_load = {:02x},{:02x},{:02x},{:02x}'.format(data[0], data[1], data[2], data[3]))
+ else:
+ print('ble discover characteristic failed.')
+ ble_client.gatt_close()
+ break
+ elif event_id == event.BLE_GATT_DISCOVER_CHARA_DESC_IND:
+ print('')
+ print('event_id : BLE_GATT_DISCOVER_CHARA_DESC_IND, status = {}'.format(status))
+ if status == 0:
+ data_len = msg[2]
+ data = msg[3]
+ fmt = data[0]
+ print('fmt={}, len={}, data:{}'.format(fmt, data_len, data))
+ if data_len > 0:
+ i = 0
+ if fmt == 1: # 16 bit uuid
+ while i < (data_len - 1) / 4:
+ descriptor_dict = {
+ 'handle': (data[i * 4 + 2] << 8) | data[i * 4 + 1],
+ 'short_uuid': (data[i * 4 + 4] << 8) | data[i * 4 + 3],
+ }
+ print('handle={:#06x}, uuid={:#06x}'.format(descriptor_dict['handle'], descriptor_dict['short_uuid']))
+ i += 1
+ if ble_client.chara_descriptor_count < 5:
+ ble_client.descriptor_list.append(descriptor_dict)
+ ble_client.chara_descriptor_count = len(ble_client.descriptor_list)
+ print('descriptor_list len = {}'.format(ble_client.chara_descriptor_count))
+ if ble_client.characteristic_index == ble_client.characteristic_count:
+ print('execute the function read_characteristic_by_uuid.')
+ # ble_client.gatt_statue = gatt_status.BLE_GATT_WRITE_CHARA_VALUE
+ # ret = ble_client.write_characteristic()
+ # ret = ble_client.write_characteristic_no_rsp()
+
+ ble_client.gatt_statue = gatt_status.BLE_GATT_READ_CHARA_VALUE
+ ret = ble_client.read_characteristic_by_uuid()
+ # ret = ble_client.read_characteristic_by_handle()
+
+ # ble_client.gatt_statue = gatt_status.BLE_GATT_READ_CHARA_DESC
+ # ret = ble_client.read_characteristic_descriptor()
+
+ # ble_client.gatt_statue = gatt_status.BLE_GATT_WRITE_CHARA_DESC
+ # ret = ble_client.write_characteristic_descriptor()
+ else:
+ print('execute the function discover_all_characteristic_descriptor.')
+ ret = ble_client.discover_all_characteristic_descriptor()
+ if ret != 0:
+ print('Execution result: Failed.')
+ ble_client.gatt_close()
+ break
+ else:
+ print('ble discover characteristic descriptor failed.')
+ ble_client.gatt_close()
+ break
+ elif event_id == event.BLE_GATT_CHARA_WRITE_WITH_RSP_IND:
+ print('')
+ print('event_id : BLE_GATT_CHARA_WRITE_WITH_RSP_IND, status = {}'.format(status))
+ if status == 0:
+ if ble_client.gatt_statue == gatt_status.BLE_GATT_WRITE_CHARA_VALUE:
+ pass
+ elif ble_client.gatt_statue == gatt_status.BLE_GATT_WRITE_CHARA_DESC:
+ pass
+ else:
+ print('ble write characteristic with response failed.')
+ break
+ elif event_id == event.BLE_GATT_CHARA_WRITE_WITHOUT_RSP_IND:
+ print('')
+ print('event_id : BLE_GATT_CHARA_WRITE_WITHOUT_RSP_IND, status = {}'.format(status))
+ if status == 0:
+ print('write characteristic value without response successful.')
+ else:
+ print('write characteristic value without response failed.')
+ break
+ elif event_id == event.BLE_GATT_CHARA_READ_IND:
+ print('')
+ # read characteristic value by handle
+ print('event_id : BLE_GATT_CHARA_READ_IND, status = {}'.format(status))
+ if status == 0:
+ data_len = msg[2]
+ data = msg[3]
+ print('data_len = {}, data : {}'.format(data_len, data))
+ if ble_client.gatt_statue == gatt_status.BLE_GATT_READ_CHARA_VALUE:
+ # print('read characteristic value by handle.')
+ pass
+ else:
+ print('ble read characteristic failed.')
+ break
+ elif event_id == event.BLE_GATT_CHARA_READ_BY_UUID_IND:
+ print('')
+ # read characteristic value by uuid
+ print('event_id : BLE_GATT_CHARA_READ_BY_UUID_IND, status = {}'.format(status))
+ if status == 0:
+ data_len = msg[2]
+ data = msg[3]
+ print('data_len = {}, data : {}'.format(data_len, data))
+ handle = (data[2] << 8) | data[1]
+ print('handle = {:#06x}'.format(handle))
+ else:
+ print('ble read characteristic by uuid failed.')
+ break
+ elif event_id == event.BLE_GATT_CHARA_MULTI_READ_IND:
+ print('')
+ # read multiple characteristic value
+ print('event_id : BLE_GATT_CHARA_MULTI_READ_IND, status = {}'.format(status))
+ if status == 0:
+ data_len = msg[2]
+ data = msg[3]
+ print('data_len = {}, data : {}'.format(data_len, data))
+ else:
+ print('ble read multiple characteristic by uuid failed.')
+ break
+ elif event_id == event.BLE_GATT_DESC_WRITE_WITH_RSP_IND:
+ print('')
+ print('event_id : BLE_GATT_DESC_WRITE_WITH_RSP_IND, status = {}'.format(status))
+ if status == 0:
+ if ble_client.gatt_statue == gatt_status.BLE_GATT_WRITE_CHARA_VALUE:
+ pass
+ elif ble_client.gatt_statue == gatt_status.BLE_GATT_WRITE_CHARA_DESC:
+ pass
+ else:
+ print('ble write characteristic descriptor failed.')
+ break
+ elif event_id == event.BLE_GATT_DESC_READ_IND:
+ print('')
+ # read characteristic descriptor
+ print('event_id : BLE_GATT_DESC_READ_IND, status = {}'.format(status))
+ if status == 0:
+ data_len = msg[2]
+ data = msg[3]
+ print('data_len = {}, data : {}'.format(data_len, data))
+ if ble_client.gatt_statue == gatt_status.BLE_GATT_READ_CHARA_DESC:
+ # print('read characteristic descriptor.')
+ pass
+ else:
+ print('ble read characteristic descriptor failed.')
+ break
+ elif event_id == event.BLE_GATT_ATT_ERROR_IND:
+ print('')
+ print('event_id : BLE_GATT_ATT_ERROR_IND, status = {}'.format(status))
+ if status == 0:
+ errcode = msg[2]
+ print('errcode = {:#06x}'.format(errcode))
+ if ble_client.gatt_statue == gatt_status.BLE_GATT_DISCOVER_INCLUDES:
+ ble_client.gatt_statue = gatt_status.BLE_GATT_DISCOVER_CHARACTERISTIC
+ print('execute the function discover_all_characteristic.')
+ ret = ble_client.discover_all_characteristic()
+ if ret != 0:
+ print('Execution result: Failed.')
+ ble_client.gatt_close()
+ break
+ elif ble_client.gatt_statue == gatt_status.BLE_GATT_DISCOVER_CHARACTERISTIC:
+ ble_client.gatt_statue = gatt_status.BLE_GATT_IDLE
+ print('execute the function discover_all_characteristic_descriptor.')
+ ret = ble_client.discover_all_characteristic_descriptor()
+ if ret != 0:
+ print('Execution result: Failed.')
+ ble_client.gatt_close()
+ break
+ else:
+ print('ble attribute error.')
+ ble_client.gatt_close()
+ break
+ else:
+ print('unknown event id : {}.'.format(event_id))
+
+ # ble_client.release()
+
+
+event = EVENT(event_dict)
+gatt_status = EVENT(gatt_status_dict)
+msg_queue = Queue(50)
+ble_client = BleClient()
+
+
+def main():
+ checknet.poweron_print_once()
+ print('create client event handler task.')
+ _thread.start_new_thread(ble_gatt_client_event_handler, ())
+ # ble.setScanFilter(0) # 关闭扫描过滤功能
+ ret = ble_client.gatt_open()
+ if ret != 0:
+ return -1
+
+ count = 0
+ while True:
+ utime.sleep(1)
+ count += 1
+ cur_time = utime.localtime()
+ timestamp = "{:02d}:{:02d}:{:02d}".format(cur_time[3], cur_time[4], cur_time[5])
+ if count % 5 == 0:
+ print('[{}] BLE Client running, count = {}......'.format(timestamp, count))
+ print('')
+ if count > 130: # 这里设置计数是为了程序运行一会自己退出, 方便测试, 实际根据用户需要来处理
+ count = 0
+ print('!!!!! stop BLE Client now !!!!!')
+ ble_status = ble_client.gatt_get_status()
+ if ble_status == 1:
+ ble_client.gatt_close()
+ ble_client.release()
+ break
+ else:
+ ble_status = ble_client.gatt_get_status()
+ if ble_status == 0: # stopped
+ print('BLE connection has been disconnected.')
+ ble_client.release()
+ break
+
+if __name__ == '__main__':
+ main()
+
+```
+
+
+
+> 当前仅EC200U/EC600U/EG915U/EG912U型号支持`ble`功能。
+
+
+
+## 初始化相关功能
+
+### `ble.gattStart`
+
+```python
+ble.gattStart()
+```
+
+开启 BLE GATT 功能。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.gattStop`
+
+```python
+ble.gattStop()
+```
+
+关闭 BLE GATT 功能。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.getStatus`
+
+```python
+ble.getStatus()
+```
+
+获取 BLE 的状态。
+
+**返回值描述:**
+
+- 0 - BLE处于停止状态。1 - BLE处于开启状态。-1 - 获取状态失败。
+
+### `ble.getPublicAddr`
+
+```python
+ble.getPublicAddr()
+```
+
+获取 BLE 协议栈正在使用的公共地址。该接口需要在BLE已经初始化完成并启动成功后才能调用,比如在回调中收到 event_id 为0的事件之后,即 start 成功后,去调用。
+
+**返回值描述:**
+
+- 执行成功返回bytearray类型的BLE地址,大小6个byte,失败返回整型-1。
+
+**示例**:
+
+```python
+>>> addr = ble.getPublicAddr()
+>>> print(addr)
+b'\xdb3\xf5\x1ek\xac'
+>>> mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+>>> print('mac = [{}]'.format(mac))
+mac = [ac:6b:1e:f5:33:db]
+```
+
+
+
+> 如果有出厂设置默认蓝牙MAC地址,那么该接口获取的MAC地址和默认的蓝牙MAC地址是一致的;如果没有设置,那么该接口获取的地址,将是蓝牙启动后随机生成的静态地址,因此在每次重新上电运行蓝牙功能时都不相同。
+
+
+
+## BLE Server相关功能
+
+### `ble.serverInit`
+
+```python
+ble.serverInit(user_cb)
+```
+
+初始化 BLE Server 并注册回调函数。
+
+**参数描述:**
+
+- `user_cb`-回调函数,类型为function。回调函数参数含义:args[0] 固定表示event_id,args[1]固定 表示状态,0表示成功,非0表示失败。回调函数的参数个数并不是固定2个,而是根据第一个参数args[0]来决定的,下表中列出了不同事件ID对应的参数个数及说明。
+
+| event_id | 参数个数 | 参数说明 |
+| :------: | :------: | ------------------------------------------------------------ |
+| 0 | 2 | args[0] :event_id,表示 BT/BLE start
args[1] :status,表示操作的状态,0-成功,非0-失败 |
+| 1 | 2 | args[0] :event_id,表示 BT/BLE stop
args[1] :status,表示操作的状态,0-成功,非0-失败 |
+| 16 | 4 | args[0] :event_id,表示 BLE connect
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :connect_id
args[3] :addr,BT/BLE address,bytearray类型数据 |
+| 17 | 4 | args[0] :event_id,表示 BLE disconnect
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :connect_id,
args[3] :addr,BT/BLE address,bytearray类型数据 |
+| 18 | 7 | args[0] :event_id,表示 BLE update connection parameter
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :connect_id
args[3] :max_interval,最大的间隔,间隔:1.25ms,取值范围:6-3200,时间范围:7.5ms\ ~ 4s
args[4] :min_interval,最小的间隔,间隔:1.25ms,取值范围:6-3200,时间范围:7.5ms\ ~ 4s
args[5] :latency,从机忽略连接状态事件的时间。需满足:(1+latecy)\*max_interval\*2\*1.25args[6] :timeout,没有交互,超时断开时间,间隔:10ms,取值范围:10-3200ms,时间范围:100ms ~ 32s |
+| 20 | 4 | args[0] :event_id,表示 BLE connection mtu
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :handle
args[3] :mtu值 |
+| 21 | 7 | args[0] :event_id,表示 BLE server : when ble client write characteristic value or descriptor,server get the notice
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :data_len,获取数据的长度
args[3] :data,一个数组,存放获取的数据
args[4] :attr_handle,属性句柄,整型值
args[5] :short_uuid,整型值
args[6] :long_uuid,一个16字节数组,存放长UUID |
+| 22 | 7 | args[0] :event_id,表示 server : when ble client read characteristic value or descriptor,server get the notice
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :data_len,获取数据的长度
args[3] :data,一个数组,存放获取的数据
args[4] :attr_handle,属性句柄,整型值
args[5] :short_uuid,整型值
args[6] :long_uuid,一个16字节数组,存放长UUID |
+| 25 | 2 | args[0] :event_id,表示 server send notification,and recieve send end notice
args[1] :status,表示操作的状态,0-成功,非0-失败 |
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+def ble_callback(args):
+ event_id = args[0]
+ status = args[1]
+ print('[ble_callback]: event_id={}, status={}'.format(event_id, status))
+
+ if event_id == 0: # ble start
+ if status == 0:
+ print('[callback] BLE start success.')
+ else:
+ print('[callback] BLE start failed.')
+ elif event_id == 1: # ble stop
+ if status == 0:
+ print('[callback] ble stop successful.')
+ else:
+ print('[callback] ble stop failed.')
+ elif event_id == 16: # ble connect
+ if status == 0:
+ print('[callback] ble connect successful.')
+ connect_id = args[2]
+ addr = args[3] # 这是一个bytearray类型
+ addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5])
+ print('[callback] connect_id = {}, addr = {}'.format(connect_id, addr_str))
+ else:
+ print('[callback] ble connect failed.')
+ elif event_id == 17: # ble disconnect
+ if status == 0:
+ print('[callback] ble disconnect successful.')
+ connect_id = args[2]
+ addr = args[3] # 这是一个bytearray类型
+ addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5])
+ print('[callback] connect_id = {}, addr = {}'.format(connect_id, addr_str))
+ else:
+ print('[callback] ble disconnect failed.')
+ ble.gattStop()
+ return
+ elif event_id == 18: # ble update connection parameter
+ if status == 0:
+ print('[callback] ble update parameter successful.')
+ connect_id = args[2]
+ max_interval = args[3]
+ min_interval = args[4]
+ latency = args[5]
+ timeout = args[6]
+ print('[callback] connect_id={},max_interval={},min_interval={},latency={},timeout={}'.format(connect_id, max_interval, min_interval, latency, timeout))
+ else:
+ print('[callback] ble update parameter failed.')
+ ble.gattStop()
+ return
+ elif event_id == 20: # ble connection mtu
+ if status == 0:
+ print('[callback] ble connect mtu successful.')
+ handle = args[2]
+ ble_mtu = args[3]
+ print('[callback] handle = {:#06x}, ble_mtu = {}'.format(handle, ble_mtu))
+ else:
+ print('[callback] ble connect mtu failed.')
+ ble.gattStop()
+ return
+ elif event_id == 21: # server:when ble client write characteristic value or descriptor,server get the notice
+ if status == 0:
+ print('[callback] ble recv successful.')
+ data_len = args[2]
+ data = args[3] # 这是一个bytearray类型
+ attr_handle = args[4]
+ short_uuid = args[5]
+ long_uuid = args[6] # 这是一个bytearray类型
+ print('len={}, data:{}'.format(data_len, data))
+ print('attr_handle = {:#06x}'.format(attr_handle))
+ print('short uuid = {:#06x}'.format(short_uuid))
+ print('long uuid = {}'.format(long_uuid))
+ else:
+ print('[callback] ble recv failed.')
+ ble.gattStop()
+ return
+ elif event_id == 22: # server:when ble client read characteristic value or descriptor,server get the notice
+ if status == 0:
+ print('[callback] ble recv read successful.')
+ data_len = args[2]
+ data = args[3] # 这是一个bytearray类型
+ attr_handle = args[4]
+ short_uuid = args[5]
+ long_uuid = args[6] # 这是一个bytearray类型
+ print('len={}, data:{}'.format(data_len, data))
+ print('attr_handle = {:#06x}'.format(attr_handle))
+ print('short uuid = {:#06x}'.format(short_uuid))
+ print('long uuid = {}'.format(long_uuid))
+ else:
+ print('[callback] ble recv read failed.')
+ ble.gattStop()
+ return
+ elif event_id == 25: # server send notification,and recieve send end notice
+ if status == 0:
+ print('[callback] ble send data successful.')
+ else:
+ print('[callback] ble send data failed.')
+ else:
+ print('unknown event id.')
+
+ble.serverInit(ble_callback)
+```
+
+### `ble.serverRelease`
+
+```python
+ble.serverRelease()
+```
+
+BLE Server 资源释放。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.setLocalName`
+
+```python
+ble.setLocalName(code, name)
+```
+
+设置 BLE 名称。
+
+**参数描述:**
+
+- `code`-编码模式,类型为整型。0 - UTF8,1 - GBK。
+- `name`-编码模式,类型为string。BLE 名称,名称最长不能超过29个字节。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+>>> ble.setLocalName(0, 'QuecPython-BLE')
+0
+```
+
+
+
+> 对于BLE,设备在广播时,如果希望扫描软件扫描时,能看到广播设备的名称,是需要在广播数据中包含蓝牙名称的,或者在扫描回复数据中包含设备名称。
+
+
+
+### `ble.setAdvParam`
+
+```python
+ble.setAdvParam(min_adv,max_adv,adv_type,addr_type,channel,filter_policy,discov_mode,no_br_edr,enable_adv)
+```
+
+设置广播参数。
+
+**参数描述:**
+
+- 参数含义如下表。
+
+| 参数 | 类型 | 说明 |
+| ------------- | ---------- | ------------------------------------------------------------ |
+| min_adv | 无符号整型 | 最小广播间隔,范围0x0020-0x4000,计算如下:
时间间隔 = min_adv \* 0.625,单位ms |
+| max_adv | 无符号整型 | 最大广播间隔,范围0x0020-0x4000,计算如下:
时间间隔 = max_adv \* 0.625,单位ms |
+| adv_type | 无符号整型 | 广播类型,取值范围如下:
0 - 可连接的非定向广播,默认选择
1 - 可连接高占空比的定向广播
2 - 可扫描的非定向广播
3 - 不可连接的非定向广播
4 - 可连接低占空比的定向广播 |
+| addr_type | 无符号整型 | 本地地址类型,取值范围如下:
0 - 公共地址
1 - 随机地址 |
+| channel | 无符号整型 | 广播通道,取值范围如下:
1 - 37信道
2 - 38信道
4 - 39信道
7 - 上述3个通道都选择,默认该选项 |
+| filter_policy | 无符号整型 | 广播过滤策略,取值范围如下:
0 - 处理所有设备的扫描和连接请求
1 - 处理所有设备的连接请求和只处理白名单设备的扫描请求(暂不支持)
2 - 处理所有设备的扫描请求和只处理白名单设备的连接请求(暂不支持)
3 - 只处理白名单设备的连接和扫描请求(暂不支持) |
+| discov_mode | 无符号整型 | 发现模式,GAP协议使用,默认为2
1 - 有限可发现模式
2 - 一般可发现模式 |
+| no_br_edr | 无符号整型 | 不用BR/EDR,默认为1,如果用则为0 |
+| enable_adv | 无符号整型 | 使能广播,默认为1,不使能则为0 |
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+def ble_gatt_set_param():
+ min_adv = 0x300
+ max_adv = 0x320
+ adv_type = 0 # 可连接的非定向广播,默认选择
+ addr_type = 0 # 公共地址
+ channel = 0x07
+ filter_strategy = 0 # 处理所有设备的扫描和连接请求
+ discov_mode = 2
+ no_br_edr = 1
+ enable_adv = 1
+ ret = ble.setAdvParam(min_adv, max_adv, adv_type, addr_type, channel, filter_strategy, discov_mode, no_br_edr, enable_adv)
+ if ret != 0:
+ print('ble_gatt_set_param failed.')
+ return -1
+ print('ble_gatt_set_param success.')
+ return 0
+```
+
+### `ble.setAdvData`
+
+```python
+ble.setAdvData(data)
+```
+
+设置广播数据内容。
+
+**参数描述:**
+
+- `data`-广播数据,最长不超过31个字节,类型为bytearray。广播数据的内容,采用 length+type+data 的格式。一条广播数据中可以包含多个这种格式数据的组合,如下示例中包含了两个数据组合,第一个是 "0x02, 0x01, 0x05",0x02表示后面有两个数据,分别是0x01和0x05,0x01即type,0x05表示具体数据;第二个是ble名称数据组合, length为ble名称长度加1、type为0x09,具体数据为name对应的具体编码值。关于type具体值代表的含义,请参考蓝牙协议官方标准文档。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+def ble_gatt_set_data():
+ adv_data = [0x02, 0x01, 0x05]
+ ble_name = "Quectel_ble"
+ length = len(ble_name) + 1
+ adv_data.append(length)
+ adv_data.append(0x09)
+ name_encode = ble_name.encode('UTF-8')
+ for i in range(0, len(name_encode)):
+ adv_data.append(name_encode[i])
+ print('set adv_data:{}'.format(adv_data))
+ data = bytearray(adv_data)
+ ret = ble.setAdvData(data)
+ if ret != 0:
+ print('ble_gatt_set_data failed.')
+ return -1
+ print('ble_gatt_set_data success.')
+ return 0
+```
+
+### `ble.setAdvRspData`
+
+```python
+ble.setAdvRspData(data)
+```
+
+设置扫描回复数据。
+
+**参数描述:**
+
+- `data`-扫描回复数据,最长不超过31个字节,类型为bytearray。 格式和上面设置广播数据内容接口一致。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+def ble_gatt_set_rsp_data():
+ adv_data = []
+ ble_name = "Quectel_ble"
+ length = len(ble_name) + 1
+ adv_data.append(length)
+ adv_data.append(0x09)
+ name_encode = ble_name.encode('UTF-8')
+ for i in range(0, len(name_encode)):
+ adv_data.append(name_encode[i])
+ print('set adv_rsp_data:{}'.format(adv_data))
+ data = bytearray(adv_data)
+ ret = ble.setAdvRspData(data)
+ if ret != 0:
+ print('ble_gatt_set_rsp_data failed.')
+ return -1
+ print('ble_gatt_set_rsp_data success.')
+ return 0
+```
+
+
+
+> 当client设备扫描方式为积极扫描时,设置扫描回复数据才有意义。
+
+
+
+### `ble.addService`
+
+```python
+ble.addService(primary, server_id, uuid_type, uuid_s, uuid_l)
+```
+
+增加一个服务。
+
+**参数描述:**
+
+- `primary`-服务类型,1表示主要服务,其他值表示次要服务,类型为整型。
+- `server_id`-服务ID,用来确定某一个服务,类型为整型。
+- `uuid_type`-uuid类型,0 - 长UUID,128bit;1 - 短UUID,16bit。类型为整型。
+- `uuid_s`-短UUID,2个字节(16bit),类型为整型,当uuid_type为0时,该值给0。
+- `uuid_l`-长UUID,16个字节(128bit),类型为bytearray,当uuid_type为1时,该值填 bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+def ble_gatt_add_service():
+ primary = 1
+ server_id = 0x01
+ uuid_type = 1 # 短UUID
+ uuid_s = 0x180F
+ uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+ ret = ble.addService(primary, server_id, uuid_type, uuid_s, uuid_l)
+ if ret != 0:
+ print('ble_gatt_add_service failed.')
+ return -1
+ print('ble_gatt_add_service success.')
+ return 0
+```
+
+### `ble.addChara`
+
+```python
+ble.addChara(server_id, chara_id, chara_prop, uuid_type, uuid_s, uuid_l)
+```
+
+在服务里增加一个特征。
+
+**参数描述:**
+
+- `server_id`-服务ID,用来确定某一个服务,类型为整型。
+- `chara_id`-特征ID,类型为整型。
+- `chara_prop`-特征的属性,十六进制数,可通过“或运算”同时指定多个属性,值具体含义如下表,类型为整型。
+
+| 值 | 含义 |
+| ---- | ----------------------------- |
+| 0x01 | 广播 |
+| 0x02 | 可读 |
+| 0x04 | 0x04 - 可写且不需要链路层应答 |
+| 0x08 | 可写 |
+| 0x10 | 通知 |
+| 0x20 | 指示 |
+| 0x40 | 认证签名写 |
+| 0x80 | 扩展属性 |
+
+- `uuid_type`-uuid类型,0 - 长UUID,128bit;1 - 短UUID,16bit。类型为整型。
+- `uuid_s`-短UUID,2个字节(16bit),类型为整型,当uuid_type为0时,该值给0。
+- `uuid_l`-长UUID,16个字节(128bit),类型为bytearray,当uuid_type为1时,该值填 bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+def ble_gatt_add_characteristic():
+ server_id = 0x01
+ chara_id = 0x01
+ chara_prop = 0x02 | 0x10 | 0x20 # 0x02-可读 0x10-通知 0x20-指示
+ uuid_type = 1 # 短UUID
+ uuid_s = 0x2A19
+ uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+ ret = ble.addChara(server_id, chara_id, chara_prop, uuid_type, uuid_s, uuid_l)
+ if ret != 0:
+ print('ble_gatt_add_characteristic failed.')
+ return -1
+ print('ble_gatt_add_characteristic success.')
+ return 0
+```
+
+### `ble.addCharaValue`
+
+```python
+ble.addCharaValue(server_id, chara_id, permission, uuid_type, uuid_s, uuid_l, value)
+```
+
+在特征里增加一个特征值。
+
+**参数描述:**
+
+- `server_id`-服务ID,用来确定某一个服务,类型为整型。
+- `chara_id`-特征ID,类型为整型。
+- `permission`-特征值的权限,2个字节,十六进制数,可通过“或运算”同时指定多个属性,值具体含义如下表,类型为整型。
+
+| 值 | 含义 |
+| ------ | -------------- |
+| 0x0001 | 可读权限 |
+| 0x0002 | 可写权限 |
+| 0x0004 | 读需要认证 |
+| 0x0008 | 读需要授权 |
+| 0x0010 | 读需要加密 |
+| 0x0020 | 读需要授权认证 |
+| 0x0040 | 写需要认证 |
+| 0x0080 | 写需要授权 |
+| 0x0100 | 写需要加密 |
+| 0x0200 | 写需要授权认证 |
+
+- `uuid_type`-uuid类型,0 - 长UUID,128bit;1 - 短UUID,16bit。类型为整型。
+- `uuid_s`-短UUID,2个字节(16bit),类型为整型,当uuid_type为0时,该值给0。
+- `uuid_l`-长UUID,16个字节(128bit),类型为bytearray,当uuid_type为1时,该值填 bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])。
+- `value`-特征值数据。类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+def ble_gatt_add_characteristic_value():
+ data = []
+ server_id = 0x01
+ chara_id = 0x01
+ permission = 0x0001 | 0x0002
+ uuid_type = 1 # 短UUID
+ uuid_s = 0x2A19
+ uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+ for i in range(0, 244):
+ data.append(0x00)
+ value = bytearray(data)
+ ret = ble.addCharaValue(server_id, chara_id, permission, uuid_type, uuid_s, uuid_l, value)
+ if ret != 0:
+ print('ble_gatt_add_characteristic_value failed.')
+ return -1
+ print('ble_gatt_add_characteristic_value success.')
+ return 0
+```
+
+### `ble.changeCharaValue`
+
+```python
+ble.changeCharaValue(server_id, chara_id, value)
+```
+
+修改特征值。
+
+**参数描述:**
+
+- `server_id`-服务ID,用来确定某一个服务,类型为整型。
+- `chara_id`-特征ID,类型为整型。
+
+- `value`-特征值数据。类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.addCharaDesc`
+
+```python
+ble.addCharaDesc(server_id, chara_id, permission, uuid_type, uuid_s, uuid_l, value)
+```
+
+在特征里增加一个特征描述,注意特征描述和特征值同属与一个特征。
+
+**参数描述:**
+
+- `server_id`-服务ID,用来确定某一个服务,类型为整型。
+- `chara_id`-特征ID,类型为整型。
+- `permission`-特征值的权限,2个字节,十六进制数,可通过“或运算”同时指定多个属性,值具体含义如下表,类型为整型。
+
+| 值 | 含义 |
+| ------ | -------------- |
+| 0x0001 | 可读权限 |
+| 0x0002 | 可写权限 |
+| 0x0004 | 读需要认证 |
+| 0x0008 | 读需要授权 |
+| 0x0010 | 读需要加密 |
+| 0x0020 | 读需要授权认证 |
+| 0x0040 | 写需要认证 |
+| 0x0080 | 写需要授权 |
+| 0x0100 | 写需要加密 |
+| 0x0200 | 写需要授权认证 |
+
+- `uuid_type`-uuid类型,0 - 长UUID,128bit;1 - 短UUID,16bit。类型为整型。
+- `uuid_s`-短UUID,2个字节(16bit),类型为整型,当uuid_type为0时,该值给0。
+- `uuid_l`-长UUID,16个字节(128bit),类型为bytearray,当uuid_type为1时,该值填 bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])。
+- `value`-特征描述数据。类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+def ble_gatt_add_characteristic_desc():
+ data = [0x00, 0x00]
+ server_id = 0x01
+ chara_id = 0x01
+ permission = 0x0001 | 0x0002
+ uuid_type = 1 # 短UUID
+ uuid_s = 0x2902
+ uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+ value = bytearray(data)
+ ret = ble.addCharaDesc(server_id, chara_id, permission, uuid_type, uuid_s, uuid_l, value)
+ if ret != 0:
+ print('ble_gatt_add_characteristic_desc failed.')
+ return -1
+ print('ble_gatt_add_characteristic_desc success.')
+ return 0
+```
+
+### `ble.addOrClearService`
+
+```python
+ble.addOrClearService(option, mode)
+```
+
+增加前面已添加的所有服务信息到模块,或者删除模块中已增加的所有服务信息。
+
+**参数描述:**
+
+- `option`-操作类型,类型为整型。0 - 删除服务,1 - 增加服务。
+- `mode`-是否保留系统默认服务,类型为整型。 0 - 删除系统默认的GAP和GATT服务,1 - 保留系统默认的GAP和GATT服务。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.sendNotification`
+
+```python
+ble.sendNotification(connect_id, attr_handle, value)
+```
+
+发送通知。
+
+**参数描述:**
+
+- `connect_id`-连接ID,类型为整型。
+- `attr_handle`-属性句柄,类型为整型。
+- `value`-要发送的数据,发送数据长度不要超过MTU,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.sendIndication`
+
+```python
+ble.sendIndication(connect_id, attr_handle, value)
+```
+
+发送指示。
+
+**参数描述:**
+
+- `connect_id`-连接ID,类型为整型。
+- `attr_handle`-属性句柄,类型为整型。
+- `value`-要发送的数据,发送数据长度不要超过MTU,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.advStart`
+
+```python
+ble.advStart()
+```
+
+开启广播。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.advStop`
+
+```python
+ble.advStop()
+```
+
+停止广播。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+## BLE Client相关功能
+
+### `ble.clientInit`
+
+```python
+ble.clientInit(user_cb)
+```
+
+初始化 BLE Client 并注册回调函数。
+
+**参数描述:**
+
+- `user_cb`-回调函数,类型为function。回调函数参数含义:args[0] 固定表示event_id,args[1] 固定表示状态,0表示成功,非0表示失败。回调函数的参数个数并不是固定2个,而是根据第一个参数args[0]来决定的,下表中列出了不同事件ID对应的参数个数及说明。
+
+| event_id | 参数个数 | 参数说明 |
+| :------: | :------: | ------------------------------------------------------------ |
+| 0 | 2 | args[0] :event_id,表示 BT/BLE start
args[1] :status,表示操作的状态,0-成功,非0-失败 |
+| 1 | 2 | args[0] :event_id,表示 BT/BLE stop
args[1] :status,表示操作的状态,0-成功,非0-失败 |
+| 16 | 4 | args[0] :event_id,表示 BLE connect
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :connect_id
args[3] :addr,BT/BLE address,bytearray类型数据 |
+| 17 | 4 | args[0] :event_id,表示 BLE disconnect
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :connect_id,
args[3] :addr,BT/BLE address,bytearray类型数据 |
+| 18 | 7 | args[0] :event_id,表示 BLE update connection parameter
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :connect_id
args[3] :max_interval,最大的间隔,间隔:1.25ms,取值范围:6-3200,时间范围:7.5ms ~ 4s
args[4] :min_interval,最小的间隔,间隔:1.25ms,取值范围:6-3200,时间范围:7.5ms ~ 4s
args[5] :latency,从机忽略连接状态事件的时间。需满足:(1+latecy)\*max_interval\*2\*1.25args[6] :timeout,没有交互,超时断开时间,间隔:10ms,取值范围:10-3200,时间范围:100ms ~ 32s |
+| 19 | 9 | args[0] :event_id,表示 BLE scan report
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :event_type
args[3] :扫描到的设备名称
args[4] :设备地址类型
args[5] :设备地址,bytearray类型数据
args[6] :rssi,信号强度
args[7] :data_len,扫描的原始数据长度
args[8] :data,扫描的原始数据 |
+| 20 | 4 | args[0] :event_id,表示 BLE connection mtu
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :handle
args[3] :mtu值 |
+| 23 | 4 | args[0] :event_id,表示 client recieve notification,即接收通知
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :data_len,数据长度
args[3] :data,包含句柄等数据的原始数据,数据格式及解析见最后的综合示例程序 |
+| 24 | 4 | args[0] :event_id,表示 client recieve indication,即接收指示
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :data_len,数据长度
args[3] :data,包含indication的原始数据,数据格式及解析见最后的综合示例程序 |
+| 26 | 2 | args[0] :event_id,表示 start discover service,即开始查找服务
args[1] :status,表示操作的状态,0-成功,非0-失败 |
+| 27 | 5 | args[0] :event_id,表示 discover service,即查找到服务
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :start_handle,表示service的开始句柄
args[3] :end_handle,表示service的结束句柄
args[4] :UUID,表示service的UUID(短UUID) |
+| 28 | 4 | args[0] :event_id,表示 discover characteristic,即查找服务特征
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :data_len,数据长度
args[3] :data,包含句柄、属性、UUID等数据的原始数据,数据格式及解析见最后的综合示例程序 |
+| 29 | 4 | args[0] :event_id,表示 discover characteristic descriptor,即查找特征描述
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :data_len,数据长度
args[3] :data,包含句柄、UUID等数据的原始数据,数据格式及解析见最后的综合示例程序 |
+| 30 | 2 | args[0] :event_id,表示 write characteristic value with response,即写入特征值并需要链路层确认
args[1] :status,表示操作的状态,0-成功,非0-失败 |
+| 31 | 2 | args[0] :event_id,表示 write characteristic value without response,即写入特征值,无需链路层确认
args[1] :status,表示操作的状态,0-成功,非0-失败 |
+| 32 | 4 | args[0] :event_id,表示 read characteristic value by handle,即通过句柄来读取特征值
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :data_len,数据长度
args[3] :data,原始数据 |
+| 33 | 4 | args[0] :event_id,表示 read characteristic value by uuid,即通过UUID来读取特征值
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :data_len,数据长度
args[3] :data,原始数据 |
+| 34 | 4 | args[0] :event_id,表示 read miltiple characteristic value,即读取多个特征值
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :data_len,数据长度
args[3] :data,原始数据 |
+| 35 | 2 | args[0] :event_id,表示 wirte characteristic descriptor,即写入特征描述,需链路层确认
args[1] :status,表示操作的状态,0-成功,非0-失败 |
+| 36 | 4 | args[0] :event_id,表示 read characteristic descriptor,即读特征描述
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :data_len,数据长度
args[3] :data,原始数据 |
+| 37 | 3 | args[0] :event_id,表示 attribute error,即属性错误
args[1] :status,表示操作的状态,0-成功,非0-失败
args[2] :errcode,错误码 |
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.clientRelease`
+
+```python
+ble.clientRelease()
+```
+
+BLE Client 资源释放。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.setScanParam`
+
+```python
+ble.setScanParam(scan_mode, interval, scan_window, filter_policy, addr_type)
+```
+
+设置扫描参数。
+
+**参数描述:**
+
+- `scan_mode`-扫描模式,类型为整型。扫描模式,默认为积极扫描。0 - 消极扫描,1 - 积极扫描。
+- `interval`-扫描间隔,类型为整型。范围0x0004-0x4000,时间间隔 = interval \* 0.625,单位ms。
+- `scan_window`-一次扫描的时间,类型为整型。范围0x0004-0x4000,扫描时间 = scan_window\* 0.625,单位ms。
+- `filter_policy`-扫描过滤策略,类型为整型。默认为0。0 - 除了不是本设备的定向广播,其他所有的广播包,1 - 除了不是本设备的定向广播,白名单设备的广播包,2 - 非定向广播,指向本设备的定向广播或使用Resolvable private address的定向广播,3 - 白名单设备非定向广播,指向本设备的定向广播或使用Resolvable private address的定向广播。
+- `addr_type`-本地地址类型,类型为整型。0 - 公共地址,1 - 随机地址。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+
+
+> 扫描时间 `scan_window` 不能大于扫描间隔 `interval` 。如果两者相等,则表示连续不停的扫描。此时 BLE 的 Controller 会连续运行扫描,占满系统资源而导致无法执行其他任务。所以不允许设置连续扫描。并且不建议将时间设置的太短,扫描越频繁则功耗越高。
+
+
+
+### `ble.scanStart`
+
+```python
+ble.scanStart()
+```
+
+开始扫描。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.scanStop`
+
+```python
+ble.scanStop()
+```
+
+停止扫描。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.setScanFilter`
+
+```python
+ble.setScanFilter(act)
+```
+
+打开或者关闭扫描过滤。如果打开,那么扫描设备的广播数据时,同一个设备的广播数据只会上报一次;如果关闭,则同一个设备的所有的广播数据都会上报。
+
+**参数描述:**
+
+- `act`-扫描过滤开关,类型为整型。0 - 关闭扫描过滤功能,1 - 打开扫描过滤功能。默认打开过滤功能。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.connect`
+
+```python
+ble.connect(addr_type, addr)
+```
+
+根据指定的设备地址去连接设备。
+
+**参数描述:**
+
+- `addr_type`-地址类型,类型为整型。0 - 公共地址,1 - 随机地址。
+- `addr`-BLE地址,类型为bytearray,大小为6字节。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.cancelConnect`
+
+```python
+ble.cancelConnect(addr)
+```
+
+取消正在建立的连接。
+
+**参数描述:**
+
+- `addr`-BLE地址,类型为bytearray,大小为6字节。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.disconnect`
+
+```python
+ble.disconnect(connect_id)
+```
+
+断开已建立的连接。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.discoverAllService`
+
+```python
+ble.discoverAllService(connect_id)
+```
+
+扫描所有的服务。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.discoverByUUID`
+
+```python
+ble.discoverByUUID(connect_id, uuid_type, uuid_s, uuid_l)
+```
+
+扫描指定UUID的服务。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+- `uuid_type`-uuid类型,0 - 长UUID,128bit;1 - 短UUID,16bit。类型为整型。
+- `uuid_s`-短UUID,2个字节(16bit),类型为整型,当uuid_type为0时,该值给0。
+- `uuid_l`-长UUID,16个字节(128bit),类型为bytearray,当uuid_type为1时,该值填 bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.discoverAllIncludes`
+
+```python
+ble.discoverAllIncludes(connect_id, start_handle, end_handle)
+```
+
+扫描所有的引用,start_handle和end_handle要属于同一个服务。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+- `start_handle`-开始句柄,从这个句柄开始寻找引用,类型为整型。
+- `end_handle`-结束句柄,从这个句柄结束寻找引用,类型为整型。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.discoverAllChara`
+
+```python
+ble.discoverAllChara(connect_id, start_handle, end_handle)
+```
+
+扫描所有的特征,start_handle和end_handle要属于同一个服务。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+- `start_handle`-开始句柄,从这个句柄开始寻找特征,类型为整型。
+- `end_handle`-结束句柄,从这个句柄结束寻找特征,类型为整型。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.discoverAllCharaDesc`
+
+```python
+ble.discoverAllCharaDesc(connect_id, start_handle, end_handle)
+```
+
+扫描所有特征的描述,start_handle和end_handle要属于同一个服务。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+- `start_handle`-开始句柄,从这个句柄开始寻找特征描述,类型为整型。
+- `end_handle`-结束句柄,从这个句柄结束寻找特征描述,类型为整型。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.readCharaByUUID`
+
+```python
+ble.readCharaByUUID(connect_id, start_handle, end_handle, uuid_type, uuid_s, uuid_l)
+```
+
+读取指定UUID的特征值,start_handle和end_handle必须要包含一个特征值句柄。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+- `start_handle`-开始句柄,一定要属于同一个特征的句柄,类型为整型。
+- `end_handle`-结束句柄,结束句柄,一定要属于同一个特征的句柄,类型为整型。
+- `uuid_type`-uuid类型,0 - 长UUID,128bit;1 - 短UUID,16bit。类型为整型。
+- `uuid_s`-短UUID,2个字节(16bit),类型为整型,当uuid_type为0时,该值给0。
+- `uuid_l`-长UUID,16个字节(128bit),类型为bytearray,当uuid_type为1时,该值填 bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.readCharaByHandle`
+
+```python
+ble.readCharaByHandle(connect_id, handle, offset, is_long)
+```
+
+读取指定句柄的特征值。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+- `handle`-特征值句柄,类型为整型。
+- `offset`-偏移位置,类型为整型。
+- `is_long`-长特征值标志,0-短特征值,一次可以读取完;1-长特征值,分多次读取。类型为整型。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.readCharaDesc`
+
+```python
+ble.readCharaDesc(connect_id, handle, is_long)
+```
+
+读取特征描述。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+- `handle`-特征值句柄,类型为整型。
+- `is_long`-长特征值标志,0-短特征值,一次可以读取完;1-长特征值,分多次读取。类型为整型。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.writeChara`
+
+```python
+ble.writeChara(connect_id, handle, offset, is_long, data)
+```
+
+写入特征值,需要对端应答。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+- `handle`-特征值句柄,类型为整型。
+- `offset`-偏移位置,类型为整型。
+- `is_long`-长特征值标志,0-短特征值,一次可以读取完;1-长特征值,分多次读取。类型为整型。
+- `data`-特征值数据,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.writeCharaNoRsp`
+
+```python
+ble.writeCharaNoRsp(connect_id, handle, data)
+```
+
+写入特征值,不需要对端应答。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+- `handle`-特征值句柄,类型为整型。
+- `data`-特征值数据,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `ble.writeCharaDesc`
+
+```python
+ble.writeCharaDesc(connect_id, handle, data)
+```
+
+写入特征描述。
+
+**参数描述:**
+
+- `connect_id`-连接ID,建立连接时得到的连接ID,类型为整型。
+- `handle`-特征描述句柄,类型为整型。
+- `data`-特征描述数据,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/bt.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/bt.md"
new file mode 100644
index 0000000000000000000000000000000000000000..fef4f56ceb1cde7b2d2dd6b129c0df3461e3b912
--- /dev/null
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/bt.md"
@@ -0,0 +1,1560 @@
+# bt - 经典蓝牙相关功能
+
+`bt`模块提供经典蓝牙的相关功能,支持HFP、A2DP、AVRCP、SPP。
+
+**示例**:
+
+```python
+#HFP 示例程序
+
+"""
+示例说明:本例程提供一个通过HFP自动接听电话的功能
+运行平台:EC600UCN_LB 铀开发板
+运行本例程后,通过手机A搜索到设备名并点击连接;然后通过手机B拨打电话给手机A,
+当手机A开始响铃震动时,设备会自动接听电话
+"""
+import bt
+import utime
+import _thread
+from queue import Queue
+from machine import Pin
+
+# 如果对应播放通道外置了PA,且需要引脚控制PA开启,则需要下面步骤
+# 具体使用哪个GPIO取决于实际使用的引脚
+gpio11 = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_DISABLE, 0)
+gpio11.write(1)
+
+BT_NAME = 'QuecPython-hfp'
+
+BT_EVENT = {
+ 'BT_START_STATUS_IND': 0, # bt/ble start
+ 'BT_STOP_STATUS_IND': 1, # bt/ble stop
+ 'BT_HFP_CONNECT_IND': 40, # bt hfp connected
+ 'BT_HFP_DISCONNECT_IND': 41, # bt hfp disconnected
+ 'BT_HFP_CALL_IND': 42, # bt hfp call state
+ 'BT_HFP_CALL_SETUP_IND': 43, # bt hfp call setup state
+ 'BT_HFP_NETWORK_IND': 44, # bt hfp network state
+ 'BT_HFP_NETWORK_SIGNAL_IND': 45, # bt hfp network signal
+ 'BT_HFP_BATTERY_IND': 46, # bt hfp battery level
+ 'BT_HFP_CALLHELD_IND': 47, # bt hfp callheld state
+ 'BT_HFP_AUDIO_IND': 48, # bt hfp audio state
+ 'BT_HFP_VOLUME_IND': 49, # bt hfp volume type
+ 'BT_HFP_NETWORK_TYPE': 50, # bt hfp network type
+ 'BT_HFP_RING_IND': 51, # bt hfp ring indication
+ 'BT_HFP_CODEC_IND': 52, # bt hfp codec type
+}
+
+HFP_CONN_STATUS = 0
+HFP_CONN_STATUS_DICT = {
+ 'HFP_DISCONNECTED': 0,
+ 'HFP_CONNECTING': 1,
+ 'HFP_CONNECTED': 2,
+ 'HFP_DISCONNECTING': 3,
+}
+HFP_CALL_STATUS = 0
+HFP_CALL_STATUS_DICT = {
+ 'HFP_NO_CALL_IN_PROGRESS': 0,
+ 'HFP_CALL_IN_PROGRESS': 1,
+}
+
+BT_IS_RUN = 0
+
+msg_queue = Queue(30)
+
+
+def get_key_by_value(val, d):
+ for key, value in d.items():
+ if val == value:
+ return key
+ return None
+
+def bt_callback(args):
+ global msg_queue
+ msg_queue.put(args)
+
+def bt_event_proc_task():
+ global msg_queue
+ global BT_IS_RUN
+ global BT_EVENT
+ global HFP_CONN_STATUS
+ global HFP_CONN_STATUS_DICT
+ global HFP_CALL_STATUS
+ global HFP_CALL_STATUS_DICT
+
+ while True:
+ print('wait msg...')
+ msg = msg_queue.get() # 没有消息时会阻塞在这
+ event_id = msg[0]
+ status = msg[1]
+
+ if event_id == BT_EVENT['BT_START_STATUS_IND']:
+ print('event: BT_START_STATUS_IND')
+ if status == 0:
+ print('BT start successfully.')
+ BT_IS_RUN = 1
+ bt_status = bt.getStatus()
+ if bt_status == 1:
+ print('BT status is 1, normal status.')
+ else:
+ print('BT status is {}, abnormal status.'.format(bt_status))
+ bt.stop()
+ break
+
+ retval = bt.getLocalName()
+ if retval != -1:
+ print('The current BT name is : {}'.format(retval[1]))
+ else:
+ print('Failed to get BT name.')
+ bt.stop()
+ break
+
+ print('Set BT name to {}'.format(BT_NAME))
+ retval = bt.setLocalName(0, BT_NAME)
+ if retval != -1:
+ print('BT name set successfully.')
+ else:
+ print('BT name set failed.')
+ bt.stop()
+ break
+
+ retval = bt.getLocalName()
+ if retval != -1:
+ print('The new BT name is : {}'.format(retval[1]))
+ else:
+ print('Failed to get new BT name.')
+ bt.stop()
+ break
+
+ # 设置蓝牙可见模式为:可以被发现并且可以被连接
+ retval = bt.setVisibleMode(3)
+ if retval == 0:
+ mode = bt.getVisibleMode()
+ if mode == 3:
+ print('BT visible mode set successfully.')
+ else:
+ print('BT visible mode set failed.')
+ bt.stop()
+ break
+ else:
+ print('BT visible mode set failed.')
+ bt.stop()
+ break
+ else:
+ print('BT start failed.')
+ bt.stop()
+ break
+ elif event_id == BT_EVENT['BT_STOP_STATUS_IND']:
+ print('event: BT_STOP_STATUS_IND')
+ if status == 0:
+ BT_IS_RUN = 0
+ print('BT stop successfully.')
+ else:
+ print('BT stop failed.')
+ break
+ elif event_id == BT_EVENT['BT_HFP_CONNECT_IND']:
+ HFP_CONN_STATUS = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_CONNECT_IND, {}, hfp_conn_status:{}, mac:{}'.format(status, get_key_by_value(msg[2], HFP_CONN_STATUS_DICT), mac))
+ if status != 0:
+ print('BT HFP connect failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_HFP_DISCONNECT_IND']:
+ HFP_CONN_STATUS = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_DISCONNECT_IND, {}, hfp_conn_status:{}, mac:{}'.format(status, get_key_by_value(msg[2], HFP_CONN_STATUS_DICT), mac))
+ if status != 0:
+ print('BT HFP disconnect failed.')
+ bt.stop()
+ elif event_id == BT_EVENT['BT_HFP_CALL_IND']:
+ call_sta = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_CALL_IND, {}, hfp_call_status:{}, mac:{}'.format(status, get_key_by_value(msg[2], HFP_CALL_STATUS_DICT), mac))
+ if status != 0:
+ print('BT HFP call failed.')
+ bt.stop()
+ continue
+
+ if call_sta == HFP_CALL_STATUS_DICT['HFP_NO_CALL_IN_PROGRESS']:
+ if HFP_CALL_STATUS == HFP_CALL_STATUS_DICT['HFP_CALL_IN_PROGRESS']:
+ HFP_CALL_STATUS = call_sta
+ if HFP_CONN_STATUS == HFP_CONN_STATUS_DICT['HFP_CONNECTED']:
+ print('call ended, ready to disconnect hfp.')
+ retval = bt.hfpDisconnect(addr)
+ if retval == 0:
+ HFP_CONN_STATUS = HFP_CONN_STATUS_DICT['HFP_DISCONNECTING']
+ else:
+ print('Failed to disconnect hfp connection.')
+ bt.stop()
+ continue
+ else:
+ if HFP_CALL_STATUS == HFP_CALL_STATUS_DICT['HFP_NO_CALL_IN_PROGRESS']:
+ HFP_CALL_STATUS = call_sta
+ print('set audio output channel to 2.')
+ bt.setChannel(2)
+ print('set volume to 7.')
+ retval = bt.hfpSetVolume(addr, 7)
+ if retval != 0:
+ print('set volume failed.')
+ elif event_id == BT_EVENT['BT_HFP_CALL_SETUP_IND']:
+ call_setup_status = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_CALL_SETUP_IND, {}, hfp_call_setup_status:{}, mac:{}'.format(status, call_setup_status, mac))
+ if status != 0:
+ print('BT HFP call setup failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_HFP_CALLHELD_IND']:
+ callheld_status = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_CALLHELD_IND, {}, callheld_status:{}, mac:{}'.format(status, callheld_status, mac))
+ if status != 0:
+ print('BT HFP callheld failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_HFP_NETWORK_IND']:
+ network_status = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_NETWORK_IND, {}, network_status:{}, mac:{}'.format(status, network_status, mac))
+ if status != 0:
+ print('BT HFP network status failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_HFP_NETWORK_SIGNAL_IND']:
+ network_signal = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_NETWORK_SIGNAL_IND, {}, signal:{}, mac:{}'.format(status, network_signal, mac))
+ if status != 0:
+ print('BT HFP network signal failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_HFP_BATTERY_IND']:
+ battery_level = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_BATTERY_IND, {}, battery_level:{}, mac:{}'.format(status, battery_level, mac))
+ if status != 0:
+ print('BT HFP battery level failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_HFP_AUDIO_IND']:
+ audio_status = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_AUDIO_IND, {}, audio_status:{}, mac:{}'.format(status, audio_status, mac))
+ if status != 0:
+ print('BT HFP audio failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_HFP_VOLUME_IND']:
+ volume_type = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_VOLUME_IND, {}, volume_type:{}, mac:{}'.format(status, volume_type, mac))
+ if status != 0:
+ print('BT HFP volume failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_HFP_NETWORK_TYPE']:
+ service_type = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_NETWORK_TYPE, {}, service_type:{}, mac:{}'.format(status, service_type, mac))
+ if status != 0:
+ print('BT HFP network service type failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_HFP_RING_IND']:
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_RING_IND, {}, mac:{}'.format(status, mac))
+ if status != 0:
+ print('BT HFP ring failed.')
+ bt.stop()
+ continue
+ retval = bt.hfpAnswerCall(addr)
+ if retval == 0:
+ print('The call was answered successfully.')
+ else:
+ print('Failed to answer the call.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_HFP_CODEC_IND']:
+ codec_type = msg[2]
+ addr = msg[3] # BT 主机端mac地址
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('BT_HFP_CODEC_IND, {}, codec_type:{}, mac:{}'.format(status, codec_type, mac))
+ if status != 0:
+ print('BT HFP codec failed.')
+ bt.stop()
+ continue
+ print('Ready to release hfp.')
+ bt.hfpRelease()
+ bt.release()
+
+
+def main():
+ global BT_IS_RUN
+
+ _thread.start_new_thread(bt_event_proc_task, ())
+
+ retval = bt.init(bt_callback)
+ if retval == 0:
+ print('BT init successful.')
+ else:
+ print('BT init failed.')
+ return -1
+ retval = bt.hfpInit()
+ if retval == 0:
+ print('HFP init successful.')
+ else:
+ print('HFP init failed.')
+ return -1
+ retval = bt.start()
+ if retval == 0:
+ print('BT start successful.')
+ else:
+ print('BT start failed.')
+ retval = bt.hfpRelease()
+ if retval == 0:
+ print('HFP release successful.')
+ else:
+ print('HFP release failed.')
+ retval = bt.release()
+ if retval == 0:
+ print('BT release successful.')
+ else:
+ print('BT release failed.')
+ return -1
+
+ count = 0
+ while True:
+ utime.sleep(1)
+ count += 1
+ cur_time = utime.localtime()
+ timestamp = "{:02d}:{:02d}:{:02d}".format(cur_time[3], cur_time[4], cur_time[5])
+
+ if count % 5 == 0:
+ if BT_IS_RUN == 1:
+ print('[{}] BT HFP is running, count = {}......'.format(timestamp, count))
+ print('')
+ else:
+ print('BT HFP has stopped running, ready to exit.')
+ break
+
+
+if __name__ == '__main__':
+ main()
+
+```
+
+```python
+#A2DP/AVRCP 示例程序
+
+"""
+示例说明:本例程提供一个通过A2DP/AVRCP实现的简易蓝牙音乐播放控制功能
+运行本例程后,通过手机搜索到设备名并点击连接;然后打开手机上的音乐播放软件,
+回到例程运行界面,根据提示菜单输入对应的控制命令来实现音乐的播放,暂停,上一首,
+下一首以及设置音量的功能
+"""
+import bt
+import utime
+import _thread
+from queue import Queue
+from machine import Pin
+
+BT_STATUS_DICT = {
+ 'BT_NOT_RUNNING': 0,
+ 'BT_IS_RUNNING': 1
+}
+
+A2DP_AVRCP_CONNECT_STATUS = {
+ 'DISCONNECTED': 0,
+ 'CONNECTING': 1,
+ 'CONNECTED': 2,
+ 'DISCONNECTING': 3
+}
+
+host_addr = 0
+msg_queue = Queue(10)
+
+# 如果对应播放通道外置了PA,且需要引脚控制PA开启,则需要下面步骤
+# 具体使用哪个GPIO取决于实际使用的引脚
+gpio11 = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_DISABLE, 0)
+gpio11.write(1)
+
+
+def cmd_proc(cmd):
+ cmds = ('1', '2', '3', '4', '5')
+ vols = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11')
+
+ if cmd in cmds:
+ if cmd == '5':
+ while True:
+ tmp = input('Please input volume: ')
+ if len(tmp) != 1:
+ vol = tmp.split('Please input volume: ')[1]
+ else:
+ vol = tmp
+ if vol in vols:
+ return cmd, int(vol)
+ else:
+ print('Volume should be in [0,11], try again.')
+ else:
+ return cmd, 0
+ else:
+ print('Command {} is not supported!'.format(cmd))
+ return -1
+
+def avrcp_play(args):
+ return bt.avrcpStart()
+
+def avrcp_pause(args):
+ return bt.avrcpPause()
+
+def avrcp_prev(args):
+ return bt.avrcpPrev()
+
+def avrcp_next(args):
+ return bt.avrcpNext()
+
+def avrcp_set_volume(vol):
+ return bt.avrcpSetVolume(vol)
+
+def bt_callback(args):
+ pass
+
+def bt_a2dp_avrcp_proc_task():
+ global msg_queue
+
+ cmd_handler = {
+ '1': avrcp_play,
+ '2': avrcp_pause,
+ '3': avrcp_prev,
+ '4': avrcp_next,
+ '5': avrcp_set_volume,
+ }
+ while True:
+ # print('wait msg...')
+ msg = msg_queue.get()
+ print('recv msg: {}'.format(msg))
+ cmd_handler.get(msg[0])(msg[1])
+
+
+def main():
+ global host_addr
+ global msg_queue
+
+ _thread.start_new_thread(bt_a2dp_avrcp_proc_task, ())
+ bt.init(bt_callback)
+ bt.setChannel(2)
+ retval = bt.a2dpavrcpInit()
+ if retval == 0:
+ print('BT A2DP/AVRCP initialization succeeded.')
+ else:
+ print('BT A2DP/AVRCP initialization failed.')
+ return -1
+
+ retval = bt.start()
+ if retval != 0:
+ print('BT start failed.')
+ return -1
+
+ utime.sleep_ms(1500)
+
+ old_name = bt.getLocalName()
+ if old_name == -1:
+ print('Get BT name error.')
+ return -1
+ print('The current BT name is {}'.format(old_name[1]))
+ new_name = 'QuecPython-a2dp'
+ print('Set new BT name to {}'.format(new_name))
+ retval = bt.setLocalName(0, new_name)
+ if retval == -1:
+ print('Set BT name failed.')
+ return -1
+ cur_name = bt.getLocalName()
+ if cur_name == -1:
+ print('Get new BT name error.')
+ return -1
+ else:
+ if cur_name[1] == new_name:
+ print('BT name changed successfully.')
+ else:
+ print('BT name changed failed.')
+
+ visible_mode = bt.getVisibleMode()
+ if visible_mode != -1:
+ print('The current BT visible mode is {}'.format(visible_mode))
+ else:
+ print('Get BT visible mode error.')
+ return -1
+
+ print('Set BT visible mode to 3.')
+ retval = bt.setVisibleMode(3)
+ if retval == -1:
+ print('Set BT visible mode error.')
+ return -1
+
+ print('BT reconnect check start......')
+ bt.reconnect_set(25, 2)
+ bt.reconnect()
+
+ count = 0
+ while True:
+ count += 1
+ if count % 5 == 0:
+ print('waiting to be connected...')
+ if count >= 10000:
+ count = 0
+ a2dp_status = bt.a2dpGetConnStatus()
+ avrcp_status = bt.avrcpGetConnStatus()
+ if a2dp_status == A2DP_AVRCP_CONNECT_STATUS['CONNECTED'] and avrcp_status == A2DP_AVRCP_CONNECT_STATUS['CONNECTED']:
+ print('========== BT connected! =========')
+ addr = bt.a2dpGetAddr()
+ if addr != -1:
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('The BT address on the host side: {}'.format(mac))
+ host_addr = addr
+ else:
+ print('Get BT addr error.')
+ return -1
+ print('Please open the music player software on your phone first.')
+ print('Please enter the following options to select a function:')
+ print('========================================================')
+ print('1 : play')
+ print('2 : pause')
+ print('3 : prev')
+ print('4 : next')
+ print('5 : set volume')
+ print('6 : exit')
+ print('========================================================')
+ while True:
+ tmp = input('> ')
+ if len(tmp) != 1:
+ cmd = tmp.split('> ')[1]
+ else:
+ cmd = tmp
+ if cmd == '6':
+ break
+ retval = cmd_proc(cmd)
+ if retval != -1:
+ msg_queue.put(retval)
+ break
+ else:
+ utime.sleep_ms(1000)
+ print('Ready to disconnect a2dp.')
+ retval = bt.a2dpDisconnect(host_addr)
+ if retval == 0:
+ print('a2dp connection disconnected successfully')
+ else:
+ print('Disconnect a2dp error.')
+ print('Ready to stop BT.')
+ retval = bt.stop()
+ if retval == 0:
+ print('BT has stopped.')
+ else:
+ print('BT stop error.')
+ bt.a2dpavrcpRelease()
+ bt.release()
+
+
+if __name__ == '__main__':
+ main()
+```
+
+```python
+#SPP 示例程序
+
+"""
+示例说明:本例程提供一个通过SPP实现与手机端进行数据传输的功能
+(1)运行之前,需要先在手机端(安卓)安装蓝牙串口APP,如BlueSPP,然后打开该软件;
+(2)修改本例程中的目标设备的蓝牙名称,即 DST_DEVICE_INFO['dev_name'] 的值改为用户准备连接的手机的蓝牙名称;
+(3)运行本例程,例程中会先发起搜索周边设备的操作,直到搜索到目标设备,就会结束搜索,然后向目标设备发起SPP连接请求;
+(4)用户注意查看手机界面是否弹出蓝牙配对请求的界面,当出现时,点击配对;
+(5)配对成功后,用户即可进入到蓝牙串口界面,发送数据给设备,设备在收到数据后会回复"I have received the data you sent."
+(6)手机端APP中点击断开连接,即可结束例程;
+"""
+import bt
+import utime
+import _thread
+from queue import Queue
+
+
+BT_NAME = 'QuecPython-SPP'
+
+BT_EVENT = {
+ 'BT_START_STATUS_IND': 0, # bt/ble start
+ 'BT_STOP_STATUS_IND': 1, # bt/ble stop
+ 'BT_SPP_INQUIRY_IND': 6, # bt spp inquiry ind
+ 'BT_SPP_INQUIRY_END_IND': 7, # bt spp inquiry end ind
+ 'BT_SPP_RECV_DATA_IND': 14, # bt spp recv data ind
+ 'BT_SPP_CONNECT_IND': 61, # bt spp connect ind
+ 'BT_SPP_DISCONNECT_IND': 62, # bt spp disconnect ind
+}
+
+DST_DEVICE_INFO = {
+ 'dev_name':'HUAWEI Mate40 Pro',# 要连接设备的蓝牙名称
+ 'bt_addr': None
+}
+
+BT_IS_RUN = 0
+msg_queue = Queue(30)
+
+
+def bt_callback(args):
+ global msg_queue
+ msg_queue.put(args)
+
+
+def bt_event_proc_task():
+ global msg_queue
+ global BT_IS_RUN
+ global DST_DEVICE_INFO
+
+ while True:
+ print('wait msg...')
+ msg = msg_queue.get() # 没有消息时会阻塞在这
+ event_id = msg[0]
+ status = msg[1]
+
+ if event_id == BT_EVENT['BT_START_STATUS_IND']:
+ print('event: BT_START_STATUS_IND')
+ if status == 0:
+ print('BT start successfully.')
+ BT_IS_RUN = 1
+
+ print('Set BT name to {}'.format(BT_NAME))
+ retval = bt.setLocalName(0, BT_NAME)
+ if retval != -1:
+ print('BT name set successfully.')
+ else:
+ print('BT name set failed.')
+ bt.stop()
+ continue
+
+ retval = bt.setVisibleMode(3)
+ if retval == 0:
+ mode = bt.getVisibleMode()
+ if mode == 3:
+ print('BT visible mode set successfully.')
+ else:
+ print('BT visible mode set failed.')
+ bt.stop()
+ continue
+ else:
+ print('BT visible mode set failed.')
+ bt.stop()
+ continue
+
+ retval = bt.startInquiry(15)
+ if retval != 0:
+ print('Inquiry error.')
+ bt.stop()
+ continue
+ else:
+ print('BT start failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_STOP_STATUS_IND']:
+ print('event: BT_STOP_STATUS_IND')
+ if status == 0:
+ BT_IS_RUN = 0
+ print('BT stop successfully.')
+ else:
+ print('BT stop failed.')
+
+ retval = bt.sppRelease()
+ if retval == 0:
+ print('SPP release successfully.')
+ else:
+ print('SPP release failed.')
+ retval = bt.release()
+ if retval == 0:
+ print('BT release successfully.')
+ else:
+ print('BT release failed.')
+ break
+ elif event_id == BT_EVENT['BT_SPP_INQUIRY_IND']:
+ print('event: BT_SPP_INQUIRY_IND')
+ if status == 0:
+ rssi = msg[2]
+ name = msg[4]
+ addr = msg[5]
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('name: {}, addr: {}, rssi: {}'.format(name, mac, rssi))
+
+ if name == DST_DEVICE_INFO['dev_name']:
+ print('The target device is found, device name {}'.format(name))
+ DST_DEVICE_INFO['bt_addr'] = addr
+ retval = bt.cancelInquiry()
+ if retval != 0:
+ print('cancel inquiry failed.')
+ continue
+ else:
+ print('BT inquiry failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_SPP_INQUIRY_END_IND']:
+ print('event: BT_SPP_INQUIRY_END_IND')
+ if status == 0:
+ print('BT inquiry has ended.')
+ inquiry_sta = msg[2]
+ if inquiry_sta == 0:
+ if DST_DEVICE_INFO['bt_addr'] is not None:
+ print('Ready to connect to the target device : {}'.format(DST_DEVICE_INFO['dev_name']))
+ retval = bt.sppConnect(DST_DEVICE_INFO['bt_addr'])
+ if retval != 0:
+ print('SPP connect failed.')
+ bt.stop()
+ continue
+ else:
+ print('Not found device [{}], continue to inquiry.'.format(DST_DEVICE_INFO['dev_name']))
+ bt.cancelInquiry()
+ bt.startInquiry(15)
+ else:
+ print('Inquiry end failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_SPP_RECV_DATA_IND']:
+ print('event: BT_SPP_RECV_DATA_IND')
+ if status == 0:
+ datalen = msg[2]
+ data = msg[3]
+ print('recv {} bytes data: {}'.format(datalen, data))
+ send_data = 'I have received the data you sent.'
+ print('send data: {}'.format(send_data))
+ retval = bt.sppSend(send_data)
+ if retval != 0:
+ print('send data faied.')
+ else:
+ print('Recv data failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_SPP_CONNECT_IND']:
+ print('event: BT_SPP_CONNECT_IND')
+ if status == 0:
+ conn_sta = msg[2]
+ addr = msg[3]
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('SPP connect successful, conn_sta = {}, addr {}'.format(conn_sta, mac))
+ else:
+ print('Connect failed.')
+ bt.stop()
+ continue
+ elif event_id == BT_EVENT['BT_SPP_DISCONNECT_IND']:
+ print('event: BT_SPP_DISCONNECT_IND')
+ conn_sta = msg[2]
+ addr = msg[3]
+ mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+ print('SPP disconnect successful, conn_sta = {}, addr {}'.format(conn_sta, mac))
+ bt.stop()
+ continue
+
+
+def main():
+ global BT_IS_RUN
+
+ _thread.start_new_thread(bt_event_proc_task, ())
+ retval = bt.init(bt_callback)
+ if retval == 0:
+ print('BT init successful.')
+ else:
+ print('BT init failed.')
+ return -1
+ retval = bt.sppInit()
+ if retval == 0:
+ print('SPP init successful.')
+ else:
+ print('SPP init failed.')
+ return -1
+ retval = bt.start()
+ if retval == 0:
+ print('BT start successful.')
+ else:
+ print('BT start failed.')
+ retval = bt.sppRelease()
+ if retval == 0:
+ print('SPP release successful.')
+ else:
+ print('SPP release failed.')
+ return -1
+
+ count = 0
+ while True:
+ utime.sleep(1)
+ count += 1
+ cur_time = utime.localtime()
+ timestamp = "{:02d}:{:02d}:{:02d}".format(cur_time[3], cur_time[4], cur_time[5])
+
+ if count % 5 == 0:
+ if BT_IS_RUN == 1:
+ print('[{}] BT SPP is running, count = {}......'.format(timestamp, count))
+ print('')
+ else:
+ print('BT SPP has stopped running, ready to exit.')
+ break
+
+
+if __name__ == '__main__':
+ main()
+```
+
+
+
+> 当前仅EC200U/EC600U/EG915U/EG912U型号支持`bt`功能。
+
+
+
+## 初始化相关功能
+
+### `bt.init`
+
+```python
+bt.init(user_cb)
+```
+
+蓝牙初始化并注册回调函数。
+
+**参数描述:**
+
+- `user_cb`-回调函数,类型为function。回调函数参数含义:args[0] 固定表示event_id,args[1] 固定表示状态,0表示成功,非0表示失败。回调函数的参数个数并不是固定2个,而是根据第一个参数args[0]来决定的,下表中列出了不同事件ID对应的参数个数及说明。
+
+| event_id | 参数个数 | 参数说明 |
+| :------: | :------: | ------------------------------------------------------------ |
+| 0 | 2 | args[0] :event_id,表示 BT/BLE start 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败 |
+| 1 | 2 | args[0] :event_id,表示 BT/BLE stop
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败 |
+| 6 | 6 | args[0] :event_id,表示 BT inquiry 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :rssi,搜索到的设备的信号强度;
args[3] :device_class
args[4] :device_name,设备名称,字符串类型
args[5] :addr,搜到的蓝牙设备的mac地址 |
+| 7 | 3 | args[0] :event_id,表示 BT inquiry end 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :end_status,0 - 正常结束搜索,8 - 强制结束搜索 |
+| 14 | 4 | args[0] :event_id,表示 BT spp recv 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :data_len,收到的数据长度
args[3] :data,收到的数据,bytearray类型数据 |
+| 40 | 4 | args[0] :event_id,表示 BT HFP connect 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_connect_status,表示hfp的连接状态;
0 - 已经断开连接
1 - 连接中
2 - 已经连接
3 - 断开连接中
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 41 | 4 | args[0] :event_id,表示 BT HFP disconnect 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_connect_status,表示hfp的连接状态;
0 - 已经断开连接
1 - 连接中
2 - 已经连接
3 - 断开连接中
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 42 | 4 | args[0] :event_id,表示 BT HFP call status 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_call_status,表示hfp的通话状态;
0 - 当前没有正在进行的通话
1 - 当前至少有一个正在进行的通话
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 43 | 4 | args[0] :event_id,表示 BT HFP call setup status 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_call_setup_status,表示hfp的call setup状态;
0 - 表示没有电话需要接通
1 - 表示有一个拨进来的电话还未接通
2 - 表示有一个拨出去的电话还没有接通
3 - 表示拨出电话的蓝牙连接的另一方正在响铃
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 44 | 4 | args[0] :event_id,表示 BT HFP network status 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_network_status,表示AG的网络状态;
0 - 表示网络不可用
1 - 表示网络正常
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 45 | 4 | args[0] :event_id,表示 BT HFP network signal 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_network_signal,表示AG的信号,范围 0~5
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 46 | 4 | args[0] :event_id,表示 BT HFP battery level 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_battery_level,表示AG端的电池电量,范围 0~5
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 47 | 4 | args[0] :event_id,表示 BT HFP call held status 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_call_held_status,表示hfp的call held状态;
0 - 表示没有保持呼叫
1 - 表示呼叫被暂停或活动/保持呼叫交换
2 - 表示呼叫暂停,没有活动呼叫
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 48 | 4 | args[0] :event_id,表示 BT HFP audio status 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_audio_status,表示audio连接状态;
0 - 表示audio已经断开连接
1 - 表示audio正在连接中
2 - 表示audio已经连接成功
3 - 表示audio正在断开连接
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 49 | 4 | args[0] :event_id,表示 BT HFP volume type 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_volume_type
0 - 表示volume type为speaker
1 - 表示volume type为microphone
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 50 | 4 | args[0] :event_id,表示 BT HFP service type 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_service_type,表示当前AG的网络服务模式;
0 - 表示AG当前为正常网络模式
1 - 表示AG当前处于漫游模式
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 51 | 4 | args[0] :event_id,表示 BT HFP ring 事件,即来电时响铃事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :当前无实际意义,保留
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 52 | 4 | args[0] :event_id,表示 BT HFP codec type 事件,即编解码模式
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :hfp_codec_type,表示当前使用哪个编解码模式;
1 - 表示 CVDS,采用8kHz采样率
2 - 表示mSBC,采用16kHz采样率
args[3] :addr,BT 主设备的地址,bytearray类型数据 |
+| 61 | 4 | args[0] :event_id,表示 BT SPP connect 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :spp_connect_status,表示spp的连接状态;
0 - 已经断开连接
1 - 连接中
2 - 已经连接
3 - 断开连接中
args[3] :addr,对端设备的mac地址,bytearray类型数据 |
+| 62 | 4 | args[0] :event_id,表示 BT SPP disconnect 事件
args[1] :status,表示操作的状态,0 - 成功,非0 - 失败
args[2] :spp_connect_status,表示spp的连接状态;
0 - 已经断开连接
1 - 连接中
2 - 已经连接
3 - 断开连接中
args[3] :addr,对端设备的mac地址,bytearray类型数据 |
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+def bt_callback(args):
+ event_id = args[0] # 第一个参数固定是 event_id
+ status = args[1] # 第二个参数固定是状态,表示某个操作的执行结果是成功还是失败
+ ......
+```
+
+### `bt.release`
+
+```python
+bt.release()
+```
+
+蓝牙资源释放。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.start`
+
+```python
+bt.start()
+```
+
+开启蓝牙功能。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.stop`
+
+```python
+bt.stop()
+```
+
+关闭蓝牙功能。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.getStatus`
+
+```python
+bt.getStatus()
+```
+
+获取蓝牙的状态。
+
+**返回值描述:**
+
+- 蓝牙状态:类型为整型,0-蓝牙处于停止状态,1-蓝牙正常运行中,-1-获取状态失败。
+
+### `bt.getLocalAddr`
+
+```python
+bt.getLocalAddr()
+```
+
+获取蓝牙地址。
+
+**返回值描述:**
+
+- 蓝牙地址:执行成功返回类型为bytearray的蓝牙地址,大小6字节,失败返回整型-1。
+
+**示例**:
+
+```python
+>>> addr = bt.getLocalAddr()
+>>> print(addr)
+b'\xc7\xa13\xf8\xbf\x1a'
+>>> mac = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[5], addr[4], addr[3], addr[2], addr[1], addr[0])
+>>> print('mac = [{}]'.format(mac))
+mac = [1a:bf:f8:33:a1:c7]
+```
+
+
+
+> 该接口需要在蓝牙已经初始化完成并启动成功后才能调用,比如在回调中收到 event_id 为0的事件之后,即 start 成功后,去调用。
+
+
+
+### `bt.setLocalName`
+
+```python
+bt.setLocalName(code, name)
+```
+
+设置蓝牙名称。
+
+**参数描述:**
+
+- `code`-编码模式,类型为整型,0 - UTF8,1 - GBK。
+- `name`-蓝牙名称,类型为string,最大长度22字节。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+>>> bt.setLocalName(0, 'QuecPython-BT')
+0
+```
+
+### `bt.getLocalName`
+
+```python
+bt.getLocalName()
+```
+
+获取蓝牙名称。
+
+**返回值描述:**
+
+- 执行成功返回一个元组`(code, name)`,包含编码模式和蓝牙名称,失败返回整型-1。
+
+**示例**:
+
+```python
+>>> bt.getLocalName()
+(0, 'QuecPython-BT')
+```
+
+### `bt.setVisibleMode`
+
+```python
+bt.setVisibleMode(mode)
+```
+
+设置蓝牙可见模式,即做从机被扫描时,是否可被发现以及可被连接。
+
+**参数描述:**
+
+- `mode`-可见模式,类型为整型,具体含义如下表。
+
+| 值 | 含义 |
+| ---- | ------------------------ |
+| 0 | 不可被发现,不可被连接 |
+| 1 | 可以被发现,但不可被连接 |
+| 2 | 不可被发现,但可被连接 |
+| 3 | 可以被发现,可被连接 |
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+>>> bt.setVisibleMode(3)
+0
+```
+
+### `bt.getVisibleMode`
+
+```python
+bt.getVisibleMode()
+```
+
+获取蓝牙可见模式。
+
+**返回值描述:**
+
+- 执行成功返回蓝牙当前的可见模式值,失败返回整型-1。
+
+**示例**:
+
+```python
+>>> bt.getVisibleMode()
+3
+```
+
+### `bt.startInquiry`
+
+```python
+bt.startInquiry(mode)
+```
+
+开始搜索周边的蓝牙设备。
+
+**参数描述:**
+
+- `mode`-搜索类型。目前固定为15,表示搜索所有类型的设备。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+bt.startInquiry(15)
+```
+
+### `bt.cancelInquiry`
+
+```python
+bt.cancelInquiry()
+```
+
+取消搜索操作。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.setChannel`
+
+```python
+bt.setChannel(channel)
+```
+
+设置音频输出通道,使用场景为蓝牙接听电话或者播放音频时。
+
+**参数描述:**
+
+- `channel`-音频通道,类型为整型。0 - 听筒,1 - 耳机,2 - 喇叭。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.reconnect_set`
+
+```python
+bt.reconnect_set(max_count, period)
+```
+
+配置尝试重连的最大次数和相邻2次尝试重连的时间间隔,使用场景为模块和蓝牙设备距离拉远后断开连接时。
+
+**参数描述:**
+
+- `max_count`-尝试重连的最大次数,类型为整型,设置0则关闭自动重连功能。
+- `period`-相邻2次尝试重连的时间间隔,单位秒,类型为整型。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+```python
+bt.reconnect_set(25, 2)#配置尝试重连的最大次数为25,每次尝试重连的间隔为2秒
+```
+
+### `bt.reconnect`
+
+```python
+bt.reconnect()
+```
+
+模组主动重连上次配对过的设备,如手机。使用场景为模组重启后重新初始化打开蓝牙、或者模组不重启仅关闭蓝牙再重新打开蓝牙。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+**示例**:
+
+参考A2DP示例程序。
+
+## HFP协议相关功能
+
+提供蓝牙通话相关功能。
+
+### `bt.hfpInit`
+
+```python
+bt.hfpInit()
+```
+
+HFP 功能初始化 。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.hfpRelease`
+
+```python
+bt.hfpRelease()
+```
+
+HFP 资源释放。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.hfpConnect`
+
+```python
+bt.hfpConnect(addr)
+```
+
+连接AG,建立HFP连接。
+
+**参数描述:**
+
+- `addr`-AG端蓝牙地址,6个字节,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.hfpDisonnect`
+
+```python
+bt.hfpDisonnect(addr)
+```
+
+断开HFP连接。
+
+**参数描述:**
+
+- `addr`-AG端蓝牙地址,6个字节,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.hfpSetVolume`
+
+```python
+bt.hfpSetVolume(addr, vol)
+```
+
+设置蓝牙通话时的音量。
+
+**参数描述:**
+
+- `addr`-AG端蓝牙地址,6个字节,类型为bytearray。
+- `vol`-通话音量,类型为整型,范围 1-15。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.hfpRejectAfterAnswer`
+
+```python
+bt.hfpRejectAfterAnswer(addr)
+```
+
+挂断接通的电话。
+
+**参数描述:**
+
+- `addr`-AG端蓝牙地址,6个字节,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.hfpRejectCall`
+
+```python
+bt.hfpRejectCall(addr)
+```
+
+拒接电话。
+
+**参数描述:**
+
+- `addr`-AG端蓝牙地址,6个字节,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.hfpAnswerCall`
+
+```python
+bt.hfpAnswerCall(addr)
+```
+
+接听电话。
+
+**参数描述:**
+
+- `addr`-AG端蓝牙地址,6个字节,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.hfpEnableVR`
+
+```python
+bt.hfpEnableVR(addr)
+```
+
+开启语音助手。
+
+**参数描述:**
+
+- `addr`-AG端蓝牙地址,6个字节,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.hfpDisableVR`
+
+```python
+bt.hfpDisableVR(addr)
+```
+
+关闭语音助手。
+
+**参数描述:**
+
+- `addr`-AG端蓝牙地址,6个字节,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.hfpDisableVR`
+
+```python
+bt.hfpDisableVR(addr, cmd)
+```
+
+三方通话控制。
+
+**参数描述:**
+
+- `addr`-AG端蓝牙地址,6个字节,类型为bytearray。
+- `cmd`-控制命令,类型为整型。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+## A2DP/AVRCP协议相关功能
+
+提供蓝牙音乐相关功能。
+
+### `bt.a2dpavrcpInit`
+
+```python
+bt.a2dpavrcpInit()
+```
+
+A2DP和AVRCP功能初始化。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.a2dpavrcpRelease`
+
+```python
+bt.a2dpavrcpRelease()
+```
+
+A2DP和AVRCP 资源释放。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.a2dpDisconnect`
+
+```python
+bt.a2dpDisconnect(addr)
+```
+
+断开A2DP连接。
+
+**参数描述:**
+
+- `addr`-A2DP主机蓝牙地址,6个字节,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.a2dpGetAddr`
+
+```python
+bt.a2dpGetAddr()
+```
+
+获取A2DP主机蓝牙地址。
+
+**返回值描述:**
+
+- 执行成功返回bytearray类型的A2DP主机蓝牙地址,6字节,失败返回整型-1。
+
+### `bt.a2dpGetConnStatus`
+
+```python
+bt.a2dpGetConnStatus()
+```
+
+获取A2DP连接状态。
+
+**返回值描述:**
+
+- A2DP连接状态,具体含义如下表。
+
+| 值 | 类型 | 含义 |
+| ---- | ---- | ------------ |
+| -1 | int | 获取失败 |
+| 0 | int | 连接已断开 |
+| 1 | int | 正在连接中 |
+| 2 | int | 已连接 |
+| 3 | int | 正在断开连接 |
+
+### `bt.avrcpStart`
+
+```python
+bt.avrcpStart()
+```
+
+控制主机开始播放。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.avrcpPause`
+
+```python
+bt.avrcpPause()
+```
+
+控制主机停止播放。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.avrcpPrev`
+
+```python
+bt.avrcpPrev()
+```
+
+控制主机播放上一首。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.avrcpNext`
+
+```python
+bt.avrcpNext()
+```
+
+控制主机播放下一首。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.avrcpSetVolume`
+
+```python
+bt.avrcpSetVolume(vol)
+```
+
+设置主机播放音量。
+
+**参数描述:**
+
+- `vol`-播放音量,类型为整型,范围 0 - 11。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.avrcpGetVolume`
+
+```python
+bt.avrcpGetVolume()
+```
+
+获取主机播放音量。
+
+**返回值描述:**
+
+- 执行成功返回整形音量值,失败返回整型-1。
+
+### `bt.avrcpGetPlayStatus`
+
+```python
+bt.avrcpGetPlayStatus()
+```
+
+获取主机播放状态。
+
+**返回值描述:**
+
+- 播放状态,具体含义如下表。
+
+| 值 | 类型 | 说明 |
+| ---- | ---- | -------------- |
+| -1 | int | 获取失败 |
+| 0 | int | 没有播放 |
+| 1 | int | 正在播放 |
+| 2 | int | 暂停播放 |
+| 3 | int | 正在切换下一首 |
+| 4 | int | 正在切换下一首 |
+
+### `bt.avrcpGetConnStatus`
+
+```python
+bt.avrcpGetConnStatus()
+```
+
+通过AVRCP协议获取主机连接状态。
+
+**返回值描述:**
+
+- 连接状态,具体含义如下表。
+
+| 值 | 类型 | 说明 |
+| ---- | ---- | ------------ |
+| -1 | int | 获取失败 |
+| 0 | int | 连接已断开 |
+| 1 | int | 正在连接中 |
+| 2 | int | 已连接 |
+| 3 | int | 正在断开连接 |
+
+## SPP协议相关功能
+
+提供蓝牙传输相关功能。
+
+### `bt.sppInit`
+
+```python
+bt.sppInit()
+```
+
+SPP 功能初始化。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.sppRelease`
+
+```python
+bt.sppRelease()
+```
+
+SPP 资源释放。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.sppConnect`
+
+```python
+bt.sppConnect(addr)
+```
+
+建立SPP连接。
+
+**参数描述:**
+
+- `addr`-蓝牙地址,类型为bytearray,6个字节。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.sppDisconnect`
+
+```python
+bt.sppDisconnect()
+```
+
+断开SPP连接。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
+### `bt.sppSend`
+
+```python
+bt.sppSend(data)
+```
+
+**参数描述:**
+
+- `data`-待发送的数据,类型为bytearray。
+
+**返回值描述:**
+
+- 执行成功返回整型0,失败返回整型-1。
+
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamCapture.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamCapture.md"
index 31b3ea550aafebb39ccfdcdd2f3e85a32414fc43..750558dbef9a8f039147228a968fdefb26fe49a9 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamCapture.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamCapture.md"
@@ -1,16 +1,8 @@
+# class camCapture - 摄像头拍照
+该类提供摄像头的拍照及保存功能。
-```
-本文阐述了QuecPython的camera.camCapture类的用法,描述了camera.camCapture类最新版本的特性。
-```
-
-
-
-# `class camCapture` - 摄像头扫码
-
-`camCapture`对象提供摄像头的拍照及保存功能。
-
-> 注意:使用该功能前,需要初始化LCD。
+> 使用该功能前,需要初始化LCD。
**示例:**
@@ -65,7 +57,7 @@ class camera.camCapture(model,cam_w,cam_h,perview_level,lcd_w,lcd_h)
- `lcd_w` - LCD水平分辨率,int类型,请按照所使用的LCD的规格填写。
- `lcd_h` - LCD垂直分辨率,int类型,请按照所使用的LCD的规格填写。
-摄像头型号对应表:
+**摄像头型号对应表:**
| 编号 | 摄像头型号 | 通信方式 |
| ---- | ---------- | -------- |
@@ -74,51 +66,47 @@ class camera.camCapture(model,cam_w,cam_h,perview_level,lcd_w,lcd_h)
## 方法
-### camCapture.open
+### `camCapture.open`
```python
camCapture.open()
```
-该方法用于使能摄像头的扫码功能。
+该方法用于使能摄像头的拍照功能。
-**参数描述**
+**参数描述:**
-无
+无。
**返回值描述:**
-`0` 表示打开使能成功;
+`0` 表示打开使能成功,其他表示打开使能失败。
-`其他`表示打开使能失败。
-
-### camCapture.close
+### `camCapture.close`
```python
camCapture.close()
```
-该方法用于关闭使能摄像头的扫码功能。
+该方法用于关闭使能摄像头的拍照功能。
-**参数描述**
+**参数描述:**
-无
+无。
**返回值描述:**
-`0` 表示关闭使能成功;
+`0` 表示关闭使能成功,其他表示关闭使能失败。
-`其他`表示关闭使能失败。
-
-### camCapture.start
+### `camCapture.start`
```python
camCaputre.start(width, height, pic_name)
```
-该方法用于开始拍照保存。
+该方法用于拍照保存。
-**参数描述**
+**参数描述:**
- `width` - 保存图片水平分辨率,int类型。
- `height` - 保存图片垂直分辨率,int类型。
@@ -126,27 +114,33 @@ camCaputre.start(width, height, pic_name)
**返回值描述:**
-`0` 表示拍照保存成功,`其他`表示开始拍照保存失败。
+`0` 表示拍照保存成功,其他表示开始拍照保存失败。
-注意:拍照结果还是以回调函数参数为主。
+> 拍照结果还是以回调函数参数为主。
-### camCapture.callback
+### `camCapture.callback`
```python
-def callback(para):
- print(para)
-camCapture.callback(callback)
+camCapture.callback(cb)
```
-该方法用于设置拍照回调函数
+该方法用于设置拍照回调函数。
-**参数描述**
+**参数描述:**
-- `callback` - 拍照回调函数,回调函数原型:function([result, pic_name])->None
回调函数参数: [result, pic_name]
result: 拍照结果(0:成功, 其它:失败)
pic_name: 保存的照片名称
+- `cb` - 拍照回调函数,回调函数原型:
-**返回值描述:**
+ ```python
+ def cb(result_list):
+ pass
+ ```
+
+ **回调函数参数描述:**
+
+ - `result_list[0]` - 拍照保存结果,int类型,`0`表示成功, 其它表示失败
+ - `result_list[1]` - 保存的照片名称,string类型。
-`0` 表示设置拍照回调函数成功;
+**返回值描述:**
-`其他`表示设置拍照回调函数失败。
+`0` 表示设置拍照回调函数成功,其他表示设置拍照回调函数失败。
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamDecoder.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamDecoder.md"
index 64309cc3d6affcc176ae17e13689d1aad350d5e5..bef893661deaee7840b48f51ecfb416ad81d804a 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamDecoder.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamDecoder.md"
@@ -1,16 +1,8 @@
+# class camScandecode - 摄像头扫码
+该类提供摄像头的扫码功能。
-```
-本文阐述了QuecPython的camera.camScandecode类的用法,描述了camera.camScandecode类最新版本的特性。
-```
-
-
-
-# `class camScandecode` - 摄像头扫码
-
-`camScandecode`对象提供摄像头的扫码功能。
-
-> 注意:如果开启预览,需要先初始化LCD。
+> 如果开启预览,需要先初始化LCD。
**示例:**
@@ -71,7 +63,7 @@ class camera.camScandecode(model,decode_level,cam_w,cam_h,perview_level,lcd_w,lc
- `lcd_w` - LCD水平分辨率,int类型,请按照所使用的LCD的规格填写。
- `lcd_h` - LCD垂直分辨率,int类型,请按照所使用的LCD的规格填写。
-摄像头型号对应表:
+**摄像头型号对应表:**
| 编号 | 摄像头型号 | 通信方式 |
| ---- | ---------- | -------- |
@@ -80,7 +72,7 @@ class camera.camScandecode(model,decode_level,cam_w,cam_h,perview_level,lcd_w,lc
## 方法
-### camScandecode.open
+### `camScandecode.open`
```python
camScandecode.open()
@@ -88,17 +80,15 @@ camScandecode.open()
该方法用于使能摄像头的扫码功能。
-**参数描述**
+**参数描述:**
-无
+无。
**返回值描述:**
-`0` 表示打开使能成功;
-
-`其他`表示打开使能失败。
+`0` 表示打开使能成功,其他表示打开使能失败。
-### camScandecode.close
+### `camScandecode.close`
```python
camScandecode.close()
@@ -106,17 +96,15 @@ camScandecode.close()
该方法用于关闭使能摄像头的扫码功能。
-**参数描述**
+**参数描述:**
-无
+无。
**返回值描述:**
-`0` 表示关闭使能成功;
-
-`其他`表示关闭使能失败。
+`0` 表示关闭使能成功,其他表示关闭使能失败。
-### camScandecode.start
+### `camScandecode.start`
```python
camScandecode.start()
@@ -124,17 +112,15 @@ camScandecode.start()
该方法用于开始摄影头扫码。
-**参数描述**
+**参数描述:**
-无
+无。
**返回值描述:**
-`0` 表示开始扫码;
-
-`其他`表示开始扫码失败。
+`0` 表示开始扫码,其他表示开始扫码失败。
-### camScandecode.stop
+### `camScandecode.stop`
```python
camScandecode.stop()
@@ -142,17 +128,15 @@ camScandecode.stop()
该方法用于结束摄像头扫码。
-**参数描述**
+**参数描述:**
-无
+无。
**返回值描述:**
-`0` 表示结束扫码扫码;
+`0` 表示结束扫码扫码,其他表示结束扫码失败。
-`其他`表示结束扫码失败。
-
-### camScandecode.pause
+### `camScandecode.pause`
```python
camScandecode.pause()
@@ -160,17 +144,15 @@ camScandecode.pause()
该方法用于暂停摄像头扫码。
-**参数描述**
+**参数描述:**
-无
+无。
**返回值描述:**
-`0` 表示暂停扫码成功;
-
-`其他`表示暂停扫码失败。
+`0` 表示暂停扫码成功,其他表示暂停扫码失败。
-### camScandecode.resume
+### `camScandecode.resume`
```python
camScandecode.resume()
@@ -178,32 +160,36 @@ camScandecode.resume()
该方法用于继续摄像头扫码。
-**参数描述**
+**参数描述:**
-无
+无。
**返回值描述:**
-`0` 表示继续扫码成功;
-
-`其他`表示继续扫码失败。
+`0` 表示继续扫码成功,其他表示继续扫码失败。
-### camScandecode.callback
+### `camScandecode.callback`
```python
-def callback(para):
- print(para)
-camScandecode.callback(callback)
+camScandecode.callback(cb)
```
-该方法用于设置识别回调函数
+该方法用于设置识别回调函数。
-**参数描述**
+**参数描述:**
-- `callback` - 识别回调函数,回调函数原型:function([result, content])->None
回调函数参数: [result, content]
result: 扫码结果(0:成功, 其它:失败)
content: 扫码内容
+- `cb` - 识别回调函数,回调函数原型:
-**返回值描述:**
+ ```python
+ def cb(result_list):
+ pass
+ ```
+
+ **回调函数参数描述:**
+
+ - `result_list[0]` - 扫码结果,int类型,`0`表示成功, 其它表示失败
+ - `result_list[1]` - 扫码内容,string类型。
-`0` 表示设置识别回调函数成功;
+**返回值描述:**
-`其他`表示设置识别回调函数失败。
\ No newline at end of file
+`0` 表示设置识别回调函数成功,其他表示设置识别回调函数失败。
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamPreview.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamPreview.md"
index 4ef19198d5f5567e03d5ec7f443826438c17af57..c48dfe58da05043b2866b6aef04cf9e8c3afdc48 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamPreview.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.CamPreview.md"
@@ -1,16 +1,10 @@
-```
-本文阐述了QuecPython的camera.camPreview类的用法,描述了camera.camPreview类最新版本的特性。
-```
-
-
-
-# `class camPreview` - 摄像头预览
+# class camPreview - 摄像头预览
-`camPreview`对象提供摄像头的预览功能。
+该类提供摄像头的预览功能。
-注意:使用该功能前,需要初始化LCD。
+> 使用该功能前,需要初始化LCD。
**示例:**
@@ -51,7 +45,7 @@ class camera.camPreview(model,cam_w,cam_h,lcd_w,lcd_h,perview_level)
- `lcd_h` - LCD垂直分辨率,int类型,请按照所使用的LCD的规格填写。
- `perview_level` - 预览等级,int类型,型号EC600N系列、EC800N系列、EC600M系列、EC800M系列可填写1或2,等级越高,图像越流畅,消耗资源越大;其他型号只可填写1。
-摄像头型号对应表:
+**摄像头型号对应表:**
| 编号 | 摄像头型号 | 通信方式 |
| ---- | ---------- | -------- |
@@ -60,7 +54,7 @@ class camera.camPreview(model,cam_w,cam_h,lcd_w,lcd_h,perview_level)
## 方法
-### camPreview.open
+### `camPreview.open`
```python
camPreview.open()
@@ -68,17 +62,15 @@ camPreview.open()
该方法用于打开摄像头的预览功能。
-**参数描述**
+**参数描述:**
-无
+无。
**返回值描述:**
-`0` 表示打开预览成功;
-
-`其他`表示打开预览失败。
+`0` 表示打开预览成功,其他表示打开预览失败。
-### camPreview.close
+### `camPreview.close`
```
camPreview.close()
@@ -86,12 +78,10 @@ camPreview.close()
该方法用于关闭摄像头的预览功能。
-**参数描述**
+**参数描述:**
-无
+无。
**返回值描述:**
-`0` 表示打开预览成功;
-
-`其他`表示打开预览失败。
\ No newline at end of file
+`0` 表示打开预览成功,其他表示打开预览失败。
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.md"
index 59c0db1499477af1bce0acf1b922bc46080a240b..f7c50173b677a9de315a846e3112c7aae741f8f2 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/camera.md"
@@ -1,24 +1,15 @@
+# camera - 摄像头
+该模块包含了摄像头预览,照相机,扫码功能。
-```
-本文阐述了QuecPython的camera模块的用法,描述了camera模块最新版本的特性。
-```
-
-
-
-# `camera` - 摄像头相关功能
-
-`camera`模块包含摄像头相关的功能。包括摄像头预览功能,照相机功能以及扫码功能。
-
-模块功能:实现摄像头预览,照相机,扫码功能
-
-> 目前支持型号:EC600N系列、EC800N系列、EC600M系列、EC800M系列;EC600U系列和EC200U系列可定制该功能。
+> 目前支持型号:EC600N系列、EC800N系列、EC600M系列、EC800M系列、EC600U-CN系列、EC200U-CN系列。
>
-> 注意:如果需要预览,在初始化camera对象之前,请先参照machine模块的lcd类的内容正确初始化LCD对象。
+> 如果需要预览,在初始化camera对象之前,请先参照[machine模块的lcd类的内容](machine.LCD.md)正确初始化LCD对象。
**示例:**
```python
+# -*- coding: UTF-8 -*-
from machine import LCD
import camera
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/cellLocator.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/cellLocator.md"
index d835b8ba17ee6ebde9e1c1de88c7b906e80a0d54..20824fbcb790ae5ebab4da49701170f7189e5ebf 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/cellLocator.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/cellLocator.md"
@@ -1,10 +1,10 @@
# cellLocator - 基站定位
-模块功能: 提供基站定位功能,获取模组经纬度坐标信息。
+该模块提供基站定位功能,获取模组经纬度坐标信息。
->注意:当前仅EC600S/EC600N/EC800N/EC200U/EC600U系列支持该功能。
+>当前仅EC600S/EC600N/EC800N/EC200U/EC600U系列支持该功能。
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/dataCall.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/dataCall.md"
index 1cf22945fafa919da4d0a6b9421d4cb680a28468..4de9d4b07106573370155b966ceda0deb12dbb7e 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/dataCall.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/dataCall.md"
@@ -411,6 +411,8 @@ dataCall.getInfo(profileID, ipType)
>返回值 `(1, 0, [0, 0, '0.0.0.0', '0.0.0.0', '0.0.0.0'])` 表示当前没有拨号或者拨号没有成功。
>
>支持该方法的模组:EC100Y/EC200N/EC600N/EC600S/EC800N/EG912N/EG915N/EC600M/EC800M/EG810M/EC200A/EC200U/EC600U/EG912U/EG915U/EC600G/EC800G/EC600E/EC800E/BG77/BG95/BC25/BC95系列。
+>
+>由于需要向老版dataCall.getInfo兼容,实际profileID的最大值是大于3的,具体以实际能够查询的profileID为准。
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.CH395.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.CH395.md"
index 3acb48d53cce79401379f689d5ef31d593c05c0d..a6b23548e4c09a64a5a14c0bd3f3e8dc9b72463e 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.CH395.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.CH395.md"
@@ -1,37 +1,29 @@
-# `class CH395` - CH395以太网卡控制
+# class CH395 - CH395以太网卡控制
该类用于控制`CH395`型号以太网网卡设备。
-
-
-当前仅支持EC600U系列
-
-
+> 当前仅支持EC600U系列
## 构造函数
### `ethernet.CH395`
```python
-class ethernet.CH395(mac, ip_addr='', mask_addr='', gw_addr='', spi_port=-1, spi_cs_pin=-1, exint_pin=-1, reset_pin=-1, work_mode=0)
+class ethernet.CH395(mac, ip='', subnet='', gateway='', spi_port=-1, spi_cs_pin=-1, extint_pin=-1, reset_pin=-1, work_mode=0)
```
加载CH395驱动,初始化CH395以太网卡,并返回CH395网卡对象。
**参数描述:**
-- `mac` - 字节流,6字节长度的 `mac` 地址.
-- `ip_addr` - 以太网卡的 `ip` 地址,默认值为空字符串'',表示使用程序中
-的默认值,`192.168.1.100`。
-- `mask_addr` - 以太网卡的子网掩码地址,默认值为空字符串'',表示使用
-`255.255.255.0`作为子网掩码。
-- `gw_addr` - 以太网卡的网关地址,默认值为空字符串'',表示将 ip 地址
-的最后一位替换成`1`作为子网掩码。
+- `mac` - 字节流,6字节长度的 `mac` 地址。
+- `ip` - 以太网卡的 `ip` 地址,若值为空字符串'',表示使用默认值`192.168.1.100`。
+- `subnet` - 以太网卡的子网掩码地址,若值为空字符串'',表示使用默认值`255.255.255.0`。
+- `gateway` - 以太网卡的网关地址,若值为空字符串'',表示将 `ip` 地址的最后一位替换成`1`作为网关。
- `spi_port` - 连接`CH395`的[SPI端口](./machine.SPI.md),默认值为`-1`,表示使用上次配置的值,程序中默认配置为了 `SPI1` 端口。
- `spi_cs_pin` - 连接`CH395`的 `SPI` 片选[GPIO管脚](./machine.Pin.md),默认值为`-1`,表示使用上次配置的值,程序中默认配置为了 `Pin.GPIO4`。
-- `eint_pin` - 连接`CH395`的外部中断[GPIO管脚](./machine.Pin.md),默认值为`-1`,表示上次配置的值,程序中默认配置为 `Pin.GPIO24`。
-- `reset_pin` - 连接`CH395`的重置[GPIO管脚](./machine.Pin.md), 表示上次配置的值,
-程序中默认配置为 `Pin.GPIO30`。
+- `extint_pin` - 连接`CH395`的外部中断[GPIO管脚](./machine.Pin.md),默认值为`-1`,表示上次配置的值,程序中默认配置为 `Pin.GPIO24`。
+- `reset_pin` - 连接`CH395`的重置[GPIO管脚](./machine.Pin.md), 表示上次配置的值,程序中默认配置为 `Pin.GPIO30`。
- `work_mode` - 以太网工作模式配置,默认为终端模式,`0`/`1` 分别表示终端模式/网关模式。终端模式表示该模块作为终端设备连接供网设备上网。网关模式表示该模块作为网关,为外部设备提供网络访问,通过`4G`上网。
## 方法
@@ -41,22 +33,22 @@ class ethernet.CH395(mac, ip_addr='', mask_addr='', gw_addr='', spi_port=-1, spi
nic.set_addr(ip, subnet, gateway)
```
-网卡静态ip地址配置
+网卡静态ip地址配置。
**参数描述:**
-- `ip` - 以太网卡的`ip`地址,值为空字符串'',表示使用程序中的默认值,即`192. 168.1.100`
-- `subnet` - 以太网卡的子网掩码地址,值为空字符串'',表示使用`255.255.255.0`作为子网掩码
-- `gateway` - 以太网卡的网关地址,值为空字符串'',表示将 ip 地址的最后一位替换 成`1`作为子网掩码
+- `ip` - 以太网卡的 `ip` 地址,若值为空字符串'',表示使用默认值`192.168.1.100`。
+- `subnet` - 以太网卡的子网掩码地址,若值为空字符串'',表示使用默认值`255.255.255.0`。
+- `gateway` - 以太网卡的网关地址,若值为空字符串'',表示将 `ip` 地址的最后一位替换成`1`作为网关。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
* 示例
```python
-nic.set_addr('192.168.31.203', '', '')
+nic.set_addr('192.168.1.100', '', '')
```
### `CH395.set_dns`
@@ -65,16 +57,16 @@ nic.set_addr('192.168.31.203', '', '')
nic.set_dns(primary_dns, secondary_dns)
```
-网卡dns服务器配置
+网卡dns服务器配置。
**参数描述:**
-- `primary_dns` - `DNS`服务器主地址
-- `secondary_dns` - `DNS`服务器辅地址
+- `primary_dns` - `DNS`服务器主地址。
+- `secondary_dns` - `DNS`服务器辅地址。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
**示例:**
@@ -88,7 +80,11 @@ nic.set_dns('8.8.8.8', '114.114.114.114')
nic.set_up()
```
-网卡启动,启动后网卡正常处理网口网络报文
+网卡启动,启动后网卡正常处理网口网络报文。
+
+**返回值描述:**
+
+成功返回整型值0,失败返回整型值-1。
### `CH395.set_down`
@@ -96,7 +92,11 @@ nic.set_up()
nic.set_down()
```
-网卡禁用,禁用后网卡不再处理网口网络报文
+网卡禁用,禁用后网卡不再处理网口网络报文。
+
+**返回值描述:**
+
+成功返回整型值0,失败返回整型值-1。
### `CH395.dhcp`
@@ -104,11 +104,11 @@ nic.set_down()
nic.dhcp()
```
-动态ip获取,此方法是作为终端模式下使用,从而自动获取ip信息
+动态ip获取,此方法是作为终端模式下使用,从而自动获取ip信息。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
### `CH395.ipconfig`
@@ -116,16 +116,17 @@ nic.dhcp()
nic.ipconfig()
```
-获取网卡网络信息,通过该方法获取到mac地址、主机名、IP地址类型、IP地址、子网掩码、网关地址和DNS服务器地址
+获取网卡网络信息,通过该方法获取到mac地址、主机名、IP地址类型、IP地址、子网掩码、网关地址和DNS服务器地址。
**返回值描述:**
-返回list类型
+返回list类型。
格式如下:
[(mac, hostname), (iptype, ip, subnet, gateway, primary_dns,secondary_dns)]
+
| 参数 | 类型 | 说明 |
-|-|-|-|
+| ---- | ---- |---------- |
| `mac` | `str` | `mac`地址,格式为`'XX-XX-XX-XX-XX-XX'` |
| `hostname`| `str` | 网卡名称 |
| `iptype` | `str` | `ip`类型,`4`表示`ipv4`,`6`表示`ipv6`,目前仅支持`ip4` |
@@ -135,22 +136,21 @@ nic.ipconfig()
| `primary_dns`| `str` | DNS服务器主地址 |
| `secondary_dns`| `str` | DNS服务器辅地址 |
-
### `CH395.set_default_NIC`
```python
nic.set_default_NIC(ip)
```
-默认网卡配置
+默认网卡配置。
**参数描述:**
-- `ip` - 默认网卡ip地址
+- `ip` - 默认网卡ip地址。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
**示例:**
@@ -164,16 +164,17 @@ nic.set_default_NIC('192.168.1.100')
nic.status()
```
-获取网卡当前状态
+获取网卡当前状态。
**返回值描述:**
-返回tuble类型
+返回tuble类型。
格式内容如下:
(dev, active, link)
+
| 参数 | 类型 | 说明 |
-|-|-|-|
+| ---- | ---- |---------- |
| `dev` | `bool` | 表示网卡设备是否连接正常,`True`/`False`表示有连接/未连接 |
| `active`| `bool` | 表示网卡是否激活使用,`True`/`False`表示启用/禁用,与`set_up`/`set_down`对应 |
| `link` | `bool` | 表示网卡网线是否连接,`True`/`False`表示已连接/未连接 |
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.DM9051.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.DM9051.md"
index eca377b8d430be245c82e345d8d39431ac07370b..441708beb61a915fdc8064f90a640244916a9f99 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.DM9051.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.DM9051.md"
@@ -1,32 +1,25 @@
-# `class DM9051` - DM9051以太网卡控制
+# class DM9051 - DM9051以太网卡控制
该类用于控制`DM9051`型号以太网网卡设备。
-
-
-当前仅支持EC600N系列
-
-
+> 当前仅支持EC600N系列
## 构造函数
### `ethernet.DM9051`
```python
-class ethernet.DM9051(mac, ip_addr='', mask_addr='', gw_addr='', spi_port=-1,spi_cs_pin=-1)
+class ethernet.DM9051(mac, ip='', subnet='', gateway='', spi_port=-1,spi_cs_pin=-1)
```
加载DM9051驱动,初始化DM9051以太网卡,并返回DM9051网卡对象。
**参数描述:**
-- `mac` - 字节流,6字节长度的 `mac` 地址.
-- `ip_addr` - 以太网卡的 `ip` 地址,默认值为空字符串'',表示使用程序中
-的默认值,`192.168.1.100`。
-- `mask_addr` - 以太网卡的子网掩码地址,默认值为空字符串'',表示使用
-`255.255.255.0`作为子网掩码。
-- `gw_addr` - 以太网卡的网关地址,默认值为空字符串'',表示将 ip 地址
-的最后一位替换成`1`作为子网掩码。
+- `mac` - 字节流,6字节长度的 `mac` 地址。
+- `ip` - 以太网卡的 `ip` 地址,若值为空字符串'',表示使用默认值`192.168.1.100`。
+- `subnet` - 以太网卡的子网掩码地址,若值为空字符串'',表示使用默认值`255.255.255.0`。
+- `gateway` - 以太网卡的网关地址,若值为空字符串'',表示将 `ip` 地址的最后一位替换成`1`作为网关。
- `spi_port` - 连接`DM9051`的[SPI端口](./machine.SPI.md),默认值为`-1`,表示使用上次配置的值,程序中默认配置为了 `SPI1` 端口。
- `spi_cs_pin` - 连接`DM9051`的 `SPI` 片选[GPIO管脚](./machine.Pin.md),默认值为`-1`,表示使用上次配置的值,程序中默认配置为了 `Pin.GPIO13`。
@@ -37,22 +30,22 @@ class ethernet.DM9051(mac, ip_addr='', mask_addr='', gw_addr='', spi_port=-1,spi
nic.set_addr(ip, subnet, gateway)
```
-网卡静态ip地址配置
+网卡静态ip地址配置。
**参数描述:**
-- `ip` - 以太网卡的`ip`地址,值为空字符串'',表示使用程序中的默认值,即`192. 168.1.100`
-- `subnet` - 以太网卡的子网掩码地址,值为空字符串'',表示使用`255.255.255.0`作为子网掩码
-- `gateway` - 以太网卡的网关地址,值为空字符串'',表示将 ip 地址的最后一位替换 成`1`作为子网掩码
+- `ip` - 以太网卡的 `ip` 地址,若值为空字符串'',表示使用默认值`192.168.1.100`。
+- `subnet` - 以太网卡的子网掩码地址,若值为空字符串'',表示使用默认值`255.255.255.0`。
+- `gateway` - 以太网卡的网关地址,若值为空字符串'',表示将 `ip` 地址的最后一位替换成`1`作为网关。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
* 示例
```python
-nic.set_addr('192.168.31.203', '', '')
+nic.set_addr('192.168.1.100', '', '')
```
### `DM9051.set_dns`
@@ -61,16 +54,16 @@ nic.set_addr('192.168.31.203', '', '')
nic.set_dns(primary_dns, secondary_dns)
```
-网卡dns服务器配置
+网卡dns服务器配置。
**参数描述:**
-- `primary_dns` - `DNS`服务器主地址
-- `secondary_dns` - `DNS`服务器辅地址
+- `primary_dns` - `DNS`服务器主地址。
+- `secondary_dns` - `DNS`服务器辅地址。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
**示例:**
@@ -84,7 +77,11 @@ nic.set_dns('8.8.8.8', '114.114.114.114')
nic.set_up()
```
-网卡启动,启动后网卡正常处理网口网络报文
+网卡启动,启动后网卡正常处理网口网络报文。
+
+**返回值描述:**
+
+成功返回整型值0,失败返回整型值-1。
### `DM9051.set_down`
@@ -92,7 +89,11 @@ nic.set_up()
nic.set_down()
```
-网卡禁用,禁用后网卡不再处理网口网络报文
+网卡禁用,禁用后网卡不再处理网口网络报文。
+
+**返回值描述:**
+
+成功返回整型值0,失败返回整型值-1。
### `DM9051.dhcp`
@@ -100,11 +101,11 @@ nic.set_down()
nic.dhcp()
```
-动态ip获取,此方法是作为终端模式下使用,从而自动获取ip信息
+动态ip获取,此方法是作为终端模式下使用,从而自动获取ip信息。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
### `DM9051.ipconfig`
@@ -112,16 +113,17 @@ nic.dhcp()
nic.ipconfig()
```
-获取网卡网络信息,通过该方法获取到mac地址、主机名、IP地址类型、IP地址、子网掩码、网关地址和DNS服务器地址
+获取网卡网络信息,通过该方法获取到mac地址、主机名、IP地址类型、IP地址、子网掩码、网关地址和DNS服务器地址。
**返回值描述:**
-返回list类型
+返回list类型。
格式如下:
[(mac, hostname), (iptype, ip, subnet, gateway, primary_dns,secondary_dns)]
+
| 参数 | 类型 | 说明 |
-|-|-|-|
+| ---- | ---- |---------- |
| `mac` | `str` | `mac`地址,格式为`'XX-XX-XX-XX-XX-XX'` |
| `hostname`| `str` | 网卡名称 |
| `iptype` | `str` | `ip`类型,`4`表示`ipv4`,`6`表示`ipv6`,目前仅支持`ip4` |
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.W5500.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.W5500.md"
index 8078d2f9616499a7692f06fee9ba94c12c3a8cfc..6ccdc9ffd11c16d490740bd95b9a183124a28e79 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.W5500.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.W5500.md"
@@ -1,36 +1,29 @@
-
-
-# `class W5500` - W5500以太网卡控制
+# class W5500 - W5500以太网卡控制
该类用于控制`W5500`型号以太网网卡设备。
-
-
-当前仅支持EC600N/EC600U系列
-
-
+
+> 当前仅支持EC600N/EC600U系列
+
## 构造函数
### `ethernet.W5500`
```python
-class ethernet.W5500(mac, ip_addr='', mask_addr='', gw_addr='', spi_port=-1, spi_cs_pin=-1, exint_pin=-1, reset_pin=-1, work_mode=0)
+class ethernet.W5500(mac, ip='', subnet='', gateway='', spi_port=-1, spi_cs_pin=-1, extint_pin=-1, reset_pin=-1, work_mode=0)
```
加载W5500驱动,初始化W5500以太网卡,并返回W5500网卡对象。
**参数描述:**
-- `mac` - 字节流,6字节长度的 `mac` 地址.
-- `ip_addr` - 以太网卡的 `ip` 地址,默认值为空字符串'',表示使用程序中
-的默认值,`192.168.1.100`。
-- `mask_addr` - 以太网卡的子网掩码地址,默认值为空字符串'',表示使用
-`255.255.255.0`作为子网掩码。
-- `gw_addr` - 以太网卡的网关地址,默认值为空字符串'',表示将 ip 地址
-的最后一位替换成`1`作为子网掩码。
+- `mac` - 字节流,6字节长度的 `mac` 地址。
+- `ip` - 以太网卡的 `ip` 地址,若值为空字符串'',表示使用默认值`192.168.1.100`。
+- `subnet` - 以太网卡的子网掩码地址,若值为空字符串'',表示使用默认值`255.255.255.0`。
+- `gateway` - 以太网卡的网关地址,若值为空字符串'',表示将 `ip` 地址的最后一位替换成`1`作为网关。
- `spi_port` - 连接`W5500`的[SPI端口](./machine.SPI.md),默认值为`-1`,表示使用上次配置的值,程序中默认配置为 `SPI1` 端口。
- `spi_cs_pin` - 连接`W5500`的 `SPI` 片选[GPIO管脚](./machine.Pin.md),默认值为`-1`,表示使用上次配置的值,程序中默认配置为 `Pin.GPIO34`。
-- `eint_pin` - 连接`W5500`的外部中断[GPIO管脚](./machine.Pin.md),默认值为`-1`,表示上次配置的值,程序中默认配置为 `Pin.GPIO19`。
+- `extint_pin` - 连接`W5500`的外部中断[GPIO管脚](./machine.Pin.md),默认值为`-1`,表示上次配置的值,程序中默认配置为 `Pin.GPIO19`。
- `reset_pin` - 连接`W5500`的重置[GPIO管脚](./machine.Pin.md),默认值为`-1`, 表示上次配置的值,程序中默认配置为 `Pin.GPIO17`。
- `work_mode` - 以太网工作模式配置,默认为终端模式,`0`/`1` 分别表示终端模式/网关模式。终端模式表示该模块作为终端设备连接供网设备上网。网关模式表示该模块作为网关,为外部设备提供网络访问,通过`4G`上网。
@@ -41,22 +34,22 @@ class ethernet.W5500(mac, ip_addr='', mask_addr='', gw_addr='', spi_port=-1, spi
nic.set_addr(ip, subnet, gateway)
```
-网卡静态ip地址配置
+网卡静态ip地址配置。
**参数描述:**
-- `ip` - 以太网卡的`ip`地址,值为空字符串'',表示使用程序中的默认值,即`192. 168.1.100`
-- `subnet` - 以太网卡的子网掩码地址,值为空字符串'',表示使用`255.255.255.0`作为子网掩码
-- `gateway` - 以太网卡的网关地址,值为空字符串'',表示将 ip 地址的最后一位替换 成`1`作为子网掩码
+- `ip` - 以太网卡的 `ip` 地址,若值为空字符串'',表示使用默认值`192.168.1.100`。
+- `subnet` - 以太网卡的子网掩码地址,若值为空字符串'',表示使用默认值`255.255.255.0`。
+- `gateway` - 以太网卡的网关地址,若值为空字符串'',表示将 `ip` 地址的最后一位替换成`1`作为网关。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
* 示例
```python
-nic.set_addr('192.168.31.203', '', '')
+nic.set_addr('192.168.1.100', '', '')
```
### `W5500.set_dns`
@@ -65,16 +58,16 @@ nic.set_addr('192.168.31.203', '', '')
nic.set_dns(primary_dns, secondary_dns)
```
-网卡dns服务器配置
+网卡dns服务器配置。
**参数描述:**
-- `primary_dns` - `DNS`服务器主地址
-- `secondary_dns` - `DNS`服务器辅地址
+- `primary_dns` - `DNS`服务器主地址。
+- `secondary_dns` - `DNS`服务器辅地址。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
**示例:**
@@ -88,7 +81,11 @@ nic.set_dns('8.8.8.8', '114.114.114.114')
nic.set_up()
```
-网卡启动,启动后网卡正常处理网口网络报文
+网卡启动,启动后网卡正常处理网口网络报文。
+
+**返回值描述:**
+
+成功返回整型值0,失败返回整型值-1。
### `W5500.set_down`
@@ -96,7 +93,11 @@ nic.set_up()
nic.set_down()
```
-网卡禁用,禁用后网卡不再处理网口网络报文
+网卡禁用,禁用后网卡不再处理网口网络报文。
+
+**返回值描述:**
+
+成功返回整型值0,失败返回整型值-1。
### `W5500.dhcp`
@@ -104,11 +105,11 @@ nic.set_down()
nic.dhcp()
```
-动态ip获取,此方法是作为终端模式下使用,从而自动获取ip信息
+动态ip获取,此方法是作为终端模式下使用,从而自动获取ip信息。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
### `W5500.ipconfig`
@@ -116,16 +117,17 @@ nic.dhcp()
nic.ipconfig()
```
-获取网卡网络信息,通过该方法获取到mac地址、主机名、IP地址类型、IP地址、子网掩码、网关地址和DNS服务器地址
+获取网卡网络信息,通过该方法获取到mac地址、主机名、IP地址类型、IP地址、子网掩码、网关地址和DNS服务器地址。
**返回值描述:**
-返回list类型
+返回list类型。
格式如下:
[(mac, hostname), (iptype, ip, subnet, gateway, primary_dns,secondary_dns)]
+
| 参数 | 类型 | 说明 |
-|-|-|-|
+| ---- | ---- |---------- |
| `mac` | `str` | `mac`地址,格式为`'XX-XX-XX-XX-XX-XX'` |
| `hostname`| `str` | 网卡名称 |
| `iptype` | `str` | `ip`类型,`4`表示`ipv4`,`6`表示`ipv6`,目前仅支持`ip4` |
@@ -135,22 +137,21 @@ nic.ipconfig()
| `primary_dns`| `str` | DNS服务器主地址 |
| `secondary_dns`| `str` | DNS服务器辅地址 |
-
### `W5500.set_default_NIC`
```python
nic.set_default_NIC(ip)
```
-默认网卡配置
+默认网卡配置。
**参数描述:**
-- `ip` - 默认网卡ip地址
+- `ip` - 默认网卡ip地址。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
**示例:**
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.YT8512H.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.YT8512H.md"
index b12af59e4580c442e7780b1bcc593372045a95a4..dcb4a53a667425d4ab4d88219c45e9661024f1ec 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.YT8512H.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.YT8512H.md"
@@ -1,32 +1,25 @@
-# `class YT8512H` - YT8512H PHY控制
+# class YT8512H - YT8512H PHY控制
-该类用于控制`YT8512H`型号以太网网卡设备。
+该类用于控制`YT8512H/SZ18201`型号以太网网卡设备。
-
-
-当前仅支持EC200A系列
-
-
+> 当前仅支持EC200A系列
## 构造函数
### `ethernet.YT8512H`
```python
-class ethernet.YT8512H(mac, ip_addr='', mask_addr='', gw_addr='')
+class ethernet.YT8512H(mac, ip='', subnet='', gateway='')
```
-加载YT8512H驱动,初始化YT8512H PHY,并返回YT8512H网卡对象。
+加载YT8512H驱动,初始化YT8512H phy设备,并返回YT8512H网卡对象。
**参数描述:**
-- `mac` - 字节流,6字节长度的 `mac` 地址.
-- `ip_addr` - 以太网卡的 `ip` 地址,默认值为空字符串'',表示使用程序中
-的默认值,`192.168.1.100`。
-- `mask_addr` - 以太网卡的子网掩码地址,默认值为空字符串'',表示使用
-`255.255.255.0`作为子网掩码。
-- `gw_addr` - 以太网卡的网关地址,默认值为空字符串'',表示将 ip 地址
-的最后一位替换成`1`作为子网掩码。
+- `mac` - 字节流,6字节长度的 `mac` 地址。
+- `ip` - 以太网卡的 `ip` 地址,若值为空字符串'',表示使用默认值`192.168.1.100`。
+- `subnet` - 以太网卡的子网掩码地址,若值为空字符串'',表示使用默认值`255.255.255.0`。
+- `gateway` - 以太网卡的网关地址,若值为空字符串'',表示将 `ip` 地址的最后一位替换成`1`作为网关。
## 方法
@@ -35,22 +28,22 @@ class ethernet.YT8512H(mac, ip_addr='', mask_addr='', gw_addr='')
nic.set_addr(ip, subnet, gateway)
```
-网卡静态ip地址配置
+网卡静态ip地址配置。
**参数描述:**
-- `ip` - 以太网卡的`ip`地址,值为空字符串'',表示使用程序中的默认值,即`192. 168.1.100`
-- `subnet` - 以太网卡的子网掩码地址,值为空字符串'',表示使用`255.255.255.0`作为子网掩码
-- `gateway` - 以太网卡的网关地址,值为空字符串'',表示将 ip 地址的最后一位替换 成`1`作为子网掩码
+- `ip` - 以太网卡的 `ip` 地址,若值为空字符串'',表示使用默认值`192.168.1.100`。
+- `subnet` - 以太网卡的子网掩码地址,若值为空字符串'',表示使用默认值`255.255.255.0`。
+- `gateway` - 以太网卡的网关地址,若值为空字符串'',表示将 `ip` 地址的最后一位替换成`1`作为网关。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
* 示例
```python
-nic.set_addr('192.168.31.203', '', '')
+nic.set_addr('192.168.1.100', '', '')
```
### `YT8512H.set_dns`
@@ -59,16 +52,16 @@ nic.set_addr('192.168.31.203', '', '')
nic.set_dns(primary_dns, secondary_dns)
```
-网卡dns服务器配置
+网卡dns服务器配置。
**参数描述:**
-- `primary_dns` - `DNS`服务器主地址
-- `secondary_dns` - `DNS`服务器辅地址
+- `primary_dns` - `DNS`服务器主地址。
+- `secondary_dns` - `DNS`服务器辅地址。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
**示例:**
@@ -82,7 +75,11 @@ nic.set_dns('8.8.8.8', '114.114.114.114')
nic.set_up()
```
-网卡启动,启动后网卡正常处理网口网络报文
+网卡启动,启动后网卡正常处理网口网络报文。
+
+**返回值描述:**
+
+成功返回整型值0,失败返回整型值-1。
### `YT8512H.set_down`
@@ -90,7 +87,11 @@ nic.set_up()
nic.set_down()
```
-网卡禁用,禁用后网卡不再处理网口网络报文
+网卡禁用,禁用后网卡不再处理网口网络报文。
+
+**返回值描述:**
+
+成功返回整型值0,失败返回整型值-1。
### `YT8512H.dhcp`
@@ -98,11 +99,11 @@ nic.set_down()
nic.dhcp()
```
-动态ip获取,此方法是作为终端模式下使用,从而自动获取ip信息
+动态ip获取,此方法是作为终端模式下使用,从而自动获取ip信息。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
### `YT8512H.ipconfig`
@@ -110,16 +111,17 @@ nic.dhcp()
nic.ipconfig()
```
-获取网卡网络信息,通过该方法获取到mac地址、主机名、IP地址类型、IP地址、子网掩码、网关地址和DNS服务器地址
+获取网卡网络信息,通过该方法获取到mac地址、主机名、IP地址类型、IP地址、子网掩码、网关地址和DNS服务器地址。
**返回值描述:**
-返回list类型
+返回list类型。
格式如下:
[(mac, hostname), (iptype, ip, subnet, gateway, primary_dns,secondary_dns)]
+
| 参数 | 类型 | 说明 |
-|-|-|-|
+| ---- | ---- |---------- |
| `mac` | `str` | `mac`地址,格式为`'XX-XX-XX-XX-XX-XX'` |
| `hostname`| `str` | 网卡名称 |
| `iptype` | `str` | `ip`类型,`4`表示`ipv4`,`6`表示`ipv6`,目前仅支持`ip4` |
@@ -129,22 +131,21 @@ nic.ipconfig()
| `primary_dns`| `str` | DNS服务器主地址 |
| `secondary_dns`| `str` | DNS服务器辅地址 |
-
### `YT8512H.set_default_NIC`
```python
nic.set_default_NIC(ip)
```
-默认网卡配置
+默认网卡配置。
**参数描述:**
-- `ip` - 默认网卡ip地址
+- `ip` - 默认网卡ip地址。
**返回值描述:**
-成功返回整型值0,其他值表示失败。
+成功返回整型值0,失败返回整型值-1。
**示例:**
@@ -158,16 +159,17 @@ nic.set_default_NIC('192.168.1.100')
nic.status()
```
-获取网卡当前状态
+获取网卡当前状态。
**返回值描述:**
-返回tuble类型
+返回tuble类型。
格式内容如下:
(dev, active, link)
+
| 参数 | 类型 | 说明 |
-|-|-|-|
+| ---- | ---- |---------- |
| `dev` | `bool` | 表示网卡设备是否连接正常,`True`/`False`表示有连接/未连接 |
| `active`| `bool` | 表示网卡是否激活使用,`True`/`False`表示启用/禁用,与`set_up`/`set_down`对应 |
| `link` | `bool` | 表示网卡网线是否连接,`True`/`False`表示已连接/未连接 |
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.md"
index 6f6e744de80dcb896b18daab9654301913683ce4..5066a89b9c63df0f16db85686d1c14f6d9fe21b8 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/ethernet.md"
@@ -1,16 +1,14 @@
-# `ethernet` - 以太网相关功能
-`ethernet`模块包含以太网控制及网络配置功能。主要是针对不同类型以太网卡提供统一的管理方式。
+# ethernet - 以太网相关功能
+`ethernet`模块包含以太网控制及网络配置功能,主要是针对不同类型以太网卡提供统一的管理方式。
-**示例:**
+**示例:**
-根据不同应用场景,分别以终端模式、网关模式、静态ip配置举例网卡初始化使用过程。
+根据不同应用场景,分别以终端模式、网关模式、静态ip配置介绍网卡初始化过程。
+
+
+> 1. 以下示例只是针对模组侧的网卡应用配置,也需要对端进行对应操作方可正常使用。
+> 2. 以下示例部分网卡未完全实现,请根据不同网卡驱动对应说明进行使用。
-
-
-1. 以下示例只是针对模组侧的网卡应用配置,也需要对端进行对应操作方可正常使用。
-2. 以下示例部分网卡未完全实现,请根据不同网卡驱动对应说明进行使用。
-
-
终端模式:
@@ -19,15 +17,15 @@
import ethernet
-# 加载对应的网卡驱动,并初始化网卡相关配置,driver替换成实际对应的网卡驱动
+# 加载对应的网卡驱动,并初始化网卡相关配置,driver替换成实际对应的网卡驱动。
nic = ethernet.diver(...)
print(nic.ipconfig())
-# 获取动态IP地址
+# 获取动态IP地址。
nic.dhcp()
print(nic.ipconfig())
-# 此时可以启动其他网络服务,并通过以太网进行网络访问
+# 此时可以启动其他网络服务,并通过以太网进行网络访问。
...
```
@@ -39,21 +37,21 @@ print(nic.ipconfig())
import ethernet
import dataCall
-# 加载对应的网卡驱动,并初始化网卡相关配置,driver替换成实际对应的网卡驱动
+# 加载对应的网卡驱动,并初始化网卡相关配置,driver替换成实际对应的网卡驱动。
nic = ethernet.diver(...)
print(nic.ipconfig())
-# 获取当前4G拨号ip信息
+# 获取当前4G拨号ip信息。
lte=dataCall.getInfo(1, 0)
print(lte)
if lte[2][0] == 1:
- # 设置默认网卡,将4G作为默认网卡
+ # 设置默认网卡,将4G作为默认网卡。
nic.set_default_NIC(lte[2][2])
-#启动网卡
+#启动网卡。
nic.set_up()
-# 此时其他设备可以通过网线连接模组,实现4G上网
+# 此时其他设备可以通过网线连接模组,实现4G上网。
...
```
@@ -64,18 +62,19 @@ nic.set_up()
# 静态ip配置,根据当前已有环境,自定义网络信息。
import ethernet
-# 加载对应的网卡驱动,并初始化网卡相关配置,driver替换成实际对应的网卡驱动
+# 加载对应的网卡驱动,并初始化网卡相关配置,driver替换成实际对应的网卡驱动。
nic = ethernet.diver(...)
print(nic.ipconfig())
-# 配置静态ip地址192.168.0.2,子网掩码255.255.255.0,网关地址192.168.0.1
-nic.set_addr('192.168.0.2','255.255.255.0','')
+# 配置静态ip地址192.168.1.100,子网掩码255.255.255.0,网关地址192.168.1.1。
+nic.set_addr('192.168.1.100','255.255.255.0','192.168.1.1')
print(nic.ipconfig())
-# 启动网卡
+# 启动网卡。
nic.set_up()
-# 终端模式下,此时可以启动其他网络服务,并通过以太网进行网络访问
+# 1. 终端模式下,此时可以启动其他网络服务,并通过以太网进行网络访问。
+# 2. 网关模式下,此时按照上例网关使用说明,配置默认网卡及对端静态ip,即可使用该模块提供网络服务。
...
```
@@ -84,4 +83,4 @@ nic.set_up()
- [class W5500 – W5500驱动](./ethernet.W5500.md)
- [class DM9051 – DM9051驱动](./ethernet.DM9051.md)
- [class CH395 – CH395驱动](./ethernet.CH395.md)
-- [class YT8512H/SZ18201 – YT8512H/SZ18201驱动](./ethernet.YT8512H.md)
+- [class YT8512H – YT8512H驱动](./ethernet.YT8512H.md)
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/example.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/example.md"
index 3af86982735f962483bb84402722efb79be2cdb8..787e9648b6625aeb1ac7b23f8e992653f8899fc2 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/example.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/example.md"
@@ -1,6 +1,6 @@
# example - 执行python脚本
-模块功能:提供方法让用户可以在命令行或者代码中执行python脚本。
+提供方法让用户可以在命令行或者代码中执行python脚本。
### `example.exec`
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/fota.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/fota.md"
index 19c306d2cdb96a5670d88053de586200fcd4497d..bf2d251046d51fc6fddff6b16669acd9e9cf6893 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/fota.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/fota.md"
@@ -5,7 +5,7 @@
**示例**:
```python
-#远程升级,下载完自动重启
+#远程升级,下载完自动重启
import fota
import utime
@@ -37,7 +37,7 @@ if __name__ == '__main__':
```
```python
-#远程升级,下载完不自动重启
+#远程升级,下载完不自动重启
import fota
from misc import Power
@@ -60,17 +60,11 @@ import log
from misc import Power
import uos
-'''
-下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值
-'''
-PROJECT_NAME = "QuecPython_Fota_example"
-PROJECT_VERSION = "1.0.0"
-
# 设置日志输出级别
log.basicConfig(level=log.INFO)
fota_log = log.getLogger("Fota")
-# 此示例需要升级包文件(差分包等.bin文件),且存放到文件系统中
+# 此示例需要升级包文件(差分包等.bin文件),且存放到文件系统中
def run():
fota_obj = fota() # 创建Fota对象
@@ -107,7 +101,7 @@ if __name__ == '__main__':
## 初始化相关功能
-### fota
+### `fota`
```python
fota(reset_disable=)
@@ -123,9 +117,11 @@ fota(reset_disable=)
- fota对象。
-**注意**:
-EC600N/EC800N/EG912N/EC600M/EC800M/EG810M平台不支持关闭下载完升级包后自动重启功能。
+
+> EC600N/EC800N/EG912N/EC600M/EC800M/EG810M型号不支持关闭下载完升级包后自动重启功能。
+
+
**示例**:
@@ -139,7 +135,7 @@ fota_obj = fota() #下载完自动重启
一个接口实现升级包下载和升级整个过程。
-### fota_obj.httpDownload
+### `fota_obj.httpDownload`
```python
fota_obj.httpDownload(url1=, url2=, callback=)
@@ -149,8 +145,8 @@ fota_obj.httpDownload(url1=, url2=, callback=)
**参数描述:**
-- `url1`-可选参数,升级包的url,该url类型可以是HTTP或FTP,类型为str。注:仅EC200A平台支持FTP url。
-- `url2`-可选参数,mini fota第二阶段升级包的url,类型为str。注:仅mini fota方式需要传入该参数,差分升级方式该参数禁止传入。mini fota方式为小存储平台特殊的固件升级方式,分为2个阶段。而差分升级方式只有一个阶段,仅EC600N/EC800N/EG912N/EC600M/EC800M/EG810M平台支持mini fota方式。
+- `url1`-可选参数,升级包的url,该url类型可以是HTTP或FTP,类型为str。注:仅EC200A型号支持FTP url。
+- `url2`-可选参数,mini fota第二阶段升级包的url,类型为str。注:仅mini fota方式需要传入该参数,差分升级方式该参数禁止传入。mini fota方式为小存储平台特殊的固件升级方式,分为2个阶段。而差分升级方式只有一个阶段,仅EC600N/EC800N/EG912N/EC600M/EC800M/EG810M型号支持mini fota方式。
- `callback`-可选参数,回调函数,显示下载进度和状态,类型为function。注:mini fota方式不支持回调函数。回调函数参数含义如下。
| callback参数 | 参数类型 | 参数说明 |
@@ -160,7 +156,7 @@ fota_obj.httpDownload(url1=, url2=, callback=)
**返回值描述:**
-- 执行成功返回整形值0,执行失败返回整形值-1。注:EC600N/EC800N/EG912N/EC600M/EC800M/EG810M/BC25PA平台,返回值只代表接口执行成功或失败,升级状态和结果需通过回调反馈。其他平台返回0表示下载和校验成功,返回-1表示下载或校验失败。
+- 执行成功返回整形值0,执行失败返回整形值-1。注:EC600N/EC800N/EG912N/EC600M/EC800M/EG810M/BC25PA型号,返回值只代表接口执行成功或失败,升级状态和结果需通过回调反馈。其他型号返回0表示下载和校验成功,返回-1表示下载或校验失败。
**示例**:
@@ -171,12 +167,12 @@ def result(args):
#差分升级HTTP方式
fota_obj.httpDownload(url1="http://www.example.com/fota.bin",callback=result)
#差分升级FTP方式
-fota_obj.httpDownload(url1="ftp://user:password@ip:port/fota.bin",callback=result) #其中user、password、ip、port需要填写具体使用的FTP服务器信息
+fota_obj.httpDownload(url1="ftp://user:password@ip:port/fota.bin",callback=result) #其中user,password,ip,port需要填写具体使用的FTP服务器信息
#mini fota方式
fota_obj.httpDownload(url1="http://www.example.com/fota1.bin",url2="http://www.example.com/fota2.bin")
```
-### fota_obj.apn_set
+### `fota_obj.apn_set`
```python
fota_obj.apn_set(fota_apn=,ip_type=,fota_user=,fota_password=)
@@ -201,11 +197,13 @@ fota_obj.apn_set(fota_apn=,ip_type=,fota_user=,fota_password=)
fota_obj.apn_set(fota_apn="CMNET",ip_type=0,fota_user="abc",fota_password="123")
```
-**注意**:
-该接口目前支持平台:BG95。
-### fota_obj.download_cancel
+> 该接口目前支持型号:BG95。
+
+
+
+### `fota_obj.download_cancel`
```python
fota_obj.download_cancel()
@@ -225,7 +223,7 @@ import _thread
import utime
def th_func():
- utime.sleep(40) #时间根据升级包的大小来定,确保在下载完之前取消
+ utime.sleep(40) #时间根据升级包的大小来定,确保在下载完之前取消
fota_obj.download_cancel()
def result(args):
@@ -236,15 +234,17 @@ _thread.start_new_thread(th_func, ())
fota_obj.httpDownload(url1="http://www.example.com/fota.bin",callback=result)
```
-**注意**:
-该接口目前支持平台:BG95。
+
+> 该接口目前支持型号:BG95。
+
+
## 本地升级相关功能
已经获取到升级包内容,调用如下接口实现升级包内容写入flash、校验及重启升级。
-### fota_obj.write
+### `fota_obj.write`
```python
fota_obj.write(bytesData, file_size)
@@ -261,7 +261,7 @@ fota_obj.write(bytesData, file_size)
- 写入成功返回整型值0,写入失败返回整型值-1。
-### fota_obj.flush
+### `fota_obj.flush`
```python
fota_obj.flush()
@@ -273,7 +273,7 @@ fota_obj.flush()
- 刷新成功返回整型值0,刷新失败返回整型值-1。
-### fota_obj.verify
+### `fota_obj.verify`
```python
fota_obj.verify()
@@ -285,7 +285,8 @@ fota_obj.verify()
- 升级包校验成功返回整型值0,校验失败返回整型值-1。
-**注意**:
-本地升级相关功能,目前支持平台:EC600NCNLC/EC600NCNLF/EG912N/EC600U/EC200U/EG915U/EG912U/EC800G/EC600E/EC800E。
+
+> 本地升级相关功能,目前支持型号:EC600NCNLC/EC600NCNLF/EG912N/EC600U/EC200U/EG915U/EG912U/EC800G/EC600E/EC800E。
+>
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/gnss.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/gnss.md"
index 2170f82e26bc7bcc7ef4495f0534c49128d904c0..62143181b577fa9baff3185cfd7ad9f33ab18aab 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/gnss.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/gnss.md"
@@ -2,7 +2,8 @@
对L76K GPS型号(或数据类型与之类似的GPS模组)进行数据获取,可以得到模块定位是否成功,定位的经纬度数据,UTC授时时间,获取GPS模块的定位模式,获取GPS模块定位使用卫星数量,获取GPS模块定位可见卫星数量,获取定位方位角,GPS模块对地速度,模块定位大地高等数据信息。目前,该模块提供的功能接口,所获取的数据都来源于从串口读出的原始GNSS数据包中的GNGGA、GNRMC和GPGSV语句。
-注意:当前仅EC600S/EC600N/EC800N/200U/600U/600M/800M模块支持该功能。
+> 当前仅EC600S/EC600N/EC800N/200U/600U/600M/800M模块支持该功能
+>
## 创建gnss对象
@@ -17,19 +18,18 @@ gnss.GnssGetData(uartn,baudrate,databits,parity,stopbits,flowctl)
**参数描述**
* `uartn`,int类型
- UARTn范围为0-3:
- `0`-UART0 - DEBUG PORT
- `1`-UART1 – BT PORT
- `2`-UART2 – MAIN PORT
- `3`-UART3 – USB CDC PORT
+ uartn
+ `0`-uart0 - DEBUG PORT
+ `1`-uart1 – BT PORT
+ `2`-uart2 – MAIN PORT
+ `3`-uart3 – USB CDC PORT
* `baudrate`,int类型,常用波特率都支持,如4800、9600、19200、38400、57600、115200、230400等
* `databits`,int类型,数据位(5 ~ 8),ECX00U系列平台当前仅支持8位
* `parity`,int类型,奇偶校验(0 – NONE,1 – EVEN,2 - ODD)
* `stopbits`,int类型,停止位(1 ~ 2)
* `flowctl`,int类型,硬件控制流(0 – FC_NONE, 1 – FC_HW)
-**返回值描述**
-gnss类的对象
+**返回值描述**
gnss类的对象
**示例**
@@ -139,7 +139,7 @@ GNSS模块提供的功能接口,所获取的数据都来源于从串口读出
**返回值描述**
-返回一个元组,形式为 ` (gga_valid, rmc_valid, gsv_valid)`
+返回一个列表,形式为 ` (gga_valid, rmc_valid, gsv_valid)`
`gga_valid` - 表示本次读取解析,是否匹配到GNGGA数据并解析成功,0表示没有匹配到GNGGA数据或数据无效,1表示有效;
@@ -311,7 +311,8 @@ gnss.getCourse()
获取GNSS信息中携带的卫星方位角
**返回值描述**
-返回所有可视的GNSS卫星方位角,范围:`0 ~ 359`,以正北为参考平面。返回形式为字典,其中key表示卫星编号,value表示方位角。要注意,value的值可能是一个整型值,也可能是"",这取决于原始的GNSS数据中GPGSV语句中方位角是否有值。返回值形式如下:
+
+返回所有可视的GNSS卫星方位角,范围:`0 ~ 359`,以正北为参考平面。返回形式为字典,其中key表示卫星编号,value表示方位角。要注意,value的值可能是一个整型值,也可能是空,这取决于原始的GNSS数据中GPGSV语句中方位角是否有值,如获取失败返回-1。返回值形式如下:
`{key:value, ..., key:value}`
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.ExtInt.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.ExtInt.md"
index 40b2acaa7f85a6d5a58532b9cefaaeb2d6f0e9e9..bb3ced66f1baaf0cb28730ed94d0ab4e3d2e6370 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.ExtInt.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.ExtInt.md"
@@ -1,6 +1,6 @@
-# `class ExtInt` - 外部中断
+# class ExtInt - 外部中断
-类功能:用于配置I/O引脚在发生外部事件时中断。
+该类用于配置I/O引脚在发生外部事件时中断。
## 构造函数
@@ -10,7 +10,7 @@
class machine.ExtInt(GPIOn, mode, pull, callback)
```
-**参数:**
+**参数描述:**
- `GPIOn` - 需要控制的GPIO引脚号,int类型,参照[Pin模块](./machine.Pin.md)的引脚定义(除BG95M3外),点此查看BG95M3平台引脚对应关系
@@ -45,7 +45,7 @@ extint.enable()
该方法用于使能中断,使能extint对象外部中断,当中断引脚收到上升沿或者下降沿信号时,会调用callback执行。
-**返回值:**
+**返回值描述:**
使能成功返回整型值`0`,使能失败返回整型值`-1`。
@@ -57,7 +57,7 @@ extint.disable()
该方法用于关闭中断,禁用与extint对象关联的中断 。
-**返回值:**
+**返回值描述:**
使能成功返回整型值`0`,使能失败返回整型值`-1`。
@@ -69,7 +69,7 @@ extint.line()
该方法用于读取引脚映射行号。
-**返回值:**
+**返回值描述:**
返回引脚映射的行号。
@@ -89,11 +89,11 @@ extint.read_count(is_reset)
该方法用于返回触发中断的次数。
-**参数:**
+**参数描述:**
- `is_reset` - 读取后是否重置计数,int类型,`0`表示不重置,`1`表示重置。
-**返回值:**
+**返回值描述:**
返回列表 `[rising_count, falling_count]`
`rising_count`:上升沿触发次数
`falling_count`:下降沿触发次数
@@ -105,7 +105,7 @@ extint.count_reset()
该方法用于清空触发中断的次数。
-**返回值:**
+**返回值描述:**
返回`0`表示成功,返回其他表示失败。
@@ -117,6 +117,6 @@ extint.read_level()
该方法用于读取当前引脚电平。
-**返回值:**
+**返回值描述:**
-返回引脚电平,`0`表示获取到的引脚电平为低,`1` 表示获取到的引脚电平为高。
\ No newline at end of file
+返回引脚电平,`0`表示获取到的引脚电平为低电平,`1` 表示获取到的引脚电平为高电平。
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.I2C.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.I2C.md"
index 12c909a29301923ff21e16a188d88d18b4089ba2..db9592dfd68eab88addb64bc2f0f2ebc1d87998a 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.I2C.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.I2C.md"
@@ -1,6 +1,6 @@
# class I2C – I2C通信
-类功能:用于设备之间通信的双线协议。
+该类用于设备之间通信的双线协议。
## 构造函数
@@ -10,23 +10,23 @@
class machine.I2C(I2Cn, MODE)
```
-**参数说明:**
+**参数描述:**
-- `I2Cn` - i2c 通路索引号,int类型,说明如下:
I2C.I2C0 : 0
I2C.I2C1 : 1
I2C.I2C2 : 2
点此查看I2C引脚对应关系
+- `I2Cn` - I2C 通路索引号,int类型,说明如下:
`I2C0` : `0` - 通道0
`I2C1` : `1` - 通道1
`I2C2` : `2` - 通道2
-- `MODE` - i2c 的工作模式,int类型,说明如下:
I2C.STANDARD_MODE : `0` - 标准模式
I2C.FAST_MODE :`1` - 快速模式
+- `MODE` - I2C 的工作模式,int类型,说明如下:
`STANDARD_MODE` : `0` - 标准模式
`FAST_MODE` :`1` - 快速模式
**示例:**
```python
-from machine import I2C
-# 创建I2C对象
-i2c_obj = I2C(I2C.I2C0, I2C.STANDARD_MODE) # 返回i2c对象
+>>> from machine import I2C
+>>> # 创建I2C对象
+>>> i2c_obj = I2C(I2C.I2C0, I2C.STANDARD_MODE) # 返回I2C对象
```
-**引脚对应关系:**
+**I2C引脚对应关系:**
-| 平台 | |
+| 平台 | 引脚 |
| ------------- | ------------------------------------------------------------ |
| EC600U | I2C0:
SCL: 引脚号11
SDA: 引脚号12
I2C1:
SCL:引脚号57
SDA:引脚号56 |
| EC200U | I2C0:
SCL: 引脚号41
SDA: 引脚号42
I2C1:
SCL:引脚号141
SDA:引脚号142 |
@@ -51,16 +51,16 @@ I2C.read(slaveaddress, addr,addr_len, r_data, datalen, delay)
该方法用于从 I2C 总线中读取数据。
-**参数说明:**
+**参数描述:**
-- `slaveaddress` - i2c 设备地址,int类型。
-- `addr` - i2c 寄存器地址,bytearray类型。
+- `slaveaddress` - I2C 设备地址,int类型。
+- `addr` - I2C 寄存器地址,bytearray类型。
- `addr_len` - 寄存器地址长度,int类型。
-- `r_data` - 接收数据的字节数组,bytearray类型
+- `r_data` - 接收数据的字节数组,bytearray类型。
- `datalen` - 字节数组的长度,int类型。
-- `delay` - 延时,数据转换缓冲时间(单位ms),int类型。
+- `delay` - 延时,数据转换缓冲时间(单位ms),int类型。
-**返回值:**
+**返回值描述:**
成功返回整型值`0`,失败返回整型值`-1`。
@@ -72,21 +72,21 @@ I2C.write(slaveaddress, addr, addr_len, data, datalen)
该方法用于从 I2C 总线中写入数据。
-**参数说明:**
+**参数描述:**
-- `slaveaddress` - i2c 设备地址,int类型。
-- `addr` - i2c 寄存器地址,bytearray类型。
+- `slaveaddress` - I2C 设备地址,int类型。
+- `addr` - I2C 寄存器地址,bytearray类型。
- `addr_len` - 寄存器地址长度,int类型。
- `data` - 写入的数据,bytearray类型。
- `datalen` - 写入数据的长度,int类型。
-**返回值:**
+**返回值描述:**
成功返回整型值`0`,失败返回整型值`-1`。
**使用示例:**
-> 注意:需要连接设备使用!
+> 需要连接设备使用。
```python
import log
@@ -110,11 +110,11 @@ i2c_log = log.getLogger("I2C")
if __name__ == '__main__':
- I2C_SLAVE_ADDR = 0x1B # i2c 设备地址
- WHO_AM_I = bytearray([0x02, 0]) # i2c 寄存器地址,以buff的方式传入,取第一个值,计算一个值的长度
+ I2C_SLAVE_ADDR = 0x1B # I2C 设备地址
+ WHO_AM_I = bytearray([0x02, 0]) # I2C 寄存器地址,以buff的方式传入,取第一个值,计算一个值的长度
data = bytearray([0x12, 0]) # 输入对应指令
- i2c_obj = I2C(I2C.I2C0, I2C.STANDARD_MODE) # 返回i2c对象
+ i2c_obj = I2C(I2C.I2C0, I2C.STANDARD_MODE) # 返回I2C对象
i2c_obj.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2) # 写入data
r_data = bytearray(2) # 创建长度为2的字节数组接收
@@ -124,12 +124,12 @@ if __name__ == '__main__':
```
-# 常量
+## 常量
-| 常量 | | 适用平台 |
-| ----------------- | ----------------- | ------------------------------------------------------------ |
-| I2C.I2C0 | i2c 通路索引号: 0 | EC100Y/EC600U/EC200U/EC200A/BC25PA/EC800N/BG95M3/EC600M/EG915U/EC800M |
-| I2C.I2C1 | i2c 通路索引号: 1 | EC600S/EC600N/EC600U/EC200U/BC25PA/BG95M3/EC600M/EG915U/EC800M/EG912N |
-| I2C.I2C2 | i2c 通路索引号: 2 | BG95M3/EC600M |
-| I2C.STANDARD_MODE | 标准模式 | |
-| I2C.FAST_MODE | 快速模式 | |
\ No newline at end of file
+| 常量 | 说明 | 适用平台 |
+| ----------------- | ---------------- | ------------------------------------------------------------ |
+| I2C.I2C0 | I2C通路索引号: 0 | EC100Y/EC600U/EC200U/EC200A/BC25PA/EC800N/BG95M3/EC600M/EG915U/EC800M |
+| I2C.I2C1 | I2C通路索引号: 1 | EC600S/EC600N/EC600U/EC200U/BC25PA/BG95M3/EC600M/EG915U/EC800M/EG912N |
+| I2C.I2C2 | I2C通路索引号: 2 | BG95M3/EC600M |
+| I2C.STANDARD_MODE | 标准模式 | 所有平台 |
+| I2C.FAST_MODE | 快速模式 | 所有平台 |
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.I2C_simulation.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.I2C_simulation.md"
index 213fc4b70e488b2e90497908c76e5a104e61aa20..1fe7debce8c14ae239bf22ab4f672fcb126fc141 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.I2C_simulation.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.I2C_simulation.md"
@@ -1,27 +1,27 @@
# class I2C_simulation - 模拟I2C通信
-类功能:用于gpio模拟标准i2c协议。除了创建对象外,其它的操作(读写)均与I2C通信一致。
+该类用于gpio模拟标准I2C协议,除了创建对象外,其它的操作(读写)均与I2C通信一致。
## 构造函数
-### `machine.I2C`_simulation
+### `machine.I2C_simulation`
```python
class machin.I2C_simulation(GPIO_clk, GPIO_sda, CLK)
```
-**参数说明:**
+**参数描述:**
-- `GPIO_clk` - i2c的CLK引脚(需要控制的GPIO引脚号,参照Pin模块的定义),int类型。
-- `GPIO_sda` - i2c的SDA引脚(需要控制的GPIO引脚号,参照Pin模块的定义),int类型。
-- `CLK` - i2c的频率,范围:(0,1000000Hz],int类型。
+- `GPIO_clk` - I2C 的CLK引脚(需要控制的GPIO引脚号,参照[Pin模块](machine.Pin.md)的定义),int类型。
+- `GPIO_sda` - I2C 的SDA引脚(需要控制的GPIO引脚号,参照[Pin模块](machine.Pin.md)的定义),int类型。
+- `CLK` - I2C 的频率,范围:(0,1000000Hz],int类型。
**示例:**
```python
-from machine import I2C_simulation
-# 创建I2C_simulation对象
-i2c_obj = I2C_simulation(I2C_simulation.GPIO10, I2C_simulation.GPIO11, 300) # 返回i2c对象
+>>> from machine import I2C_simulation
+>>> # 创建I2C_simulation对象
+>>> i2c_obj = I2C_simulation(I2C_simulation.GPIO10, I2C_simulation.GPIO11, 300) # 返回I2C对象
```
## 方法
@@ -34,16 +34,16 @@ I2C_simulation.read(slaveaddress, addr,addr_len, r_data, datalen, delay)
该方法用于从 I2C 总线中读取数据。
-**参数说明:**
+**参数描述:**
-- `slaveaddress` - i2c 设备地址,int类型。
-- `addr` - i2c 寄存器地址,bytearray类型。
+- `slaveaddress` - I2C 设备地址,int类型。
+- `addr` - I2C 寄存器地址,bytearray类型。
- `addr_len` - 寄存器地址长度,int类型。
-- `r_data` - 接收数据的字节数组,bytearray类型
+- `r_data` - 接收数据的字节数组,bytearray类型。
- `datalen` - 字节数组的长度,int类型。
-- `delay` - 延时,数据转换缓冲时间(单位ms),int类型。
+- `delay` - 延时,数据转换缓冲时间(单位ms),int类型。
-**返回值:**
+**返回值描述:**
成功返回整型值`0`,失败返回整型值`-1`。
@@ -55,22 +55,20 @@ I2C_simulation.write(slaveaddress, addr, addr_len, data, datalen)
该方法用于从 I2C 总线中写入数据。
-**参数说明:**
+**参数描述:**
-- `slaveaddress` - i2c 设备地址,int类型。
-- `addr` - i2c 寄存器地址,bytearray类型。
+- `slaveaddress` - I2C 设备地址,int类型。
+- `addr` - I2C 寄存器地址,bytearray类型。
- `addr_len` - 寄存器地址长度,int类型。
- `data` - 写入的数据,bytearray类型。
- `datalen` - 写入数据的长度,int类型。
-**返回值:**
+**返回值描述:**
成功返回整型值`0`,失败返回整型值`-1`。
**使用示例:**
-该示例是驱动AHT10获取温湿度。
-
```python
import log
#from machine import I2C
@@ -84,8 +82,8 @@ import utime as time
# API 手册 http://qpy.quectel.com/wiki/#/zh-cn/api/?id=i2c
# AHT10 说明书
-# https://server4.eca.ir/eshop/AHT10/Aosong_AHT10_en_draft_0c.pdf
-
+# https://server4.eca.ir/eshop/AHT10/Aosong_AHT10_en_draft_0c.pdf
+# 该示例是驱动AHT10获取温湿度数据
class aht10class():
i2c_log = None
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.KeyPad.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.KeyPad.md"
index 0ed5173d1aea624269feec39f51d466899c1c051..c42e088edc798d7a15ff339992f6e7c12b65e687 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.KeyPad.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.KeyPad.md"
@@ -1,10 +1,9 @@
# class KeyPad - 矩阵键盘
-模块功能:提供矩阵键盘接口。
+该类提供矩阵键盘接口。
-> 支持平台:EC600SCN_LB/ EC800NCN_LA/ EC600NCN_LC/ EC200UCN_LB/ EC600UCN_LB/ EC600MCN_LA/ EC800MCN_LA/ EC800MCN_GA/ EG912NEN_AA
+> 支持型号:EC600SCN_LB/ EC800NCN_LA/ EC600NCN_LC/ EC200UCN_LB/ EC600UCN_LB/ EC600MCN_LA/ EC800MCN_LA/ EC800MCN_GA/ EG912NEN_AA
>
-> EC200U最大支持4X3,EC600U最大支持6X6。
## 构造函数
@@ -14,12 +13,12 @@
class machine.KeyPad(row,col)
```
-**参数:**
+**参数描述:**
-- row - 行号,int类型,大于0,不超过平台支持最大值
-- col - 列号,int类型,大于0,不超过平台支持最大值
+- `row` - 行号,int类型,大于0,不超过平台支持最大值。
+- `col` - 列号,int类型,大于0,不超过平台支持最大值。
-> 注意:如果row和col均不设置,默认为4X4.
+> 如果row和col均不设置,默认为4X4.
| 平台 | 最大行 | 最大列 |
| ------------- | ------ | ------ |
@@ -31,9 +30,9 @@ class machine.KeyPad(row,col)
| EC800M | 5 | 5 |
| EG912N | 3 | 3 |
-**引脚说明:**
+**KeyPad引脚对应关系:**
-> 注意:当不使用全部引脚时,接线按行列号从小到大顺序接线,比如EC600M使用2x2矩阵键盘时,硬件使用49、51和48、50引脚。
+> 当不使用全部引脚时,接线按行列号从小到大顺序接线,比如EC600M使用2x2矩阵键盘时,硬件使用49、51和48、50引脚。
| 平台 | 引脚 |
| ------ | ------------------------------------------------------------ |
@@ -44,11 +43,11 @@ class machine.KeyPad(row,col)
**示例:**
```python
->>># 创建keypad对象
->>>import machine
->>>keypad=machine.KeyPad(2,3) # 矩阵键盘设置为2行3列矩阵键盘
->>>keypad=machine.KeyPad() # 不设置,默认设置为4行4列矩阵键盘
->>>keypad=machine.KeyPad(2) # 行值设置为2,不设置列值,列值默认为4,2行4列矩阵键盘
+>>> # 创建keypad对象
+>>> import machine
+>>> keypad=machine.KeyPad(2,3) # 设置为2行3列矩阵键盘
+>>> keypad=machine.KeyPad() # 参数缺省,默认设置为4行4列矩阵键盘
+>>> keypad=machine.KeyPad(2) # 行值设置为2,列值缺省,列值默认为4,初始化为2行4列矩阵键盘
```
## 方法
@@ -61,9 +60,9 @@ keypad.init()
该方法用于初始化keypad设置。
-**返回值:**
+**返回值描述:**
-成功返回`0`,失败返回`-1`。
+设置成功返回整型值`0`,设置失败返回整型值`-1` 。
### `keypad.set_callback`
@@ -71,16 +70,27 @@ keypad.init()
keypad.set_callback(usrFun)
```
-该方法用于设置回调函数,按键接入模组后,按放按键后触发回调函数设置。
+该方法用于设置回调函数,外接按键接入模组后,当外接键盘按键按放时会触发此回调函数。
-**参数:**
+**参数描述:**
-- usrFun - 回调函数,functio类型,说明如下:
当外接键盘按键按放会触发此函数。
usrFun参数为list数据类型,list包含三个参数。
其含义如下:
list[0]: 1表示按下,0表示抬起
list[1] : row
list[2] : col
+- `usrFun` - 矩阵键盘回调函数,回调函数原型:
+ ```
+ usrFun(result_list)
+ ```
-**返回值:**
+ 回调函数参数描述:
-成功返回`0`。
+ - `result_list[0]`:按键状态(1表示按下,0表示抬起)
+
+ - `result_list[1]`:行号
+
+ - `result_list[2]`:列号
+
+**返回值描述:**
+
+设置成功返回整型值`0`,设置失败返回整型值`-1` 。
### `keypad.deinit`
@@ -90,9 +100,9 @@ keypad.deinit()
该方法用于解除初始化,释放初始化的资源和回调函数设置。
-**返回值:**
+**返回值描述:**
-成功返回`0`,失败返回`-1`。
+设置成功返回整型值`0`,设置失败返回整型值`-1` 。
**使用示例:**
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.LCD.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.LCD.md"
index c12879903c01142811b75b90dc16bb97d7a5a996..d2e8f916402da63282e54abbb674192e0e9746c1 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.LCD.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.LCD.md"
@@ -1,10 +1,18 @@
# class LCD - LCD显示屏
-类功能:该模块提供对LCD显示屏的控制
+该类提供对LCD显示屏的控制。
-适配版本:EC100Y(V0009)及以上;EC600S(V0002)及以上。
-
-> 注意:BC25PA平台不支持此模块功能。
+> 支持的平台和模块型号:
+>
+> EC200U系列、EC600U系列、EC600N系列、EC800N系列
+>
+> EC600M-CNLA、EC600M-CNLE
+>
+> EC800M-CNLA、EC800M-CNLE、EC800M-CNGA、EC800G-CNGA
+>
+> EG912N-ENAA、EG912U-GLAA
+>
+> EG915N-EUAG、EG915U-EUAB
## 构造函数
@@ -17,8 +25,8 @@ class machine.lcd = LCD()
**示例:**
```python
-from machine import LCD
-lcd = LCD() # 创建lcd对象
+>>> from machine import LCD
+>>> lcd = LCD() # 创建lcd对象
```
## 方法
@@ -38,28 +46,28 @@ lcd.lcd_init(lcd_init_data, lcd_width, lcd_hight, lcd_clk, data_line, line_num,
| 参数 | 类型 | 说明 |
| ------------------ | --------- | ------------------------------------------------------------ |
| lcd_init_data | bytearray | LCD 的初始化配置命令 |
-| lcd_width | int | LCD 屏幕的宽度。宽度不超过 500 |
-| lcd_hight | int | LCD 屏幕的高度。高度不超过 500 |
-| lcd_clk | int | LCD SPI 时钟。SPI 时钟为 6.5K/13K/26K/52K |
-| data_line | int | 数据线数。参数值为 1 和 2。 |
-| line_num | int | 线的数量。参数值为 3 和 4。 |
-| lcd_type | int | 屏幕类型。0:rgb;1:fstn |
+| lcd_width | int | LCD 屏幕的宽度,宽度不超过 500 |
+| lcd_hight | int | LCD 屏幕的高度,高度不超过 500 |
+| lcd_clk | int | LCD SPI 时钟,SPI 时钟为 6.5K/13K/26K/52K |
+| data_line | int | 数据线数,参数值为 1 和 2 |
+| line_num | int | 线的数量,参数值为 3 和 4 |
+| lcd_type | int | 屏幕类型,0 - rgb;1 - fstn |
| lcd_invalid | bytearray | LCD 区域设置的配置命令 |
| lcd_display_on | bytearray | LCD 屏亮的配置命令 |
| lcd_display_off | bytearray | LCD 屏灭的配置命令 |
-| lcd_set_brightness | bytearray | LCD屏亮度的配置命令。
设置为 None表示由 LCD_BL_K 控制亮度(有些屏幕是由寄存器控制屏幕亮度,有些是通过 LCD_BL_K 控制屏幕亮度) |
+| lcd_set_brightness | bytearray | LCD屏亮度的配置命令:
设置为 None表示由 LCD_BL_K 控制亮度 |
**返回值描述:**
-`0` 表示成功
+`0` 表示成功。
-`-1`表示已经初始化
+`-1` 表示已经初始化。
-`-2` 表示参数错误,为空或过大(大于 1000 像素点)
+`-2` 表示参数错误,为空或过大(大于 1000 像素点)。
-`-3`表示缓存申请失败
+`-3` 表示缓存申请失败。
-`-5`表示配置参数错误
+`-5` 表示配置参数错误。
#### **接口2:设备接模块SPI接口**
@@ -72,34 +80,34 @@ lcd.lcd_init(lcd_init_data, lcd_width, lcd_hight, lcd_clk, data_line, line_num,
| 参数 | 类型 | 说明 |
| ------------------ | --------- | ------------------------------------------------------------ |
| lcd_init_data | bytearray | LCD 的配置命令 |
-| lcd_width | int | LCD 屏幕的宽度。宽度不超过 500 |
-| lcd_hight | int | LCD 屏幕的高度。高度不超过 500 |
-| lcd_clk | int | SPI 时钟。见machine SPI 创建SPI对象参数说明clk |
-| data_line | int | 数据线数。参数值为 1 和 2。 |
-| line_num | int | 线的数量。参数值为 3 和 4。 |
-| lcd_type | int | 屏幕类型。0:rgb;1:fstn |
+| lcd_width | int | LCD 屏幕的宽度,宽度不超过 500 |
+| lcd_hight | int | LCD 屏幕的高度,高度不超过 500 |
+| lcd_clk | int | SPI 时钟,见machine.SPI 创建SPI对象参数说明clk |
+| data_line | int | 数据线数,参数值为 1 和 2 |
+| line_num | int | 线的数量,参数值为 3 和 4 |
+| lcd_type | int | 屏幕类型,0 - rgb;1 - fstn |
| lcd_invalid | bytearray | LCD 区域设置的配置命令 |
| lcd_display_on | bytearray | LCD 屏亮的配置命令 |
| lcd_display_off | bytearray | LCD 屏灭的配置命令 |
-| lcd_set_brightness | bytearray | LCD屏亮度的配置命令。设置为 None表示由 LCD_BL_K 控制亮度(有些屏幕是由寄存器控制屏幕亮度,有 些是通过 LCD_BL_K 控制屏幕亮度) |
-| lcd_interface | int | LCD接口类型。0:LCM接口;1:SPI接口 |
+| lcd_set_brightness | bytearray | LCD屏亮度的配置命令:
设置为 None表示由 LCD_BL_K 控制亮度 |
+| lcd_interface | int | LCD接口类型,0 - LCM接口;1 - SPI接口 |
| spi_port | int | 通道选择[0,1],参照SPI部分 |
-| spi_mode | int | SPI 的工作模式(模式0最常用):
时钟极性CPOL: 即SPI空闲时,时钟信号SCLK的电平(0:空闲时低电平; 1:空闲时高电平)
0 : CPOL=0, CPHA=0
1 : CPOL=0, CPHA=1
2: CPOL=1, CPHA=0
3: CPOL=1, CPHA=1 |
-| cs_pin | int | CS引脚,见machine.Pin常量说明 |
-| dc_pin | int | DC引脚,见machine.Pin常量说明 |
-| rst_pin | int | RST引脚,见machine.Pin常量说明 |
+| spi_mode | int | SPI 的工作模式(通常使用工作模式0):
时钟极性CPOL:即SPI空闲时,时钟信号SCLK的电平(0:空闲时低电平; 1:空闲时高电平)
0 : CPOL=0, CPHA=0
1 : CPOL=0, CPHA=1
2 : CPOL=1, CPHA=0
3 : CPOL=1, CPHA=1 |
+| cs_pin | int | CS引脚,见[machine.Pin](machine.Pin.md)中GPIO引脚编号说明 |
+| dc_pin | int | DC引脚,见[machine.Pin](machine.Pin.md)中GPIO引脚编号说明 |
+| rst_pin | int | RST引脚,见[machine.Pin](machine.Pin.md)中GPIO引脚编号说明 |
**返回值描述:**
-`0` 表示成功
+`0` 表示成功。
-`-1`表示屏幕已经初始化
+`-1` 表示屏幕已经初始化。
-`-2` 表示参数错误,为空或过大(大于 1000 像素点)
+`-2` 表示参数错误,为空或过大(大于 1000 像素点)。
-`-3`表示缓存申请失败
+`-3` 表示缓存申请失败。
-`-5`表示配置参数错误
+`-5` 表示配置参数错误。
### `lcd.mipi_init`
@@ -110,9 +118,7 @@ lcd.mipi_init(initbuf, **kwargs)
该方法用于初始化MIPI,按键值对传参,请根据屏厂提供的初始化参数填写。
-> 注意:
->
-> 1.仅支持EC200U系列和EC600U系列
+> 1.仅支持EC200U系列和EC600U系列。
>
> 2.参数列表中,initbuf为必传参数;后面参数与缺省值不同时传入。
@@ -125,11 +131,11 @@ lcd.mipi_init(initbuf, **kwargs)
| hight | int | 缺省值:854,屏幕的高度,示例:hight=800 |
| bpp | int | 缺省值:16,像素深度 |
| DataLane | int | 缺省值:2,数据通道 |
-| MipiMode | int | 缺省值:0,模式:
0:DSI_VIDEO_MODE;
1:DSI_CMD_MODE |
-| PixelFormat | int | 缺省值:0,像素格式:
0:RGB_PIX_FMT_RGB565;
16:RGB_PIX_FMT_RGB888
32:RGB_PIX_FMT_XRGB888
48:RGB_PIX_FMT_RGBX888 |
-| DsiFormat | int | 缺省值:0,DSI格式:
0:DSI_FMT_RGB565;
1:DSI_FMT_RGB666;
2:DSI_FMT_RGB666L;
3:DSI_FMT_RGB888 |
-| TransMode | int | 缺省值:3,转换模式:
0:DSI_CMD;
1:DSI_PULSE;
2:DSI_EVENT;
3:DSI_BURST |
-| RgbOrder | int | 缺省值:8,RGB顺序:
0:RGB;
8:BGR |
+| MipiMode | int | 缺省值:0
模式:
0:DSI_VIDEO_MODE
1:DSI_CMD_MODE |
+| PixelFormat | int | 缺省值:0
像素格式:
0:RGB_PIX_FMT_RGB565
16:RGB_PIX_FMT_RGB888
32:RGB_PIX_FMT_XRGB888
48:RGB_PIX_FMT_RGBX888 |
+| DsiFormat | int | 缺省值:0
DSI格式:
0:DSI_FMT_RGB565
1:DSI_FMT_RGB666
2:DSI_FMT_RGB666L
3:DSI_FMT_RGB888 |
+| TransMode | int | 缺省值:3
转换模式:
0:DSI_CMD
1:DSI_PULSE
2:DSI_EVENT
3:DSI_BURST |
+| RgbOrder | int | 缺省值:8
RGB顺序:
0:RGB
8:BGR |
| BllpEnable | bool | 缺省值:true,blank low power 模式使能 |
| HSync | int | 缺省值:10,水平同步 |
| HBP | int | 缺省值:10,水平后肩 |
@@ -220,7 +226,7 @@ lcd.lcd_clear(color)
**返回值描述:**
-成功返回`0`, 失败返回`-1`。
+成功返回`0`,失败返回`-1`。
### `lcd.lcd_write`
@@ -232,7 +238,7 @@ lcd.lcd_write(color_buffer,start_x,start_y,end_x,end_y)
**参数描述:**
-- `Color_buffer` - 屏幕的颜色值缓存,bytearray类型。
+- `color_buffer` - 屏幕的颜色值缓存,bytearray类型。
- `start_x` - 起始 x 坐标,int类型。
- `start_y` - 起始 y 坐标,int类型。
- `end_x` - 结束 x 坐标,int类型。
@@ -240,13 +246,13 @@ lcd.lcd_write(color_buffer,start_x,start_y,end_x,end_y)
**返回值描述:**
-`0` 表示成功;
+`0` 表示成功。
-`-1`表示屏幕未初始化;
+`-1` 表示屏幕未初始化。
-`-2` 表示宽度和高度设置错误;
+`-2` 表示宽度和高度设置错误。
-`-3`表示数据缓存为空。
+`-3 ` 表示数据缓存为空。
### `lcd.lcd_brightness`
@@ -270,7 +276,7 @@ lcd.lcd_brightness(level)
lcd.lcd_display_on()
```
-该方法用于打开屏显 。调用此接口后调用 lcd.lcd_init()中的 lcd_display_on 回调。
+该方法用于打开屏显 ,调用此接口后调用 lcd.lcd_init()中的 lcd_display_on 回调。
**返回值描述:**
@@ -279,10 +285,10 @@ lcd.lcd_display_on()
### `lcd.lcd_display_off`
```python
-**lcd.lcd_display_off()**
+lcd.lcd_display_off()
```
-该方法用于关闭屏显 。调用此接口后调用 lcd.lcd_init()中的 lcd_display_off 回调。
+该方法用于关闭屏显 ,调用此接口后调用 lcd.lcd_init()中的 lcd_display_off 回调。
**返回值描述:**
@@ -299,7 +305,7 @@ lcd.lcd_write_cmd(cmd_value, cmd_value_len)
**参数描述:**
- `cmd_value` - 命令值 ,16进制 。
-- `cmd_value_len` - 命令值长度,int类型。
+- `cmd_value_len` - 命令值长度,int类型。
**返回值描述:**
@@ -315,8 +321,8 @@ lcd.lcd_write_data(data_value, data_value_len)
**参数描述:**
-- `data_value` - 数据值,16进制。
-- `data_value_len` - 数据值长度,int类型。
+- `data_value` - 数据值,16进制。
+- `data_value_len` - 数据值长度,int类型。
**返回值描述:**
@@ -328,17 +334,17 @@ lcd.lcd_write_data(data_value, data_value_len)
lcd.lcd_show(file_name, start_x,start_y,width,hight)
```
-该方法用于采用读文件方式,显示图片。
+该方法采用读文件方式,显示图片。
-> 注意:该文件是由Image2Lcd工具生成的bin文件。若勾选包含图像头文件,则width和hight无需填写,也可以是jpeg格式图片
+> 该文件是由Image2Lcd工具生成的bin文件,若勾选包含图像头文件,则width和hight无需填写。
**参数描述:**
- `file_name ` - 需要显示的图片名,str类型。
- `start_x` - 起始x坐标,int类型。
- `start_y` - 起始y坐标,int类型。
-- `width` - 图片宽度(若图片文件包含的头信息,则该处不填,jpeg格式也不需要填),int类型。
-- `hight` - 图片高度(若图片文件包含的头信息,则该处不填,jpeg格式也不需要填),int类型。
+- `width` - 图片宽度(若图片文件包含头信息,则该处不填),int类型。
+- `hight` - 图片高度(若图片文件包含头信息,则该处不填),int类型。
**返回值描述:**
@@ -350,7 +356,7 @@ lcd.lcd_show(file_name, start_x,start_y,width,hight)
lcd.lcd_show_jpg( file_name, start_x,start_y)
```
-该方法用于采用读文件方式,显示jpeg图片。
+该方法采用读文件方式,显示jpeg图片。
**参数描述:**
@@ -364,7 +370,7 @@ lcd.lcd_show_jpg( file_name, start_x,start_y)
**使用示例:**
-> 注意:需要配合LCD屏使用,如下代码以st7789为例!
+> 需要配合LCD屏使用,如下代码以st7789为例。
```python
from machine import LCD
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.Pin.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.Pin.md"
index 02ac930457aef642a24260b00f23a32ee13560c3..7c941af13f6f382ffbf019f5e85b32ec7c007620 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.Pin.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.Pin.md"
@@ -1,6 +1,6 @@
-# `class Pin` - 控制I/O引脚
+# class Pin - 控制I/O引脚
-类功能:GPIO读写操作。引脚是控制I/O引脚的基本对象,它有设置引脚的模式(输入,输出等)、获取和设置数字逻辑电平的方法。
+该类提供GPIO读写操作。引脚是控制I/O的基本对象,它有设置引脚的模式(输入,输出等)、获取和设置数字逻辑电平的方法。
**示例:**
@@ -8,7 +8,7 @@
from machine import Pin
# 创建gpio对象
-gpio1 = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_DISABLE, 0)
+gpio1 = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_DISABLE, 1)
# 获取引脚电平
gpio1.read()
@@ -35,7 +35,7 @@ class machine.Pin(GPIOn, direction, pullMode, level)
**参数描述:**
-- `GPIOn` - GPIO号,int类型,点此查看引脚编号与物理引脚的映射关系。
+- `GPIOn` - GPIO号,int类型,点此查看GPIO引脚编号与物理引脚的映射关系。
- `direction` - 输入输出模式,int类型,`IN` - 输入模式,`OUT` - 输出模式。
- `pullMode` - 上下拉模式,int类型,说明如下:
`PULL_DISABLE` - 浮空模式
`PULL_PU` - 上拉模式
`PULL_PD` - 下拉模式
@@ -44,12 +44,12 @@ class machine.Pin(GPIOn, direction, pullMode, level)
**示例:**
```python
->>> from machine import Pin
>>> # 创建gpio对象
+>>> from machine import Pin
>>> gpio1 = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_DISABLE, 0)
```
-**引脚编号与物理引脚的映射关系:**
+**GPIO引脚编号与物理引脚的映射关系:**
> GPIO对应引脚号说明:文档中提供的GPIO引脚号对应的为模块外部的引脚编号,例如EC100YCN下GPIO1对应引脚号22,这里的引脚号22为模块外部的引脚编号。可参考提供的硬件资料查看模块外部的引脚编号。
@@ -70,7 +70,7 @@ GPIO1 – 引脚号10
GPIO2 – 引脚号11
GPIO3 – 引脚号12
EC600U平台引脚对应关系
-GPIO1 – 引脚号61(不可与GPIO31同时为gpio)
GPIO2 – 引脚号58(不可与GPIO32同时为gpio)
GPIO3 – 引脚号34(不可与GPIO41同时为gpio)
GPIO4 – 引脚号60(不可与GPIO34同时为gpio)
GPIO5 – 引脚号69(不可与GPIO35同时为gpio)
GPIO6 – 引脚号70(不可与GPIO36同时为gpio)
GPIO7 – 引脚号123(不可与GPIO43同时为gpio)
GPIO8 – 引脚号118
GPIO9 – 引脚号9
GPIO10 – 引脚号1(不可与GPIO37同时为gpio)
GPIO11 – 引脚号4(不可与GPIO38同时为gpio)
GPIO12 – 引脚号3(不可与GPIO39同时为gpio)
GPIO13 – 引脚号2(不可与GPIO40同时为gpio)
GPIO14 – 引脚号54
GPIO15 – 引脚号57
GPIO16 – 引脚号56
GPIO17 – 引脚号12
GPIO18 – 引脚号33(不可与GPIO42同时为gpio)
GPIO19 – 引脚号124(不可与GPIO44同时为gpio)
GPIO20 – 引脚号122(不可与GPIO45同时为gpio)
GPIO21 – 引脚号121(不可与GPIO46同时为gpio)
GPIO22 – 引脚号48
GPIO23 – 引脚号39
GPIO24 – 引脚号40
GPIO25 – 引脚号49
GPIO26 – 引脚号50
GPIO27 – 引脚号53
GPIO28 – 引脚号52
GPIO29 – 引脚号51
GPIO30 – 引脚号59(不可与GPIO33同时为gpio)
GPIO31 – 引脚号66(不可与GPIO1同时为gpio)
GPIO32 – 引脚号63(不可与GPIO2同时为gpio)
GPIO33 – 引脚号67(不可与GPIO30同时为gpio)
GPIO34 – 引脚号65(不可与GPIO4同时为gpio)
GPIO35 – 引脚号137(不可与GPIO5同时为gpio)
GPIO36 – 引脚号62(不可与GPIO6同时为gpio)
GPIO37 – 引脚号98(不可与GPIO10同时为gpio)
GPIO38 – 引脚号95(不可与GPIO11同时为gpio)
GPIO39 – 引脚号119(不可与GPIO12同时为gpio)
GPIO40 – 引脚号100(不可与GPIO13同时为gpio)
GPIO41 – 引脚号120(不可与GPIO3同时为gpio)
GPIO42 – 引脚号16(不可与GPIO18同时为gpio)
GPIO43 – 引脚号10(不可与GPIO7同时为gpio)
GPIO44 – 引脚号14(不可与GPIO19同时为gpio)
GPIO45 – 引脚号15(不可与GPIO20同时为gpio)
GPIO46 – 引脚号13(不可与GPIO21同时为gpio)
+GPIO1 – 引脚号61(不可与GPIO31同时为gpio)
GPIO2 – 引脚号58(不可与GPIO32同时为gpio)
GPIO3 – 引脚号34(不可与GPIO41同时为gpio)
GPIO4 – 引脚号60(不可与GPIO34同时为gpio)
GPIO5 – 引脚号69(不可与GPIO35同时为gpio)
GPIO6 – 引脚号70(不可与GPIO36同时为gpio)
GPIO7 – 引脚号123(不可与GPIO43同时为gpio)
GPIO8 – 引脚号118
GPIO9 – 引脚号9(不可与GPIO47同时为gpio)
GPIO10 – 引脚号1(不可与GPIO37同时为gpio)
GPIO11 – 引脚号4(不可与GPIO38同时为gpio)
GPIO12 – 引脚号3(不可与GPIO39同时为gpio)
GPIO13 – 引脚号2(不可与GPIO40同时为gpio)
GPIO14 – 引脚号54
GPIO15 – 引脚号57
GPIO16 – 引脚号56
GPIO17 – 引脚号12
GPIO18 – 引脚号33(不可与GPIO42同时为gpio)
GPIO19 – 引脚号124(不可与GPIO44同时为gpio)
GPIO20 – 引脚号122(不可与GPIO45同时为gpio)
GPIO21 – 引脚号121(不可与GPIO46同时为gpio)
GPIO22 – 引脚号48
GPIO23 – 引脚号39
GPIO24 – 引脚号40
GPIO25 – 引脚号49
GPIO26 – 引脚号50
GPIO27 – 引脚号53
GPIO28 – 引脚号52
GPIO29 – 引脚号51
GPIO30 – 引脚号59(不可与GPIO33同时为gpio)
GPIO31 – 引脚号66(不可与GPIO1同时为gpio)
GPIO32 – 引脚号63(不可与GPIO2同时为gpio)
GPIO33 – 引脚号67(不可与GPIO30同时为gpio)
GPIO34 – 引脚号65(不可与GPIO4同时为gpio)
GPIO35 – 引脚号137(不可与GPIO5同时为gpio)
GPIO36 – 引脚号62(不可与GPIO6同时为gpio)
GPIO37 – 引脚号98(不可与GPIO10同时为gpio)
GPIO38 – 引脚号95(不可与GPIO11同时为gpio)
GPIO39 – 引脚号119(不可与GPIO12同时为gpio)
GPIO40 – 引脚号100(不可与GPIO13同时为gpio)
GPIO41 – 引脚号120(不可与GPIO3同时为gpio)
GPIO42 – 引脚号16(不可与GPIO18同时为gpio)
GPIO43 – 引脚号10(不可与GPIO7同时为gpio)
GPIO44 – 引脚号14(不可与GPIO19同时为gpio)
GPIO45 – 引脚号15(不可与GPIO20同时为gpio)
GPIO46 – 引脚号13(不可与GPIO21同时为gpio)
GPIO47 – 引脚号99(不可与GPIO9同时为gpio)
@@ -113,6 +113,8 @@ GPIO1 – 引脚号30
GPIO2 – 引脚号31
GPIO3 – 引脚号32
GPIO2 – 引脚号5
GPIO3 – 引脚号6
GPIO4 – 引脚号7
GPIO5 – 引脚号18
GPIO6 – 引脚号19
GPIO7 – 引脚号1
GPIO8 – 引脚号16
GPIO9 – 引脚号25
GPIO10 – 引脚号26
GPIO11 – 引脚号27
GPIO12 – 引脚号28
GPIO13 – 引脚号40
GPIO14 – 引脚号41
GPIO15 – 引脚号64
GPIO16 – 引脚号20
GPIO17 – 引脚号21
GPIO18 – 引脚号30
GPIO19 – 引脚号34
GPIO20 – 引脚号35
GPIO21 – 引脚号36
GPIO22 – 引脚号37
GPIO23 – 引脚号38
GPIO24 – 引脚号39
GPIO25 – 引脚号42
GPIO26 – 引脚号78
GPIO27 – 引脚号83
GPIO28 – 引脚号92
GPIO29 – 引脚号95
GPIO30 – 引脚号96
GPIO31 – 引脚号97
GPIO32 – 引脚号98
GPIO33 – 引脚号103
GPIO34 – 引脚号104
GPIO35 – 引脚号105
GPIO36 – 引脚号106
GPIO37 – 引脚号107
GPIO38 – 引脚号114
GPIO39 – 引脚号115
GPIO40 – 引脚号116
+
+
## 方法
### `Pin.read`
@@ -125,7 +127,7 @@ Pin.read()
**返回值描述:**
-返回引脚电平,`0`表示获取到的引脚电平为低,`1` 表示获取到的引脚电平为高。
+返回引脚电平,`0`表示获取到的引脚电平为低电平,`1` 表示获取到的引脚电平为高电平。
### `Pin.write`
@@ -135,11 +137,11 @@ Pin.write(value)
该方法用于设置PIN脚电平。
-> 注意:设置高低电平前需要保证引脚为输出模式。
+> 设置高低电平前需要保证引脚为输出模式。
**参数描述:**
-- `value` - 引脚电平,int类型,`0`表示设置当前PIN脚输出低 ,`1`表示设置当前PIN脚输出高
+- `value` - 引脚电平,int类型,`0`表示设置当前PIN脚输出低电平,`1`表示设置当前PIN脚输出高电平。
**返回值描述:**
@@ -170,7 +172,7 @@ Pin.set_dir(value)
**返回值描述:**
-设置成功返回整型值`0`,设置失败返回其它。
+设置成功返回整型值`0`,设置失败返回整型值`-1`。
### `Pin.get_dir`
@@ -247,7 +249,7 @@ Pin.get_dir()
| Pin.GPIO44 | EC600U/EC200U/EC200A/EC600M/EC800M | GPIO44 |
| Pin.GPIO45 | EC600U/EC200U/EC200A/EC600M | GPIO45 |
| Pin.GPIO46 | EC600U/EC200U/EC200A | GPIO46 |
-| Pin.GPIO47 | EC200U/EC200A | GPIO47 |
+| Pin.GPIO47 | EC600U/EC200U/EC200A | GPIO47 |
| Pin.IN | -- | 输入模式 |
| Pin.OUT | -- | 输出模式 |
| Pin.PULL_DISABLE | -- | 浮空模式 |
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.RTC.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.RTC.md"
index 13c452e52ccc47045e4195b631864a31497d0cbb..ab6e78e15692b79227edf66abcb5f40fd65f7d8e 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.RTC.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.RTC.md"
@@ -1,6 +1,6 @@
# class RTC – 实时时钟
-类功能:提供获取设置rtc时间方法,对于BC25PA平台起到从深休眠或者软件关机状态唤醒模组的功能。
+该类提供获取设置rtc时间方法,对于BC25PA平台起到从深休眠或者软件关机状态唤醒模组的功能。
## 构造函数
@@ -13,9 +13,9 @@ class machine.RTC()
**示例:**
```python
-# 创建RTC对象
->>>from machine import RTC
->>>rtc = RTC()
+>>> # 创建RTC对象
+>>> from machine import RTC
+>>> rtc = RTC()
```
## 方法
@@ -26,20 +26,20 @@ class machine.RTC()
rtc.datetime([year, month, day, week, hour, minute, second, microsecond])
```
-该方法用于设置和获取RTC时间。不带参数时,则用于获取时间,带参数则是设置时间;设置时间的时候,参数week不参与设置,microsecond参数保留,暂未使用,默认是0。
+该方法用于设置或获取RTC时间。不带参数时,用于获取时间,带参数则是设置时间;设置时间时,参数week不参与设置,microsecond参数保留,暂未使用,默认是0。
-**参数:**
+**参数描述:**
- `year` - 年,int类型。
-- `month` - 月,int类型,范围1 ~ 12。
-- `day` - 日,int类型,范围1 ~ 31。
-- `week` - 星期,int类型,范围0 ~ 6,其中0表示周日,1 ~ 6分别表示周一到周六;设置时间时,该参数不起作用,保留;获取时间时该参数有效。
-- `hour` - 时,int类型,范围0 ~ 23。
-- `minute` - 分,int类型,范围0 ~ 59。
-- `second` - 秒,int类型,范围0 ~ 59。
+- `month` - 月,int类型,范围[1 ~ 12]。
+- `day` - 日,int类型,范围[1 ~ 31]。
+- `week` - 星期,int类型,范围[0 ~ 6],其中0表示周日,[1 ~ 6]分别表示周一到周六;设置时间时,该参数不起作用,保留;获取时间时该参数有效。
+- `hour` - 时,int类型,范围[0 ~ 23]。
+- `minute` - 分,int类型,范围[0 ~ 59]。
+- `second` - 秒,int类型,范围[0 ~ 59]。
- `microsecond` - 微秒,int类型,保留参数,暂未使用,设置时间时该参数写0即可。
-**返回值:**
+**返回值描述:**
获取时间时,返回一个元组,包含日期时间,格式如下:
`[year, month, day, week, hour, minute, second, microsecond]`
@@ -65,25 +65,25 @@ rtc.datetime([year, month, day, week, hour, minute, second, microsecond])
rtc.set_alarm(data_e)
```
-该方法用于设置RTC到期时间,当到了到期时间就会调用注册的回调函数。
+该方法用于设置RTC到期时间,时间到期就会调用注册的回调函数。
-> 注:支持平台EC600U/EC200U/EC600N/EC800N/BC25
-
-**参数:**
+**参数描述:**
- `year` - 年,int类型。
-- `month` - 月,int类型,范围1 ~ 12。
-- `day` - 日,int类型,范围1 ~ 31。
-- `week` - 星期,int类型,范围0 ~ 6,其中0表示周日,1 ~ 6分别表示周一到周六;设置时间时,该参数不起作用,保留;获取时间时该参数有效。
-- `hour` - 时,int类型,范围0 ~ 23。
-- `minute` - 分,int类型,范围0 ~ 59。
-- `second` - 秒,int类型,范围0 ~ 59。
+- `month` - 月,int类型,范围[1 ~ 12]。
+- `day` - 日,int类型,范围[1 ~ 31]。
+- `week` - 星期,int类型,范围[0 ~ 6],其中0表示周日,[1 ~ 6]分别表示周一到周六;设置时间时,该参数不起作用,保留;获取时间时该参数有效。
+- `hour` - 时,int类型,范围[0 ~ 23]。
+- `minute` - 分,int类型,范围[0 ~ 59]。
+- `second` - 秒,int类型,范围[0 ~ 59]。
- `microsecond` - 微秒,int类型,保留参数,暂未使用,设置时间时该参数写0即可。
-**返回值:**
+**返回值描述:**
设置成功返回整型值`0`,设置失败返回整型值`-1` 。
+> 该方法支持平台EC600U/EC200U/EC600N/EC800N/BC25。
+
**示例:**
```python
@@ -103,34 +103,34 @@ rtc.register_callback(fun)
该方法用于注册RTC alarm回调处理函数。
-> 注:支持平台EC600U/EC200U/EC600N/EC800N/BC25
-
-**参数:**
+**参数描述:**
- `fun` - RTC alarm回调处理函数,function类型。
-**返回值:**
+**返回值描述:**
注册成功返回整型值`0`,注册失败返回整型值`-1` 。
+> 该方法支持平台EC600U/EC200U/EC600N/EC800N/BC25。
+
### `rtc.enable_alarm`
```python
rtc.enable_alarm(on_off)
```
-该方法用于打开/关闭RTC alarm功能
+该方法用于打开/关闭RTC alarm功能。
-> 注:支持平台EC600U/EC200U/EC600N/EC800N/BC25,BC25PA平台只有设置回调函数,才能启动定时器.
-
-**参数:**
+**参数描述:**
- `on_off` - `1`表示打开RTC alarm功能,`0`表示关闭RTC alarm功能,int类型。
-**返回值:**
+**返回值描述:**
打开/关闭成功返回整型值`0`,打开/关闭失败返回整型值`-1` 。
+> 该方法支持平台EC600U/EC200U/EC600N/EC800N/BC25,BC25PA平台只有设置回调函数,才能启动定时器。
+
**示例:**
```python
@@ -144,4 +144,4 @@ rtc.set_alarm([2021, 7, 9, 5, 12, 30, 0, 0])
rtc.enable_alarm(1)
```
-> 注意:EC600U/EC200U平台支持自动开机,即设置alarm功能之后将模块关机,alarm时间到了之后可以自动开机。其他平台不支持该特性。
+> EC600U/EC200U平台支持自动开机,即设置alarm功能之后将模块关机,alarm时间到了之后可以自动开机。其他平台不支持该特性。
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.SPI.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.SPI.md"
index 85692b051c76074271b3731ef63c57205989c97d..4f53d6801719b8a216f1d857768923d3c941f715 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.SPI.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.SPI.md"
@@ -1,6 +1,6 @@
# class SPI – SPI通信
-类功能:串行外设接口总线协议。
+该类提供串行外设接口总线协议功能。
## 构造函数
@@ -10,26 +10,26 @@
class machine.SPI(port, mode, clk)
```
-**参数说明:**
+**参数描述:**
- `port` - 通道选择[0,1],int类型。
-- `mode` - SPI 的工作模式(模式0最常用),说明如下:
时钟极性CPOL:即SPI空闲时,时钟信号SCLK的电平(0:空闲时低电平; 1:空闲时高电平)
0 : CPOL=0, CPHA=0
1 : CPOL=0, CPHA=1
2: CPOL=1, CPHA=0
3: CPOL=1, CPHA=1
+- `mode` - SPI 的工作模式,说明如下:
时钟极性CPOL:即SPI空闲时,时钟信号SCLK的电平(0:空闲时低电平; 1:空闲时高电平)
`0` : CPOL=0, CPHA=0
`1` : CPOL=0, CPHA=1
`2`: CPOL=1, CPHA=0
`3`: CPOL=1, CPHA=1
-- `clk` - 时钟频率,说明如下:
EC600N/EC600S/EC800N/BG95M3/EC600M/EC800M/EG912N:
0 : 812.5kHz
1 : 1.625MHz
2 : 3.25MHz
3 : 6.5MHz
4 : 13MHz
5 : 26MHz
6:52MHz
EC600U/EC200U/EG915U:
0 : 781.25KHz
1 : 1.5625MHz
2 : 3.125MHz
3 : 5MHz
4 : 6.25MHz
5 : 10MHz
6 : 12.5MHz
7 : 20MHz
8 : 25MHz
9 : 33.33MHz
BC25PA:
0 :5MHz
X : XMHz (X in [1,39])
+- `clk` - 时钟频率,说明如下:
EC600N/EC600S/EC800N/BG95M3/EC600M/EC800M/EG912N:
`0` : 812.5kHz
`1` : 1.625MHz
`2` : 3.25MHz
`3` : 6.5MHz
`4` : 13MHz
`5` : 26MHz
`6`:52MHz
C600U/EC200U/EG915U:
`0` : 781.25KHz
`1` : 1.5625MHz
`2` : 3.125MHz
`3` : 5MHz
`4` : 6.25MHz
`5` : 10MHz
`6` : 12.5MHz
`7` : 20MHz
`8` : 25MHz
`9` : 33.33MHz
BC25PA:
`0` :5MHz
`X` : XMHz (X in [1,39])
-> 注意:BC25PA平台不支持1、2模式。
+> BC25PA平台不支持1、2模式。
**示例:**
```python
-from machine import SPI
-# 创建SPI对象
-spi_obj = SPI(1, 0, 1) # 返回spi对象
+>>> from machine import SPI
+>>> # 创建SPI对象
+>>> spi_obj = SPI(1, 0, 1)
```
-**引脚说明:**
+**SPI引脚对应关系:**
| 平台 | 引脚 |
| ------------- | ------------------------------------------------------------ |
@@ -55,14 +55,14 @@ SPI.read(recv_data, datalen)
该方法用于读取数据。
-**参数说明:**
+**参数描述:**
- `recv_data` - 接收读取数据的数组,bytearray类型。
- `datalen` - 读取数据的长度,int类型。
-**返回值:**
+**返回值描述:**
-失败返回整型值`-1`。
+成功返回整型值`0`,失败返回整型值`-1`。
### `SPI.write`
@@ -72,14 +72,14 @@ SPI.write(data, datalen)
该方法用于写入数据。
-**参数说明:**
+**参数描述:**
- `data` - 写入的数据,bytes类型。
- `datalen` - 写入的数据长度,int类型。
-**返回值:**
+**返回值描述:**
-失败返回整型值`-1`。
+成功返回整型值`0`,失败返回整型值`-1`。
### `SPI.write_read`
@@ -89,19 +89,19 @@ SPI.write_read(r_data, data, datalen)
该方法用于写入和读取数据。
-**参数说明:**
+**参数描述:**
- `r_data ` - 接收读取数据的数组,bytearray类型。
- `data` - 发送的数据,bytes类型。
- `datalen` - 读取数据的长度,int类型。
-**返回值:**
+**返回值描述:**
-失败返回整型值`-1`。
+成功返回整型值`0`,失败返回整型值`-1`。
**使用示例:**
-> 注意:需要配合外设使用!
+> 需要配合外设使用!
```python
import log
@@ -128,7 +128,7 @@ spi_log = log.getLogger("SPI")
if __name__ == '__main__':
r_data = bytearray(5) # 创建接收数据的buff
- data = b"world" # 写入测试数据
+ data = b"world" # 测试数据
ret = spi_obj.write_read(r_data, data, 5) # 写入数据并接收
spi_log.info(r_data)
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.Timer.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.Timer.md"
index e87adca2535f31df04cf7875c45960d3a7e3b855..56497cd9ff85ff7a722d9565d764f4cdf8d3cdcf 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.Timer.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.Timer.md"
@@ -1,8 +1,8 @@
-# `class Timer` - 硬件定时器
+# class Timer - 硬件定时器
-类功能:硬件定时器。
+该类提供硬件定时器功能。
-> 注意:使用该定时器时需注意定时器0-3,每个在同一时间内只能执行一件任务,且多个对象不可使用同一个定时器。
+> 使用该定时器时需注意定时器0-3,每个在同一时间内只能执行一件任务,且多个对象不可使用同一个定时器。
## 构造函数
@@ -12,17 +12,16 @@
class machine.Timer(Timern)
```
-**参数:**
+**参数描述:**
- `Timern` - 定时器号,int类型,支持定时器Timer0 ~ Timer3。
**示例:**
```python
-# 使用该定时器时需注意:定时器0-3,每个在同一时间内只能执行一件任务,且多个对象不可使用同一个定时器。
-from machine import Timer
-# 创建Timer对象
-timer1 = Timer(Timer.Timer1)
+>>> # 创建Timer对象
+>>> from machine import Timer
+>>> timer1 = Timer(Timer.Timer1)
```
## 方法
@@ -35,22 +34,21 @@ timer.start(period, mode, callback)
该方法用于启动定时器。
-**参数:**
+**参数描述:**
- `period` - 中断周期,int类型,单位毫秒,大于等于1。
-- `mode` - 运行模式,int类型,说明如下:
`Timer.ONE_SHOT` - 单次模式,定时器只执行一次
`Timer.PERIODIC` - 周期模式,循环执行
+- `mode` - 运行模式,int类型,说明如下:
`ONE_SHOT` - 单次模式,定时器只执行一次
`PERIODIC` - 周期模式,循环执行
- `callback` - 定时器执行函数,function类型。
-**返回值:**
+**返回值描述:**
启动成功返回整型值`0`,失败返回整型值`-1`。
**示例:**
```python
-# 使用该定时器时需注意:定时器0-3,每个在同一时间内只能执行一件任务,且多个对象不可使用同一个定时器。
>>> def fun(args):
print("###timer callback function###")
>>> timer1.start(period=1000, mode=timer1.PERIODIC, callback=fun)
@@ -69,20 +67,13 @@ timer.stop()
该方法用于关闭定时器。
-**返回值:**
+**返回值描述:**
成功返回整型值`0`,失败返回整型值`-1`。
**使用示例**:
```python
-'''
-@Author: Baron
-@Date: 2020-06-17
-@LastEditTime: 2020-06-17 17:06:08
-@Description: example for module timer
-@FilePath: example_timer_file.py
-'''
import log
import utime
from machine import Timer
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.UART.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.UART.md"
index a363f11582058ff814515c14b2981e1cc0846418..3270c383c4fa4c8fe373988db924adcf95a96199 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.UART.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.UART.md"
@@ -1,6 +1,6 @@
-# `class UART` - 串口通信
+# class UART - 串口通信
-类功能:uart串口数据传输。
+该类提供uart串口数据传输功能。
## 构造函数
@@ -12,17 +12,17 @@ class machine.UART(UART.UARTn, buadrate, databits, parity, stopbits, flowctl)
**参数描述:**
-- `UARTn` - UART编号,int类型,UARTn说明如下:
UART0 - DEBUG PORT
UART1 – BT PORT
UART2 – MAIN PORT
UART3 – USB CDC PORT (BG95M3 不支持)
UART4 – STDOUT PORT (仅支持EC200U/EC600U/EG915U)
+- `UARTn` - UART编号,int类型,UARTn说明如下:
`UART0` - DEBUG PORT
`UART1` - BT PORT
`UART2` - MAIN PORT
`UART3` - USB CDC PORT (不支持BG95M3)
`UART4` - STDOUT PORT (仅支持EC200U/EC600U/EG915U)
-- `buadrate` - 波特率,int类型,常用波特率都支持,如`4800`、`9600`、`19200`、`38400`、`57600`、`115200`、`230400`等。
-- `databits` - 数据位(5 ~ 8),int类型,展锐平台当前仅支持8位。
-- `parity` - 奇偶校验(`0` – NONE,`1` – EVEN,`2` - ODD),int类型。
-- `stopbits` - 停止位(1 ~ 2),int类型。
-- `flowctl` - 硬件控制流(`0` – FC_NONE, `1` – FC_HW),int类型。
+- `buadrate` - 波特率,int类型,支持常用波特率,如`4800`、`9600`、`19200`、`38400`、`57600`、`115200`、`230400`等。
+- `databits` - 数据位[5 ~ 8],int类型,EC600U/EC200U/EG915U仅支持8位。
+- `parity` - 奇偶校验(`0` – NONE,`1` – EVEN,`2` – ODD),int类型。
+- `stopbits` - 停止位[1 ~ 2],int类型。
+- `flowctl` - 硬件控制流(`0` – FC_NONE, `1` – FC_HW),int类型。
-**引脚对应关系 :**
+**UART引脚对应关系 :**
-| 平台 | |
+| 平台 | 引脚 |
| ------------- | ------------------------------------------------------------ |
| EC600U | uart1:
TX: 引脚号124
RX: 引脚号123
uart2:
TX:引脚号32
RX:引脚号31
uart4:
TX:引脚号103
RX:引脚号104 |
| EC200U | uart1:
TX: 引脚号138
RX: 引脚号137
uart2:
TX:引脚号67
RX:引脚号68
uart4:
TX:引脚号82
RX:引脚号81 |
@@ -32,16 +32,18 @@ class machine.UART(UART.UARTn, buadrate, databits, parity, stopbits, flowctl)
| EC800N | uart0:
TX: 引脚号39
RX: 引脚号38
uart1:
TX: 引脚号50
RX: 引脚号51
uart2:
TX:引脚号18
RX:引脚号17 |
| BC25PA | uart1:
TX: 引脚号29
RX: 引脚号28 |
| BG95M3 | uart0:
TX: 引脚号23
RX: 引脚号22
uart1:
TX:引脚号27
RX:引脚号28
uart2:
TX: 引脚号64
RX: 引脚号65 |
-| EC600M | uart0:
TX: 引脚号71
RX: 引脚号72
uart1(不开启流控):
TX: 引脚号3
RX: 引脚号2
uart1(开启流控):
TX: 引脚号33
RX: 引脚号34
uart2:
TX:引脚号32
RX:引脚号31 |
+| EC600M | uart0:
TX: 引脚号71
RX: 引脚号72
uart1(flowctl = 0):
TX: 引脚号3
RX: 引脚号2
uart1(flowctl = 1):
TX: 引脚号33
RX: 引脚号34
uart2:
TX:引脚号32
RX:引脚号31 |
| EG915U | uart1:
TX: 引脚号27
RX: 引脚号28
uart2:
TX:引脚号35
RX:引脚号34
uart4:
TX:引脚号19
RX:引脚号18 |
-| EC800M | uart0:
TX: 引脚号39
RX: 引脚号38
uart1(不开启流控):
TX: 引脚号50
RX: 引脚号51
uart1(开启流控):
TX: 引脚号22
RX: 引脚号23
注:EC800MCN_GA uart1不可用
uart2:
TX:引脚号18
RX:引脚号17 |
-| EG912N | uart0:
TX: 引脚号23
RX: 引脚号22
uart1(不开启流控):
TX: 引脚号27
RX: 引脚号28
uart1(开启流控):
TX: 引脚号36
RX: 引脚号37
uart2:
TX:引脚号34
RX:引脚号35 |
+| EC800M | uart0:
TX: 引脚号39
RX: 引脚号38
uart1(flowctl = 0):
TX: 引脚号50
RX: 引脚号51
uart1(flowctl = 1):
TX: 引脚号22
RX: 引脚号23
注意:EC800MCN_GA uart1不可用
uart2:
TX:引脚号18
RX:引脚号17 |
+| EG912N | uart0:
TX: 引脚号23
RX: 引脚号22
uart1(flowctl = 0):
TX: 引脚号27
RX: 引脚号28
uart1(flowctl = 1):
TX: 引脚号36
RX: 引脚号37
uart2:
TX:引脚号34
RX:引脚号35 |
+
+> EC600M/EC800M/EG912N 的uart1在flowctl = 1时,仅将uart1映射到不同的引脚,未开启流控功能。
**示例:**
```python
->>> from machine import UART
>>> # 创建uart对象
+>>> from machine import UART
>>> uart1 = UART(UART.UART1, 115200, 8, 0, 1, 0)
```
@@ -53,7 +55,7 @@ class machine.UART(UART.UARTn, buadrate, databits, parity, stopbits, flowctl)
uart.any()
```
-该方法用于获取接收缓存未读数据大小
+该方法用于获取接收缓存未读数据大小。
**返回值描述:**
@@ -108,27 +110,27 @@ uart.close()
**返回值描述:**
-成功返回整型`0`,失败返回整型`-1`。
+成功返回整型值`0`,失败返回整型值`-1`。
### `uart.control_485`
```python
-art.control_485(UART.GPIOn, direction)
+uart.control_485(UART.GPIOn, direction)
```
该方法用于控制485通信方向,串口发送数据之前和之后进行拉高拉低指定GPIO,用来指示485通信的方向。
**参数描述:**
-- `GPIOn` - 需要控制的GPIO引脚号,参照Pin模块的引脚定义,int类型。
+- `GPIOn` - 需要控制的GPIO引脚号,参照[Pin模块](machine.Pin.md)的引脚定义,int类型。
- `direction` - 引脚电平变化,int类型,说明如下:
`1`表示引脚电平变化为:串口发送数据之前由低拉高、发送数据之后再由高拉低
`0`表示引脚电平变化为:串口发送数据之前由高拉低、发送数据之后再由低拉高
**返回值描述:**
-成功返回整型`0`,失败返回整型`-1`。
+成功返回整型值`0`,失败返回整型值`-1`。
-> 注意:BC25PA平台不支持此方法。
+> BC25PA/BG95M3平台不支持此方法。
**示例:**
@@ -148,12 +150,23 @@ uart.set_callback(fun)
**参数描述:**
-- `fun` - 回调函数,function类型,说明如下:
回调函数原型:`cb_func([result, port, num])->None`
回调函数参数:`[result, port, num]`
`result`:接收接口(0:成功,其它:失败)
`port`:接收端口
`num`:返回有多少数据
+- `fun` - 串口回调函数,回调函数原型:
+
+ ```
+ fun(result_list)
+ ```
+
+ 回调函数参数描述:
+
+ - `result_list[0]`:接收是否成功(0:成功,其它:失败)
+
+ - `result_list[1]`:接收端口
+ - `result_list[2]`:返回有多少数据
**返回值描述:**
-成功返回整型`0`,失败返回整型`-1`。
+成功返回整型值`0`,失败返回整型值`-1`。
**示例:**
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.WDT.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.WDT.md"
index 3c6120bdc958ce4bc3942a3601e8b8b8a9ee35e6..1140fd30d4e9594a9d6d11fe7155dc8a2ce3110d 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.WDT.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.WDT.md"
@@ -1,6 +1,6 @@
# class WDT – 看门狗定时器
-模块功能:APP应用程序发生异常不执行时进行系统重启操作
+该类提供APP应用程序发生异常不执行时进行系统重启操作。
## 构造函数
@@ -12,13 +12,13 @@ class machine.WDT(period)
创建软狗对象。
-**参数:**
+**参数描述:**
- `period` - 设置软狗检测时间,单位(s),int类型。
-**返回值:**
+**返回值描述:**
-返回软狗对象
+返回软狗对象。
## 方法
@@ -30,9 +30,9 @@ wdt.feed()
该方法用于喂狗。
-**返回值:**
+**返回值描述:**
-成功返回整型值`0`,失败返回其他
+成功返回整型值`0`。
### `wdt.stop`
@@ -42,21 +42,13 @@ wdt.stop()
该方法用于关闭软狗功能。
-**返回值:**
+**返回值描述:**
-成功返回整型值`0`,失败返回其他。
+成功返回整型值`0`。
**使用示例:**
```python
-'''
-@Author: Pawn
-@Date: 2020-08-12
-@LastEditTime: 2020-08-12 17:06:08
-@Description: example for module timer
-@FilePath: example_wdt.py
-'''
-
from machine import WDT
from machine import Timer
import utime
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.md"
index a65593e30e4c7526054470eb9cbb104ec81e3bd9..85cc452b426f8697162e2f190178a7677aa6c2ef 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/machine.md"
@@ -1,10 +1,6 @@
-```
-本文阐述了QuecPython的machine模块的用法,描述了machine模块最新版本的特性。
-```
-
# machine - 硬件相关功能
-模块功能: 包含与特定电路板上的硬件相关的特定功能。该模块中的大多数功能允许直接和不受限制地访问和控制系统上的硬件。
+该模块包含与特定电路板上的硬件相关的功能。该模块中的大多数功能允许直接且不受限制地访问和控制系统上的硬件。
## Classes
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.ADC.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.ADC.md"
index 8da21abcfd3a388e002e5bc5f585477c492ad0c6..5ddc014888991dfb893cda4f8c96f4a7bdfa7936 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.ADC.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.ADC.md"
@@ -1,5 +1,3 @@
- 本文阐述了QuecPython的misc.ADC类的用法,描述了misc.ADC类最新版本的特性。
-
# class ADC - 电压采集功能
用于采集电压信号。
@@ -43,7 +41,7 @@ ADC.read(ADCn)
**参数描述:**
-- ADCn-ADC通道,int类型,点此查看支持的通道与对应引脚
+- `ADCn`-ADC通道,int类型,点此查看支持的通道与对应引脚
**返回值描述:**
@@ -60,7 +58,7 @@ ADC.read(ADCn)
**ADC通道与物理引脚的映射关系:**
-EC100Y平台对应引脚如下
ADC0 – 引脚号39
ADC1 – 引脚号81
EC600S/EC600N平台对应引脚如下
ADC0 – 引脚号19
EC600M平台对应引脚如下
ADC0 – 引脚号19
ADC1 – 引脚号20
EC800N平台对应引脚如下
ADC0 – 引脚号9
EC600U平台对应引脚如下
ADC0 – 引脚号19
ADC1 – 引脚号20
ADC2 – 引脚号113
ADC3 – 引脚号114
EC200U平台对应引脚如下
ADC0 – 引脚号45
ADC1 – 引脚号44
ADC2 – 引脚号43
EC200A平台对应引脚如下
ADC0 – 引脚号45
ADC1 – 引脚号44
BG95M3平台对应引脚如下
ADC0 – 引脚号24
EG915U平台对应引脚如下
ADC0 – 引脚号24
ADC1 – 引脚号2
EC800M平台对应引脚如下
ADC0 – 引脚号9
ADC1 – 引脚号96
EG912N平台对应引脚如下
ADC0 – 引脚号24
ADC1 – 引脚号2
+EC100Y系列对应引脚如下
ADC0 – 引脚号39
ADC1 – 引脚号81
EC600S/EC600N系列对应引脚如下
ADC0 – 引脚号19
EC600M系列对应引脚如下
ADC0 – 引脚号19
ADC1 – 引脚号20
EC800N系列对应引脚如下
ADC0 – 引脚号9
EC600U系列对应引脚如下
ADC0 – 引脚号19
ADC1 – 引脚号20
ADC2 – 引脚号113
ADC3 – 引脚号114
EC200U系列对应引脚如下
ADC0 – 引脚号45
ADC1 – 引脚号44
ADC2 – 引脚号43
EC200A系列对应引脚如下
ADC0 – 引脚号45
ADC1 – 引脚号44
BG95系列对应引脚如下
ADC0 – 引脚号24
EG915U系列对应引脚如下
ADC0 – 引脚号24
ADC1 – 引脚号2
EC800M系列对应引脚如下
ADC0 – 引脚号9
ADC1 – 引脚号96
EG912N系列对应引脚如下
ADC0 – 引脚号24
ADC1 – 引脚号2
### ADC.close
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.PWM.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.PWM.md"
index f2f9e34a0004bcba67a7b3dafba5bb4809022bed..be6d95fbccee68094e5159952a9b9cb20d9dad06 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.PWM.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.PWM.md"
@@ -1,10 +1,8 @@
- 本文阐述了QuecPython的misc.PWM类的用法,描述了misc.PWM类最新版本的特性。
-
# class PWM - 脉宽调制
提供脉宽调制输出功能。
-> 注意:BC25PA平台不支持此模块。
+> 注意:BC25系列不支持此模块。
## 构造函数
@@ -16,17 +14,17 @@ class misc.PWM(PWM.PWMn,PWM.ABOVE_xx, highTime, cycleTime)
**参数描述:**
-- PWM.PWMn-PWM通道,int类型,点此查看支持的通道与对应引脚;
+- `PWM.PWMn`-PWM通道,int类型,点此查看支持的通道与对应引脚;
-- PWM.ABOVE_xx-时间取值范围,int类型,说明如下:
+- `PWM.ABOVE_xx`-时间取值范围,int类型,说明如下:
- EC600SCN/EC600N/EC800N/EC600M/EC800M/EG912N平台:
PWM.ABOVE_MS ms级取值范围:(0,1023]
PWM.ABOVE_1US us级取值范围:(0,157]
PWM.ABOVE_10US us级取值范围:(1,1575]
PWM.ABOVE_BELOW_US ns级 取值(0,1024]
EC200U/EC600U/EG915U平台:
PWM.ABOVE_MS ms级取值范围:(0,10]
PWM.ABOVE_1US us级取值范围:(0,10000]
PWM.ABOVE_10US us级取值范围:(1,10000]
PWM.ABOVE_BELOW_US ns级 取值[100,65535]
+ EC200U/EC600U/EG915U系列:
PWM.ABOVE_MS ms级取值范围:(0,10]
PWM.ABOVE_1US us级取值范围:(0,10000]
PWM.ABOVE_10US us级取值范围:(1,10000]
PWM.ABOVE_BELOW_US ns级 取值[100,65535]
-- highTime-高电平时间,int类型,说明如下:
+- `highTime`-高电平时间,int类型,说明如下:
ms级时,单位为ms
us级时,单位为us
ns级别:需要使用者计算
频率 = 13Mhz / cycleTime
占空比 = highTime/ cycleTime
-- cycleTime-周期时间,int类型,说明如下:
+- `cycleTime`-周期时间,int类型,说明如下:
ms级时,单位为ms
us级时,单位为us
ns级别:需要使用者计算
频率 = 13Mhz / cycleTime
占空比 = highTime/ cycleTime
@@ -39,7 +37,7 @@ class misc.PWM(PWM.PWMn,PWM.ABOVE_xx, highTime, cycleTime)
**PWM通道与物理引脚的映射关系:**
-EC100YCN平台,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号19
PWM1 – 引脚号18
PWM2 – 引脚号23
PWM3 – 引脚号22
EC600SCN/EC600N平台,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号52
PWM1 – 引脚号53
PWM2 – 引脚号70
PWM3 – 引脚号69
EC800N平台,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号79
PWM1 – 引脚号78
PWM2 – 引脚号16
PWM3 – 引脚号49
EC200UCN平台,支持PWM0,对应引脚如下:
PWM0 – 引脚号135
EC600UCN平台,支持PWM0,对应引脚如下:
PWM0 – 引脚号70
EC600M平台,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号57
PWM1 – 引脚号56
PWM2 – 引脚号70
PWM3 – 引脚号69
EG915U平台,支持PWM0,对应引脚如下:
PWM0 – 引脚号20
EC800M平台,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号83
PWM1 – 引脚号78
PWM2 – 引脚号16
PWM3 – 引脚号49
EG912N平台,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号21
PWM1 – 引脚号116
PWM2 – 引脚号107
PWM3 – 引脚号92
+EC100Y系列,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号19
PWM1 – 引脚号18
PWM2 – 引脚号23
PWM3 – 引脚号22
EC600SCN/EC600N系列,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号52
PWM1 – 引脚号53
PWM2 – 引脚号70
PWM3 – 引脚号69
EC800N系列,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号79
PWM1 – 引脚号78
PWM2 – 引脚号16
PWM3 – 引脚号49
EC200U系列,支持PWM0,对应引脚如下:
PWM0 – 引脚号135
EC600U系列,支持PWM0,对应引脚如下:
PWM0 – 引脚号70
EC600M系列,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号57
PWM1 – 引脚号56
PWM2 – 引脚号70
PWM3 – 引脚号69
EG915U系列,支持PWM0,对应引脚如下:
PWM0 – 引脚号20
EC800M系列,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号83
PWM1 – 引脚号78
PWM2 – 引脚号16
PWM3 – 引脚号49
EG912N系列,支持PWM0-PWM3,对应引脚如下:
PWM0 – 引脚号21
PWM1 – 引脚号116
PWM2 – 引脚号107
PWM3 – 引脚号92
## 方法
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.Power.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.Power.md"
index 42f6ccce5235e3ef4d530b13761c66d269e32c9b..59ed7565760e7adb4e453903c66ae67f341b332d 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.Power.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.Power.md"
@@ -1,12 +1,6 @@
-```
-本文阐述了QuecPython的misc模块的power子模块的用法,描述了power模块最新版本的特性。
-```
-
-
-
# power - 关机以及软件重启
-模块功能: 提供关机、软件重启、开机原因、上次关机原因、获取电池电压功能。
+模块功能: 提供关机、软件重启、获取开机原因、获取上次关机原因、获取电池电压功能。
## 关机功能
@@ -97,7 +91,7 @@ Power.getVbatt()
**返回值描述:**
-返回整形电压值。
+返回整型电压值。
**示例:**
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.PowerKey.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.PowerKey.md"
index 86e3dd915adea7f5e41e78e88f4ca5479d81e676..7f445ac81140c5d8209bb8b7b899efc3f3df3e1c 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.PowerKey.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.PowerKey.md"
@@ -1,5 +1,3 @@
- 本文阐述了QuecPython的misc.PowerKey类的用法,描述了misc.PowerKey类最新版本的特性。
-
# class PowerKey - power key按键回调注册功能
提供power key按键注册回调功能接口。
@@ -14,7 +12,7 @@ class misc.PowerKey()
**返回值描述:**
-返回创建的对象
+返回创建的对象。
**示例:**
@@ -35,19 +33,19 @@ PowerKey.powerKeyEventRegister(usrFun)
**参数描述:**
-- usrfun-回调函数,原型usrfun(status),参数status:`0`表示松开,`1`表示按下;按下或松开powerkey按键时触发回调。
+- `usrfun`-回调函数,原型usrfun(status),参数status:`0`表示松开,`1`表示按下;按下或松开powerkey按键时触发回调。
**返回值描述:**
`0`表示注册成功,`-1`表示注册失败。
-> 注意:EC600S/EC600N等ASR平台,对于powerkey,按下和松开时,都会触发用户注册的回调函数;
+> 注意:EC600S/EC600N系列,对于powerkey,按下和松开时,都会触发用户注册的回调函数;
>
-> EC200U/EC600U等展锐平台,对于powerkey,只在按键松开时才会触发回调函数,并且按键按下的时间需要维持500ms以上。
+> EC200U/EC600U系列,对于powerkey,只在按键松开时才会触发回调函数,并且按键按下的时间需要维持500ms以上。
**示例:**
-EC600S/EC600N平台:
+EC600S/EC600N系列:
```python
from misc import PowerKey
@@ -63,7 +61,7 @@ def pwk_callback(status):
pk.powerKeyEventRegister(pwk_callback)
```
-EC200U/EC600U平台:
+EC200U/EC600U系列:
```python
from misc import PowerKey
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.USB.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.USB.md"
index df516290228c0a3e5496799b4cbe88ed2910fb03..19e0ecae6b515d7ba7bc6691c5855151ce5deebd 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.USB.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.USB.md"
@@ -1,10 +1,8 @@
- 本文阐述了QuecPython的misc.USB类的用法,描述了misc.USB类最新版本的特性。
-
# class USB - USB插拔检测
提供USB插拔检测功能。
-> 注意:当前仅EC600S/EC600N/EC800N/EC200U/EC600U平台支持该功能。
+> 注意:EC600S/EC600N/EC800N/EG912N/EC200U/EC600U/EG915U/EC600M/EC800M/EC200A系列支持该功能。
## 构造函数
@@ -45,7 +43,7 @@ usb.setCallback(usrFun)
**参数描述:**
-- usrFun -回调函数,原型usrFun (conn_status),参数conn_status:`0`表示未连接,`1`表示连接。
+- `usrFun` -回调函数,原型usrFun (conn_status),参数conn_status:`0`表示未连接,`1`表示连接。
**返回值描述:**
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.USBNET.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.USBNET.md"
index 482a89a4470cdb6a667ffbf7943e8eae78d10350..ee22eed4420ed1017b6bab470524577cbe10f32a 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.USBNET.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.USBNET.md"
@@ -1,16 +1,10 @@
-```
-本文阐述了QuecPython的misc模块的USBNET子模块的用法,描述了USBNET模块最新版本的特性。
-```
-
-
-
# USBNET - USB网卡功能
模块功能: 提供USB网卡功能。
-> 注意:当前仅EC600S/EC600N/EC800N/EC200U/EC600U/EC800G平台支持该功能。
+> 注意:EC600S/EC600N/EC800N/EC200U/EC600U/EC600M系列支持该功能。
-## 设置USB网卡工作类型(重启生效)
+## 设置USB网卡工作类型
### `USBNET.set_worktype`
@@ -20,13 +14,15 @@ USBNET.set_worktype(type)
**参数描述:**
-- type-USBNET 工作类型, int类型,Type_ECM:ECM模式, Type_RNDIS:RNDIS模式。
+- `type`-USBNET 工作类型,int类型,Type_ECM:ECM模式, Type_RNDIS:RNDIS模式。
**返回值描述:**
`0`表示设置成功,`-1`表示设置失败。
-## 获取USB网卡工作类型(重启生效)
+> 注意:重启生效
+
+## 获取USB网卡工作类型
### `USBNET.get_worktype`
@@ -36,7 +32,7 @@ USBNET.get_worktype()
**返回值描述:**
-成功返回USBNET当前工作类型,失败返回整型`-1`;`1`表示ECM模式,`3 `表示 RNDIS模式。
+成功返回USBNET当前工作类型,失败返回整型`-1`;`1`表示ECM模式,`3 `表示 RNDIS模式。
## 获取USBNET当前状态
@@ -48,7 +44,7 @@ USBNET.get_status()
**返回值描述:**
-成功返回USBNET当前状态,失败返回整型`-1`;`0`表示未连接,`1`表示连接成功。
+成功返回USBNET当前状态,失败返回整型`-1`;`0`表示未连接,`1`表示连接成功。
## 打开USB网卡
@@ -96,7 +92,7 @@ from misc import USBNET
USBNET.open()
```
-## 获取Nat使能情况
+## 获取NAT使能情况
### `USBNET.getNat`
@@ -104,18 +100,18 @@ USBNET.open()
USBNET.getNat(simid, pid)
```
-获取某一路网卡的Nat使能情况(是否支持ipv6拨号)。
+获取某一路网卡的NAT使能情况(是否支持ipv6拨号)。
-> 注意:(仅在EC200U/EC600U平台支持)
+> 注意:(仅在EC200U/EC600U系列支持)
**参数描述:**
-- simid-int类型,范围0/1,目前仅支持`0`;
-- pid-PDP索引, int类型,展锐平台范围`1-7`。
+- `simid`-int类型,范围0/1,目前仅支持`0`;
+- `pid`-PDP索引,int类型,范围`1-7`。
**返回值描述:**
-成功:返回Nat使能情况,整型0/1,`0`:使能,支持ipv6拨号;`1`:未使能,不支持ipv6拨号。
+成功:返回NAT使能情况,整型0/1,`0`:使能,支持ipv6拨号;`1`:未使能,不支持ipv6拨号。
失败:返回整型`-1`。
@@ -127,27 +123,27 @@ USBNET.getNat(0, 1)
0
```
-## Nat设置
+## NAT设置
### `USBNET.setNat`
```python
-USBNET.setNat(simid, pid, Nat)
+USBNET.setNat(simid, pid, nat)
```
-Nat设置,设置成功后重启生效(USBNET.set_worktype()接口调用的时候会使对应的Nat值变为1,使得该pid无法IPV6拨号,所以在close USBnet后,可以使用该接口关闭NAT,使IPV6功能正常)。
+NAT设置,设置成功后重启生效(USBNET.set_worktype()接口调用的时候会使对应的nat值变为1,使得该pid无法IPV6拨号,所以在close USBnet后,可以使用该接口关闭NAT,使IPV6功能正常)。
-> 注意:仅在EC200U/EC600U平台支持
+> 注意:仅在EC200U/EC600U系列支持
**参数描述:**
-- simid-int类型,范围0/1,目前仅支持`0`;
-- pid-PDP索引, int类型,展锐平台范围`1-7`;
-- Nat-int类型,范围:0/1,`0`:支持ipv6拨号;`1`:不支持ipv6拨号。
+- `simid`-int类型,范围0/1,目前仅支持`0`;
+- `pid`-PDP索引, int类型,范围`1-7`;
+- `Nat`-int类型,范围:0/1,`0`:支持ipv6拨号;`1`:不支持ipv6拨号。
**返回值描述:**
-`0`表示设置成功,`-1`表示设置失败。
+`0`表示设置成功,`-1`表示设置失败。
**示例:**
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.md"
index c3250103f82b11312ab25336b058963062641004..3915ad3f97330048f16b132a18c07aef3bad66bd 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/misc.md"
@@ -1,9 +1,3 @@
-```
-本文阐述了QuecPython的misc模块的用法,描述了misc模块最新版本的特性。
-```
-
-
-
# misc- 其他
模块功能: 提供关机、软件重启、PWM以及ADC相关功能。
@@ -16,7 +10,7 @@
misc.antennaSecRXOffCtrl(*args)
```
-分集天线配置、查询接口。(仅1803S平台支持该接口)。
+分集天线配置、查询接口(EC200A系列支持该接口)。
**参数描述:**
@@ -24,13 +18,13 @@ misc.antennaSecRXOffCtrl(*args)
参数个数为0,查询:misc.antennaSecRXOffCtrl();
参数个数为1,配置:misc.antennaSecRXOffCtrl(SecRXOff_set)。
-- SecRXOff_set-int类型,范围0/1, `0`:不关闭分集天线 `1`:关闭分集天线。
+- `SecRXOff_set`-int类型,范围0/1, `0`:不关闭分集天线 `1`:关闭分集天线。
**返回值描述:**
查询:成功返回分集天线配置,失败返回整形值`-1`;
-设置:成功返回整形0,失败返回整型值`-1`。
+设置:成功返回整形`0`,失败返回整型值`-1`。
**示例:**
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/net.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/net.md"
index 6a45ae38c7f5ef5230201e9f3acfe8091555975a..a18300ae5bd80b7969d6095e027d02a3e3e90e67 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/net.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/net.md"
@@ -1,10 +1,10 @@
# net - 网络相关功能
-模块功能:该模块包含了模组网络相关的功能,提供配置和查询网络模式信息等接口,比如获取注网状态,设置搜网模式等。
+该模块包含了模组网络相关的功能,提供配置和查询网络模式信息等接口,比如获取注网状态,设置搜网模式等。
->注意: 建议用户使用不同运营商的SIM卡时,则配置对应运营商的APN信息;如果不配置或者配置错误,可能会导致模组无法注网。用户具体如何配置APN信息,参考`dataCall.setPDPContext`方法。
+>建议用户使用不同运营商的SIM卡时,则配置对应运营商的APN信息;如果不配置或者配置错误,可能会导致模组无法注网。用户具体如何配置APN信息,参考`dataCall.setPDPContext`方法。
@@ -43,20 +43,11 @@ net.csqQueryPoll()
### `net.getCellInfo`
```python
-net.getCellInfo([sinrEnable])
+net.getCellInfo()
```
该方法用于获取邻近小区的信息。
-**参数描述:**
-
-* `sinrEnable` - 使能是否获取sinr数值,整型值,可选参数,取值范围见下表:
-
-| 取值 | 含义 |
-|-----| ------------- |
-| 0 | 不获取sinr数值 |
-| 1 | 获取sinr数值 |
-
**返回值描述:**
失败返回整型值`-1`,成功返回包含三种网络系统`(GSM、UMTS、LTE)`的信息的list,如果对应网络系统信息为空,则返回空的List。格式和说明如下:
@@ -101,17 +92,13 @@ net.getCellInfo([sinrEnable])
| `pci` | 物理层小区标识号,0 ~ 503 |
| `tac` | 跟踪区域码,0 ~ 65535 |
| `earfcn` | 无线频道编号,范围 0 ~ 65535 |
-| `rssi` | LTE网络下,表示接收的信号强度,单位dBm,范围 -140 ~ -44 dBm
注:目前除BC25系列和BG77/BG95系列,其它平台均无法获取rssi,显示值使用RSRP代替:
RSRP(负数)= RSRP测量报告值 - 140,单位dBm,范围 -140 ~ -44 dBm |
+| `rssi` | LTE网络下,rssi:表示接收的所有信号强度,单位dBm,范围 -140 ~ -44 dBm
注:目前除BC25系列和BG77/BG95系列,其它平台均无法获取rssi,使用RSRP代替:
RSRP:表示接收到的有效信号强度,单位dBm,范围 -140 ~ -44 dBm |
| `rsrq` |LTE网络参考信号接收质量,范围 -20 ~ -3
注:理论上rsrq的范围应该是-19.5 ~ -3,但由于计算方法问题,目前能给出的是-20 ~ -3
目前仅BC25系列、BG77/BG95系列和EC600E/EC800E系列获取该参数有意义,其它平台该参数无意义|
-| `sinr` |信噪比(目前仅BC25系列和EC600E/EC800E系列支持获取该参数)范围-30 ~ 30 |
->注意:
+>该接口搜小区时会一直阻塞,一般是3-5秒,在无信号的地方会更长
>
->* 该接口搜小区时会一直阻塞,一般是3-5秒,在无信号的地方会更长
->* `sinrEnable`为可选参,不支持的平台可不写,不写默认不获取sinr
->* 仅BC25/EC600E/EC800E系列支持获取sinr,其余模组型号均不支持
@@ -123,11 +110,6 @@ net.getCellInfo([sinrEnable])
([], [], [(0, 232301375, 1120, 17, 378, 26909, 1850, -66, -8), (3, 110110494, 1120, 17, 10, 26909, 2452, -87, -17), (3, 94542859, 1120, 1, 465, 56848, 1650, -75, -10),
(3, 94472037, 1120, 1, 369, 56848, 3745, -84, -20)])
-# BC25
->>> net.getCellInfo(1)
-([], [], [(0, 17104243, 460, 4, 169, 19472, 3688, -56, -10, -3)])
->>> net.getCellInfo(0)
-([], [], [(0, 17104243, 460, 4, 169, 19472, 3688, -75, -12)])
>>> net.getCellInfo()
([], [], [(0, 17104243, 460, 4, 121, 19472, 3688, -76, -15)])
```
@@ -172,7 +154,7 @@ net.getConfig()
->注意:BC25系列不支持此方法;
+>BC25系列不支持此方法;
>
>BG95-M1系列仅支持CATM制式;
>
@@ -212,8 +194,6 @@ net.setConfig(mode [, roaming])
->注意:
->
>* roaming为可选参数,不支持的平台,该参数可不写
>* BC25系列不支持此方法
>* EC200U/EC600U/EG915U系列模组不支持漫游参数配置,且仅支持设置网络制式0/6/8
@@ -335,18 +315,16 @@ net.getSignal([sinrEnable])
* `LTE`返回值参数说明:
-| 参数 | 参数意义 |
-| ------ | ------------------------------------------------------------ |
-| `rssi` | 接收的信号强度,范围 -140 ~ -44 dBm,99表示未知或者无法检测到 |
-| `rsrp` | 下行参考信号的接收功率,范围 -141 ~ -44 dBm,99表示未知或者无法检测到 |
-| `rsrq` | 下行特定小区参考信号的接收质量,范围 -20 ~ -3 dBm,值越大越好 |
-| `cqi` | 信道质量 |
-| `sinr` | 信噪比,BC25系列不支持获取该参数 |
+| 参数 | 参数意义 |
+| ------ |-------------------------------------------------------|
+| `rssi` | 接收的信号强度,范围 -140 ~ -44 dBm,99表示未知或者无法检测到 |
+| `rsrp` | 下行参考信号的接收功率,范围 -140 ~ -44 dBm,99表示未知或者无法检测到 |
+| `rsrq` | 下行特定小区参考信号的接收质量,范围 -20 ~ -3 dBm,值越大越好 ,255表示未知或者无法检测到 |
+| `cqi` | 信道质量,255表示未知或者无法检测到 |
+| `sinr` | 信噪比,范围 -10 ~ 40 dBm,255表示未知或者无法检测到 |
->注意:
->
>* `sinrEnable`为可选参,不支持的平台可不写,不写默认不获取sinr
>* BC25系列不支持获取sinr,其余模组型号均支持
@@ -492,7 +470,7 @@ net.getState()
-> 注意:BG77/BG95系列参照下表
+> BG77/BG95系列参照下表
| 值 | 说明 |
| ---- | ------------------ |
@@ -633,7 +611,7 @@ net.getMcc()
-> 注意:EC100Y/EC600S/EC600N/EC600E/EC800E/EC200A/EC600M/EC800M系列的模组,该值是用十六进制来表示,比如下面示例中的十进制数1120,十六进制即0x460,表示移动设备国家代码460,其他型号模组,该值直接用十进制表示,比如移动设备国家代码460,就是用十进制的460来表示。
+> EC100Y/EC600S/EC600N/EC600E/EC800E/EC200A/EC600M/EC800M系列的模组,该值是用十六进制来表示,比如下面示例中的十进制数1120,十六进制即0x460,表示移动设备国家代码460,其他型号模组,该值直接用十进制表示,比如移动设备国家代码460,就是用十进制的460来表示。
@@ -661,7 +639,7 @@ net.getServingMcc()
-> 注意:EC100Y/EC600S/EC600N系列的模组,该值是用十六进制来表示,比如下面示例中的十进制数1120,十六进制即0x460,表示移动设备国家代码460,其他型号模组,该值直接用十进制表示,比如移动设备国家代码460,就是用十进制的460来表示。
+> EC100Y/EC600S/EC600N系列的模组,该值是用十六进制来表示,比如下面示例中的十进制数1120,十六进制即0x460,表示移动设备国家代码460,其他型号模组,该值直接用十进制表示,比如移动设备国家代码460,就是用十进制的460来表示。
@@ -850,7 +828,6 @@ net.setBand(netRat, gsmBand, bandTuple)
->注意:
>* 当前可支持模组型号:BG95系列/EG912NENAA
>* BG95不支持设置上述模式1(LTE)下的`band`
>* EG912NENAA仅支持上述模式0(GSM)和模式1(LTE)
@@ -997,7 +974,6 @@ net.getBand(netRat)
->注意:
>* 当前可支持模组型号:BG95系列/EG912NENAA
>* BG95不支持设置上述模式1(LTE)下的`band`
>* EG912NENAA仅支持上述模式0(GSM)和模式1(LTE)
@@ -1028,7 +1004,7 @@ net.bandRst()
->注意:当前可支持模组型号:EG912NENAA
+>当前可支持模组型号:EG912NENAA
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/pm.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/pm.md"
index d3f06f6e7149ce90f906bcbf0c997fc4d6301962..cc5d8a73be52e4acf73c3d5cefbd33dd8eb0dddb 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/pm.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/pm.md"
@@ -2,6 +2,33 @@
在无业务处理时使系统进入休眠状态,进入低功耗模式。
+**使用示例**
+
+模拟测试,实际开发请根据业务场景选择使用!
+
+```python
+import pm
+import utime
+
+# 创建wakelock锁
+lpm_fd = pm.create_wakelock("test_lock", len("test_lock"))
+# 设置自动休眠模式
+pm.autosleep(1)
+
+# 模拟测试,实际开发请根据业务场景选择使用
+while 1:
+ utime.sleep(20) # 休眠
+ res = pm.wakelock_lock(lpm_fd)
+ print("ql_lpm_idlelock_lock, g_c1_axi_fd = %d" %lpm_fd)
+ print("unlock sleep")
+ utime.sleep(20)
+ res = pm.wakelock_unlock(lpm_fd)
+ print(res)
+ print("ql_lpm_idlelock_unlock, g_c1_axi_fd = %d" % lpm_fd)
+ num = pm.get_wakelock_num() # 获取已创建锁的数量
+ print(num)
+```
+
## 创建wake_lock锁
### `pm.create_wakelock`
@@ -14,14 +41,14 @@ pm.create_wakelock(lock_name, name_size)
**参数描述**
-* `lock_name`,自定义lock名,string类型,
-* `name_size`, lock_name的长度, int类型
+* `lock_name`,自定义lock名,string类型。
+* `name_size`, 可选参数,lock_name的长度, int类型。
**返回值描述**
成功返回wakelock的标识号,否则返回 `-1`。
-> **注意**:BC25PA平台不支持此方法。
+> BC25PA平台不支持此方法。
## 删除wake_lock锁
@@ -35,13 +62,13 @@ pm.delete_wakelock(lpm_fd)
**参数描述**
-* `lpm_fd`,需要删除的锁对应标识id,int类型
+* `lpm_fd`,需要删除的锁对应标识id,int类型。
**返回值描述**
成功返回 `0`。
-> **注意**:BC25PA平台不支持此方法。
+> BC25PA平台不支持此方法。
## 加锁
@@ -55,13 +82,13 @@ pm.wakelock_lock(lpm_fd)
**参数描述**
-* `lpm_fd`,需要执行加锁操作的wakelock标识id,int类型
+* `lpm_fd`,需要执行加锁操作的wakelock标识id,int类型。
**返回值描述**
成功返回 `0`,否则返回 `-1`。
-> **注意**:BC25PA平台不支持此方法。
+> BC25PA平台不支持此方法。
## 释放锁
@@ -75,13 +102,13 @@ pm.wakelock_unlock(lpm_fd)
**参数描述**
-* `lpm_fd`,需要执行释放锁操作的wakelock标识id,int类型
+* `lpm_fd`,需要执行释放锁操作的wakelock标识id,int类型。
**返回值描述**
成功返回 `0`,否则返回 `-1`。
-> **注意**:BC25PA平台不支持此方法。
+> BC25PA平台不支持此方法。
## 自动休眠模式控制
@@ -95,7 +122,7 @@ pm.autosleep(sleep_flag)
**参数描述**
-* `sleep_flag`,`0`关闭自动休眠, `1`开启自动休眠,int类型
+* `sleep_flag`,`0`关闭自动休眠, `1`开启自动休眠,int类型。
**返回值描述**
@@ -115,7 +142,7 @@ pm.get_wakelock_num()
int类型,返回已创建wakelock锁的数量。
-> 注意:BC25PA平台不支持此方法。
+> BC25PA平台不支持此方法。
## 设置PSM模式的控制时间
@@ -132,8 +159,8 @@ pm.set_psm_time(mode)# 单独设置启用或禁用 <模式2>
* `mode`,是否启用PSM,int类型:
`0 `禁用PSM
`1 `启用PSM
- `2 `(仅BC25平台)禁用PSM并删除PSM的所有参数,如有默认值,则重置默认值。(注意此种模式禁用的情况下,如果要启用PSM必须用**模式1**,用**模式2**没有任何的意义,因为设置的TAU和ACT时间全部清零了)。
-* `tau_uint`,tau(T3412)定时器单位,int类型
+ `2 `(仅BC25平台)禁用PSM并删除PSM的所有参数,如有默认值,则重置默认值。(注意此种模式禁用的情况下,如果要启用PSM必须用**模式1**,用**模式2**没有任何的意义,因为设置的TAU和ACT时间全部清零了。)
+* `tau_uint`,tau(T3412)定时器单位,int类型。
| tau定时器单位值 | 类型 | 单位值说明 |
| --------------- | ---- | ------------ |
@@ -146,8 +173,8 @@ pm.set_psm_time(mode)# 单独设置启用或禁用 <模式2>
| 6 | int | 320 小时 |
| 7 | int | 定时器被停用 |
-* `tau_time`,tau(T3412)定时器时间周期值,int类型
-* `act_uint`,act(T3324)定时器单位,int类型
+* `tau_time`,tau(T3412)定时器时间周期值,int类型。
+* `act_uint`,act(T3324)定时器单位,int类型。
| act定时器单位值 | 类型 | 单位值说明 |
| --------------- | ---- | ------------ |
@@ -156,9 +183,9 @@ pm.set_psm_time(mode)# 单独设置启用或禁用 <模式2>
| 2 | int | 6 分钟 |
| 7 | int | 定时器被停用 |
-* `act_time`,act(T3324)定时器时间周期值,int类型
+* `act_time`,act(T3324)定时器时间周期值,int类型。
-> **注意:**实际设置的tau和act,为单位值和周期值的积
+> 实际设置的tau和act,为单位值和周期值的积
**返回值描述**
@@ -174,7 +201,7 @@ True
>>>
```
-> **注意**:仅BC25/ECX00U/ECX00E支持
+> 仅BC25/ECX00U/ECX00E支持
## 获取PSM模式的控制时间
@@ -208,31 +235,5 @@ pm.get_psm_time()
```
-> **注意**:仅BC25/ECX00U/ECX00E平台支持
+> 仅BC25/ECX00U/ECX00E平台支持
-**使用示例**
-
-模拟测试,实际开发请根据业务场景选择使用!
-
-```python
-import pm
-import utime
-
-# 创建wakelock锁
-lpm_fd = pm.create_wakelock("test_lock", len("test_lock"))
-# 设置自动休眠模式
-pm.autosleep(1)
-
-# 模拟测试,实际开发请根据业务场景选择使用
-while 1:
- utime.sleep(20) # 休眠
- res = pm.wakelock_lock(lpm_fd)
- print("ql_lpm_idlelock_lock, g_c1_axi_fd = %d" %lpm_fd)
- print("unlock sleep")
- utime.sleep(20)
- res = pm.wakelock_unlock(lpm_fd)
- print(res)
- print("ql_lpm_idlelock_unlock, g_c1_axi_fd = %d" % lpm_fd)
- num = pm.get_wakelock_num() # 获取已创建锁的数量
- print(num)
-```
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/qrcode.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/qrcode.md"
index 66c8b5483f64f3a4ba532c0d9700634e3ef860a7..fb40a27e85ecb0e0a57f436d171cf31468db6a19 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/qrcode.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/qrcode.md"
@@ -1,15 +1,7 @@
-```
-本文阐述了QuecPython的qrcode模块的用法,描述了qrcode模块最新版本的特性。
-```
-
-
-
# qrcode- 二维码显示
模块功能:根据输入的内容,生成对应的二维码。
-> 注意:BC25PA平台不支持此模块功能;使用该功能前,需要初始化LCD。
-
## 二维码显示功能
### `qrcode.show`
@@ -18,14 +10,16 @@
qrcode.show(qrcode_str,magnification,start_x,start_y,Background_color,Foreground_color)
```
+显示二维码到LCD。
+
**参数描述:**
-- qrcode_str-string类型,二维码内容;
-- magnification-int类型,放大倍数[1,6];
-- start_x-int类型,二维码显示起始x坐标;
-- start_y-int类型,二维码显示起始y坐标;
-- Background_color-int类型,前景色(不设置即默认为0xffff);
-- Foreground_color,int类型,背景色(不设置即默认为0x0000)。
+- `qrcode_str`-string类型,二维码内容;
+- `magnification`-int类型,放大倍数[1,6];
+- `start_x`-int类型,二维码显示起始x坐标;
+- `start_y`-int类型,二维码显示起始y坐标;
+- `Background_color`-int类型,前景色(不设置即默认为0xffff);
+- `Foreground_color`,int类型,背景色(不设置即默认为0x0000)。
**返回值描述:**
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/quecgnss.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/quecgnss.md"
index a404cc66bb6dd771152228f32c45ce7d54cd3b73..45415fc0ac0f7a2e7cfdc0bb689f257a98bd1c14 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/quecgnss.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/quecgnss.md"
@@ -2,7 +2,72 @@
此模块提供内置GNSS的使用接口
-> **说明**:当前仅 EC200UCNAA/EC200UCNLA/EC200UEUAA/EC800MCNGA/EC800GCNGA 型号支持该功能。
+> 当前仅 EC200UCNAA/EC200UCNLA/EC200UEUAA/EC800MCNGA/EC800GCNGA 型号支持该功能。
+
+**使用示例**
+
+```python
+import quecgnss
+
+
+def main():
+ ret = quecgnss.init()
+ if ret == 0:
+ print('GNSS init ok.')
+ else:
+ print('GNSS init failed.')
+ return -1
+ data = quecgnss.read(4096)
+ print(data[1].decode())
+
+ quecgnss.gnssEnable(0)
+
+
+if __name__ == '__main__':
+ main()
+
+
+#===================================================================================================
+#运行结果
+167,169,170,,,,,,,,1.773,1.013,1.455*15
+$GPGSV,2,1,8,3,23,303,34,16,32,219,28,22,74,98,26,25,16,43,25*77
+$GPGSV,2,2,8,26,70,236,28,31,59,12,38,32,55,127,34,4,5,,21*49
+$BDGSV,2,1,8,163,51,192,32,166,70,11,31,167,52,197,32,169,59,334,31*61
+$BDGSV,2,2,8,170,40,205,31,161,5,,31,164,5,,27,165,5,,29*59
+$GNRMC,022326.000,A,3149.324624,N,11706.921702,E,0.000,261.541,180222,,E,A*38
+$GNGGA,022326.000,3149.324624,N,11706.921702,E,1,12,1.013,-8.580,M,0,M,,*47
+$GNGLL,3149.324624,N,11706.921702,E,022326.000,A,A*44
+$GNGSA,A,3,31,32,3,16,22,25,26,,,,,,1.773,1.013,1.455*1C
+$GNGSA,A,3,163,166,167,169,170,,,,,,,,1.773,1.013,1.455*15
+$GPGSV,2,1,8,3,23,303,34,16,32,219,27,22,74,98,26,25,16,43,25*78
+$GPGSV,2,2,8,26,70,236,28,31,59,12,37,32,55,127,34,4,5,,20*47
+$BDGSV,2,1,8,163,51,192,32,166,70,11,31,167,52,197,32,169,59,334,31*61
+$BDGSV,2,2,8,170,40,205,31,161,5,,31,164,5,,27,165,5,,29*59
+$GNRMC,022327.000,A,3149.324611,N,11706.921713,E,0.000,261.541,180222,,E,A*3F
+$GNGGA,022327.000,3149.324611,N,11706.921713,E,1,12,1.013,-8.577,M,0,M,,*48
+$GNGLL,3149.324611,N,11706.921713,E,022327.000,A,A*43
+...... # 数据较多,省略
+$GNGSA,A,3,31,32,3,16,22,25,26,,,,,,1.837,1.120,1.456*11
+$GNGSA,A,3,163,166,167,169,170,,,,,,,,1.837,1.120,1.456*18
+$GPGSV,2,1,8,3,23,302,27,16,32,220,26,22,73,101,27,25,16,43,27*45
+$GPGSV,2,2,8,26,70,237,28,31,59,13,33,32,54,128,28,4,5,,24*44
+$BDGSV,2,1,8,163,51,192,33,166,71,11,35,167,52,198,33,169,59,334,34*6E
+$BDGSV,2,2,8,170,40,205,32,161,5,,33,164,5,,28,165,5,,30*5F
+$GNRMC,022507.000,A,3149.324768,N,11706.922344,E,0.000,261.541,180222,,E,A*31
+$GNGGA,022507.000,3149.324768,N,11706.922344,E,1,12,1.120,-8.794,M,0,M,,*48
+$GNGLL,3149.324768,N,11706.922344,E,022507.000,A,A*4D
+$GNGSA,A,3,31,32,3,16,22,25,26,,,,,,1.837,1.120,1.455*12
+$GNGSA,A,3,163,166,167,169,170,,,,,,,,1.837,1.120,1.455*1B
+$GPGSV,2,1,8,3,23,302,26,16,32,220,26,22,73,101,27,25,16,43,26*45
+$GPGSV,2,2,8,26,70,237,28,31,59,13,32,32,54,128,28,4,5,,24*45
+$BDGSV,2,1,8,163,51,192,24,166,71,11,35,167,52,198,33,169,59,334,34*68
+$BDGSV,2,2,8,170,40,205,31,161,5,,33,164,5,,28,165,5,,30*5C
+$GNRMC,022508.000,A,3149.324754,N,11706.922338,E,0.002,261.541,180222,,E,A*38
+$GNGGA,022508.000,3149.324754,N,11706.922338,E,1,12,1.120,-8.750,M,0,M,,*4B
+$GNGLL,3149.324754,N,11706.922338,E,022508.000,A,A*46
+$GNGSA,A,3,31,3
+```
+
## GNSS 功能初始化
@@ -15,7 +80,7 @@ quecgnss.init()
模组内置GNSS模块功能的初始化。
**返回值描述**
-成功返回整形`0`,失败返回整形`-1`。
+成功返回整型`0`,失败返回整型`-1`。
## GNSS 工作状态获取
@@ -55,7 +120,7 @@ quecgnss.gnssEnable(opt)
**返回值描述**
-成功返回整形 `0`,失败返回整形 `-1`。
+成功返回整型 `0`,失败返回整型 `-1`。
## GNSS定位数据获取
@@ -73,71 +138,7 @@ quecgnss.read(size)
**返回值描述**
-成功返回一个元组,失败返回整形-1。元组形式如下:
+成功返回一个元组,失败返回整型-1。元组形式如下:
`(size, data)`
`size` - 实际读取数据的大小
-`data` - GNSS定位数据
-
-**GNSS使用示例**
-
-```python
-import quecgnss
-
-
-def main():
- ret = quecgnss.init()
- if ret == 0:
- print('GNSS init ok.')
- else:
- print('GNSS init failed.')
- return -1
- data = quecgnss.read(4096)
- print(data[1].decode())
-
- quecgnss.gnssEnable(0)
-
-
-if __name__ == '__main__':
- main()
-
-
-#===================================================================================================
-#运行结果
-167,169,170,,,,,,,,1.773,1.013,1.455*15
-$GPGSV,2,1,8,3,23,303,34,16,32,219,28,22,74,98,26,25,16,43,25*77
-$GPGSV,2,2,8,26,70,236,28,31,59,12,38,32,55,127,34,4,5,,21*49
-$BDGSV,2,1,8,163,51,192,32,166,70,11,31,167,52,197,32,169,59,334,31*61
-$BDGSV,2,2,8,170,40,205,31,161,5,,31,164,5,,27,165,5,,29*59
-$GNRMC,022326.000,A,3149.324624,N,11706.921702,E,0.000,261.541,180222,,E,A*38
-$GNGGA,022326.000,3149.324624,N,11706.921702,E,1,12,1.013,-8.580,M,0,M,,*47
-$GNGLL,3149.324624,N,11706.921702,E,022326.000,A,A*44
-$GNGSA,A,3,31,32,3,16,22,25,26,,,,,,1.773,1.013,1.455*1C
-$GNGSA,A,3,163,166,167,169,170,,,,,,,,1.773,1.013,1.455*15
-$GPGSV,2,1,8,3,23,303,34,16,32,219,27,22,74,98,26,25,16,43,25*78
-$GPGSV,2,2,8,26,70,236,28,31,59,12,37,32,55,127,34,4,5,,20*47
-$BDGSV,2,1,8,163,51,192,32,166,70,11,31,167,52,197,32,169,59,334,31*61
-$BDGSV,2,2,8,170,40,205,31,161,5,,31,164,5,,27,165,5,,29*59
-$GNRMC,022327.000,A,3149.324611,N,11706.921713,E,0.000,261.541,180222,,E,A*3F
-$GNGGA,022327.000,3149.324611,N,11706.921713,E,1,12,1.013,-8.577,M,0,M,,*48
-$GNGLL,3149.324611,N,11706.921713,E,022327.000,A,A*43
-...... # 数据较多,省略
-$GNGSA,A,3,31,32,3,16,22,25,26,,,,,,1.837,1.120,1.456*11
-$GNGSA,A,3,163,166,167,169,170,,,,,,,,1.837,1.120,1.456*18
-$GPGSV,2,1,8,3,23,302,27,16,32,220,26,22,73,101,27,25,16,43,27*45
-$GPGSV,2,2,8,26,70,237,28,31,59,13,33,32,54,128,28,4,5,,24*44
-$BDGSV,2,1,8,163,51,192,33,166,71,11,35,167,52,198,33,169,59,334,34*6E
-$BDGSV,2,2,8,170,40,205,32,161,5,,33,164,5,,28,165,5,,30*5F
-$GNRMC,022507.000,A,3149.324768,N,11706.922344,E,0.000,261.541,180222,,E,A*31
-$GNGGA,022507.000,3149.324768,N,11706.922344,E,1,12,1.120,-8.794,M,0,M,,*48
-$GNGLL,3149.324768,N,11706.922344,E,022507.000,A,A*4D
-$GNGSA,A,3,31,32,3,16,22,25,26,,,,,,1.837,1.120,1.455*12
-$GNGSA,A,3,163,166,167,169,170,,,,,,,,1.837,1.120,1.455*1B
-$GPGSV,2,1,8,3,23,302,26,16,32,220,26,22,73,101,27,25,16,43,26*45
-$GPGSV,2,2,8,26,70,237,28,31,59,13,32,32,54,128,28,4,5,,24*45
-$BDGSV,2,1,8,163,51,192,24,166,71,11,35,167,52,198,33,169,59,334,34*68
-$BDGSV,2,2,8,170,40,205,31,161,5,,33,164,5,,28,165,5,,30*5C
-$GNRMC,022508.000,A,3149.324754,N,11706.922338,E,0.002,261.541,180222,,E,A*38
-$GNGGA,022508.000,3149.324754,N,11706.922338,E,1,12,1.120,-8.750,M,0,M,,*4B
-$GNGLL,3149.324754,N,11706.922338,E,022508.000,A,A*46
-$GNGSA,A,3,31,3
-```
+`data` - GNSS定位数据
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/securedata.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/securedata.md"
index 167cc42adca7cdc501a10150fb73c51816a76f08..6404f3c5aacf48bcd2969d0f6501e1af3c92c3d6 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/securedata.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/securedata.md"
@@ -2,7 +2,25 @@
模组提供一块裸flash区域及专门的读写接口供客户存贮重要信息,且信息在烧录固件后不丢失(烧录不包含此功能的固件无法保证不丢失)。提供一个存储和读取接口,不提供删除接口。
-> 目前除BC25/BG95/EC200A系列外,其余平台均支持本功能
+
+> 目前除BC25/BG95/EC200A系列外,其余系列均支持本功能
+
+**示例**
+
+```python
+import SecureData
+# 即将存储的数据buf
+databuf = '\x31\x32\x33\x34\x35\x36\x37\x38'
+# 在index为1的存储区域中存储长度为8的数据databuf
+SecureData.Store(1, databuf, 8)
+# 定义一个长度为20的数组用于读取存储的数据
+buf = bytearray(20)
+# 读取index为1的存储区域中的数据至buf中,将读取到数据的长度存储在变量length中
+length = SecureData.Read(1, buf, 20)
+# 输出读到的数据
+print(buf[:length])
+```
+
## 数据存储
@@ -42,7 +60,7 @@ SecureData.Read(index,databuf,len)
**参数描述**
-* `index`,index范围为1-16:读取存储数据对应的索引号,int类型
+* `index`,index范围为1-16:待读取数据对应的索引号,int类型
* `databuf`,存储读取到的数据,bytearray类型
* `len`,要读取数据的长度,int类型
@@ -53,33 +71,3 @@ SecureData.Read(index,databuf,len)
`-2`存储数据不存在且备份数据也不存在
`-1`参数有误
`其他`实际读取到的数据长度
-
-**示例**
-
-```python
-import SecureData
-# 即将存储的数据buf
-databuf = '\x31\x32\x33\x34\x35\x36\x37\x38'
-# 在index为1的存储区域中存储长度为8的数据databuf
-SecureData.Store(1, databuf, 8)
-# 定义一个长度为20的数组用于读取存储的数据
-buf = bytearray(20)
-# 读取index为1的存储区域中的数据至buf中,将读取到数据的长度存储在变量length中
-length = SecureData.Read(1, buf, 20)
-# 输出读到的数据
-print(buf[:length])
-```
-
-**使用示例**
-
-```python
->>> import SecureData
->>> databuf = '\x31\x32\x33\x34\x35\x36\x37\x38'
->>> SecureData.Store(1, databuf, 8)
-0
->>> buf = bytearray(20)
->>> length = SecureData.Read(1, buf, 20)
->>> print(buf[:length])
-bytearray(b'12345678')
->>>
-```
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/sim.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/sim.md"
index 15532642c99dc0785ac94da983ecbdd241d3558f..a6d60d2df574dfb88521488fb2fcfceef3b4d9f5 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/sim.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/sim.md"
@@ -1,10 +1,10 @@
# sim - SIM卡功能
-模块功能:提供sim卡相关功能的接口,如查询sim卡状态、iccid、imsi、电话号码等。
+该模块提供sim卡相关功能的接口,如查询sim卡状态、iccid、imsi、电话号码等。
-> 注意:能成功获取IMSI、ICCID、电话号码的前提是SIM卡状态为1,可通过sim.getStatus()查询。
+> 能成功获取IMSI、ICCID、电话号码的前提是SIM卡状态为1,可通过sim.getStatus()查询。
@@ -31,7 +31,7 @@ sim.genericAccess(simId, cmd)
-> 注意:仅EC100Y/EC200N/EC600N/EC600S/EC800N/EG912N/EG915N系列支持该方法。
+> 仅EC100Y/EC200N/EC600N/EC600S/EC800N/EG912N/EG915N系列支持该方法。
@@ -112,7 +112,7 @@ sim.getPhoneNumber()
->注意:BC25系列不支持此方法
+>BC25系列不支持此方法
@@ -354,8 +354,6 @@ sim.readPhonebook(storage, start, end, username)
->注意:
->
>- EC100Y/EC200N/EC600N/EC600S/EC800N/EG912N/EG915N/EC600MCNLE/EC600MCNLA/EC800MCNLA/EC800MCNLE/EC800MCNGA/EG810M/EC200A系列支持此方法。
>
>- 按username进行匹配时,并不是按完整的单词进行匹配,只要电话簿中已有记录的name是以username开头,那么就会匹配上。
@@ -400,7 +398,7 @@ sim.writePhonebook(storage, index, username, number)
-> 注意:EC100Y/EC200N/EC600N/EC600S/EC800N/EG912N/EG915N/EC600MCNLE/EC600MCNLA/EC800MCNLA/EC800MCNLE/EC800MCNGA/EG810M/EC200A系列支持此方法。
+> EC100Y/EC200N/EC600N/EC600S/EC800N/EG912N/EG915N/EC600MCNLE/EC600MCNLA/EC800MCNLA/EC800MCNLE/EC800MCNGA/EG810M/EC200A系列支持此方法。
@@ -435,7 +433,7 @@ SIM卡热插拔开关:用于设置SIM卡热插拔相关配置。
-> 注意:BC25系列不支持此方法。
+> BC25系列不支持此方法。
@@ -471,7 +469,7 @@ sim.getSimDet()
->注意:BC25系列不支持此方法。
+>BC25系列不支持此方法。
@@ -503,7 +501,7 @@ sim.getCurSimid()
->注意:支持该方法的模组:EC600M/EC800M系列。
+>支持该方法的模组:EC600M/EC800M系列。
@@ -535,7 +533,7 @@ sim.switchCard(simId)
->注意:支持该方法的模组:EC600M/EC800M系列。
+>支持该方法的模组:EC600M/EC800M系列。
@@ -582,7 +580,7 @@ def usrFun(args):
-> 注意:BC25系列不支持此方法。
+> BC25系列不支持此方法。
@@ -629,7 +627,7 @@ def usrFun(args):
> 支持该方法的模组:EC600M/EC800M系列。
>
-> 注意:以下几点:
1、目标卡不存在或者目标卡状态异常;
2、目标卡是当前卡;
以上情况切卡方法`sim.switchCard`直接返回-1,不触发此接口设置的回调函数。
+> 注意以下几点:
1、目标卡不存在或者目标卡状态异常;
2、目标卡是当前卡;
以上情况切卡方法`sim.switchCard`直接返回-1,不触发此接口设置的回调函数。
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/sms.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/sms.md"
index bcf9a70fa75e10c1e72c86fcc3cdcdb4a73ae245..15f619839758a8f5ceb7e756443be5bda8319a2c 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/sms.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/sms.md"
@@ -1,10 +1,10 @@
# sms - 短信功能
-模块功能:该模块提供短信功能相关方法,包括读取、发送、删除短信等方法。
+该模块提供短信功能相关方法,包括读取、发送、删除短信等方法。
-> 注意:BC25/EC600M系列不支持此功能。
+> BC25/EC600M系列不支持此功能。
@@ -35,7 +35,7 @@ sms.sendTextMsg(phoneNumber, msg, codeMode)
-> 注意:仅以下系列支持长短信:
+> 仅以下系列支持长短信:
>
> EC100Y/EC200N/EC600N/EC600S/EC800N/EG912N/EG915N/EC800M/EG810M/EC200A系列支持6条正常短信长度;
>
@@ -81,7 +81,7 @@ sms.sendPduMsg(phoneNumber, msg, codeMode)
-> 注意:仅以下系列支持长短信:
+> 仅以下系列支持长短信:
>
> EC100Y/EC200N/EC600N/EC600S/EC800N/EG912N/EG915N/EC600M/EC800M/EG810M/EC200A系列支持6条正常短信长度;
>
@@ -128,7 +128,7 @@ sms.deleteMsg(index [, delmode])
-> 注意:BC25/EC800G不支持可选参数的使用
+> BC25/EC800G不支持可选参数的使用
@@ -174,7 +174,7 @@ sms.setSaveLoc(mem1, mem2, mem3)
-> 注意:不同系列短信默认存储空间有差异,用户根据自己的需求进行设置。
+> 不同系列短信默认存储空间有差异,用户根据自己的需求进行设置。
>
> EC100Y/EC200N/EC600N/EC600S/EC800N/EG912N/EG915N/EC800M/EG810M/EC200A系列如果要改变接收消息的存储位置,需要同时设定mem2 & mem3;EC200U/EC600U/EG912U/EG915U/EC600G/EC800G系列只需设定mem3即可
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/uping.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/uping.md"
index 3d2a1d7b7cdba067b154f74e3b6f461a32080f47..1fe8aad5727fd6f780a9a274824d7105bf5a48aa 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/uping.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/uping.md"
@@ -1,9 +1,6 @@
+# class uping - 发送ping包
-```
-本文阐述了QuecPython的uping模块的用法,描述了uping模块最新版本的特性。
-```
-
-uping 模块实现模拟发送icmp-ping包。
+该模块实现了 IPv4 ping 请求功能。
> 注意:1.可能会存在host地址无法建立socket连接异常。2.通过初始化参数中的`COUNT`和`INTERVAL`来确认发Ping包周期。
@@ -32,7 +29,6 @@ result = uping.ping('baidu.com', quiet=True)
# result(tx=4, rx=4, losses=0, min=76.93899999999999, avg=131.348, max=226.697)
```
-
## 构造函数
### `uping.ping`
@@ -50,8 +46,8 @@ uping.ping(HOST, SOURCE=None, COUNT=4, INTERVAL=1000, SIZE=64, TIMEOUT=5000, qui
| HOST | str | 所要ping的域名地址, 例如"baidu.com" |
| SOURCE | str | 源地址, 用于绑定, 一般情况下不需要传 |
| COUNT | int | 默认是4次, 发送4次ping包 |
-| INTERVAL | int | 间隔时间, 默认是ms单位, 默认1000ms |
+| INTERVAL | int | 间隔时间, 单位:ms, 默认1000ms |
| SIZE | int | 每次读取的包大小默认64, 无需修改 |
-| TIMEOUT | int | 超时时间, 单位是ms单位, 默认是5000ms即5s |
-| quiet | bool | 默认fasle,打印输出, 设置True后, 调用start的后得到的打印的值会被转换成对象返回, 而不是通过打印显示 |
+| TIMEOUT | int | 超时时间, 单位:ms, 默认5000ms |
+| quiet | bool | 默认:false,打印直接输出。若设为True, 调用start默认打印的值会被转换成对象返回。 |
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/voiceCall.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/voiceCall.md"
index 6cceb72b344e1f9630300b536d273288bebc3bb2..be185d6a62c9234fa547d2b6ff9525b37de71264 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/voiceCall.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/voiceCall.md"
@@ -1,12 +1,11 @@
# voiceCall - 电话功能
-模块功能:该模块提供电话功能相关接口。
+该模块提供电话功能相关接口。
->注意:
>* 支持voiceCall功能的模组:
-> EC100Y系列:EC100YCN_AA
+>EC100Y系列:EC100YCN_AA
> EC200N系列:EC200NCN_AA/EC200NCN_AC/EC200NCN_LA
> EC600N系列:EC600NCN_AA/EC600NCN_LC/EC600NCN_LD/EC600NCN_LF
> EC600S系列:EC600SCN_LA
@@ -16,7 +15,7 @@
> EC200U系列:EC200UAU_AB/EC200UCN_AA/EC200UEU_AA/EC200UEU_AB
> EC600U系列:EC600CEU_AB/EG912UGL_AA/EG915UEU_AB
> BC25/EC600G/EC800G/BG95/BG77系列模组不支持voiceCall功能。
->* 其他系列模组需要定制版本才能支持voiceCall功能。
+> * 其他系列模组需要定制版本才能支持voiceCall功能。
@@ -193,8 +192,6 @@ def voice_callback(args):
->注意:
->
>* 1、以上仅适用2021-09-09之后发布的支持语音通话的版本
>* 2、QPY_V0004_EC600N_CNLC_FW_VOLTE(2021-09-09发布)之前发布的版本都按照以下规则使用voiceCall
@@ -246,7 +243,7 @@ voiceCall.setAutoCancel(enable)
->注意:EC200AAU_HA/EC200ACN_DA/EC200ACN_HA/EC200ACN_LA/EC200AEU_HA系列模组支持该功能
+>EC200AAU_HA/EC200ACN_DA/EC200ACN_HA/EC200ACN_LA/EC200AEU_HA系列模组支持该功能
@@ -319,7 +316,7 @@ voiceCall.startDtmf(dtmf, duration)
->注意:该方法仅在语音通话过程中使用生效
+>该方法仅在语音通话过程中使用生效
@@ -351,7 +348,7 @@ voiceCall.dtmfDetEnable(enable)
->注意:支持voiceCall功能的模组型号中,EC600N/EC600S/EC800N/EG912N/EG915N系列支持该方法。
+>支持voiceCall功能的模组型号中,EC600N/EC600S/EC800N/EG912N/EG915N系列支持该方法。
@@ -382,7 +379,7 @@ def dtmfFun(args):
->注意:支持voiceCall功能的模组型号中,EC600N/EC600S/EC800N/EG912N/EG915N系列支持该方法。
+>支持voiceCall功能的模组型号中,EC600N/EC600S/EC800N/EG912N/EG915N系列支持该方法。
@@ -641,7 +638,6 @@ voiceCall.readRecordStream(readBuf, bufLen)
->注意:
>* 录音流第一包数据均是对应格式文件的文件头
>* wav格式录音流第一包数据不包含文件大小,需结束录音后自行计算
@@ -689,7 +685,6 @@ def recordStreamCallback(args):
->注意:
>* 录音流第一包数据均是对应格式文件的文件头
>* wav格式录音流第一包数据不包含文件大小,需结束录音后自行计算
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/wifiScan.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/wifiScan.md"
index bb916973486d120ae75d3779c58ca1494b0f070a..83829cbce9ea12b911acb8355055223ccdfc2d77 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/wifiScan.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/wifiScan.md"
@@ -2,15 +2,17 @@
`wifiScan`模块提供了同步和异步两种方式来扫描模组周边的WiFi热点信息。
-支持`wifiScan`功能的模组:
-EC100Y/EC200N/EC600N/EC600S/EC600M部分系列/EC800M部分系列/EC800N/EG912N/EG915N/EG810M/EC600G/EC800G/EC200U/EC600U部分系列/EG912U/EG915U系列模组。
-EC600M系列模组中,EC600MCN_LC/EC600MCN_LF不支持`wifiScan`;
-
-EC800M系列模组中,EC800MCN_GC/EC800MCN_LC/EC800MCN_LF不支持`wifiScan`;
-
-EC600U系列模组中,EC600UEC_AC不支持`wifiScan`。
+> 支持`wifiScan`功能的模组:
+>
+> EC100Y/EC200N/EC600N/EC600S/EC600M部分系列/EC800M部分系列/EC800N/EG912N/EG915N/EG810M/EC600G/EC800G/EC200U/EC600U部分系列/EG912U/EG915U系列模组。
+>
+> EC600M系列模组中,EC600MCN_LC/EC600MCN_LF不支持`wifiScan`;
+>
+> EC800M系列模组中,EC800MCN_GC/EC800MCN_LC/EC800MCN_LF不支持`wifiScan`;
+>
+> EC600U系列模组中,EC600UEC_AC不支持`wifiScan`。
@@ -81,7 +83,7 @@ wifiScan.setCfgParam(timeout, round, maxNums[, priority])
-> EC200U/EC600U/EG912U/EG915U/EC600G/EC800G系列模组不支持priority参数,使用时可不填该参数,如果填写了也没有影响。
+> EC200U/EC600U/EG912U/EG915U/EC600G/EC800G系列模组不支持priority参数,使用时可不填该参数。
@@ -95,7 +97,7 @@ wifiScan.getCfgParam()
**返回值描述:**
-成功返回一个元组,失败返回整型` -1`。返回元组格式如下,返回值参数描述见`wifiScan.setCfgParam`方法的参数描述:
+成功返回一个元组,失败返回整型` -1`。返回值参数描述见`wifiScan.setCfgParam`方法的参数描述,返回元组格式如下:
`(timeout, round, maxNums, priority)`
diff --git "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/wifilocator.md" "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/wifilocator.md"
index 237cf8779b7f11750568583f171ae23fd4c523f3..37e7206a74bc5ec2af200015f6250c6be1893f4b 100644
--- "a/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/wifilocator.md"
+++ "b/docs/API_reference/zh/QuecPython\347\261\273\345\272\223/wifilocator.md"
@@ -1,10 +1,10 @@
# class wifilocator - WIFI定位
-模块功能:提供WIFI定位功能的类,获取模组经纬度坐标信息。
+该模块提供WIFI定位功能的类,获取模组经纬度坐标信息。
-> 注意:当前仅EC600S/EC600N/EC800N/EC200U/EC600U系列支持该功能。
+> 当前仅EC600S/EC600N/EC800N/EC200U/EC600U系列支持该功能。
diff --git "a/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/Queue.md" "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/Queue.md"
new file mode 100644
index 0000000000000000000000000000000000000000..51b481477e285182b3dff8dbb1fa120e346d4017
--- /dev/null
+++ "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/Queue.md"
@@ -0,0 +1,109 @@
+# Queue - 普通队列
+
+模块功能: 用于线程间通信
+
+
+
+## 构造函数
+
+### `queue.Queue`
+
+```python
+class queue.Queue(maxsize=100)
+```
+
+**参数描述:**
+
+`maxsize`-队列最大长度, int类型, 默认长度是100
+
+**示例**:
+
+```python
+>>> from queue import Queue
+>>> q = Queue(100)
+```
+
+
+
+## 往队列放入数据
+
+### `Queue.put`
+
+往队列中塞入数据
+
+```python
+Queue.put(data)
+```
+
+**参数描述:**
+`data`-数据或信号, 任意类型, 插入的数据, 可以为空不传, 不传则可认识是放松了一个空信号
+
+**返回值描述:**
+
+True 为成功, False 为失败
+
+
+
+## 获取数据
+
+### `Queue.get`
+
+从队列中获取数据, 这里需要注意一下获取数据这块的是阻塞获取
+
+```python
+Queue.get()
+```
+
+**返回值描述:**
+
+为队列中的数据, 如果是空信号则会获取为None
+
+
+
+## 查看队列是否为空
+
+### `Queue.empty`
+
+```python
+Queue.empty()
+```
+
+**返回值描述:**
+
+True则为空, False则不为空
+
+
+
+## 查看队列中存在的数据个数
+
+### `Queue.size`
+
+```python
+Queue.size()
+```
+
+**返回值描述:**
+
+int类型的当前数据长度
+
+
+
+**示例**:
+
+```python
+import _thread
+from queue import Queue
+
+# 初始化队列 默认长度100
+q = Queue()
+
+
+def get():
+ while True:
+ # 阻塞获取
+ data = q.get()
+ print("data = {}".format(data))
+
+# 线程去阻塞
+_thread.start_new_thread(get, ())
+```
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/README.md" "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/README.md"
index 97a5d24a82b519ed7e5b50c87455ae68bf17d7d9..c25939a608422a86161abbd4781a4d083e17d974 100644
--- "a/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/README.md"
+++ "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/README.md"
@@ -7,10 +7,14 @@
## QuecPython 组件库列表
- [aLiYun - 阿里云服务](./aLiYun.md)
+- [ql_fs - 文件存储](./ql_fs.md)
+- [Queue - 队列](./Queue.md)
+- [sys_bus - 会话总线](./sys_bus.md)
+- [uwebsocket - websocket](./uwebsocket.md)
- [TenCentYun - 腾讯云服务](./TenCentYun.md)
- [request - HTTP请求](./request.md)
- [log - 日志模块](./log.md)
- [umqtt - MQTT模块](./umqtt.md)
-- [...](./....md)
+- [ussl - ussl模块](./ussl.md)
diff --git "a/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/log.md" "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/log.md"
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..14a338a44d641e11c4c9655f10fef6099bb74ae6 100644
--- "a/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/log.md"
+++ "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/log.md"
@@ -0,0 +1,180 @@
+# log -日志
+
+在程序开发中,日志(log)是一种用于记录应用程序在运行时状态的工具。它可以记录应用程序的运行情况,以及帮助开发人员诊断和解决问题。通过记录日志,开发人员可以更快地找到问题的根本原因,也可以更好地了解应用程序的行为和性能。`log` 模块可以记录不同级别的日志,包括调试信息、警告信息、错误信息等。
+
+
+
+## 日志级别
+
+### `log.DEBUG`
+
+常量,用来标识LOG等级, 最详细的日志信息,通常只在开发和调试时使用。
+
+### `log.INFO`
+
+常量,用来标识LOG等级,确认一切按预期运行。
+
+### `log.WARNING`
+
+常量,用来标识LOG等级,表明发生了一些意外,或者指示可能出现问题的情况,但仍然可以继续执行。
+
+### `log.ERROR`
+
+常量,用来标识LOG等级,由于更严重的问题,应用程序已不能执行某些功能。
+
+### `log.CRITICAL`
+
+常量,用来标识LOG等级,指出应用程序中的严重错误,可能导致应用程序停止运行。
+
+## 日志设置
+
+### `log.basicConfig`
+
+设置日志输出级别, 默认为log.INFO,系统只会输出 level 数值大于或等于该 level 的的日志结果。
+
+```python
+log.basicConfig(level)
+```
+
+**参数介绍:**
+
+- `level`-日志等级
+
+**示例:**
+
+```python
+import log
+log.basicConfig(level=log.INFO)
+```
+
+### `log.set_output`
+
+设置日志输出的位置, 目前只支持uart和usys.stdout
+
+```python
+log.set_output(out)
+```
+
+**参数介绍:**
+
+- `out`-日志输出位置,输出到指定串口或者交互口,默认不设置为交互口输出。
+
+**示例:**
+
+```python
+import log
+log.basicConfig(level=log.INFO)
+Testlog = log.getLogger("TestLog")
+
+# 设置输出到debug口
+from machine import UART
+uart = UART(UART.UART0, 115200, 8, 0, 1, 0)
+
+log.set_output(uart)
+
+Testlog.info("this is a Test log") # 会输出带对应的uart口
+
+# 从uart口切换成交互口输出
+import usys
+log.set_output(usys.stdout)
+
+Testlog.info("this is a Test log") # 会输出到交互口
+```
+
+## 日志输出
+
+### `log.getLogger`
+
+获取log对象,对象支持输出不同等级的log信息。
+
+```python
+Testlog = log.getLogger(name)
+```
+
+**参数介绍:**
+
+- `name`-当前log对象的主题信息。
+
+**返回值描述:**
+
+- log操作句柄,也可理解成log对象,拥有log输出的方法。
+
+### `log.debug`
+
+输出DEBUG级别的日志。
+
+```python
+Testlog.debug(msg)
+```
+
+**参数介绍:**
+
+- `msg`-日志内容
+
+### `log.info`
+
+输出INFO级别的日志。
+
+```python
+Testlog.info(msg)
+```
+
+**参数介绍:**
+
+- `msg`-日志内容
+
+### `log.warning`
+
+输出WARNING级别的日志。
+
+```python
+Testlog.warning(msg)
+```
+
+**参数介绍:**
+
+- `msg`-日志内容
+
+### `log.error`
+
+输出ERROR级别的日志。
+
+```python
+Testlog.error(msg)
+```
+
+**参数介绍:**
+
+- `msg`-日志内容
+
+### `log.critical`
+
+输出CRITICAL级别的日志。
+
+```python
+Testlog.critical(msg)
+```
+
+**参数介绍:**
+
+- `msg`-日志内容
+
+### 示例
+
+```python
+import log
+
+# 设置日志输出级别
+log.basicConfig(level=log.INFO)
+# 获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象
+Testlog = log.getLogger("Quec")
+
+Testlog.error("Test error message!!")
+Testlog.debug("Test debug message!!")
+Testlog.critical("Test critical message!!")
+Testlog.info("Test info message!!")
+Testlog.warning("Test warning message!!")
+```
+
+
+
diff --git "a/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/ql_fs.md" "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/ql_fs.md"
new file mode 100644
index 0000000000000000000000000000000000000000..67621bade41d62565274c8f409c8fa1f603fc2be
--- /dev/null
+++ "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/ql_fs.md"
@@ -0,0 +1,224 @@
+# ql_fs - 高级文件操作
+
+模块功能: 用于文件的高级操作
+
+> 注意: 适配版本, BC25不支持
+
+
+
+
+
+## 查看文件或文件夹是否存在
+
+### `ql_fs.path_exists`
+
+```python
+ql_fs.path_exists(file_path)
+```
+
+**参数描述:**
+
+`file_path`-文件路径, string类型, 文件或文件夹的绝对路径
+
+**返回值描述:**
+
+存在返回 True, 不存在返回False
+
+**示例:**
+
+```python
+>>> import ql_fs
+>>> ret = ql_fs.path_exists("/usr/xxx.py")
+>>> print(ret)
+
+# 存在打印True 不存在 FalseCopy to clipboardErrorCopied
+```
+
+
+
+## 获取文件所在文件夹路径
+
+### `ql_fs.path_dirname`
+
+```python
+ql_fs.path_dirname(file_path)
+```
+
+**参数描述:**
+
+`file_path`-文件路径, string类型, 文件或文件夹的绝对路径
+
+**返回值描述:**
+
+string类型的路径地址
+
+**示例:**
+
+```python
+>>> import ql_fs
+>> ret = ql_fs.path_dirname("/usr/bin")
+>>> print(ret)
+
+# 打印结果如下
+# /usr
+```
+
+
+
+## 创建文件夹
+
+### `ql_fs.mkdirs`
+
+```python
+ql_fs.mkdirs(dir_path)
+```
+
+该方法递归式创建文件夹, 传入文件夹路径
+
+**参数描述:**
+
+`dir_path`-文件路径, string类型, 所要创建的文件夹绝对路径
+
+**示例:**
+
+```python
+>>> import ql_fs
+>>> ql_fs.mkdirs("usr/a/b")
+```
+
+
+
+
+
+## 删除文件夹
+
+### `ql_fs.rmdirs`
+
+```python
+ql_fs.rmdirs(dir_path)
+```
+
+**参数描述:**
+
+`dir_path`-文件路径, string类型, 所要创建的文件夹绝对路径
+
+**示例:**
+
+```python
+>>> import ql_fs
+
+>>> ql_fs.rmdirs("usr/a/b")
+```
+
+
+
+## 获取文件大小
+
+### `ql_fs.path_getsize`
+
+```python
+ql_fs.path_getsize(file_path)
+```
+
+**参数:**
+
+`file_path`-文件路径, string类型, 文件或文件夹的绝对路径
+
+**返回值**
+
+int类型的数字, 单位是字节
+
+**示例**
+
+```python
+import ql_fs
+
+ql_fs.path_getsize('usr/system_config.json')
+```
+
+
+
+## 创建文件
+
+### `ql_fs.touch`
+
+```python
+ql_fs.touch(file, data)
+```
+
+创建文件或者更新文件数据, 默认是json文件也可传入文本文件更新, 会自动创建文件夹然后创建或更新文件的内容
+
+**参数描述:**
+
+`file`-文件路径, string类型, 文件或文件夹的绝对路径
+
+ `data`-数据, dict类型, 所要写入的数据,目前只支持json文件
+
+**返回值描述:**
+
+int类型, 0为成功, -1则失败
+
+**示例**:
+
+```python
+>>> import ql_fs
+>>> data = {"test":1}
+>>> ql_fs.touch("/usr/bin/config.json", data)
+```
+
+
+
+## 读取json文件
+
+### `ql_fs.read_json`
+
+```python
+ql_fs.read_json(file)
+```
+
+json文件类型的直接读取json文件并返回, 非json文件类型返回为读取的字符串数据类型
+
+**参数描述:**
+
+`file`-文件路径, string类型, 文件或文件夹的绝对路径
+
+**返回值描述:**
+
+读取成功, 返回dict类型
+
+失败, 返回None
+
+**示例**:
+
+```python
+>>> import ql_fs
+>>> data = ql_fs.read_json("/usr/system_config.json")
+```
+
+
+
+## 文件拷贝
+
+### `ql_fs.file_copy`
+
+```python
+ql_fs.file_copy(dst, src)
+```
+
+将文件从原路径拷贝到目标路径
+
+**参数描述:**
+
+`dst`-目标文件, string类型, 目标路径路径
+`src`-源文件, string类型, 源文件路径
+
+**返回值描述:**
+
+True代表拷贝成功
+
+**示例**:
+
+```python
+>>> import ql_fs
+>>> ql_fs.file_copy("usr/a.json", "usr/system_config.json")
+```
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/request.md" "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/request.md"
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cb826d53b591b3786f0a82d407488e5f86eabe24 100644
--- "a/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/request.md"
+++ "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/request.md"
@@ -0,0 +1,208 @@
+# request- HTTP 客户端库
+
+`request`是一个 HTTP 客户端库,用于向服务器发起 HTTP 请求,它可以被用于从一个服务器获取数据,或者将数据提交到服务器上,支持多种请求方法(如 GET、POST、PUT等)。
+
+## HTTP请求
+
+### `request.get`
+
+```python
+response = requtes.get(url)
+```
+
+发送GET请求。
+
+**参数描述:**
+
+- `url`- 必填参数,请求的远端地址。
+- `data`-可选参数,请求中需要携带参数,JSON格式。
+- `headers`-可选参数,请求头信息,字典类型。
+- `decode`-可选参数,将请求成功后的响应结果解码(UTF8),默认为True,输入False则返回bytes,仅配合response.content使用。
+- `sizeof`-可选参数,读取缓冲区的数据块大小,默认255 个字节,建议255-4096, 数值越大读取的速度越快。
+- `ssl_params`-可选参数,SSL认证时传入密钥,格式为{"cert": certificate_content, "key": private_content}
+
+**返回值描述:**
+
+- 返回响应对象,对象包含了服务器返回的所有信息,例如响应状态码、响应头、响应体等。
+
+### `request.post`
+
+```python
+response = requtes.post(url,data)
+```
+
+发送POST请求。
+
+**参数描述:**
+
+- `url`- 必填参数,请求的远端地址。
+- `data`-可选参数,请求中需要携带的参数,JSON格式。
+- `headers`-可选参数,请求头信息,字典类型。
+- `decode`-可选参数,将请求成功后的响应结果解码(UTF8),默认为True,输入False则返回bytes,仅配合response.content使用。
+- `sizeof`-可选参数,读取缓冲区的数据块大小,默认255 个字节,建议255-4096, 数值越大读取的速度越快。
+
+**返回值描述:**
+
+- 返回响应对象,对象包含了服务器返回的所有信息,例如响应状态码、响应头、响应体等。
+
+**Content-Type介绍:**
+
+当使用POST方法提交数据时,对于提交的数据主要有如下四种形式:
+
+- application/x-www-form-urlencoded:form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
+- multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
+- application/json: JSON数据格式
+- application/octet-stream : 二进制流数据(如常见的文件下载)
+
+### `request.put`
+
+```python
+response = requtes.put(url)
+```
+
+发送PUT请求。
+
+**参数描述:**
+
+- `url`- 必填参数,请求的远端地址。
+- `data`-可选参数,请求中需要携带的参数,JSON格式。
+- `headers`-可选参数,请求头信息,字典类型。
+- `decode`-可选参数,将请求成功后的响应结果解码(UTF8),默认为True,输入False则返回bytes,仅配合response.content使用。
+- `sizeof`-可选参数,读取缓冲区的数据块大小,默认255 个字节,建议255-4096, 数值越大读取的速度越快。
+
+**返回值描述:**
+
+- 返回响应对象,对象包含了服务器返回的所有信息,例如响应状态码、响应头、响应体等。
+
+### `request.head`
+
+```python
+response = requtes.head(url)
+```
+
+发送HEAD请求。
+
+**参数描述:**
+
+- `url`- 必填参数,请求的远端地址。
+- `data`-可选参数,请求中需要携带的参数,JSON格式。
+- `headers`-可选参数,请求头信息,字典类型。
+- `decode`-可选参数,将请求成功后的响应结果解码(UTF8),默认为True,输入False则返回bytes,仅配合response.content使用。
+- `sizeof`-可选参数,读取缓冲区的数据块大小,默认255 个字节,建议255-4096, 数值越大读取的速度越快。
+
+**返回值描述:**
+
+- 返回响应对象,对象包含了服务器返回的所有信息,例如响应状态码、响应头、响应体等。
+
+## 获取响应
+
+`request` 库发送请求后,会返回一个响应对象。响应对象包含了服务器返回的所有信息,例如响应状态码、响应头、响应体等。
+
+### `response.status_code`
+
+使用 `response.status_code` 属性获取响应状态码。
+
+```python
+response.status_code
+```
+
+**返回值描述:**
+
+- int类型,请求状态码
+
+**示例:**
+
+```python
+import request
+
+response = request.get("http://httpbin.org/get")
+print(response.status_code)
+```
+
+### `response.headers`
+
+使用 `response.headers` 属性获取响应头信息。
+
+```python
+response.headers
+```
+
+**返回值描述:**
+
+- dict类型,请求头信息
+
+**示例:**
+
+```python
+import request
+
+response = request.get("http://httpbin.org/get")
+print(response.headers)
+```
+
+### `response.text`
+
+使用 `response.text` 属性获取响应体文本数据。
+
+```python
+response.text
+```
+
+**返回值描述:**
+
+- 生成器对象,通过for遍历读取全部返回的文本数据
+
+**示例:**
+
+```python
+import request
+
+response = request.get("http://httpbin.org/get")
+for i in response.text:
+ print(i)
+```
+
+### `response.content`
+
+使用 `response.content` 属性获取响应体信息。
+
+```python
+response.content
+```
+
+**返回值描述:**
+
+- 生成器对象,通过for遍历读取全部返回的响应体数据
+
+**示例:**
+
+```python
+import request
+
+response = request.get("http://httpbin.org/get")
+for i in response.content:
+ print(i)
+```
+
+### `response.json`
+
+使用 `response.json` 属性获取JSON类型的响应体信息。
+
+```python
+response.json()
+```
+
+**返回值描述:**
+
+- 字典类型的响应体数据
+
+**示例:**
+
+```python
+import request
+
+response = request.get("http://httpbin.org/get")
+data = response.json()
+print(data)
+```
+
diff --git "a/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/sys_bus.md" "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/sys_bus.md"
new file mode 100644
index 0000000000000000000000000000000000000000..de96320067ef12222f1639e7167a8c5af6ba2508
--- /dev/null
+++ "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/sys_bus.md"
@@ -0,0 +1,106 @@
+# sys_bus会话总线
+
+模块功能: 用于消息的订阅和发布广播, 多线程处理等,用于一对多的广播, 类似于内部的mqtt
+
+
+
+## 订阅topic
+
+### `sys_bus.subscribe`
+
+```python
+import sys_bus
+
+sys_bus.subscribe(topic, handler)
+```
+
+**参数描述:**
+
+`topic`-主题, string/int类型, 所需要订阅的topic
+`handler`-处理函数, func函数类型, 处理函数, 当有对应topic过来时, 会对应调用其中的处理函数去处理 handler 需要有两个参数(topic, msg)
+
+
+
+## 发布topic消息
+
+### `sys_bus.publish`
+
+```python
+sys_bus.publish(topic , msg)
+```
+
+发布消息, 对应订阅的topic将收到并多线程对此消息处理
+
+**参数描述:**
+
+`topic`-主题, string/int类型, 所需要订阅的topic
+`msg`-处理函数, 任意类型, 发布的数据
+
+
+
+
+
+## 查看会话总线注册表
+
+### `sys_bus.sub_table`
+
+```python
+sys_bus.sub_table(topic=None)
+```
+
+查看订阅注册表, 注册表中有所有topic和订阅的函数
+
+**参数描述:**
+`topic`-主题, string/int类型, 可以不传 传表示查看此topic的注册表 不传表示查看所有的topic的注册表
+
+**返回值描述:**
+
+dict / list类型的订阅函数列表或注册表
+
+
+
+## 解除订阅
+
+### `sys_bus.unsubscribe`
+
+```python
+sys_bus.unsubscribe(topic , cb=None)
+```
+
+解除订阅订阅的topic, 或者对应topic下的某个函数, 当cb不传时只传入topic时删除topic和从topic下所有的订阅函数, 如果传了cb则删除订阅topic下面订阅列表中的对应的cb函数
+
+
+
+**参数描述:**
+`topic`-主题, string/int类型, 可以不传 传表示查看此topic的注册表 不传表示查看所有的topic的注册表
+
+`cb`-回调函数, func函数类型, 要删除的订阅函数, 不传则删除topic
+
+**返回值描述:**
+
+True 删除成功, False删除失败
+
+
+
+**示例**:
+
+```python
+import sys_bus
+
+
+def test(topic, msg):
+ print("test ... topic = {} msg = {}".format(topic, msg))
+
+# 订阅
+sys_bus.subscribe("test", test)
+# 发布
+sys_bus.publish("test", "this is a test msg")
+
+# test ... topic = test msg = this is a test msg
+
+# 解绑对应test topic下的订阅的test函数
+sys_bus.unsubscribe("test", test)
+
+# 解绑对应test topic下的所有订阅函数
+sys_bus.unsubscribe("test")Copy to clipboardErrorCopied
+```
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/ussl.md" "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/ussl.md"
new file mode 100644
index 0000000000000000000000000000000000000000..ac74682cbe2935a6b8ad8b970b9c5108b3552ad9
--- /dev/null
+++ "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/ussl.md"
@@ -0,0 +1,92 @@
+# SSL
+
+注意 BC25PA平台不支持模块功能。
+
+
+
+## ssl加密算法套件支持
+
+
+
+| 算法套件 |
+| ------------------------------------------------------ |
+| TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca9) |
+| TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xccaa) |
+| TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca8) |
+| TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c) |
+| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030) |
+| TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x009f) |
+| TLS_ECDHE_ECDSA_WITH_AES_256_CCM (0xc0ad) |
+| TLS_DHE_RSA_WITH_AES_256_CCM (0xc09f) |
+| TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (0xc024) |
+| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (0xc028) |
+| TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (0x006b) |
+| TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a) |
+| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014) |
+| TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039) |
+| TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 (0xc0af) |
+| TLS_DHE_RSA_WITH_AES_256_CCM_8 (0xc0a3) |
+| TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 (0xc087) |
+| TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 (0xc08b) |
+| TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 (0xc07d) |
+| TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 (0xc073) |
+| TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 (0xc077) |
+| TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 (0x00c4) |
+| TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (0x0088) |
+| TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b) |
+| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) |
+| TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x009e) |
+| TLS_ECDHE_ECDSA_WITH_AES_128_CCM (0xc0ac) |
+| TLS_DHE_RSA_WITH_AES_128_CCM (0xc09e) |
+| TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (0xc023) |
+| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (0xc027) |
+| TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (0x0067) |
+| TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009) |
+| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013) |
+| TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x0033) |
+| TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 (0xc0ae) |
+| TLS_DHE_RSA_WITH_AES_128_CCM_8 (0xc0a2) |
+| TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 (0xc086) |
+| TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 (0xc08a) |
+| TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 (0xc07c) |
+| TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 (0xc072) |
+| TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 (0xc076) |
+| TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 (0x00be) |
+| TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (0x0045) |
+| TLS_RSA_WITH_AES_256_GCM_SHA384 (0x009d) |
+| TLS_RSA_WITH_AES_256_CCM (0xc09d) |
+| TLS_RSA_WITH_AES_256_CBC_SHA256 (0x003d) |
+| TLS_RSA_WITH_AES_256_CBC_SHA (0x0035) |
+| TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 (0xc032) |
+| TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 (0xc02a) |
+| TLS_ECDH_RSA_WITH_AES_256_CBC_SHA (0xc00f) |
+| TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02e) |
+| TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 (0xc026) |
+| TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA (0xc005) |
+| TLS_RSA_WITH_AES_256_CCM_8 (0xc0a1) |
+| TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 (0xc07b) |
+| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 (0x00c0) |
+| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (0x0084) |
+| TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 (0xc08d) |
+| TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 (0xc079) |
+| TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 (0xc089) |
+| TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 (0xc075) |
+| TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c) |
+| TLS_RSA_WITH_AES_128_CCM (0xc09c) |
+| TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c) |
+| TLS_RSA_WITH_AES_128_CBC_SHA (0x002f) |
+| TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 (0xc031) |
+| TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 (0xc029) |
+| TLS_ECDH_RSA_WITH_AES_128_CBC_SHA (0xc00e) |
+| TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02d) |
+| TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 (0xc025) |
+| TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA (0xc004) |
+| TLS_RSA_WITH_AES_128_CCM_8 (0xc0a0) |
+| TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 (0xc07a) |
+| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 (0x00ba) |
+| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (0x0041) |
+| TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 (0xc08c) |
+| TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 (0xc078) |
+| TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 (0xc088) |
+| TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 (0xc074) |
+| TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff) |
\ No newline at end of file
diff --git "a/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/uwebsocket.md" "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/uwebsocket.md"
new file mode 100644
index 0000000000000000000000000000000000000000..dc81e5567f255970e93b054599b5b9440230b83d
--- /dev/null
+++ "b/docs/API_reference/zh/QuecPython\347\273\204\344\273\266\345\272\223/uwebsocket.md"
@@ -0,0 +1,86 @@
+# uwebsocket
+
+模块功能: 提供用于websocket连接使用
+
+
+
+## 客户端连接
+
+### `uwebsocket.Client.connect`
+
+```python
+>>> import uwebsocket
+>>> ws_client = uwebsocket.Client.connect(uri, headers=None, debug=False)
+```
+
+**参数**:
+`uri` - str类型, websocket的连接地址, 一般以"ws://xxx/"或"wss://xxx/"形式存在
+`headers` - dict类型, 额外需要添加的headers, 用于除了标准连接头之外, 允许用户自己传额外的头部
+`debug` - bool类型, 默认False, 当为True的情况下, 会输出日志
+
+
+
+## send发送数据
+
+### `ws_client.send`
+
+```python
+ws_client.send(msg)
+```
+
+**参数描述:**
+`msg` - str类型, 需要发送的数据
+
+
+
+## recv接收数据
+
+### `ws_client.recv`
+
+```python
+ws_client.recv()
+```
+
+**返回值描述:**
+`result `- str类型, 返回的结果, 就是recv的结果, 当接受空值或None的时候, 为连接被关闭
+
+
+
+## 关闭连接
+
+### `ws_client.close`
+
+```python
+ws_client.close()
+```
+
+
+
+**示例**:
+
+```python
+from usr import uwebsocket
+import _thread
+
+
+def recv(cli):
+ while True:
+ # 死循环接收数据
+ recv_data = cli.recv()
+ print("recv_data = {}".format(recv_data))
+ if not recv_data:
+ # 服务器关闭连接或客户端关闭连接
+ print("cli close")
+ client.close()
+ break
+
+
+# 创建客户端, debug=True输出日志, ip和端口需要自己填写, 或者是域名
+client = uwebsocket.Client.connect('ws://xxx/', debug=True)
+
+# 线程接收数据
+_thread.start_new_thread(recv, (client,))
+
+# 发送数据
+client.send("this is a test msg")
+```
\ No newline at end of file
diff --git a/docs/API_reference/zh/sidebar.yaml b/docs/API_reference/zh/sidebar.yaml
index 2d294fabba0ae5090b1dd1effca4689ceb8ec299..89974b69733b5e8f2c12a2255c55a902b4fc24b8 100644
--- a/docs/API_reference/zh/sidebar.yaml
+++ b/docs/API_reference/zh/sidebar.yaml
@@ -53,12 +53,43 @@ items:
file: QuecPython类库/cellLocator.md
- label: wifilocator - WIFI定位
file: QuecPython类库/wifilocator.md
+ - label: fota - 固件升级相关功能
+ file: QuecPython类库/fota.md
+ - label: app_fota - 用户文件升级相关功能
+ file: QuecPython类库/app_fota.md
- label: checkNet - 网络就绪检测
file: QuecPython类库/checkNet.md
- label: wifiScan - WiFi扫描
file: QuecPython类库/wifiScan.md
- label: ethernet - 以太网相关功能
file: QuecPython类库/ethernet.md
+ items:
+ - label: W5500 - W5500驱动
+ file: QuecPython类库/ethernet.W5500.md
+ - label: DM9051 - DM9051驱动
+ file: QuecPython类库/ethernet.DM9051.md
+ - label: CH395 - CH395驱动
+ file: QuecPython类库/ethernet.CH395.md
+ - label: YT8512H - YT8512H驱动
+ file: QuecPython类库/ethernet.YT8512H.md
+ - label: camera - 摄像扫码
+ file: QuecPython类库/camera.md
+ items:
+ - label: CamPreview - 摄像头预览
+ file: QuecPython类库/camera.CamPreview.md
+ - label: CamDecoder - 摄像头扫码
+ file: QuecPython类库/camera.CamDecoder.md
+ - label: CamCapture - 摄像头拍照
+ file: QuecPython类库/camera.CamCapture.md
+ - label: audio - 音频播放
+ file: QuecPython类库/audio.md
+ items:
+ - label: TTS - 文本到语音播放
+ file: QuecPython类库/audio.TTS.md
+ - label: Audio - 音频播放
+ file: QuecPython类库/audio.Audio.md
+ - label: Record - 录音
+ file: QuecPython类库/audio.Record.md
- label: WLAN - 无线局域网相关功能
file: QuecPython类库/WLAN.md
- label: misc - 其他
@@ -72,6 +103,29 @@ items:
file: QuecPython类库/modem.md
- label: machine - 硬件相关功能
file: QuecPython类库/machine.md
+ items:
+ - label: Pin - 控制I/O引脚
+ file: QuecPython类库/machine.Pin.md
+ - label: UART - 串口通信
+ file: QuecPython类库/machine.UART.md
+ - label: Timer - 硬件定时器
+ file: QuecPython类库/machine.Timer.md
+ - label: ExtInt - 外部中断
+ file: QuecPython类库/machine.ExtInt.md
+ - label: RTC - 实时时钟
+ file: QuecPython类库/machine.RTC.md
+ - label: I2C - I2C通信
+ file: QuecPython类库/machine.I2C.md
+ - label: I2C_simulation - 模拟I2C通信
+ file: QuecPython类库/machine.I2C_simulation.md
+ - label: SPI - SPI通信
+ file: QuecPython类库/machine.SPI.md
+ - label: LCD - LCD显示屏
+ file: QuecPython类库/machine.LCD.md
+ - label: WDT - 看门狗定时器
+ file: QuecPython类库/machine.WDT.md
+ - label: KeyPad - 矩阵键盘
+ file: QuecPython类库/machine.KeyPad.md
- label: qrcode - 二维码显示
file: QuecPython类库/qrcode.md
- label: pm - 低功耗
@@ -82,6 +136,10 @@ items:
file: QuecPython类库/quecgnss.md
- label: securedata - 安全数据区
file: QuecPython类库/securedata.md
+ - label: ble - 低功耗蓝牙相关功能
+ file: QuecPython类库/ble.md
+ - label: bt - 经典蓝牙相关功能
+ file: QuecPython类库/bt.md
- label: QuecPython组件库
file: QuecPython组件库/README.md
items:
@@ -105,8 +163,6 @@ items:
file: QuecPython组件库/Queue.md
- label: sys_bus - 会话总线
file: QuecPython组件库/sys_bus.md
- - label: uasyncio - 协程
- file: QuecPython组件库/uasyncio.md
- label: uwebsocket - websocket服务
file: QuecPython组件库/uwebsocket.md
- label: ussl - SSL算法
diff --git a/docs/Application_guide/zh/Note.md b/docs/Application_guide/zh/Note.md
new file mode 100644
index 0000000000000000000000000000000000000000..935e06655945f9a5384a1f88bbbeb408935bff74
--- /dev/null
+++ b/docs/Application_guide/zh/Note.md
@@ -0,0 +1,55 @@
+# QuecPython 高级教程文档编写注意事项
+
+## 目录结构
+
+目录结构示例如下:
+
+```
+QuecPython官网文档中心/Application_guide
+├── Note.md
+├── README.md
+├── bsp
+│ ├── README.md
+│ ├── gpio.md
+│ ├── iic.md
+│ ├── spi.md
+│ └── uart.md
+├── config.json
+├── media
+│ └── network
+│ └── test.png
+├── network
+│ ├── README.md
+│ ├── datacall.md
+│ ├── http
+│ │ ├── http_get.md
+│ │ └── http_post.md
+│ ├── mqtt.md
+│ └── socket
+│ ├── tcp_client.md
+│ ├── tcp_server.md
+│ └── udp.md
+└── sidebar.yaml
+```
+
+## README.md
+
+README.md作为板块的首页入口,需要对该板块做综合性描述,并且在最后提供板块的所有二级目录链接。
+
+## 正文注意事项
+
+1. 若该技术板块存在多种应用场景,每种应用场景均需对应一篇文档,如socket编程,会存在 tcp client,tcp server 和 udp 三种不同场景,需编写3篇文档。
+2. 每篇文档按照常规的应用开发流程描述即可,可粘贴每个开发环节对应的代码片段,完整的代码由于篇幅过程,禁止粘贴在文档中,而是在文末给出代码链接。
+3. 代码链接必须指向[https://github.com/QuecPython](https://github.com/QuecPython)组织中的仓库,禁止将代码仓库放在任何其他组织中。代码仓库的建立,联系Chavis。
+4. 所有md文档中引用的图片,都应根据文档所属功能在media目录下新建合适的子目录,并将图片文件存放在该子目录下:
+
+* 图片格式统一为png格式;
+* 图片命名符合见名知意的要求,如bsp.uart.xxx.png,其中`xxx`表示用简短英文编写的图片作用描述。
+
+> 代码仓库的建立,联系Chavis。
+
+
+
+## QuecPython 应用指导
+
+[点此查看](./README.md)
\ No newline at end of file
diff --git a/docs/Application_guide/zh/README.md b/docs/Application_guide/zh/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..3b45bbb709670658a58770d45a25c7d8a7725696
--- /dev/null
+++ b/docs/Application_guide/zh/README.md
@@ -0,0 +1,13 @@
+# QuecPython 应用指导
+
+QuecPython 应用指导,是对QuecPython常用功能模块如何使用的指导说明。包含对各功能模块使用方法的详细指导,以及规范的例程,帮助用户正确、合理、高效的使用QuecPython进行开发。
+
+## QuecPython 应用指导
+
+* [audio](./audio/README.md)
+* [bsp](./bsp/README.md)
+* [bluetooth](./bluetooth/README.md)
+* [fota](./fota/README.md)
+* [gnss](./gnss/README.md)
+* [wifiScan](./wifiscan/README.md)
+* [peripherals](./peripherals/README.md)
\ No newline at end of file
diff --git "a/docs/FAQ/zh/\345\272\224\347\224\250\346\226\271\346\241\210/README.md" b/docs/Application_guide/zh/audio/README.md
similarity index 100%
rename from "docs/FAQ/zh/\345\272\224\347\224\250\346\226\271\346\241\210/README.md"
rename to docs/Application_guide/zh/audio/README.md
diff --git "a/docs/FAQ/zh/\345\274\200\345\217\221\347\216\257\345\242\203\344\270\216\345\267\245\345\205\267/README.md" b/docs/Application_guide/zh/bluetooth/README.md
similarity index 100%
rename from "docs/FAQ/zh/\345\274\200\345\217\221\347\216\257\345\242\203\344\270\216\345\267\245\345\205\267/README.md"
rename to docs/Application_guide/zh/bluetooth/README.md
diff --git "a/docs/FAQ/zh/\346\265\213\350\257\225\346\240\241\351\252\214/README.md" b/docs/Application_guide/zh/bsp/README.md
similarity index 100%
rename from "docs/FAQ/zh/\346\265\213\350\257\225\346\240\241\351\252\214/README.md"
rename to docs/Application_guide/zh/bsp/README.md
diff --git "a/docs/FAQ/zh/\345\272\224\347\224\250\346\226\271\346\241\210/EventMesh\346\241\206\346\236\266\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/Application_guide/zh/bsp/gpio.md
similarity index 100%
rename from "docs/FAQ/zh/\345\272\224\347\224\250\346\226\271\346\241\210/EventMesh\346\241\206\346\236\266\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/Application_guide/zh/bsp/gpio.md
diff --git "a/docs/FAQ/zh/\345\272\224\347\224\250\346\226\271\346\241\210/sys_bus\346\241\206\346\236\266\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/Application_guide/zh/bsp/iic.md
similarity index 100%
rename from "docs/FAQ/zh/\345\272\224\347\224\250\346\226\271\346\241\210/sys_bus\346\241\206\346\236\266\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/Application_guide/zh/bsp/iic.md
diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_1.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_1.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f9e636fa9fc329c164c2e2f42f31795b5c61abaf
Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_1.jpg differ
diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_2.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7ac14f0715250687e91e68bf13d5b98b4efac075
Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_2.jpg differ
diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_3.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_3.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..cf87c486c4832c74f3d20170f7cd64faf10d774a
Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_3.jpg differ
diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_4.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_4.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..66b9a7b203f332146efb947dc5c550a98c413dd5
Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_4.jpg differ
diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_5.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_5.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..88c9a0922849681691935bf954f22daf1123b45e
Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_5.jpg differ
diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_6.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_6.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..86e7fbfce741edf00face5e7bebed76fbf98c6b9
Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_6.jpg differ
diff --git a/docs/Application_guide/zh/bsp/spi.md b/docs/Application_guide/zh/bsp/spi.md
new file mode 100644
index 0000000000000000000000000000000000000000..f0a6de297c26bd37506c85f13381caa6305683dc
--- /dev/null
+++ b/docs/Application_guide/zh/bsp/spi.md
@@ -0,0 +1,93 @@
+# SPI通信
+
+SPI,是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。
+
+本文档主要介绍如何使用 QuecPython_SPI 功能,通过本文你将了解到 QuecPython_SPI 的参数设置及使用方法。
+
+
+
+## SPI 简介
+
+### 主-从模式(Master-Slave)
+
+SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave)。一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备,SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备,Slave 设备本身不能产生或控制 Clock,没有 Clock 则 Slave 设备不能正常工作。
+
+
+
+
+
+### 同步方式(Synchronous)
+
+Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse),时钟脉冲组成了时钟信号(Clock Signal),时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输的。
+
+
+
+
+
+### 四种通信模式
+
+**时钟极性 CPOL** 是指 SPI 通讯设备处于空闲状态时,SCK 信号线的电平信号(即 SPI 通讯开始前、 NSS 线为高电平时 SCK 的状态)。 CPOL=0 时, SCK 在空闲状态时为低电平,CPOL=1 时,则相反。
+
+ **时钟相位 CPHA** 是指数据的采样的时刻,当 CPHA=0 时, MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的“奇数边沿” 被采样。当 CPHA=1 时,数据线在 SCK 的“偶数边沿” 采样。
+
+根据 **时钟极性 CPOL** 与 **时钟相位 CPHA** 的不同,SPI具有四种通信模式。
+
+
+
+
+
+
+
+
+
+### 数据交换(Data Exchanges)
+
+SPI 设备间的数据传输之所以又被称为数据交换,是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)"。在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据,相当于该设备有一个 bit 大小的数据被交换了。
+
+一个 Slave 设备要想能够接收到 Master 发过来的控制信号,必须在此之前能够被 Master 设备进行访问 (Access)。所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选,把想要访问的 Slave 设备选上,在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI 物理模块最终失效。因此,在程序中一般都会在 SPI 传输完数据后,去读取 SPI 设备里的数据,即使这些数据(Dummy Data)在我们的程序里是无用的。
+
+SPI只有主模式和从模式之分,没有读和写的说法。因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。
+
+
+
+## SPI通信
+
+### 实验代码
+
+以下代码适合EC600x 开发板进行 SPI 自发自收通信测试。**实验前提:短接 SPI_MISO 与 SPI_MOSI 引脚**。
+
+```python
+# -*- coding: UTF-8 -*-
+import utime
+from machine import SPI
+from machine import Pin
+
+# 屏蔽GNSS模块数据干扰. 由于EC600S/N的SPI_MISO与SPI_MOSI引脚还被复用为UART1. 开发板还连接GNSS模块L76K, 为了断开L76K吐数据对SPI通信的干扰, 需要添加下面两句代码.
+gpio11 = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 0) # EC600S/EC600N使用
+gpio11.write(0) # EC600S/EC600N使用
+
+w_data = "test"
+r_data = bytearray(len(w_data))
+count = 10 # 运行次数
+
+# 以下代码根据模块型号进行选择.
+spi_obj = SPI(1, 0, 1) # EC600S/N使用
+# spi_obj = SPI(0, 0, 1) # EC600U使用
+
+while count:
+ count -= 1
+ utime.sleep(1)
+ ret = spi_obj.write_read(r_data, w_data, 100)
+ if ret == -1:
+ SPI_msg = "SPIReadError"
+ else:
+ SPI_msg = "SPIRead:{} running:{:0>2d}".format(r_data, count)
+ print(SPI_msg)
+```
+
+
+
+### 实验现象
+
+
+
diff --git "a/docs/FAQ/zh/\345\272\224\347\224\250\346\226\271\346\241\210/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/Application_guide/zh/bsp/uart.md
similarity index 100%
rename from "docs/FAQ/zh/\345\272\224\347\224\250\346\226\271\346\241\210/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/Application_guide/zh/bsp/uart.md
diff --git a/docs/Application_guide/zh/cloud/AliyunCloud.md b/docs/Application_guide/zh/cloud/AliyunCloud.md
new file mode 100644
index 0000000000000000000000000000000000000000..417bc762840d9a60e807beb78fb1de67820734de
--- /dev/null
+++ b/docs/Application_guide/zh/cloud/AliyunCloud.md
@@ -0,0 +1,240 @@
+# 阿里云应用指导文档
+
+## 1. 功能简介
+
+基于MQTT协议连接到阿里云物联网平台,设备快速连云,支持“一机一密和“一型一密”两种认证方式。
+
+## 2. 应用场景说明
+
+通过阿里云物联网平台对同一产品下的设备进行管理,处理设备事件,完成消息转发,OTA升级等应用功能。
+
+## 3. 功能应用流程
+
+### 3.1. 阿里云物联网平台
+
+详细文档请查看:https://help.aliyun.com/document_detail/145493.html
+
+#### 3.1.1.名称解释
+
+连接三元组:三元组指的是ProductKey(产品标识)DeviceName(设备名)DeviceSecret(设备密钥),是设备与物联网平台建立连接时的认证信息。
+
+一机一密:每个设备烧录其唯一的设备证书(ProductKey、DeviceName 和 DeviceSecret),当设备与物联网平台建立连接时,物联网平台对其携带的设备证书信息进行认证。
+
+一型一密:同一产品下所有设备可以烧录相同产品证书(即 ProductKey 和 ProductSecret ),设备发送激活请求时,物联网平台进行产品身份确认,认证通过,下发该设备对应的 DeviceSecret
+
+#### 3.1.2.平台地址
+
+- 阿里云:https://www.aliyun.com
+
+ 
+
+ 注册个人或者企业账号进行账号登录
+
+#### 3.1.3.创建实例
+
+- 进入物联网平台
+
+ 
+
+- 选择实例,根据需求选择,试用选择公共实例即可
+
+ 
+
+- 实例概览
+
+ 
+
+#### 3.1.4.创建产品
+
+- 点击实例进行产品创建
+
+ 
+
+- 按需填写产品创建信息
+
+ 
+
+- 产品列表展示
+
+ 
+
+#### 3.1.5.查看产品信息
+
+- 产品信息包含ProductKey 和 ProductSecret
+
+ 
+
+#### 3.1.6.创建设备
+
+- 选择产品进行设备创建
+
+ 
+
+- 添加设备
+
+ 
+
+- 手动编辑设备信息
+
+ 
+
+- 设备创建完成后处于未激活状态
+
+ 
+
+#### 3.1.7.查看设备信息
+
+- 查看设备信息,设备信息包含ProductKey(产品标识)DeviceName(设备名)DeviceSecret(设备密钥)
+
+ 
+
+### 3.2. QuecPython连接阿里云
+
+QuecPython 官网地址:https://python.quectel.com
+
+#### 3.2.1.开发环境搭建
+
+- 驱动安装
+
+ 驱动下载地址:https://python.quectel.com/download
+
+ 选择对应平台的USB驱动进行安装
+
+ 
+
+- QPYcom 图形化工具下载
+
+ 应用调试基于此工具,下载地址:https://python.quectel.com/download
+
+ 
+
+- 模组固件下载
+
+ 根据所用的模组型号选择固件下载后烧录,此文档调试选择EC600N CNLE进行演示。
+
+ 
+
+#### 3.2.2.设备调试
+
+- 打开电脑设备管理器,查看端口
+
+ 
+
+- 选择 Quectel USB MI05 COM Port串口,使用QPYcom工具打开该串口
+
+ 
+
+- 查询SIM卡状态和拨号状态
+
+ API 使用以及说明查阅Wiki文档:https://python.quectel.com/wiki/#/
+
+ ```python
+ >>> import sim
+ >>> sim.getStatus() # 返回1表示SIM状态正常
+ 1
+ >>> import dataCall
+ >>> dataCall.getInfo(1,2) # 成功返回拨号信息
+ (1, 0, [1, 0, '10.145.246.10', '211.138.180.2', '211.138.180.3'], [1, 0, '::', '::', '::'])
+ >>>
+ ```
+
+#### 3.2.3.设备连云
+
+阿里云API 使用以及说明查阅Wiki文档:https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonThirdlib
+
+- 导入阿里云API
+
+ ```python
+ >>> from aLiYun import aLiYun
+ ```
+
+- 创建aliyun连接对象
+
+ ```python
+ >>> from aLiYun import aLiYun
+
+ >>> productKey = "a1YoiRfLSbV"
+ >>> DeviceName = "QuecPyhon_Dev"
+ >>> DeviceSecret = "a86aadbbe78de7b8248adfc09e458bb9"
+ >>> productSecre = None
+ >>>
+ >>> ali_obj = aLiYun(productKey, productSecre, DeviceName, DeviceSecret)
+ ```
+
+- 注册事件回调函数
+
+ ```python
+ >>> def event_callback(topic, data):
+ ... print("aliyun callback recv: {}".format(data))
+ ...
+ ...
+ ...
+ >>> ali_obj.setCallback(event_callback)
+ ```
+
+- 设置连接参数并连接平台,state为0时表示连接成功,连接成功后调用start方法
+
+ ```python
+ >>> clientID = "Quecpython"
+ >>> clean_session = False
+ >>> keepAlive = 300
+ >>> reconn = True
+
+ >>> state = ali_obj.setMqtt(clientID, clean_session=False, keepAlive=300,reconn=True)
+ >>> state
+ 0
+ >>> ali_obj.start()
+ ```
+
+ 云端查看设备状态,由创建时未激活状态变成在线状态
+
+ 
+
+#### 3.2.4.订阅Topic
+
+- 根据平台订阅规则选择操作权限为订阅的Topic
+
+ /a1YoiRfLSbV/${deviceName}/user/get:$ {deviceName}替换成我们的设备名称即可,例如"/a1YoiRfLSbV/QuecPyhon_Dev/user/get"
+
+ 
+
+ ```python
+ >>> ali_obj.subscribe("/a1YoiRfLSbV/QuecPyhon_Dev/user/get")
+ 0
+ >>>
+ ```
+
+#### 3.2.5.数据上行
+
+- 发布主题消息到平台,Topic选择操作权限为发布的进行数据上报
+
+ ```python
+ >>> ali_obj.publish("/a1YoiRfLSbV/QuecPyhon_Dev/user/update", "Hello, Aliyun!")
+ True
+ >>>
+ ```
+
+ 云端查看设备上行消息
+
+ 
+
+ 
+
+#### 3.2.6.数据下行
+
+- 找到设备订阅的Topic,选择发布消息
+
+ 
+
+ 
+
+ 设备查看平台下行数据,通过我们注册的回调函数接收数据
+
+ 
+
+## 4. 注意事项
+
+- 设备进行云连接时需确认网络状态,例如SIM卡是否能够注网,设备是否拨号成功
+- 确保所用模组包含阿里云连接API可供使用
+- Topic注意操作权限
+
diff --git a/docs/advanced_tutorial/zh/config.json b/docs/Application_guide/zh/config.json
similarity index 52%
rename from docs/advanced_tutorial/zh/config.json
rename to docs/Application_guide/zh/config.json
index 1f5ad6333e4e10d7a315231f8de3b84e7d7b527d..0e7f963a9aceb5a862993ce8dff59a2aaf4b7027 100644
--- a/docs/advanced_tutorial/zh/config.json
+++ b/docs/Application_guide/zh/config.json
@@ -1,4 +1,4 @@
{
"import": "config_zh",
- "name": "高级教程"
+ "name": "应用指导"
}
\ No newline at end of file
diff --git "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/OTA\345\215\207\347\272\247-\345\233\272\344\273\266.md" b/docs/Application_guide/zh/fota/fota.md
similarity index 45%
rename from "docs/development_guide/zh/OTA\345\215\207\347\272\247/OTA\345\215\207\347\272\247-\345\233\272\344\273\266.md"
rename to docs/Application_guide/zh/fota/fota.md
index 19a08591087f7979bf2431a4b7f2837c4e0d23a7..02403f737a453e189b69e8f0dd9a4b11efc43372 100644
--- "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/OTA\345\215\207\347\272\247-\345\233\272\344\273\266.md"
+++ b/docs/Application_guide/zh/fota/fota.md
@@ -1,56 +1,132 @@
-# OTA升级-固件
+# OTA升级
-## 什么是OTA升级-固件
+OTA:Over-the-Air Technology空中下载技术,是通过移动通信的空中接口实现对移动终端设备进行远程管理的技术。QuecPython的OTA升级包含两部分:**OTA升级-文件**及**OTA升级-固件**。OTA升级功能测试需用到HTTP服务器作为升级内容的存放点,该部分内容本章节不做介绍,客户自行实现。本章节先介绍基本概念与理论,结合实际操作进行讲解OTA升级的使用。
+
+
+
+## OTA升级-文件
+
+### 什么是OTA升级-文件
+
+OTA:Over-the-Air Technology空中下载技术,是通过移动通信的空中接口实现对移动终端设备进行远程管理的技术。
+
+OTA升级-文件就是利用这项技术对模块进行文件升级。在QuecPython中该功能接口为[APP_FOTA](../../../API_reference/zh/QuecPython类库/app_fota.html)。为阅读体验以下均命名为APP_FOTA。
+
+### 怎么使用APP_FOTA
+
+#### 升级准备
+
+在之前的引言中已经说到OTA升级需要使用到HTTP服务器作为升级内容的存放点。对于APP_FOTA而言,服务器需要存储客户需要升级文件内容。此部分工作由客户自主完成。目的就是得到一个可以访问下载到该文件的URL地址即可。
+
+#### 硬件设计
+
+APP_FOTA升级主要为网络侧与模块内部交互,除前提条件模块需要组网成功外无需其他外围硬件支持。
+
+#### 软件应用
+
+QuecPython中APP_FOTA功能支持单文件下载与批量文件下载。API接口分别为:**fota.download(url, file_name)**与**fota.bulk_download(info=[])**,有关API的详细介绍请参考[APP_FOTA](../../../API_reference/zh/QuecPython类库/app_fota.html)。
+
+需要注意是:调用APP_FOTA接口后文件不是直接下载到**usr**分区(模块存放用户文件的分区),而是下载到一个临时的**.updater**文件夹中。该文件夹可能存在与**usr.updater**文件夹下,也可能存在于**./fota/usr/.updater**。但对于实际使用不需要关注这些。只需了解APP_FOTA后文件并非直接存在**usr**目录,需要**fota.set_update_flag()**设置升级标志位后重启模组才会自动将对应文件搬运至**usr**目录。
+
+示例代码如下:
+
+```python
+import app_fota
+from misc import Power
+import utime as time
+
+
+files = ["file_name.file_suffix"]
+download_list = []
+url = r"url_connection"
+
+for file in files:
+ download_list.append({'url': (url + file), 'file_name': '/usr/%s' % file})
+
+if download_list:
+ print("downlist: %d\r\n" % len(download_list), download_list)
+ fota = app_fota.new()
+ result = fota.bulk_download(download_list)
+ fota.set_update_flag()
+
+ print("update ....", result)
+ time.sleep(1)
+ Power.powerRestart() # 重启模块
+```
+
+注:`file_name.file_suffix`替换为需要下载的文件名加后缀一起。`url_connection`替换为文件存放服务器的连接。
+
+### APP_FOTA文件下载测试
+
+使用QPYcom工具和模组进行交互,下载示例代码至模组进行运行。
+
+APP_FOTA_DEMO运行前:
+
+
+
+APP_FOTA_DEMO运行后:
+
+
+
+
+
+
+
+## OTA升级-固件
+
+### 什么是OTA升级-固件
OTA:Over-the-Air Technology空中下载技术,是通过移动通信的空中接口实现对移动终端设备进行远程管理的技术。
OTA升级-固件就是利用这项技术进行模块固件升级。在QuecPython中该功能接口为[FOTA](/../../../API_reference/zh/QuecPython类库/fota.html)。为阅读体验以下均命名为FOTA。
-## 怎么使用FOTA
+### 怎么使用FOTA
-### 硬件设计
+#### 硬件设计
[FOTA](/../../../API_reference/zh/QuecPython类库/fota.html)升级主要为网络侧与模块内部交互,除前提条件模块需要组网成功外无需其他外围硬件支持。
-### 软件应用
+#### 软件应用
在之前的引言中已经提到OTA升级需要使用到HTTP服务器作为升级内容的存放点。对于FOTA而言是否就是存储需要升级的固件呢?答案不是。其主要原因也容易想到,无法就是固件太大与没内存缓存等。问题是不存储原始固件存储什么呢?答案是差分包。也是两版固件差异的部分。这样一来以上问题就得到了解决。
那问题来了,怎么制作差分包FOTA升级时怎么操作呢?下面我们分:`FOTA分类`;`差分包制作`;`软件设计`三个部分来分别介绍。
-#### FOTA分类
+##### FOTA分类
FOTA类型分为三种:`差分升级`;`全量升级`;`最小系统升级`。下面就这三种FOTA类型的功能与支持的型号分别进行介绍。
-| 序号 | FOTA类型 | 使用模组 | 实现功能 |
-| ---- | ------------ | ---------------- | ----------------- |
-| 1 | 差分升级 | 所有模组 | 固件升级 |
-| 2 | 全量升级 | ASR_16MFlash模组 | 客户脚本升级 |
-| 3 | 最小系统升级 | ASR_16MFlash模组 | 固件+客户脚本升级 |
+| 序号 | FOTA类型 | 使用模组 | 实现功能 |
+| ---- | ------------ | ----------------------------------- | ----------------- |
+| 1 | 差分升级 | ASR_16MFlash模组及ASR平台外所有模组 | 固件升级 |
+| 2 | 全量升级 | ASR_16MFlash模组 | 客户脚本升级 |
+| 3 | 最小系统升级 | ASR平台所有模组 | 固件+客户脚本升级 |
-#### 差分包制作
+##### 差分包制作
为便于客户制作差分包简化流程,QuecPython团队将制作差分包功能集成到了QPYcom工具中。如下图添加制作FOTA包按钮进入制作FOTA工具。
-
+
选择模块对应的平台。
-
+
+
+选择对应的FOTA类型后,依次选择旧/新固件包,选择差分包输出的文件夹,最后选择`OK`按钮即可生成对应的差分包。
-选择对应的FOTA类型后,依次选择旧/新固件包,选择差分包输出的文件夹,最后选择`OK`按钮即可生成对应的差分包
+**注:不同平台上传与生成的固件后缀有所不同。**
-
+
若是进行全量或是最小系统升级,会需要选择”用户分区文件“。该文件存在于ASR的固件包中。将官网提供的.bin后缀固件修改为.zip后缀。然后使用压缩工具打开,其中的`customer_fs.bin`文件就是我们这里上传的文件。
-注意:只有ASR_16M模组才会支持此升级类型。
+**注:只有ASR平台模组才会支持这两种升级类型。**
-
+
其他操作与上述差分升级流程类似,这里不做赘述。
-#### 软件设计
+##### 软件设计
首先将上面步骤制作的差分包上传至HTTP服务器中。然后模块执行如下代码进行FOTA升级。
@@ -59,7 +135,7 @@ FOTA类型分为三种:`差分升级`;`全量升级`;`最小系统升级`
import fota
import utime
-DEF_URL1 = 'url1'
+DEF_URL1 = 'url1_connection'
def result(args):
print('download status:', args[0], 'download process:', args[1])
@@ -82,7 +158,7 @@ run()
import fota
import utime
-DEF_URL1 = 'url1'
+DEF_URL1 = 'url1_connection'
def result(args):
print('download status:', args[0], 'download process:', args[1])
@@ -105,8 +181,8 @@ run()
import fota
import utime
-DEF_URL1 = 'url1'
-DEF_URL2 = 'url2'
+DEF_URL1 = 'url1_connection'
+DEF_URL2 = 'url2_connection'
def run():
fota_obj = fota() # 创建Fota对象
@@ -121,9 +197,9 @@ def run():
run()
```
-注:`url1`与`url2`替换为文件存放服务器的连接。
+注:`url_connection`替换为文件存放服务器的连接。
-## FOTA文件下载测试
+### FOTA文件下载测试
使用QPYcom工具和模组进行交互,下载示例代码至模组进行运行。
diff --git "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/media/APP_FOTA_1.jpg" b/docs/Application_guide/zh/fota/media/APP_FOTA_1.jpg
similarity index 100%
rename from "docs/development_guide/zh/OTA\345\215\207\347\272\247/media/APP_FOTA_1.jpg"
rename to docs/Application_guide/zh/fota/media/APP_FOTA_1.jpg
diff --git "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/media/APP_FOTA_2.jpg" b/docs/Application_guide/zh/fota/media/APP_FOTA_2.jpg
similarity index 100%
rename from "docs/development_guide/zh/OTA\345\215\207\347\272\247/media/APP_FOTA_2.jpg"
rename to docs/Application_guide/zh/fota/media/APP_FOTA_2.jpg
diff --git "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/media/FOTA_1.jpg" b/docs/Application_guide/zh/fota/media/FOTA_1.jpg
similarity index 100%
rename from "docs/development_guide/zh/OTA\345\215\207\347\272\247/media/FOTA_1.jpg"
rename to docs/Application_guide/zh/fota/media/FOTA_1.jpg
diff --git "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/media/FOTA_2.jpg" b/docs/Application_guide/zh/fota/media/FOTA_2.jpg
similarity index 100%
rename from "docs/development_guide/zh/OTA\345\215\207\347\272\247/media/FOTA_2.jpg"
rename to docs/Application_guide/zh/fota/media/FOTA_2.jpg
diff --git "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/media/FOTA_3.jpg" b/docs/Application_guide/zh/fota/media/FOTA_3.jpg
similarity index 100%
rename from "docs/development_guide/zh/OTA\345\215\207\347\272\247/media/FOTA_3.jpg"
rename to docs/Application_guide/zh/fota/media/FOTA_3.jpg
diff --git "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/media/FOTA_4.jpg" b/docs/Application_guide/zh/fota/media/FOTA_4.jpg
similarity index 100%
rename from "docs/development_guide/zh/OTA\345\215\207\347\272\247/media/FOTA_4.jpg"
rename to docs/Application_guide/zh/fota/media/FOTA_4.jpg
diff --git a/docs/Application_guide/zh/gnss/README.md b/docs/Application_guide/zh/gnss/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..64122c81590f0075653c7daf38acd5eeb78e8da5
--- /dev/null
+++ b/docs/Application_guide/zh/gnss/README.md
@@ -0,0 +1,59 @@
+# GNSS应用指导说明
+
+本文中对GNSS一些基础概念进行了简要说明,描述了如何使用 QuecPython 的`gnss`模块和`quecgnss`模块的功能来获取定位信息,同时包含了一些注意事项。
+
+
+
+## 1. 基础概念说明
+
+### 1.1 什么是GNSS
+
+GNSS是指全球导航卫星系统(Global Navigation Satellite System),它是泛指所有的卫星导航系统。主要包括美国的全球定位系统(GPS)、欧洲的伽利略卫星导航系统(GALILEO)、俄罗斯的格洛纳斯卫星导航系统(GLONASS)、中国的北斗卫星导航系统(BDS)以及区域系统和增强系统。
+
+
+
+### 1.2 什么是AGPS
+
+AGPS是指辅助全球卫星定位系统(Assisted Global Positioning System)。它本身并不是一种定位系统,而是一种辅助定位的方式,用来加快定位速度。传统GPS定位中需要全频段搜索以找到可用卫星而导致耗时较长,而AGPS可以通过无线网络直接下载当前地区的可用卫星信息,提高了搜星的速度,也就加快了定位速度,同时起到了减少设备电量消耗的作用。
+
+
+
+> 目前以下型号模组均内置GNSS定位功能,并默认都支持AGPS:
+>
+> EC200UCNAA/EC200UCNLA/EC200UEUAA/EC800MCNGA/EC800GCNGA/EG810MCNGA/EG915NEUAG
+
+
+
+### 1.3 参考坐标系
+
+坐标都是相对于某一参考系而言,才有意义,GNSS定位坐标也不例外。我们通过各种渠道获取到的经纬度坐标,很可能并不是同一个坐标系下的数据。如果想利用这些坐标在地图上做可视化相关功能,就需要经过计算转换为对应地图坐标系下的坐标。目前在中国比较常见的坐标系有:
+
+| 坐标系 | 说明 |
+| ------ | ------------------------------------------------------------ |
+| WGS-84 | 世界大地测量系统(World Geodetic System 1984),是全球通用的坐标系,也是使用最广泛的坐标系。一般GPS定位设备得到的经纬度坐标都是使用WGS-84坐标系。 |
+| GCJ-02 | 由中国国家测绘局制定的地理信息系统的坐标系,也叫火星坐标系。它是由WGS-84坐标加密得到。国内的高德地图、腾讯地图使用的都是GCJ-02坐标系。 |
+| BD-09 | 由百度开发定制的坐标系统,它是在GCJ-02坐标的基础上再次加密得到。百度地图使用的是BD-09坐标系。 |
+
+通过上述说明,应明确一点,通过GNSS定位芯片拿到的经纬度坐标是WGS-84坐标系下的数据。在中国,如果用户需要将获取的经纬度坐标放到地图上显示位置,则需要将WGS-84坐标进行计算转换为该地图所使用坐标系下的坐标,才可用于在地图上拾取位置。
+
+
+
+### 1.4 QuecPython `gnss`和`quecgnss`的区别
+
+QuecPython 的内置库中,有`gnss`模块和`quecgnss`模块,都是和GNSS定位相关的功能模块。具体区别如下:
+
+* `gnss` - 外置GNSS功能模块。
+
+* `quecgnss` - 内置GNSS功能模块。
+
+所谓的“内置”和“外置”,是相对模组而言。如果模组内部集成了GNSS定位功能,则为“内置”,须使用QuecPython的`quecgnss`模块来获取定位信息;如果模组是通过串口外接了L76K系列定位芯片,则为“外置”,须使用QuecPython的`gnss`模块来获取定位信息。
+
+
+
+## 2. GNSS应用指导文档列表
+
+* [外置GNSS功能应用指导](./gnss.md)
+
+* [内置GNSS功能应用指导](./quecgnss.md)
+
+
diff --git "a/docs/FAQ/zh/\345\272\224\347\224\250\346\226\271\346\241\210/\350\247\243\345\206\263\346\226\271\346\241\210\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/Application_guide/zh/gnss/coordinate_convert.md
similarity index 100%
rename from "docs/FAQ/zh/\345\272\224\347\224\250\346\226\271\346\241\210/\350\247\243\345\206\263\346\226\271\346\241\210\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/Application_guide/zh/gnss/coordinate_convert.md
diff --git a/docs/Application_guide/zh/gnss/gnss.md b/docs/Application_guide/zh/gnss/gnss.md
new file mode 100644
index 0000000000000000000000000000000000000000..9a26eb6d12e8fa261731969ca82c3bea58aa4bb9
--- /dev/null
+++ b/docs/Application_guide/zh/gnss/gnss.md
@@ -0,0 +1,231 @@
+# 1. 简介
+
+QuecPython提供了`gnss`功能模块来获取外置GNSS模块的定位数据。该功能模块直接在内部完成了原始定位数据的处理解析工作,将用户关心的一些定位参数提取出来并提供对应接口让用户可直接获取。避免了用户自己通过串口去读取原始的定位数据,并进行复杂的正则匹配查找和解析的情况,提高了用户开发效率。
+
+目前该模块自动解析的NEMA语句包括:GGA、RMC和GSV。
+
+> 本文档中示例代码前面有 `>>> `字符串的,表示在QuecPython的命令交互界面输入的代码。
+
+
+
+# 2. 使用说明
+
+`gnss`模块接口的详细说明,请参考QuecPython官网的Wiki文档中相关部分的说明。下面以L76K定位芯片为例,说明如何使用`gnss`模块的相关功能。
+
+## 2.1 获取定位数据
+
+下面将详细描述使用gnss模块接口获取定位数据的步骤,同时说明在使用过程中一些注意事项。
+
+### 2.1.1 使用步骤
+
+步骤1:确定串口信息
+
+即确定L76K定位芯片接到模组哪个串口,以及使用的波特率等信息,本示例中将L76K接到了模组的UART2,波特率默认为9600bps(可在L76K使用手册中查询到)。
+
+
+
+步骤2:实例化一个对象
+
+```python
+>>> from gnss import GnssGetData
+>>> gnss_obj = GnssGetData(2, 9600, 8, 0, 1, 0)
+```
+
+
+
+步骤3:读取数据并解析
+
+用户只需要调用如下接口,该接口直接完成定位数据的读取和解析工作:
+
+```python
+>>> gnss_obj.read_gnss_data()
+822
+```
+
+上述接口将读取原始数据、以及复杂的解析操作都放在接口内部实现,只返回了通过串口读取的数据长度。如用户想看本次读取解析的原始数据,可调用如下接口:
+
+```python
+>>> data = gnss_obj.getOriginalData()
+>>> print(data)
+$GNGGA,063957.000,3802.01852,N,11437.92027,E,1,13,1.2,129.2,M,-15.7,M,,*62
+$GNGLL,3802.01852,N,11437.92027,E,063957.000,A,A*40
+$GNGSA,A,3,01,03,06,14,30,194,,,,,,,1.8,1.2,1.4,1*00
+$GNGSA,A,3,13,23,33,38,40,43,59,,,,,,1.8,1.2,1.4,4*3C
+$GPGSV,3,1,11,01,38,044,12,03,44,101,24,06,30,233,31,14,79,184,34,0*6F
+$GPGSV,3,2,11,17,58,319,,19,40,296,04,21,11,051,,30,14,202,34,0*67
+$GPGSV,3,3,11,194,44,156,27,195,68,074,,199,44,160,25,0*6F
+$BDGSV,3,1,11,03,44,186,,07,83,121,05,10,65,309,,13,37,206,31,0*79
+$BDGSV,3,2,11,23,21,181,31,28,69,354,14,33,24,115,27,38,65,190,30,0*7A
+$BDGSV,3,3,11,40,70,093,18,43,28,065,15,59,38,143,29,0*44
+$GNRMC,063957.000,A,3802.01852,N,11437.92027,E,0.69,168.35,260422,,,A,V*0B
+$GNVTG,168.35,T,,M,0.69,N,1.29,K,A*2F
+$GNZDA,063957.000,26,04,2022,00,00*44
+$GPTXT,01,01,01,ANTENNA OPEN*25
+```
+
+
+
+步骤4:确认是否定位成功
+
+如用户只关心是否定位到经纬度坐标以及坐标是否有效,可使用如下接口,返回1即表示定位成功且有效:
+
+```python
+>>> gnss_obj.isFix()
+1
+```
+
+
+
+步骤5:获取坐标信息
+
+调用如下接口即可获取到定位坐标:
+
+```python
+>>> gnss_obj.getLocation()
+(114.6320045, 'E', 38.033642, 'N')
+```
+
+
+
+> 上述接口获取的坐标是WGS-84坐标系下的经纬度数据,不可直接用于高德地图、腾讯地图以及百度地图等地图上拾取位置信息,必须先转换为对应地图参考坐标系下的坐标。
+
+
+
+### 2.1.2 示例代码
+
+如下代码是一个完整的使用`gnss`模块方法来获取定位坐标的例程:
+
+```python
+
+import utime
+from gnss import GnssGetData
+
+
+def main():
+ gnss_obj = GnssGetData(2, 9600, 8, 0, 1, 0)
+ while True:
+ try:
+ read_size = gnss_obj.read_gnss_data()
+ except Exception:
+ print('数据异常,解析出错!')
+ data = gnss_obj.getOriginalData()
+ print('===============================================')
+ print(data)
+ print('===============================================')
+ utime.sleep(2)
+ continue
+
+ if read_size > 0:
+ if gnss_obj.isFix():
+ coordinate = gnss_obj.getLocation()
+ longitude = coordinate[0]
+ latitude = coordinate[2]
+ print('定位成功,当前经纬度:({}, {})'.format(longitude, latitude))
+ utime.sleep(10)
+ else:
+ print('定位中,请稍后...')
+ utime.sleep(2)
+ else:
+ print('未读取到定位数据...')
+ utime.sleep(2)
+
+
+if __name__ == '__main__':
+ main()
+```
+
+
+
+## 2.2 配置NEMA串口波特率
+
+查阅L76K的使用手册,确定默认使用的波特率为9600bps,如用户需要修改波特率,则需要使用PCAS语句来发送一条修改波特率的指令给L76K芯片。
+
+### 2.2.1 PCAS01指令格式
+
+PCAS01语句即用来配置L76K的NEMA串口波特率。格式如下:
+
+```
+$PCAS01,*
+```
+
+参数说明:
+
+| 字段 | 描述 |
+| -------- | ------------------------------------------------------------ |
+| CMD | 支持如下波特率:
0 - 4800
1 - 9600
2 - 19200
3 - 38400
4 - 57600
5 - 115200 |
+| Checksum | 校验和,校验和是对语句中所有字符的 8 位(不包括起始和结束位)进行异或运算,所有字符是指在定界符“$”与“*”之间,但不包括这些定界符的全部字符,包括“,”在内。 |
+| CR和LF | NEMA语句的结束字符,即`\r\n` |
+
+
+
+### 2.2.2 步骤说明
+
+步骤1:确定波特率
+
+即确定需要配置的波特率,以确定CMD的值。假如需要配置L76K NEMA串口波特率为115200,即CMD为5。则PCAS01语句为:
+
+```
+$PCAS01,5*\r\n
+```
+
+步骤2:checksum计算
+
+确定波特率后,PCAS01语句就只差checksum待计算,可按照如下算法计算:
+
+```python
+
+"""
+参数说明
+dstr - 需要计算校验和的字符串,对NEMA语句而言,即“$”与“*”之间的字符串
+返回值:返回十进制的校验和
+"""
+def get_checksum(dstr):
+ lista = list(dstr)
+ list_len = len(lista) - 1
+ checksum = ord(lista[0])
+ i = 0
+ while i < list_len:
+ checksum = checksum ^ ord(lista[i+1])
+ i = i + 1
+ return checksum
+
+# 取“$”与“*”之间的字符串
+dstr = 'PCAS01,5'
+checksum = get_checksum(dstr)
+print('checksum={},{}'.format(checksum, hex(checksum)))
+
+#计算结果
+checksum=25,0x19
+```
+
+得到对应的checksum之后,可确定完整的PCAS01语句如下:
+
+```
+$PCAS01,5*19\r\n
+```
+
+步骤3:发送指令
+
+使用machine类下的UART功能模块来发送该指令到L76K,本示例中将L76K接到了模组的UART2,具体如下:
+
+```python
+
+from machine import UART
+from gnss import GnssGetData
+
+# L76K默认波特率是9600,故先需要配置9600波特率来打开串口
+uart2 = UART(UART.UART2, 9600, 8, 0, 1, 0)
+# 发送波特率配置指令
+uart2.write('$PCAS01,5*19\r\n')
+# 配置成功后须先关闭当前串口
+uart2.close()
+# 按照115200波特率来示例话一个gnss对象
+gnss_obj = GnssGetData(2, 115200, 8, 0, 1, 0)
+```
+
+
+
+
+
+
+
diff --git a/docs/Application_guide/zh/gnss/quecgnss.md b/docs/Application_guide/zh/gnss/quecgnss.md
new file mode 100644
index 0000000000000000000000000000000000000000..a0c9fc5b51a33ddb8d974958dbcade2b0f2b85fb
--- /dev/null
+++ b/docs/Application_guide/zh/gnss/quecgnss.md
@@ -0,0 +1,452 @@
+# 1. 简介
+
+QuecPython提供了`quecgnss`功能模块来获取模组内置GNSS的定位数据。当前`quecgnss`模块暂不支持像`gnss`模块那样直接完成了原始定位数据的处理解析功能,而是需要用户自己来完成原始数据的处理解析工作。为了提高用户开发效率和使用便捷性,本指导文档中会直接给出较为完整的数据处理解析例程,供用户参考使用。
+
+> 本文档中示例代码前面有 `>>> `字符串的,表示在QuecPython的命令交互界面输入的代码。
+
+
+
+# 2. 使用说明
+
+quecgnss模块的接口详细说明,请参考QuecPython官网的Wiki文档中相关部分的说明。本文档中主要从整体流程上说明quecgnss模块的使用方式。
+
+
+
+## 2.1 获取定位数据
+
+### 2.2.1 使用步骤
+
+步骤1:功能初始化
+
+内置GNSS功能默认是关闭的,需要用户主动初始化并开启。直接调用quecgnss模块的init接口即可完成初始化并打开的工作。如果初始化成功,则会返回0,失败返回-1。
+
+```python
+>>> import quecgnss
+>>> quecgnss.init()
+0
+```
+
+
+
+步骤2:确定GNSS的状态
+
+内置GNSS功能初始化后,应确定GNSS当前的状态是否为”定位中“,只有处于这种状态,才可以开始读取NEMA数据。使用如下接口确定状态,返回值为2说明已经处于”定位中“的状态:
+
+```python
+>>> quecgnss.get_state()
+2
+```
+
+
+
+步骤3:读取NEMA数据
+
+当GNSS状态值为”定位中“时,即可使用如下接口去读取定位数据,读取出来的是尚未处理过的原始数据:
+
+```python
+>>> data = quecgnss.read(2048)
+>>> print(data)
+(2048, '$GNRMC,020943.00,A,3149.30070,N,11706.93208,E,0.052,,310323,,,A,V*15\r\n$GNGGA,020943.00,3149.30070,N,11706.93208,E,1,29,0.54,101.2,M,,M,,*52\r\n$GNGSA,A,3,07,08,09,16,21,27,31,04,194,199,195,50,1.06,0.54,0.91,1*3B\r\n$GNGSA,A,3,02,03,05,10,11,25,36,,,,,,1.06,0.54,0.91,3*0A\r\n$GNGSA,A,3,78,88,67,66,76,86,87,68,,,,,1.06,0.54,0.91,2*0C\r\n$GPGSV,5,1,17,04,48,238,45,07,20,314,40,08,63,215,48,09,37,285,44,0*65\r\n$GPGSV,5,2,17,16,50,034,45,21,09,175,40,27,77,054,48,31,15,124,43,0*63\r\n$GPGSV,5,3,17,18,08,045,,26,24,068,,194,65,058,43,199,51,161,41,0*6A\r\n$GPGSV,5,4,17,195,47,127,43,41,37,232,45,42,45,141,,50,51,161,45,0*59\r\n$GPGSV,5,5,17,40,15,254,41,0*55\r\n$GAGSV,3,1,09,02,21,281,36,03,42,271,40,05,33,201,42,10,34,093,42,0*7F\r\n$GAGSV,3,2,09,11,32,127,37,25,57,330,43,36,09,172,36,08,13,317,36,0*78\r\n$GAGSV,3,3,09,12,26,065,,0*49\r\n$GLGSV,3,1,10,66,13,216,32,67,26,269,37,68,13,319,34,76,40,058,36,0*7D\r\n$GLGSV,3,2, ......')# 数据较多,仅列出部分数据
+```
+
+需要注意的是,`quecgnss.read`接口返回值是一个元组,第一个参数是读取的数据长度,第二参数才是读取的数据,调试过程中,如果想让数据看起来整洁清晰,可按如下方式打印:
+
+```python
+>>> print(data[1].decode())
+$GNRMC,020943.00,A,3149.30070,N,11706.93208,E,0.052,,310323,,,A,V*15
+$GNGGA,020943.00,3149.30070,N,11706.93208,E,1,29,0.54,101.2,M,,M,,*52
+$GNGSA,A,3,07,08,09,16,21,27,31,04,194,199,195,50,1.06,0.54,0.91,1*3B
+$GNGSA,A,3,02,03,05,10,11,25,36,,,,,,1.06,0.54,0.91,3*0A
+$GNGSA,A,3,78,88,67,66,76,86,87,68,,,,,1.06,0.54,0.91,2*0C
+$GPGSV,5,1,17,04,48,238,45,07,20,314,40,08,63,215,48,09,37,285,44,0*65
+$GPGSV,5,2,17,16,50,034,45,21,09,175,40,27,77,054,48,31,15,124,43,0*63
+$GPGSV,5,3,17,18,08,045,,26,24,068,,194,65,058,43,199,51,161,41,0*6A
+$GPGSV,5,4,17,195,47,127,43,41,37,232,45,42,45,141,,50,51,161,45,0*59
+...... # 数据较多,仅列出部分数据
+```
+
+我们需要的定位信息就在上述这些NEMA语句中,比如经纬度坐标、海拔等。后面我们将讲述如何对这些数据进行处理解析,提取出我们需要的信息。
+
+
+
+### 2.1.2 示例代码
+
+如下例程,即是按照上述流程编写的较为完整的使用例程。
+
+```python
+
+"""
+本例程示范了如何使用quecgnss模块的方法
+例程中设定10s获取一次定位信息,仅为示例,实际可由用户自行决定获取定位信息的周期
+"""
+import utime
+import quecgnss
+
+
+def main():
+ if quecgnss.get_state() == 0:
+ ret = quecgnss.init()
+ if ret == 0:
+ print('GNSS 初始化成功')
+ else:
+ print('GNSS 初始化失败,请检查问题')
+ return -1
+
+ while True:
+ gnss_state = quecgnss.get_state()
+ if gnss_state == 2:
+ print('GNSS 开始定位')
+ break
+ elif gnss_state == 1:
+ print('GNSS 固件烧录中,请稍后')
+ utime.sleep(2)
+ continue
+ else:
+ print('GNSS 初始化异常,请检查问题')
+ return -1
+
+ while True:
+ try:
+ data = quecgnss.read(2048)
+ except Exception as e:
+ print('读取NEMA数据异常:{}'.format(e))
+ utime.sleep(2)
+ continue
+ data_len = data[0]
+ nema_data = data[1]
+ if data_len == 0:
+ print('未读到定位数据,重试中')
+ utime.sleep(2)
+ else:
+ print('===============================================')
+ print(nema_data.decode())
+ print('===============================================')
+ # 用户自行决定多久获取一次定位数据,此处10s仅为示例
+ utime.sleep(10)
+ # 注[1]
+ try:
+ quecgnss.read(4096)
+ except Exception as e:
+ print('{}'.format(e))
+ utime.sleep(2)
+ continue
+
+
+if __name__ == '__main__':
+ main()
+
+```
+
+
+
+> 注[1]
+>
+> 上述示例代码中,在休眠一段时间后,读取了4K的定位数据并丢弃了。这段代码的作用如下:
+>
+> 实际使用中,设备可能会间隔较长一段时间才会获取一次定位数据。有的模组,串口部分底层驱动代码缓存机制是如果缓存满了,就不会再接收新的数据;这就导致如果设备在移动中,间隔较长一段时间才获取一次定位信息时,获取到的是较长时间之前缓存的定位数据,而不是当前位置实时的定位信息。所以为了确保这种情形下,每次获取的定位信息都是实时的,需要在每次获取定位数据之前,先读一次串口数据,把串口缓存中的数据读出并丢弃,休眠1~2s后再读定位数据。
+>
+> 如设备获取定位信息较为频繁,可去掉上述代码片段。
+
+
+
+## 2.2 数据解析
+
+NEMA语句都是以字符`$`开头,并且以`\r\n`作为结束。而从一堆原始数据中找到我们需要的某一条NEMA语句,本质上利用的就是NEMA语句的该特点,比如正则匹配或是判断字符串头尾。
+
+下面以获取经纬度坐标信息为例,说明对NEMA语句的处理解析过程。经纬度坐标信息在RMC和GGA语句中都有包含,下面例程中以从RMC语句中提取经纬度信息为例进行说明。
+
+### 2.2.1 解析步骤
+
+步骤1:查找相关RMC语句
+
+从读取的原始数据中找出RMC语句,这里使用的方式为——先分割再查找。
+
+在这种先分割再查找的方式中,需要注意的是,对原始数据的分割,必须使用字符`$`来分割。理论上每一条NEMA语句都应以字符`$`开始,以`\r\n`结束。但在实际的定位数据中,会出现一些NEMA语句不完整的情况,即某一条或几条NEMA语句缺少了一部分,并且直接和下一条语句粘在了一起。比如:
+
+```
+$GPGSV,4,2,16,21,2$GNRMC,024843.00,A,3149.30313,N,11706.92780,E,0.157,,310323,,,A,V*16
+```
+
+这种情况下,使用字符`$`来分割原始字符串数据,可以将这种两条粘在一起的语句分割开,再结合”NEMA语句都应以字符`$`开始,以`\r\n`结束“的特性加以判断,基本可以避免获取到不正常的语句导致后续解析出错的情况。
+
+下面示例中data中就是通过`quecgnss.read`接口读出的原始数据,数据如下:
+
+```python
+(2048,'*3B\r\n$GNGSA,A,3,02,11,25,30,34,36,,,,,,,1.20,0.65,$GNRMC,060154.00,A,3149.30510,N,11706.93089,E,0.016,,310323,,,A,V*17\r\n$GNGGA,0$GNRMC,062306.00,A,3149.30472,N,11706.93365,E,0.053,,310323,,,A,V*15\r\n$GNGGA,062306.00,3149.30472,N,11706.93365,E,1,28,0.59,91.9,M,,M,,*6C\r\n$GNGSA,A,3,01,03,07,14,17,21,30,194,199,195,19,06,0.99,0.59,0.80,1*3D\r\n$GNGSA,A,3,02,11,25,30,34,36,15,,,,,,0.99,0.59,0.80,3*07\r\n$GNGSA,A,3,78,80,79,88,82,81,,,,,,,0.99,0.59,0.80,2*0C\r\n$GPGSV,5,1,17,01,63,040,46,03,31,131,42,06,08,220,40,07,26,193,44,0*63\r\n$GPGSV,5,2,17,14,60,326,45,17,39,294,43,19,15,273,43,21,35,041,42,0*6E\r\n$GPGSV,5,3,17,30,43,234,45,08,14,073,,194,61,126,45,199,51,161,40,0*64\r\n$GPGSV,5,4,17,195,69,065,46,42,45,141,,50,51,161,44,40,15,254,41,0*53\r\n$GPGSV,5,5,17,41,37,232,44,0*51\r\n$GAGSV,2,1,07,02,82,078,40,11,12,040,32,15,10,223,35,25,33,129,36,0*7D\r\n$GAGSV,2,2,07,30,37,319,39,34,61,229,44,36,60,034,41,0*4D\r\n$GLGSV,2,1,07,78,52,161,45,79,68,316,41,80,15,330,34,81,61,325,38,0*79\r\n$GLGSV,2,2,07,82,34,252,33,88,26,031,33,65,04,073,,0*43\r\n$GNRMC,062307.00,A,3149.30472,N,11706.93366,E,0.023,,310323,,,A,V*10\r\n$GNGGA,062307.00,3149.30472,N,11706.93366,E,1,28,0.59,91.9,M,,M,,*6E\r\n$GNGSA,A,3,01,03,07,14,17,21,30,194,199,195,19,06,0.99,0.59,0.80,1*3D\r\n$GNGSA,A,3,02,11,25,30,34,36,15,,,,,,0.99,0.59,0.80,3*07\r\n$GNGSA,A,3,78,80,79,88,82,81,,,,,,,0.99,0.59,0.80,2*0C\r\n$GPGSV,5,1,17,01,63,040,46,03,31,131,42,06,08,220,40,07,26,193,44,0*63\r\n$GPGSV,5,2,17,14,60,326,44,17,39,294,45,19,15,273,43,21,35,041,42,0*69\r\n$GPGSV,5,3,17,30,43,234,44,08,14,073,,194,61,126,47,199,51,161,40,0*67\r\n$GPGSV,5,4,17,195,69,065,46,42,45,141,,50,51,161,43,40,15,254,42,0*57\r\n$GPGSV,5,5,17,41,37,232,44,0*51\r\n$GAGSV,2,1,07,02,82,078,40,11,12,040,32,15,10,223,34,25,33,129,36,0*7C\r\n$GAGSV,2,2,07,30,37,319,39,34,61,229,44,36,60,034,42,0*4E\r\n$GLGSV,2,1,07,78,52,161,45,79,68,316,41,80,15,330,35,81,61,325,38,0*78\r\n$GLGSV,2,2,07,82,34,252,33,88,26,031,32,65,04,073,,0*42\r\n$GNRMC,062308.00,A,3149.30473,N,11706.93366,E,0.032,,310323,,,A,V*1E\r\n$GNGGA,062308.00,3149.30473,N,11706.9336')
+```
+
+解析代码如下:
+
+```python
+
+rmc = ''
+split_data = data[1].split('$')
+for i in split_data:
+ # 查找RMC语句并进行数据完整性检查
+ if i.startswith('GNRMC') and i.endswith('\r\n'):
+ rmc = i
+ split_rmc = rmc.split(',')
+ break
+print(rmc)
+print(split_rmc)
+
+############执行结果如下################
+GNRMC,060154.00,A,3149.30510,N,11706.93089,E,0.016,,310323,,,A,V*17
+['GNRMC', '060154.00', 'A', '3149.30510', 'N', '11706.93089', 'E', '0.016', '', '310323', '', '', 'A', 'V*17\r\n']
+
+```
+
+
+
+步骤2:语句完整性校验
+
+上述解析代码中,判断是否以`GNRMC`开头并且以`\r\n`结尾,本身也是一种完整性检查。如果用户希望更准确的检查某一条NEMA语句的完整性,那就需要对该条语句进行checksum计算,并将计算结果与该条语句中的checksum进行比较,如果相等,则说明该条语句是完整且正确的。
+
+这里提供一个校验NEMA语句checksum的接口:
+
+```python
+
+"""
+功能:checksum计算
+参数说明:
+dstr - 需要计算校验和的字符串,应取NEMA语句的”$“字符和”*“字符之间的部分,不包含”$“字符和”*“字符
+返回值:返回十六进制字符串类型的checksum
+"""
+def checksum(dstr):
+ lista = list(dstr)
+ list_len = len(lista) - 1
+ tmp = ord(lista[0])
+ i = 0
+ while i < list_len:
+ tmp = tmp ^ ord(lista[i+1])
+ i = i + 1
+ strtmp = str(hex(tmp))
+ return strtmp.replace('0x', '')
+
+"""
+功能:NEMA语句checksum确认
+参数说明:
+nema - 一条以‘$’字符开始和‘\r\n’字符结束的NEMA语句
+返回值:checksum校验通过返回Ture,否则返回False
+"""
+def checksum_verify(nema):
+ find_sck = ure.search("\*(.+?)\r\n", nema)
+ if find_sck:
+ sck = find_sck.group(1)
+ else:
+ return False
+ data = ure.search("\$(.+?)\*", nema)
+ if data:
+ print('待计算数据:{}'.format(nema))
+ ck = checksum(data.group(1))
+ print('计算checksum为:{}'.format(ck))
+ if ck.upper() == sck.upper():
+ return True
+ else:
+ return False
+ else:
+ return False
+
+```
+
+
+
+步骤3:确认定位有效性
+
+在获取经纬度数据之前,应先确认当前定位数据是有效的,这里是通过检查RMC语句中的`Status`位来判断是否有效,该位表示定位系统状态。当`Status`为字符`A`时,即表示有效。
+
+RMC语句格式:
+
+```
+$RMC,,,,,,,,,,,,,*
+```
+
+以步骤1中查找到的RMC数据为例:
+
+```python
+
+# 通过步骤1可知split_rmc如下
+split_rmc = ['GNRMC', '060154.00', 'A', '3149.30510', 'N', '11706.93089', 'E', '0.016', '', '310323', '', '', 'A', 'V*17\r\n']
+
+if split_rmc[2] == 'A':
+ print('有效定位')
+else:
+ print('无效定位')
+
+```
+
+
+
+步骤4:提取经纬度坐标
+
+确定定位数据有效后,即可提取经纬度相关信息。需注意的是,提取出的数据默认都是字符串,需要转换为浮点数:
+
+```python
+
+lat = float(split_rmc[3])
+lon = float(split_rmc[5])
+print('经度信息:{}'.format(lon))
+print('纬度信息:{}'.format(lat))
+
+############执行结果如下################
+经度信息:11706.93089
+纬度信息:3149.3051
+
+```
+
+
+
+步骤5:将经纬度数据转换为单位为”度“的坐标
+
+查阅NEMA语句格式说明可知,NEMA语句中的经纬度格式如下:
+
+| 字段 | 格式 | 说明 |
+| ---- | ----------- | ------------------------------------------------------------ |
+| Lat | ddmm.mmmmm | 纬度
dd - 度(00-90)
mm - 分(00-59)
mmmmm - 分的十进制小数 |
+| Lon | dddmm.mmmmm | 经度
ddd - 度(000-180)
mm - 分(00-59)
mmmmm - 分的十进制小数 |
+
+转换计算如下:
+
+```python
+
+longitude = lon // 100 + (lon % 100) / 60
+latitude = lat // 100 + (lat % 100) / 60
+print('({}, {})'.format(longitude, latitude))
+
+############执行结果如下################
+(117.1155148333333, 31.82175166666667)
+
+```
+
+
+
+> 此处计算出来的是WGS-84坐标系下经纬度坐标,不可直接用于高德、腾讯、百度等地图上。
+
+
+
+### 2.2.2 示例代码
+
+下面示例是基于2.1.2章节中的代码基础上,增加了数据解析部分的代码。
+
+```python
+
+"""
+本例程示范了如何使用quecgnss模块的方法
+例程中设定10s获取一次定位信息,仅为示例,实际可由用户自行决定获取定位信息的周期
+"""
+import ure
+import utime
+import quecgnss
+
+cycle = 10
+
+def checksum(dstr):
+ lista = list(dstr)
+ list_len = len(lista) - 1
+ tmp = ord(lista[0])
+ i = 0
+ while i < list_len:
+ tmp = tmp ^ ord(lista[i+1])
+ i = i + 1
+ strtmp = str(hex(tmp))
+ return strtmp.replace('0x', '')
+
+def checksum_verify(nema):
+ find_sck = ure.search("\*(.+?)\r\n", nema)
+ if find_sck:
+ sck = find_sck.group(1)
+ else:
+ return False
+ data = ure.search("\$(.+?)\*", nema)
+ if data:
+ print('待计算数据:{}'.format(nema))
+ ck = checksum(data.group(1))
+ print('计算checksum为:{}'.format(ck))
+ if ck.upper() == sck.upper():
+ return True
+ else:
+ return False
+ else:
+ return False
+
+
+def main():
+ global cycle
+ if quecgnss.get_state() == 0:
+ ret = quecgnss.init()
+ if ret == 0:
+ print('GNSS 初始化成功')
+ else:
+ print('GNSS 初始化失败,请检查问题')
+ return -1
+
+ while True:
+ gnss_state = quecgnss.get_state()
+ if gnss_state == 2:
+ print('GNSS 开始定位')
+ break
+ elif gnss_state == 1:
+ print('GNSS 固件烧录中,请稍后')
+ utime.sleep(2)
+ continue
+ else:
+ print('GNSS 初始化异常,请检查问题')
+ return -1
+
+ while True:
+ try:
+ data = quecgnss.read(2048)
+ except Exception as e:
+ print('读取NEMA数据异常:{}'.format(e))
+ utime.sleep(2)
+ continue
+ data_len = data[0]
+ nema_data = data[1]
+ if data_len == 0:
+ print('未读到定位数据,重试中')
+ utime.sleep(2)
+ else:
+ print('===============================================')
+ print(nema_data.decode())
+ print('===============================================')
+ split_nema = nema_data.split('$')
+ for i in split_nema:
+ if i.startswith('GNRMC') and i.endswith('\r\n'):
+ split_rmc = i.split(',')
+ if split_rmc[2] == 'A':
+ print('获取到有效定位')
+ # 确认定位有效后,再计算checksum确认语句完整性,避免对无效数据进行计算
+ # 用户自行决定是否需要计算,如不需要可屏蔽checksum校验相关代码
+ rmc = i.replace('GNRMC', '$GNRMC')
+ if not checksum_verify(rmc):
+ continue
+ print('checksum 校验通过')
+
+ lat = float(split_rmc[3])
+ lon = float(split_rmc[5])
+ longitude = lon // 100 + (lon % 100) / 60
+ latitude = lat // 100 + (lat % 100) / 60
+ print('经纬度坐标:({}, {})'.format(longitude, latitude))
+ break
+ else:
+ continue
+ # 用户自行决定多久获取一次定位数据,此处10s仅为示例
+ utime.sleep(cycle)
+ # 下面这段代码是否需要,取决于用户获取定位的频繁程度。
+ if cycle > 60:
+ try:
+ quecgnss.read(4096)
+ except Exception as e:
+ print('{}'.format(e))
+ utime.sleep(2)
+
+ continue
+
+
+if __name__ == '__main__':
+ main()
+
+```
+
+
+
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_1.png b/docs/Application_guide/zh/media/cloud/aliyun_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3ceac49f4f5410524c2c0e6a158fae6dcb6a8e6
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_1.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_10.png b/docs/Application_guide/zh/media/cloud/aliyun_10.png
new file mode 100644
index 0000000000000000000000000000000000000000..428c26ac9bc9850e016014d3264ed12dcf52e8f6
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_10.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_11.png b/docs/Application_guide/zh/media/cloud/aliyun_11.png
new file mode 100644
index 0000000000000000000000000000000000000000..9235374d3f46893e343fac56dd252ddbcb98319c
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_11.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_12.png b/docs/Application_guide/zh/media/cloud/aliyun_12.png
new file mode 100644
index 0000000000000000000000000000000000000000..9235374d3f46893e343fac56dd252ddbcb98319c
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_12.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_13.png b/docs/Application_guide/zh/media/cloud/aliyun_13.png
new file mode 100644
index 0000000000000000000000000000000000000000..25de8c1e7afccc7d94f26df9f0ebbe949dd5ac9c
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_13.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_14.png b/docs/Application_guide/zh/media/cloud/aliyun_14.png
new file mode 100644
index 0000000000000000000000000000000000000000..11a8d78f7600fb8e57a3f33ac29ddd06b4d790e3
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_14.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_15.png b/docs/Application_guide/zh/media/cloud/aliyun_15.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc600798e1d06096caac590befcbf2476e844d45
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_15.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_16.png b/docs/Application_guide/zh/media/cloud/aliyun_16.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed9d8f600f44ddb8e3e94c2102b02a1cf5a7878e
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_16.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_17.png b/docs/Application_guide/zh/media/cloud/aliyun_17.png
new file mode 100644
index 0000000000000000000000000000000000000000..1bb34cc23f107c924d425750b9cf96641adacf72
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_17.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_18.png b/docs/Application_guide/zh/media/cloud/aliyun_18.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e242ed4f8be545ddf5d12436851b14fbaec32b9
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_18.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_19.png b/docs/Application_guide/zh/media/cloud/aliyun_19.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3b2f5d49defae53a04338295a4ed39d6c13556c
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_19.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_2.png b/docs/Application_guide/zh/media/cloud/aliyun_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..1eb54084768a424f3c1b87b80c8e8ca45dc282ca
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_2.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_20.png b/docs/Application_guide/zh/media/cloud/aliyun_20.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed8bd04bd7eab1d75e633ae297e19143fa233901
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_20.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_21.png b/docs/Application_guide/zh/media/cloud/aliyun_21.png
new file mode 100644
index 0000000000000000000000000000000000000000..cd56f038eb1be4f69839948a3f73f1f12d163f4f
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_21.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_22.png b/docs/Application_guide/zh/media/cloud/aliyun_22.png
new file mode 100644
index 0000000000000000000000000000000000000000..cd56f038eb1be4f69839948a3f73f1f12d163f4f
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_22.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_23.png b/docs/Application_guide/zh/media/cloud/aliyun_23.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ad84103121a31b476cd7cfc5c17c789cb9fc5ae
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_23.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_24.png b/docs/Application_guide/zh/media/cloud/aliyun_24.png
new file mode 100644
index 0000000000000000000000000000000000000000..4da3274e7d36478efec548f2c03d5d56d32019a7
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_24.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_25.png b/docs/Application_guide/zh/media/cloud/aliyun_25.png
new file mode 100644
index 0000000000000000000000000000000000000000..3aaeac5135a12400360e564fd36aa6b588f11587
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_25.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_26.png b/docs/Application_guide/zh/media/cloud/aliyun_26.png
new file mode 100644
index 0000000000000000000000000000000000000000..91d4a08aa3a1df2cb715afa68306d6d95c2fce91
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_26.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_27.png b/docs/Application_guide/zh/media/cloud/aliyun_27.png
new file mode 100644
index 0000000000000000000000000000000000000000..e221f7cfc7128c9e4a88ea8db2775195372d3301
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_27.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_3.png b/docs/Application_guide/zh/media/cloud/aliyun_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..daed4119d1b5723ba3806fd4c3ea9f42fbbc3a3c
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_3.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_4.png b/docs/Application_guide/zh/media/cloud/aliyun_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b348c77591d9800977880fc4242f3f69336a934
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_4.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_5.png b/docs/Application_guide/zh/media/cloud/aliyun_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..5401fcc90366a172f62fa1e595addaed5bfc0b8f
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_5.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_6.png b/docs/Application_guide/zh/media/cloud/aliyun_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab74e76f2c6aadf254f2d9cbfdaf05842ec54a2d
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_6.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_7.png b/docs/Application_guide/zh/media/cloud/aliyun_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea5bbf6604d2221deadaa6e601b5d67c781dc3cf
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_7.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_8.png b/docs/Application_guide/zh/media/cloud/aliyun_8.png
new file mode 100644
index 0000000000000000000000000000000000000000..cea6401f83e296e88a487c4fdbdf6f3f8e0977a9
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_8.png differ
diff --git a/docs/Application_guide/zh/media/cloud/aliyun_9.png b/docs/Application_guide/zh/media/cloud/aliyun_9.png
new file mode 100644
index 0000000000000000000000000000000000000000..c78c2d310ec8f336ab0fe669d6b4ae1cd70f802f
Binary files /dev/null and b/docs/Application_guide/zh/media/cloud/aliyun_9.png differ
diff --git a/docs/Application_guide/zh/media/network/dataCall/network.dataCall-1.png b/docs/Application_guide/zh/media/network/dataCall/network.dataCall-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..2492a659e58bf886766d236cda0c1f857884ad83
Binary files /dev/null and b/docs/Application_guide/zh/media/network/dataCall/network.dataCall-1.png differ
diff --git "a/docs/FAQ/zh/\345\274\200\345\217\221\347\216\257\345\242\203\344\270\216\345\267\245\345\205\267/\345\274\200\345\217\221\345\267\245\345\205\267\344\275\277\347\224\250\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/Application_guide/zh/media/network/test.png
similarity index 100%
rename from "docs/FAQ/zh/\345\274\200\345\217\221\347\216\257\345\242\203\344\270\216\345\267\245\345\205\267/\345\274\200\345\217\221\345\267\245\345\205\267\344\275\277\347\224\250\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/Application_guide/zh/media/network/test.png
diff --git "a/docs/FAQ/zh/\347\241\254\344\273\266\347\233\270\345\205\263/README.md" b/docs/Application_guide/zh/network/README.md
similarity index 100%
rename from "docs/FAQ/zh/\347\241\254\344\273\266\347\233\270\345\205\263/README.md"
rename to docs/Application_guide/zh/network/README.md
diff --git a/docs/Application_guide/zh/network/cellLocator.md b/docs/Application_guide/zh/network/cellLocator.md
new file mode 100644
index 0000000000000000000000000000000000000000..5bf561a459371f8d7978938f16aa20da6d9e4763
--- /dev/null
+++ b/docs/Application_guide/zh/network/cellLocator.md
@@ -0,0 +1,49 @@
+# 基站定位
+
+## 什么是基站定位
+
+基站定位是一种利用移动通信基站的信号信息确定设备位置的技术。在移动通信网络中,基站是无线信号的发射和接收站点,每个基站都有一个唯一标识码,同时可以测量设备与基站之间的信号强度和时间延迟等信息。通过对设备与多个基站之间的信号信息进行比对和计算,就可以确定设备大致的位置。基站定位技术广泛应用于车辆追踪、物流管理、紧急救援等领域。与GPS等卫星定位技术相比,基站定位更适用于城市等密集建筑区域,但精度相对较低。
+
+#### 基站定位分类
+
+基站定位可以分为以下几类:
+
+1、单纯的基站定位。
+
+2、基站和WiFi混合定位。
+
+本文档主要介绍如何 QuecPython 单纯的基站定位功能,WiFi定位可查看WiFi定位应用文档,通过本文你将了解到 QuecPython 基站定位使用方法。
+
+
+
+## 怎么使用基站定位功能
+
+### 硬件设计
+
+基站定位主要是数据通道向服务器获取位置信息实现的,除前提条件模块需要组网成功外无需其他外围硬件支持。
+
+### 软件应用
+
+#### 使用流程
+
+在使用基站定位服务之前,首先需要建立数据通道(拨号成功,能通过dataCall.getInfo(1,0)查询到ip),基站定位服务基于这个数据通道向服务器获取位置信息。若在其他任务中已经建立了数据通道,可以跳过建立数据通道的步骤。
+
+建立好数据通道之后,调用cellLocator.getLocation可查询当前UE的经纬度坐标。
+
+
+
+> 1、 token需要向相关部门提交申请获取。
+>
+> 2、基站定位服务访问不可太过频繁,两次定位间隔最好保持10s以上。
+
+
+
+#### 软件实现示例
+
+```Python
+>>> import cellLocator
+>>> cellLocator.getLocation("www.queclocator.com", 80, "xxxxxxxxxxxxxxxx", 8, 1)
+(117.1138, 31.82279, 550)
+# 上面使用的密钥"xxxxxxxxxxxxxxxx"指代token,具体需要向移远申请
+```
+
diff --git a/docs/Application_guide/zh/network/datacall.md b/docs/Application_guide/zh/network/datacall.md
new file mode 100644
index 0000000000000000000000000000000000000000..34122dea041d4308031e1ac937add4737343ebf1
--- /dev/null
+++ b/docs/Application_guide/zh/network/datacall.md
@@ -0,0 +1,385 @@
+# 数据拨号
+
+数据拨号是指通过调用通信模块的拨号接口,实现将嵌入式设备连接到互联网的过程。在进行数据拨号之前,需要先配置通信模块的网络参数,如APN、用户名、密码等,以便建立连接时使用。
+
+## 引言
+
+移远通信LTE Standard 模块支持QuecPython方案,本文档主要描述QuecPython模块无线数据业务的建立过程,即数据拨号的过程。本文主要介绍数据拨号功能的实际应用,包含开机自动拨号、拨号重连以及手动拨号的基础的用法和注意事项。同时介绍了拨号功能在常见场景中的使用。
+
+### 适用模块
+
+| **模块系列** |
+| ------------------------------------------------------ |
+| EC100Y/EC200N/EC600N/EC600S/EC800N/EG912N/EG915N 系列 |
+| EC600M/EC800M/EG810M/EC200A系列 |
+| EC200U/EC600U/EG912U/EG915U/EC600G/EC800G系列 |
+| BC25系列 |
+| EC600E/EC800E 系列 |
+| BG77/BG95系列 |
+
+### 设备检查
+
+本文档介绍的内容是基于Python SDK中包含的API来实现的,本文中使用的相关API具体详情见[dataCall](../../../API_reference/zh/QuecPython类库/dataCall.html)。
+
+拨号之前需做一系列基本检查,判断模块是否处于基本的正常工作状态,具体步骤如下:
+
+1. 通过USB转串口线连接PC至模块的主串口或者USB端口。
+
+2. 插入(U)SIM卡和天线,并上电。
+
+3. 通过如下API函数,检查设备状态。
+
+ a) 检测(U)SIM卡:sim.getStatus()
+
+ b) 检测信号强度:net.getSignal()
+
+ c) 检测模块注网:net.getState()
+
+ d) 查询第一路拨号服务状态:dataCall.getInfo(1,0)
+
+4. 使用QPYcom工具和模组进行交互,检查如下操作:
+
+
+
+
+
+## 开机自动拨号
+
+所谓开机自动拨号,是指模组上电运行时,自动进行拨号的行为,无需用户再去执行拨号。用户只需要在模组开机后确认已经拨号成功,即可开始正常使用网络功能。
+
+### 功能实现
+
+根据profileID来设置对应那一路是否开机自动拨号。profileID为1的那一路初始默认使能开机自动拨号。
+
+1. 查询是否拨号成功。使用API和示例代码如下:
+
+ dataCall.getInfo(profileID, ipType)
+
+```python
+import dataCall
+dataCall.getInfo(1,0) #查看第一路是否拨号成功
+#返回结果 (1, 0, [1, 0, '10.146.83.168', '211.138.180.2', '211.138.180.3'])
+dataCall.getInfo(2,0) #查看第二路是否拨号成功
+dataCall.getInfo(3,0) #查看第三路是否拨号成功
+```
+
+2. 设置为自动拨号。使用API和示例代码如下:
+
+ dataCall.setAutoActivate(profileID, enable)
+
+```python
+import dataCall
+# 第一路默认为自动拨号
+dataCall.setAutoActivate(2, 1) #设置第二路自动拨号
+dataCall.setAutoActivate(3, 1) #设置第三路自动拨号
+```
+
+2. 取消自动拨号。示例代码如下:
+
+```python
+import dataCall
+dataCall.setAutoActivate(1, 0) #取消第一路自动拨号
+dataCall.setAutoActivate(2, 0) #取消第二路自动拨号
+dataCall.setAutoActivate(3, 0) #取消第三路自动拨号
+```
+
+### 注意事项
+
+> 1. 第一路(profileID为1)初始默认开机自动拨号。
+> 2. 拨号前请先通过 setPDPContext配置APN相关信息。
+> 3. 如没有配置对应profileID的APN相关信息,默认使用空字符串进行拨号。
+> 4. 当设置多路自动拨号时,会依照profileID从小到大依次进行拨号。
+> 5. 如全部取消自动拨号,则模组上电运行时不会进行拨号,需要进行手动拨号。
+
+
+
+## 手动拨号
+
+拨号,指的是PDP Context的激活操作,激活成功后,核心网的PDN网关才会分配一个IP地址给模组。手动拨号是指用户自己使用拨号接口去进行拨号,手动拨号前需要先配置PDP Context相关信息(APN,用户名,密码以及鉴权参数等信息)。
+
+### 配置APN
+
+配置APN相关信息,拨号时使用该方法配置的相关信息进行PDP Context激活。
+
+1. 配置PDP Context信息。使用API和示例代码如下:
+
+ dataCall.setPDPContext(profileID, ipType, apn, username, password, authType)
+
+```python
+import dataCall
+#配置第一路PDP Context相关信息
+dataCall.setPDPContext(1, 0, "3gnet", "", "", 0)
+#配置第二路PDP Context相关信息
+dataCall.setPDPContext(2, 0, "3gnet.mnc001.mcc460.gprs", "", "", 0)
+#配置第三路PDP Context相关信息
+dataCall.setPDPContext(3, 0, "3gnet.mnc001.mcc460.gprs", "", "", 0)
+```
+
+ 2. 查询PDP Context信息。使用API和示例代码如下:
+
+ dataCall.getPDPContext(profileID)
+
+```python
+import dataCall
+dataCall.getPDPContext(1) #查询第一路PDP Context相关信息
+#返回结果 (0, '3gnet', '', '', 0)
+dataCall.getPDPContext(2) #查询第一路PDP Context相关信息
+#返回结果 (0, '3gnet.mnc001.mcc460.gprs', '', '', 0)
+dataCall.getPDPContext(3) #查询第一路PDP Context相关信息
+```
+
+### 拨号实现
+
+手动拨号,激活profileID指定的那一路PDP Context。
+
+1. 手动激活,进行拨号。使用API和示例代码如下:
+
+ dataCall.activate(profileID)
+
+```Python
+import dataCall
+# 激活之前,应先配置APN
+dataCall.setPDPContext(1, 0, '3gnet', '', '', 0) # 这里配置第一路的APN
+dataCall.setPDPContext(2, 0, '3gnet', '', '', 0) # 这里配置第二路的APN
+dataCall.setPDPContext(3, 0, '3gnet', '', '', 0) # 这里配置第三路的APN
+dataCall.activate(1) # 激活第一路
+dataCall.activate(2) # 激活第二路
+dataCall.activate(3) # 激活第三路
+```
+
+2. 去激活,取消拨号。使用API和示例代码如下:
+
+ dataCall.deactivate(profileID)
+
+```Python
+import dataCall
+dataCall.deactivate(1) # 去激活第一路
+dataCall.deactivate(2) # 去激活第二路
+dataCall.deactivate(3) # 去激活第三路
+```
+
+### 注意事项
+
+> 1. 模组会在开机时自动拨号,一般不需要用户执行激活操作。
+> 2. 如用户关闭了开机自动拨号功能,则需要用户调用此方法来进行手动拨号。
+> 3. 手动拨号之前,应该先配置对应profileID的APN相关信息。
+> 4. 如没有配置对应profileID的APN相关信息,默认使用空字符串进行拨号。
+
+
+
+## 拨号重连
+
+自动重连功能是指,因网络异常、信号差等异常场景导致模组与网络断开连接,当异常场景恢复正常后,模组自动进行拨号重连的行为。
+
+### 功能实现
+
+根据profileID来设置对应那一路是否使能自动重连。profileID为1的那一路默认使能自动重连功能。
+
+1. 设置开启自动重连。使用API和示例代码如下:
+
+ dataCall.setAutoConnect(profileID, enable)
+
+```python
+import dataCall
+# 第一路默认开启自动重连
+dataCall.setAutoConnect(2, 1) #开启二路为自动重连
+dataCall.setAutoConnect(3, 1) #开启三路为自动重连
+```
+
+2. 关闭自动重连。示例代码如下:
+
+ 如用户关闭了自动重连功能,网络状态发生变化时,如网络断开等情况下,则需要用户进行手动拨号。
+
+```python
+import dataCall
+dataCall.setAutoConnect(1, 0) #关闭第一路自动重连
+dataCall.setAutoConnect(2, 0) #关闭第二路自动重连
+dataCall.setAutoConnect(3, 0) #关闭第三路自动重连
+```
+
+### 注册回调函数
+
+当网络状态发生变化时,如网络断开、拨号重连成功时,会触发注册的回调函数,告知用户网络状态。
+
+1. 定义回调函数并注册。使用API和示例代码如下:
+
+ dataCall.setCallback(fun)
+
+```python
+import dataCall
+#定义回调函数
+def netCallback(args):
+ pdp = args[0]
+ datacallState = args[1]
+ if datacallState == 0:
+ print('*** network {} disconnected.'.format(pdp))
+ elif datacallState == 1:
+ print('*** network {} connected.'.format(pdp))
+#注册回调函数
+dataCall.setCallback(netCallback)
+
+#此时第一路网络断开
+*** network 1 disconnected.
+#此时第一路自动重连成功
+*** network 1 connected
+```
+
+### 注意事项
+
+> 1. 第一路(profileID为1)初始默认为自动重连。
+> 2. 如用户关闭了自动重连功能,则在网路断开恢复时需要用户进行手动拨号。
+> 3. 当注册了回调函数后,在网络断开、拨号重连成功时,会触发注册的回调函数的运行。
+
+
+
+## 不同场景下的使用
+
+### 场景一:第一次使用
+
+第一次插入sim卡,之前没有配置过PDP Context相关信息,文件系统也没有保存过PDP Context相关信息。
+
+模组烧录QuecPython的固件,开机后,默认会自动执行第一路拨号,使用默认APN进行拨号。可以直接查询拨号信息。
+
+1. 拨号成功--能够查询到拨号信息
+
+ 对于大部分公网卡和可以连上公网的专网卡而言,一般利用核心网下发的APN,进行拨号,并保存在文件系统里面,可以通过dataCall.getPDPContext(1)查询PDP Context相关信息。
+
+```python
+import dataCall
+dataCall.getInfo(1, 0) #查询拨号结果信息
+#返回结果 (1, 0, [1, 0, '10.91.44.177', '58.242.2.2', '218.104.78.2'])
+dataCall.getPDPContext(1) #查询第一路PDP Context信息
+#返回结果 (0, '3gnet', '', '', 0)
+```
+
+2. 拨号失败--查询不到拨号信息
+
+对于少部分公网卡,不是所有核心网都支持不设置APN;大部分专网卡必须提前设置APN,导致拨号失败。需要进行正常单路拨号,见场景二。
+
+```python
+import dataCall
+dataCall.getInfo(1, 0) #查询拨号结果信息
+#返回结果 (1, 0, [0, 0, '', '', ''])
+dataCall.getPDPContext(1) #查询第一路PDP Context信息
+#返回结果 (0, '', '', '', 0)
+```
+
+### 场景二:正常单路拨号
+
+在场景一和场景三拨号失败或不使用默认APN拨号的情况下,使用用户自己配置对应运营商的APN信息的进行拨号。
+
+示例一如下:
+
+```python
+import dataCall
+from misc import Power
+# 用户需要配置的APN信息,根据实际情况修改
+usrConfig = {'apn': '3gnet', 'username': '', 'password': ''}
+# 获取第一路的APN信息,确认当前使用的是否是用户指定的APN
+pdpCtx = dataCall.getPDPContext(1)
+if pdpCtx != -1:
+ if pdpCtx[1] != pdpConfig['apn']:
+ # 如果不是用户需要的APN,使用如下方式配置
+ ret = dataCall.setPDPContext(1, 0, usrConfig['apn'], usrConfig['username'], usrConfig['password'], 0)
+ if ret == 0:
+ print('APN 配置成功。')
+ # 重启后按照配置的信息进行拨号
+ Power.powerRestart()
+ else:
+ print('APN 配置失败。')
+ else:
+ print('APN 已经配置过了。')
+else:
+ print('获取PDP Context失败。')
+
+```
+
+示例二 如下:
+
+```python
+>>> import dataCall
+>>> dataCall.getPDPContext(1) #查询APN
+(0, 'cmnet.mnc001.mcc460.gprs', '', '', 0)
+ #设置成用户指定的APN
+>>> dataCall.setPDPContext(1, 0, '3gnet', '', '', 0)
+
+0
+>>> dataCall.getPDPContext(1) #查询是否配置成功
+(0, '3gnet', '', '', 0)
+
+>>> from misc import Power
+>>> Power.powerDown() #重启
+```
+
+重启后:
+
+1. 拨号成功--能够查询到正确的拨号信息
+
+正常情况下使用正确的APN进行拨号,都能够拨号成功,并保存在文件系统里面,可以通过dataCall.getPDPContext(1)查询PDP Context相关信息。
+
+```python
+import dataCall
+dataCall.getInfo(1, 0) #查询第一路拨号信息
+#返回结果 (1, 0, [1, 0, '10.91.44.177', '58.242.2.2', '218.104.78.2'])
+dataCall.getPDPContext(1)
+#返回结果(0, '3gnet', '', '', 0)
+```
+
+2. 拨号失败--查询不到拨号信息
+
+部分为APN配置错误造成的,如没有配置对应运营商的APN,配置错专网卡特有的APN。需要先确认APN的正确性。
+
+部分为网络、SIM卡或模块自身问题造成的,如SIM卡欠费、限制,网络断开,信号质量差等其它原因,需要和运营商或研发人员确认。
+
+### 场景三:中途换卡
+
+非第一次插入卡,中途换卡(公网换公网、公网换专网、专网换专网,专网换公网),因为之前卡拨号成功过,所以无论有没有配置过PDP Context,文件系统都保存过PDP Context相关信息。
+
+如删除过文件系统的PDP Context相关信息,拨号场景见场景一。
+
+开机后,默认会自动执行第一路拨号,使用文件系统中配置的APN进行拨号。可以直接查询拨号信息。
+
+1. 拨号成功--能够查询到拨号信息
+
+对于部分同运营商内换卡或部分公网换公网,APN信息是一样的能够拨号成功;
+
+对于部分公网换公网或专网换公网,因为核心支持APN纠错,能够拨号成功,但是不建议使用,不是所有核心网都支持这个纠错功能。
+
+2. 拨号失败--查询不到拨号信息
+
+对于中途换卡场景拨号失败情况基本上都是APN错误导致的,需要进行正常单路拨号,见场景二。
+
+### 场景四:多路拨号
+
+用户除了使用第一路数据拨号外还需要使用其它路进行数据拨号。
+
+1. 由于除了第一路外,其他路没有自带自动拨号,自动重连功能,可以使用手动拨号。
+
+```python
+import dataCall
+#查询第二路拨号信息;由于没有拨号,返回空
+dataCall.getInfo(2, 0)
+#返回结果 (2, 0, [0, 0, '', '', ''])
+#设置第二路拨号的PDP Context相关信息,如不设置,拨号时使用空字符串进行拨号
+dataCall.setPDPContext(2, 0, '3gnet', '', '', 0)
+# 开启第二路开机自动拨号功能
+dataCall.setAutoActivate(2, 1)
+# 开启第二路自动重连功能
+dataCall.setAutoConnect(2, 1)
+#手动激活第二路PDP Context
+dataCall.activate(2)
+#返回结果 0 拨号成功
+dataCall.getInfo(2, 0) #查询第二路拨号信息
+#返回结果 (2, 0, [1, 0, '10.91.44.177', '58.242.2.2', '218.104.78.2'])
+dataCall.getPDPContext(2)
+#返回结果(0, '3gwap', '', '', 0)
+```
+
+2. 注意事项
+
+ 在配置其它路为自动拨号,自动重连后,拨号场景同场景一、场景二、场景三。
+
+ 多路手动拨号成功与失败原因,同场景一、场景二、场景三。
+
+ 如设置第一路为取消自动拨号,取消自动重连,同场景四。
+
diff --git a/docs/Application_guide/zh/network/esim.md b/docs/Application_guide/zh/network/esim.md
new file mode 100644
index 0000000000000000000000000000000000000000..b72415985a4d1df5413eba3eee27df0ea7d443b3
--- /dev/null
+++ b/docs/Application_guide/zh/network/esim.md
@@ -0,0 +1,197 @@
+# eSIM LPA
+
+## 什么是eSIM LPA
+
+eSIM即嵌入式SIM,也叫eUICC,支持空中写号,可远程动态切换码号;它是SIM卡技术的升级,是由GSMA开发的一个新标准。
+与传统可插拔的SIM卡不同,eSIM一般没有实体SIM卡,而是通过一个嵌入到设备中的芯片(eUICC),下载运营商配置文件并激活运营商服务。详细点说,eSIM是通过使用远程SIM卡配置来激活的,即通过使用远程SIM卡配置平台,通过使用标准化、安全和远程的“空中传送”过程,来完成eSIM配置文件的下载、安装和激活。
+eSIM这种虚拟化和设备集成化的特性,让用户不必来回插拔传统SIM卡,SIM卡号码的切换也将引来全新的用户体验,用户直接通过与终端交互,通过APP或者云端,即可在全球范围内将终端智能设备连接到所选择的当地网络,且可动态切换,使设备可以始终处于优质网速中。
+
+对于终端用户而言,Quecpython eSIM方案整体架构可以理解为由DP+服务器,设备提供的LPA以及eSIM组成,我们UE在此充当的就是LPA的功能。
+
+## 怎么使用eSIM
+
+### 硬件设计
+
+eSIM功能主要为DP+服务器与eSIM通过UE来进行的内部交互,除前提条件模块需要组网成功外无需其他外围硬件支持。
+
+### 软件应用
+
+目前GSMA制定了两套eSIM标准方案,分别是针对物联网行业的M2M方案——M2M eSIM;以及直接面向最终用户的消费者解决方案——Consumer eSIM。
+M2M方案需要依赖短信功能进行profile的下载,而消费者解决方案依赖于HTTPS下载。故M2M方案的实施eSIM芯片中必须预置有种子号;消费者解决方案的实施只需要设备能连接网络即可,但目前QuecPython支持的模组型号只能通过蜂窝数据连接网络,所以使用消费者解决方案时也需要预置种子号保证能正常连接网络。
+
+下面我们分:`eSIM空中写号流程`;`OTA`;`软件设计`三个部分来分别介绍Quecpython eSIM LPA方案。
+
+#### eSIM空中写号流程
+
+1、通常MCU/End user通过二维码获取activation code并提供给终端
+
+2、模块使用esim中的种子号的网络与DP+服务器进行交互
+
+3、从服务器下载profile到esim中(OTA)
+
+#### OTA
+
+1、ESIM和DP+服务器互相认证
+
+2、从DP+ 服务器下载profile安装包
+
+3、安装profile到eSIM并上报结果给DP+ 服务器
+
+#### 软件设计
+
+注意:执行该脚本之前请关闭开机自动拨号逻辑
+
+```Python
+import utime
+import net
+import dataCall
+import sim
+from sim import esim
+from machine import UART
+from queue import Queue
+
+OTAResult_q = None
+
+def check_sim():
+ repeat_count = 10
+ while repeat_count >= 0:
+ sim_state = sim.getStatus()
+ if sim_state == 1:
+ print('sim is ready!')
+ break;
+ else:
+ utime.sleep_ms(500)
+ repeat_count -= 1
+
+ if repeat_count < 0:
+ return -1
+ #else:
+ #return 0
+
+ iccid = sim.getIccid()
+ print('iccid:{}'.format(iccid))
+
+ eid = esim.getEid()
+ print("eUICC id:{}".format(eid))
+ if eid == '' or eid == None:
+ print('get euicc id failed!')
+ return -1
+
+ profile_list = esim.getProfileInfo(1)
+ print(profile_list)
+ if profile_list[0] == 0:
+ print('there is no profileinfo in this esim!')
+ return -1
+ return 0
+
+def init_esim():
+ #
+ print('Please input the ipVersion of this esim:')
+ ipVersion=input()
+ print('Please input the APN of this esim:')
+ apn=input()
+ print('Please input the userName of this esim:')
+ userName=input()
+ print('Please input the passWord of this esim:')
+ passWord=input()
+ print('Please input the authType of this esim:')
+ authType=input()
+ net.setApn(1,int(ipVersion),apn,userName,passWord,int(authType),0)
+ #
+ print('Please input the net config:')
+ config=input()
+ net.setConfig(int(config))
+ #
+ net.setModemFun(0)
+ repeat_count = 5
+ while repeat_count >= 0:
+ net_state = net.getState() #([11, 26909, 232301323, 7, 0, 466], [0, 26909, 232301323, 7, 0, 0])
+ if net_state == -1 or (net_state[1][0] != 1 and net_state[1][0] != 5):
+ net.setModemFun(1)
+ repeat_count = 1200
+ while repeat_count >= 0:
+ net_state = net.getState()
+ if net_state[1][0] == 1 or net_state[1][0] == 5:
+ print('success to reg network...')
+ break;
+ else:
+ utime.sleep_ms(500)
+ repeat_count -= 1
+ print('wait reg network...')
+
+ if repeat_count >= 0:
+ return 0
+ else:
+ print('failed to reg network,please check pdn info and netconfig!')
+ return -1
+ else:
+ utime.sleep_ms(100)
+ repeat_count -= 1
+ if repeat_count < 0:
+ return -1
+ return 0
+
+def cb(args):
+ global OTAResult_q
+ print('OTA result:{}'.format(args))
+ OTAResult_q.put(args)
+
+def esim_lpa():
+ global OTAResult_q
+ esim.setCallback(cb)
+ print('please input the activationCode:')
+ activationCode = input()
+ print('please input the confirmationCode:')
+ confirmationCode = input()
+ ret = esim.profileOTA(activationCode, confirmationCode)
+ if ret == 0:
+ result = OTAResult_q.get()
+ if result == 0:
+ print('success to download and install the profile!')
+ while True:
+ print('Please select the action you want<0:enable profile 1:exit>')
+ handlerType = input()
+ if int(handlerType) == 1:
+ return 0
+ elif int(handlerType) == 0:
+ print('please input the iccid:')
+ iccid = input()
+ ret = esim.profileHandle(int(handlerType), iccid)
+ if ret != 0:
+ print('enable profile failed!')
+ return -1
+ print('enable profile succeed!')
+ sim_state = sim.getStatus()
+ print('sim state:{}'.format(sim_state))
+ iccid = sim.getIccid()
+ print('iccid:{}'.format(iccid))
+ profile_list = esim.getProfileInfo(1)
+ print('profile_list:{}'.format(profile_list))
+ break
+ else:
+ print('invalid input')
+ utime.sleep_ms(100)
+ else:
+ print('failed to download and install the profile!')
+ return -1
+ else:
+ print('failed to download and install the profile!')
+ return -1
+
+if __name__ == '__main__':
+ OTAResult_q = Queue(maxsize=100)
+ ret = check_sim()
+ if ret == 0:
+ ret = init_esim()
+ if ret == 0:
+ pdninfo = net.getApn(1,0)
+ print(pdninfo)
+ dataCall.setAsynMode(0)
+ ret = dataCall.start(1,int(pdninfo[0]), pdninfo[1], pdninfo[2], pdninfo[3], int(pdninfo[4]))
+ if ret == 0:
+ esim_lpa()
+```
+
+## eSIM OTA测试
+
+成功执行以上脚本之后,默认已经成功从DP+服务器下载并安装profile到eSIM中,并且使能了该profile,如果该profile是可用的,我们可以重启模块,查询当前注网状态,以及iccid,验证是否写号成功
diff --git "a/docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/README.md" b/docs/Application_guide/zh/network/http/README.md
similarity index 100%
rename from "docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/README.md"
rename to docs/Application_guide/zh/network/http/README.md
diff --git "a/docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/Python\345\237\272\347\241\200\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/Application_guide/zh/network/http/http_get.md
similarity index 100%
rename from "docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/Python\345\237\272\347\241\200\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/Application_guide/zh/network/http/http_get.md
diff --git "a/docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/Application_guide/zh/network/http/http_post.md
similarity index 100%
rename from "docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/Application_guide/zh/network/http/http_post.md
diff --git "a/docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/Application_guide/zh/network/mqtt.md
similarity index 100%
rename from "docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/Application_guide/zh/network/mqtt.md
diff --git a/docs/Application_guide/zh/network/sim.md b/docs/Application_guide/zh/network/sim.md
new file mode 100644
index 0000000000000000000000000000000000000000..9005a5ba871d49c4d3334bc0554aa3afcfd97c68
--- /dev/null
+++ b/docs/Application_guide/zh/network/sim.md
@@ -0,0 +1,92 @@
+# SIM卡
+
+## 什么是SIM卡
+
+Subscriber Identity Module(简称SIM卡)是一种智能卡,主要用于存储移动用户的身份信息和相关密钥,并实现对移动通信网络的认证和授权。SIM卡通常由芯片、封装材料和金属接点等组成,可以插入手机或其他移动终端中使用。 SIM卡的主要功能是存储移动用户的身份信息和相关密钥,包括手机号码、用户身份标识、IMSI号码、PIN码、PUK码、加密密钥等。通过这些信息,SIM卡可以向移动通信网络提供用户身份认证和授权,以保证通信网络的安全性。 此外,SIM卡还可以存储联系人信息、短信、通话记录、语音信箱号码、网络参数等相关信息,为用户提供各种通信和管理功能,方便用户的日常生活和工作。
+
+本文档主要介绍如何使用 QuecPython SIM卡功能,通过本文你将了解到 QuecPython SIM卡的设置及使用方法。
+
+## 怎么使用SIM卡功能
+
+### 硬件设计
+
+SIM卡功能主要是实体SIM卡通过UE来进行交互,除前提条件模块需要组网成功外无需其他外围硬件支持。
+
+### 软件应用
+
+#### 已实现功能
+
+SIM卡是具有以下功能和应用:
+
+1. 身份认证:SIM卡中存储了用户的身份信息和网络访问权限,可以对用户进行身份认证和授权,以保证通信网络的安全性。
+2. 存储联系人:SIM卡可以存储联系人信息,包括姓名、电话号码等,方便用户进行通信和联系。
+3. 短信功能:SIM卡可以接收和发送短信,方便用户进行信息交流和通信。
+4. 存储通话记录:SIM卡可以存储用户的通话记录,包括通话时间、通话时长等,方便用户进行通话管理和统计。
+5. 存储语音信箱号码:SIM卡可以存储语音信箱号码,方便用户使用语音信箱服务。
+6. 存储网络参数:SIM卡可以存储网络参数,包括APN、用户名、密码等,方便用户进行数据拨号和网络连接。
+7. 存储安全信息:SIM卡可以存储加密密钥、PIN码等安全信息,以保证通信网络的安全性。
+
+在QuecPython中这些功能的接口主要在[sim](/../../../API_reference/zh/QuecPython类库/sim.html),[sms](/../../../API_reference/zh/QuecPython类库/sms.html)和[ voiceCall](/../../../API_reference/zh/QuecPython类库/ voiceCall.html)中。
+
+ 1. SIM卡信息和状态查询:包括获取sim卡的IMSI,ICCID,电话号码和SIM当前状态。
+ 2. 电话簿功能:可以存储联系人信息,包括姓名、电话号码等。
+ 3. 短信功能:具体见[sms](./sms.md)短信应用指导。
+ 4. 电话功能:具体见[ voiceCall](./sms.md)电话应用指导。
+ 5. 存储安全信息功能:包括PIN码验证,解锁等。
+ 6. 其它功能:如切卡、热插拔和注册回调功能。
+
+#### 软件实现示例
+
+```python
+>>> import sim
+>>> sim.getImsi() # 获取sim卡的IMSI
+'460105466870381'
+>>> sim.getIccid() # 获取sim卡的ICCID
+'89860390845513443049'
+>>> sim.getPhoneNumber() # 获取sim卡的电话号码
+'+8618166328752'
+>>> sim.getStatus() # 查询当前SIM卡状态 0:SIM卡不存在/被移除,1:SIM已经准备好,2:SIM卡已锁定
+1
+>>> sim.writePhonebook(9, 1, 'Tom', '18144786859') # 写电话簿
+0
+>>> sim.readPhonebook(9, 1, 4, "") # 读电话簿
+(4,[(1,'Tom','15544272539'),(2,'Pony','15544272539'),(3,'Jay','18144786859'),(4,'Pondy','15544282538')])
+>>> sim.readPhonebook(9, 0, 0, "Tom")
+(1, [(1, 'Tom', '18144786859')])
+>>> sim.readPhonebook(9, 0, 0, "Pony")
+(1, [(2, 'Pony', '17744444444')])
+>>> sim.readPhonebook(9, 0, 0, "Pon") # 关键字查询电话簿
+(2, [(2, 'Pony', '17744444444'),(4,'Pondy','15544282538')])
+>>> sim.enablePin("1234") # 开启PIN码验证
+0
+>>> sim.verifyPin("1234") # PIN码验证
+0
+>>> sim.disablePin("1234") # 取消PIN码验证。
+0
+>>> sim.changePin("1234", "4321") # 于更改sim卡PIN码。
+0
+>>> sim.unblockPin("12345678", "0000") # SIM卡解锁:当多次输入PIN码错误需要用PUK码解锁
+0
+>>> sim.setSimDet(1, 0) # 开启SIM卡热插拔, 1表示开启
+0
+>>> sim.getSimDet() # 查询热插拔相关配置
+(1, 0)
+>>> sim.getCurSimid() # 获取当前卡,当前是卡1
+0
+>>> sim.switchCard(1) # 切到卡2
+0
+>>> sim.getCurSimid() # 获取当前卡,成功切到卡2
+1
+# 热插拔 注册监听回调函数
+def usrCallback(args):
+ simstates = args
+ print('sim states:{}'.format(simstates))
+sim.setCallback(usrCallback)
+
+# SIM卡切卡状态 注册监听回调函数
+def usrCallback(args):
+ switchcard_state = args
+ print('sim switchcard states:{}'.format(switchcard_state))
+sim.setSwitchcardCallback(usrCallback)
+```
+
diff --git a/docs/Application_guide/zh/network/sms.md b/docs/Application_guide/zh/network/sms.md
new file mode 100644
index 0000000000000000000000000000000000000000..ad245b26384d1e489194fd509e15be937c6ea58c
--- /dev/null
+++ b/docs/Application_guide/zh/network/sms.md
@@ -0,0 +1,92 @@
+# 短信
+
+## 什么是短信
+
+短信(Short Message Service)是一种通过移动通信网络传输文字信息的服务。短信可以用于发送文字、数字、符号等信息,每条短信的长度一般为160个字符。短信可以用于个人通信、商业宣传、政府通知等多种场合。短信服务通常需要用户购买短信套餐或者按条计费。
+
+本文档主要介绍如何使用 QuecPython 短信功能,通过本文你将了解到 QuecPython 短信的设置及使用方法。
+
+#### 什么是PUD短信
+
+PDU(Protocol Data Unit)短信是一种短信传输的编码格式,常用于GSM网络和3G网络中。相对于常见的文本格式短信(也称为ASCII短信),PDU短信可以在同样长度的情况下携带更多的信息。PDU短信包含多个字段,例如消息中心号码、目标号码、短信编码方式、短信内容等。
+
+QuecPython 短信功能支持PDU短信的生成和解析。
+
+## 怎么使用短信功能
+
+### 硬件设计
+
+短信功能主要是实体SIM卡通过UE来进行交互,除前提条件模块需要组网成功外无需其他外围硬件支持。
+
+### 软件应用
+
+#### 已实现功能
+
+短信功能是移动通信网络中的一种基本服务,它可以实现文字、图片、音频等多种信息的快速传输和交流。
+
+在QuecPython中短信功能的接口主要在[sms](/../../../API_reference/zh/QuecPython类库/sms.html)中。
+
+下面是QuecPython短信功能的应用说明:
+
+ 1. 短信发送:用户可以通过UE,向其他用户发送文字信息,支持发送TEXT类型的消息和PDU类型的消息。
+ 2. 短信接收:用户可以接收来自其他用户或服务提供商发送的短信信息,包括广告信息、验证码等,支持PDU方式和TEXT方式。
+ 3. 短信存储:UE可以将短信保存在本地,方便用户进行查看和管理,包括设置短信存储位置,获取短信数量;查看发送、删除和接收的短信。
+ 4. 其它功能:如删除短信、PDU短信解析、短信中心号码配置、注册监听回调函数等
+
+#### 软件实现示例
+
+```Python
+>>> import sms
+# 发送TEXT短信
+>>> sms.sendTextMsg('18158626517', '这是一条中文测试短信!', 'UCS2')
+0
+>>> sms.sendTextMsg('18158626517', 'Hello, world.', 'GSM')
+0
+>>> sms.sendTextMsg('18158626517', '这是一条夹杂中文与英文的测试短信,hello world!', 'UCS2')
+0
+# 发送PDU短信
+>>> sms.sendPduMsg('18158626517', 'send pdu msg by GSM mode.', 'GSM')
+0
+>>> sms.sendPduMsg('18158626517', 'send pdu msg by UCS2 mode.', 'UCS2')
+0
+>>> sms.sendPduMsg('18158626517', '这是一条中文测试短信!通过PDU-UCS2模式', 'UCS2')
+0
+# 删除短信
+>>> sms.deleteMsg(2) #删除索引号为2的那一条短信
+0
+>>> sms.deleteMsg(1,4) #删除所有短信
+0
+# 获取短信数量
+>>> sms.getMsgNums() # 执行本行前,先发送一条短信到模块
+1
+# 查询短信存储位置
+>>> sms.getSaveLoc()
+(['SM', 2, 50], ['SM', 2, 50], ['SM', 2, 50])
+# 设置短信存储位置
+>>> sms.setSaveLoc('SM','ME','MT')
+0
+>>> sms.getSaveLoc()
+(['SM', 2, 50], ['ME', 14, 180], ['MT', 2, 50])
+>>> sms.sendPduMsg('+8618226172342', '123456789aa', 'GSM') # 自己给自己发送一条短信
+# 以TEXT方式获取短信内容
+>>> sms.searchTextMsg(0)
+('+8618226172342', '123456789aa', 22)
+# 以PDU方式获取短信内容
+>>> sms.searchPduMsg(0) # 下面PDU格式短信需要解码后才能正常显示短信内容
+'0891683110305005F0240BA19169256015F70000022141013044230B31D98C56B3DD70B97018'
+>>> sms.getPduLength(sms.searchPduMsg(0)) #注意,是获取PDU短信长度,不是上面字符串的长度
+20
+# 解析PDU短信内容
+>>>sms.decodePdu('0891683110305005F0240BA19169256015F70000022141013044230B31D98C56B3DD70B97018',20)
+('+8618226172342', '123456789aa', '2021-07-13 09:34:44', 40)
+# 获取短信中心号码
+>>> sms.getCenterAddr()
+'+8613800551500'
+# 注册监听收到短信回调函数
+def cb(args):
+ index = args[1]
+ storage = args[2]
+ print('New message! storage:{},index:{}'.format(storage, index))
+sms.setCallback(cb)
+```
+
diff --git a/docs/advanced_tutorial/zh/HeliosSDK/README.md b/docs/Application_guide/zh/network/socket/README.md
similarity index 100%
rename from docs/advanced_tutorial/zh/HeliosSDK/README.md
rename to docs/Application_guide/zh/network/socket/README.md
diff --git "a/docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/\345\244\232\347\272\277\347\250\213\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/Application_guide/zh/network/socket/tcp_client.md
similarity index 100%
rename from "docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/\345\244\232\347\272\277\347\250\213\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/Application_guide/zh/network/socket/tcp_client.md
diff --git "a/docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/\347\275\221\347\273\234\351\200\232\344\277\241\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/Application_guide/zh/network/socket/tcp_server.md
similarity index 100%
rename from "docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/\347\275\221\347\273\234\351\200\232\344\277\241\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/Application_guide/zh/network/socket/tcp_server.md
diff --git "a/docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/\350\223\235\347\211\231\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/Application_guide/zh/network/socket/udp.md
similarity index 100%
rename from "docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/\350\223\235\347\211\231\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/Application_guide/zh/network/socket/udp.md
diff --git "a/docs/advanced_tutorial/zh/QuecPython\345\272\224\347\224\250\346\241\206\346\236\266/README.md" b/docs/Application_guide/zh/peripherals/README.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/QuecPython\345\272\224\347\224\250\346\241\206\346\236\266/README.md"
rename to docs/Application_guide/zh/peripherals/README.md
diff --git a/docs/Application_guide/zh/sidebar.yaml b/docs/Application_guide/zh/sidebar.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..4ae6b91955dbace674ea47fde1dc75151670e31f
--- /dev/null
+++ b/docs/Application_guide/zh/sidebar.yaml
@@ -0,0 +1,9 @@
+items:
+- label: 音频
+ file: audio/README.md
+- label: 蓝牙
+ file: bluetooth/README.md
+- label: GNSS定位
+ file: gnss/README.md
+- label: WiFi扫描
+ file: wifiscan/README.md
\ No newline at end of file
diff --git a/docs/Application_guide/zh/wifiscan/README.md b/docs/Application_guide/zh/wifiscan/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..625a2aead014ee8f2acf8efa615747cdffd2dfed
--- /dev/null
+++ b/docs/Application_guide/zh/wifiscan/README.md
@@ -0,0 +1,12 @@
+# wifiScan应用指导说明
+
+本文描述了如何使用QuecPython的wifiScan模块的功能,包含相关API的使用以及一些注意事项。
+
+
+
+## wifiScan应用指导文档列表
+
+* [wifiScan功能应用指导](./wifiscan.md)
+
+
+
diff --git a/docs/Application_guide/zh/wifiscan/wifiscan.md b/docs/Application_guide/zh/wifiscan/wifiscan.md
new file mode 100644
index 0000000000000000000000000000000000000000..4cc374b60a0de2a500ead6e7b0aa7fb8fb6a87f7
--- /dev/null
+++ b/docs/Application_guide/zh/wifiscan/wifiscan.md
@@ -0,0 +1,240 @@
+# 1. 简介
+
+QuecPython提供了`wifiScan`功能模块来扫描周边的WiFi热点信息,包括WiFi热点的MAC地址和RSSI信号强度。
+
+> 本文档中示例代码前面有 `>>> `字符串的,表示在QuecPython的命令交互界面输入的代码。
+
+
+
+# 2. 使用说明
+
+`wifiScan`有同步扫描和异步扫描两种扫描方式。同步扫描是一直等待扫描结束才返回扫描结果,因此扫描接口会阻塞一段时间;而异步扫描则是将扫描结果通过回调来返回给用户,因此扫描接口本身并不会阻塞。具体使用哪一种扫描方式,取决于用户的实际需求。下面分别说明这两种扫描方式的用法。
+
+## 2.1 同步扫描
+
+如前述所,同步扫描接口会阻塞一段时间,具体阻塞时间的长短取决于扫描配置参数,因此并没有一个固定的时间值。如果用户允许相关线程中使用阻塞性质接口,则可按照如下步骤来使用`wifiScan`的同步扫描功能。
+
+### 2.1.1 使用步骤
+
+步骤1:确认状态
+
+先通过如下接口获取`wifiScan`的状态,确认是否已开启。返回值为`True`表示功能已开启,为`False`表示功能未开启。
+
+```python
+>>> wifiScan.getState()
+False
+```
+
+步骤2:打开`wifiScan`功能
+
+如果`wifiScan.getState()`返回`False`,则使用如下接口来开启`wifiScan`功能。
+
+```python
+>>> wifiScan.control(1)
+0
+```
+
+步骤3:扫描参数设置
+
+`wifiScan`模块提供了配置接口来设置扫描的相关参数,比如超时时间、扫描轮数、最大扫描热点数量以及扫描优先级。用户可根据需要来设置对应参数。这里设置超时时间为10s、扫描1次、最大扫描数量20个。由于优先级参数是可选参数,对于不支持的模组,我们可以不写该参数。
+
+```python
+>>> wifiScan.getCfgParam()
+(5, 1, 10, 0)
+>>> wifiScan.setCfgParam(10, 1, 20)
+0
+>>> wifiScan.getCfgParam()
+(10, 1, 20, 0)
+```
+
+
+
+> * 并不是所有的模组都支持优先级参数,上述示例是基于EC600U系列模组,不支持优先级参数,因此没有配置。不支持优先级参数的模组有:EC200U/EC600U/EG912U/EG915U/EC600G/EC800G系列。
+>
+> * 设置的扫描参数掉电不保存。
+
+
+
+步骤4:开始扫描
+
+```python
+>>> wifiScan.start()
+(8, [('34:CE:00:09:E5:A8', -38), ('50:D2:F5:B4:70:BF', -40), ('00:60:92:57:0A:F4', -47), ('00:03:7F:12:06:06', -53), ('F0:2F:74:2A:41:78', -54), ('00:03:7F:12:15:15', -68), ('08:4F:0A:05:22:8B', -73), ('08:4F:0A:05:22:8F', -76)])
+```
+
+
+
+### 2.1.2 示例代码
+
+```python
+"""
+本例程示范了如何使用wifiScan模块的同步扫描功能
+"""
+import utime
+import wifiScan
+
+
+def main():
+ isOpen = wifiScan.getState()
+ if not isOpen:
+ ret = wifiScan.control(1)
+ if ret == 0:
+ print('wifi scan 打开成功')
+ else:
+ print('wifi scan 打开失败')
+ return -1
+ else:
+ print('wifi scan 已经开启')
+
+ ret = wifiScan.setCfgParam(5, 1, 20, 0)
+ if ret == 0:
+ print('扫描参数设置成功')
+ else:
+ print('扫描参数配置出错')
+ return -1
+ curCfg = wifiScan.getCfgParam()
+ if curCfg != -1:
+ print('当前扫描参数为:')
+ print('超时时间:{}'.format(curCfg[0]))
+ print('扫描轮数:{}'.format(curCfg[1]))
+ print('最大扫描数量:{}'.format(curCfg[2]))
+ else:
+ print('获取扫描配置出错')
+ return -1
+ count = 0
+ while True:
+ count += 1
+ scanInfo = wifiScan.start()
+ if scanInfo != -1:
+ scanNums = scanInfo[0]
+ wifiInfo = scanInfo[1]
+ print('扫描到{}个热点:'.format(scanNums))
+ for i in wifiInfo:
+ print(i)
+ utime.sleep(2)
+ if count >= 3:
+ break
+ else:
+ print('扫描出错')
+ return -1
+
+ ret = wifiScan.control(0)
+ if ret == 0:
+ print('wifi scan 关闭成功')
+ return 0
+ else:
+ print('wifi scan 关闭失败')
+ return -1
+
+
+if __name__ == '__main__':
+ main()
+
+```
+
+
+
+## 2.2 异步扫描
+
+异步扫描方式在使用上和同步扫描区别不大,大部分步骤和同步扫描一致。
+
+### 2.2.1 使用步骤
+
+步骤1:确认状态
+
+步骤2:打开`wifiScan`功能
+
+步骤3:扫描参数设置
+
+步骤4:注册异步扫描回调函数
+
+步骤5:开始扫描
+
+
+
+### 2.2.2 示例代码
+
+关于如下例程有两点需要说明:
+
+* 例程中,`wifiscanCallback`回调中使用消息队列将扫描数据发到`main`中显示处理了。这是因为,在回调中,尽量只做一些耗时短的操作,一些耗时较长、处理较为复杂的操作一般放到其他任务中进行处理,不一定是放到主任务`main`中处理,也可以是其他子任务中。
+
+* 消息队列的`get`方法,在没有消息时,会一直阻塞。如果应用代码中某个线程中不能阻塞,则不应该在其中使用该方法。
+
+```python
+"""
+本例程示范了如何使用wifiScan模块的异步扫描功能
+"""
+import utime
+import wifiScan
+from queue import Queue
+
+msgq = Queue(5)
+
+
+def wifiscanCallback(args):
+ global msgq
+ msgq.put(args)
+
+
+def main():
+ global msgq
+ isOpen = wifiScan.getState()
+ if not isOpen:
+ ret = wifiScan.control(1)
+ if ret == 0:
+ print('wifi scan 打开成功')
+ else:
+ print('wifi scan 打开失败')
+ return -1
+ else:
+ print('wifi scan 已经开启')
+
+ ret = wifiScan.setCfgParam(5, 1, 20, 0)
+ if ret == 0:
+ print('扫描参数设置成功')
+ else:
+ print('扫描参数配置出错')
+ return -1
+ curCfg = wifiScan.getCfgParam()
+ if curCfg != -1:
+ print('当前扫描参数为:')
+ print('超时时间:{}'.format(curCfg[0]))
+ print('扫描轮数:{}'.format(curCfg[1]))
+ print('最大扫描数量:{}'.format(curCfg[2]))
+ else:
+ print('获取扫描配置出错')
+ return -1
+ # 注册回调函数
+ wifiScan.setCallback(wifiscanCallback)
+
+ count = 0
+ while True:
+ count += 1
+ if wifiScan.asyncStart() == 0:
+ scanInfo = msgq.get() # 没有消息时会阻塞在这里
+ scanNums = scanInfo[0]
+ wifiInfo = scanInfo[1]
+ print('扫描到{}个热点:'.format(scanNums))
+ for i in wifiInfo:
+ print(i)
+ utime.sleep(2)
+ if count >= 3:
+ break
+ else:
+ print('扫描出错')
+ return -1
+
+ ret = wifiScan.control(0)
+ if ret == 0:
+ print('wifi scan 关闭成功')
+ return 0
+ else:
+ print('wifi scan 关闭失败')
+ return -1
+
+
+if __name__ == '__main__':
+ main()
+
+```
+
diff --git a/docs/FAQ/zh/README.md b/docs/FAQ/zh/README.md
index 736487948a3a4bb8fbd428fa8e28a0f8954e344e..f8142f866fc0c6b126af0797054e938c4d8781c4 100644
--- a/docs/FAQ/zh/README.md
+++ b/docs/FAQ/zh/README.md
@@ -5,6 +5,6 @@ QuecPython-FAQ 是由QuecPython团队推出的针对常见问题的总结。在
||||
|---|---|---|
||||
-|[使用说明](./使用说明/README.md)|[开发环境与工具](./开发环境与工具/README.md)|[应用方案](./应用方案/README.md)|
-||||
-|[软件平台](./软件平台/README.md)|[硬件相关](./硬件相关/README.md)|[测试校验](./测试校验/README.md)|
+|[操作指引](./guide/README.md)|[开发环境与工具相关](./toos/README.md)|[软件相关](./software/README.md)|
+||||
+|[硬件功能相关](./hardware/README.md)|[网络功能相关](./network/README.md)|[量产和商业应用](./mp/README.md)|
diff --git "a/docs/FAQ/zh/\344\275\277\347\224\250\350\257\264\346\230\216/README.md" b/docs/FAQ/zh/guide/README.md
similarity index 98%
rename from "docs/FAQ/zh/\344\275\277\347\224\250\350\257\264\346\230\216/README.md"
rename to docs/FAQ/zh/guide/README.md
index 45e15d27ebddf03a62eab7e7e7c290a3c88c3aae..bed39b6d8e7388431d805c8b9ca24199521260c8 100644
--- "a/docs/FAQ/zh/\344\275\277\347\224\250\350\257\264\346\230\216/README.md"
+++ b/docs/FAQ/zh/guide/README.md
@@ -1,6 +1,6 @@
-# 使用说明
-
-本节为 QuecPython-FAQ 的使用说明。“问题查找”旨在帮助您快速了解该网站的搜索方法及分类框架,节省问题查找时间。同时,我们诚挚欢迎您对 QuecPython-FAQ 直接做出错误修复、新文档添加等优化贡献,具体操作流程可参见“文档贡献”。
-
-- [问题查找](./问题查找.md)
-- [文档贡献](./文档贡献.md)
+# 使用说明
+
+本节为 QuecPython-FAQ 的使用说明。“问题查找”旨在帮助您快速了解该网站的搜索方法及分类框架,节省问题查找时间。同时,我们诚挚欢迎您对 QuecPython-FAQ 直接做出错误修复、新文档添加等优化贡献,具体操作流程可参见“文档贡献”。
+
+- [问题查找](./问题查找.md)
+- [文档贡献](./文档贡献.md)
diff --git "a/docs/FAQ/zh/\344\275\277\347\224\250\350\257\264\346\230\216/\346\226\207\346\241\243\350\264\241\347\214\256.md" b/docs/FAQ/zh/guide/contribute.md
similarity index 97%
rename from "docs/FAQ/zh/\344\275\277\347\224\250\350\257\264\346\230\216/\346\226\207\346\241\243\350\264\241\347\214\256.md"
rename to docs/FAQ/zh/guide/contribute.md
index f36e40d1a8f35bdd9a725eda4b66972c526fea24..bccd93923920cdd541848b64dc42f8d13f0407fb 100644
--- "a/docs/FAQ/zh/\344\275\277\347\224\250\350\257\264\346\230\216/\346\226\207\346\241\243\350\264\241\347\214\256.md"
+++ b/docs/FAQ/zh/guide/contribute.md
@@ -1,178 +1,178 @@
-# 贡献指南
-
-我们欢迎对 QuecPython-FAQ 项目做出贡献,如修复错误,添加文档等。我们通过[Github Pull Requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests)接受贡献。
-
-## 提交流程
-
-这一节,是对`新增问题`和`修改问题`两个操作的流程简要介绍,流程中涉及的环节具体要求,请点击链接查看。
-
-针对 git 相关操作不做具体的介绍,可以查看[Git 相关教程](https://git-scm.com/book/zh/v2)。
-
-### 新增问题
-
-1. 在本地[新建分支](#new_branch),遵循[分支命名规范](#branch_name_rules);
-
-2. 在本地或者 web IDE 找到与问题类型对应的 `*.md` 文件,根据模板格式新增问题;
-
-3. 编辑完成后,打开预览界面查看显示结果是否符合预期,可以使用[本地编译环境](#local_compile_env)编译文档,并检查生成网页是否满足;
-
-4. 遵循[提交信息规范](#msg_commit_rules),推送到 github 后并提交 Pull Requests;
-
-5. 若满足上述预期,则[提交合并请求];
-
-6. 待文档所有讨论解决并成功提交 PR,即完成新增问题的流程。
-
-### 修改问题
-
-1. 在本地[新建分支](#new_branch),遵循[分支命名规范](#branch_name_rules);
-
-2. 在本地或者 web IDE 找到与问题类型对应的 `*.rst` 文件,修改期望修改的问题;
-
-3. 编辑完成后,打开预览界面查看显示结果是否符合预期,可以使用[本地编译环境](#local_compile_env)编译文档,并检查生成网页是否满足;
-
-4. 遵循[提交信息规范](#msg_commit_rules),推送到 github 后并提交 Pull Requests;
-
-5. 若满足上述预期,则[提交合并请求];
-
-6. 待文档所有讨论解决并成功提交 PR,即完成修改的流程
-
-## 新建分支
-
-新建分支都基于**主分支** 进行;操作时,请留意当前所在分支是否为你期望合入的分支。
-
-操作示例:
-
-```bash
-git status # 查看当前分支
-git checkout -b add/API-reference_machine_pin # 用于新增问题 "API-reference_machine pin"
-```
-
-## 分支命名规范
-
-- 新增问题:`add/API-reference_{q&a}`,`{q&a}` 使用文件名的英语简要,例如新增 `API-reference_machine pin` 问题,分支名:`add/API-reference_machine_pin`。
-
-- 修改问题:`mod/API-reference_{q&a}`,`{q&a}` 使用文件名的英语简要,例如修改 `API-reference_machine pin` 问题,分支名:`mod/API-reference_machine_pin`。
-
-
-## 问题编辑规范
-
-请按照以下格式规范规则添加或更新 Q&A:
-
-**通用规则:**
-
-- 添加新的 Q&A 时,切记将问题作为三级标题,并添加数字编号。
-
-- 示例:`### 1. CAT1下行带宽是多少?`
-
-**问题格式:**
-
-- 须简洁清晰地描述问题,如:
- - QPYcom烧录固件失败。**(问题不清晰)**
- - QPYcom烧录固件失败,如何解决?**(清晰)**
-
-- 问题不宜过长。如描述太多,可精炼出主要的问题作为标题,并在回答的正文中详细描述问题背景及细节。
-
-**答案格式:**
-
-- 如正文中需引用代码,请使用 code 语法将其与文字隔开。
-
-- 如某个问题的回答仅包含一句话,则使用正常段落书写即可,无需使用列表。
-
-- 需要列举多个条目或排列顺序时,请使用列表:
-
- - 数字列表:有一定顺序(如操作步骤),或后文中需引用列表中的某个条目。
-
- - 项目符号列表:无特定顺序。
-
-- 列表前需有介绍性文字,说明下述列表的含义或目的,且以冒号“:”结尾。
-
-- 如两项条目是互为选择的关系,应使用项目符号列表罗列(非数字列表),并在段前介绍性文字中说明这二者的关系。
-
-- 正文中(不论列表还是段落),每一行之前需空两格。
-
-- 如某项条目后需跟注释或说明性文字,应缩进该注释,使其成为子条目。
-
-## 本地编译环境
-
-- 测试验证环境使用 Windows10及以上版本、Ubuntu 或 Debian 系统,配置 python 环境为 `3.6`及以上版本。
-- 推荐使用 python 虚拟环境,或者 docker 环境。
-
-```bash
-# 安装 python3 与虚拟环境(Windows系统直接双击 python3 exe 安装包即可)
-
-sudo apt-get install python3 python3-pip python3-venv
-
-# 创建虚拟环境(Windows系统下的路径为 path\to\.pyenv3,path/to意为真实的路径)
-
-python3 -m venv path/to/.pyenv3
-
-# 激活虚拟环境(Windows系统需在工作目录下执行 path\to\.pyenv3\Scripts\activate.bat)
-
-source path/to/.pyenv3/bin/activate
-
-# 安装teedoc
-
-pip3 install teedoc
-
-# 获取源文件
-
-git clone https://gitee.com/qpy-doc-center/teedoc_with_qpydoc.git
-
-# 安装插件
-
-cd teedoc_with_qpydoc
-teedoc install
-
-# 编译并启动服务(追加 -s 选项,用于启动服务)
-./build.sh -s
-```
-
-## 提交信息规范
-
-在分支上添加提交信息,以说明添加/修改/删除问题功能。每个提交都有一条消息,例如:
-
-```
-API-reference_machine_pin: add 'value' method for machine.Pin class.
-
-1. add 'value' method for machine.Pin class.
-```
-
-提交信息的第一行应类似于“问题类别:添加/修复/删除/更改内容”。第一行以提交要更改的文件名的名称开头。例如:
-
-`API-reference_machine_pin: add 'value' method for machine.Pin class.`
-
-要添加有关该提交的更多详细信息,请将其放在第一行之后的提交消息中。
-
-一个好的 git 提交消息讲述了一个为什么发生更改的故事,因此,阅读提交日志的人可以了解项目的开发。编写良好的提交信息现在看来似乎是在浪费时间,但是在将来尝试了解某些原因更改时,这对您和您的同事很有用(对我们的客户也有用)。
-
-## 提交合并请求
-
-一旦完成修改就可以对分支进行第一次提交,如果您需要进行更多的更改,请进行更多提交。完成您对该分支的所有提交后,提交合并请求。
-
-我们使用 github 合并请求功能将分支合并到主分支中,步骤:
-
-- 将您的分支推送到 github 仓库;
-
-- 转到 teedoc_with_qpydoc,然后单击 “New pull request”;
-
-- 选择您刚创建准备合并的分支,然后填写“合并请求”详细信息。
-
-### 提交合并请求相关规范
-
-- Title 要求:
-
- `add: 简要描述`
-
-- Description 要求:
-
- `分点描述该合并修改的信息。`
-
-- 示例:
-
- Title:
-
- `API-reference_machine_pin: add 'value' method for machine.Pin class.`
-
- Description:
-
- `1. add 'value' method for machine.Pin class.`
+# 贡献指南
+
+我们欢迎对 QuecPython-FAQ 项目做出贡献,如修复错误,添加文档等。我们通过[Github Pull Requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests)接受贡献。
+
+## 提交流程
+
+这一节,是对`新增问题`和`修改问题`两个操作的流程简要介绍,流程中涉及的环节具体要求,请点击链接查看。
+
+针对 git 相关操作不做具体的介绍,可以查看[Git 相关教程](https://git-scm.com/book/zh/v2)。
+
+### 新增问题
+
+1. 在本地[新建分支](#new_branch),遵循[分支命名规范](#branch_name_rules);
+
+2. 在本地或者 web IDE 找到与问题类型对应的 `*.md` 文件,根据模板格式新增问题;
+
+3. 编辑完成后,打开预览界面查看显示结果是否符合预期,可以使用[本地编译环境](#local_compile_env)编译文档,并检查生成网页是否满足;
+
+4. 遵循[提交信息规范](#msg_commit_rules),推送到 github 后并提交 Pull Requests;
+
+5. 若满足上述预期,则[提交合并请求];
+
+6. 待文档所有讨论解决并成功提交 PR,即完成新增问题的流程。
+
+### 修改问题
+
+1. 在本地[新建分支](#new_branch),遵循[分支命名规范](#branch_name_rules);
+
+2. 在本地或者 web IDE 找到与问题类型对应的 `*.rst` 文件,修改期望修改的问题;
+
+3. 编辑完成后,打开预览界面查看显示结果是否符合预期,可以使用[本地编译环境](#local_compile_env)编译文档,并检查生成网页是否满足;
+
+4. 遵循[提交信息规范](#msg_commit_rules),推送到 github 后并提交 Pull Requests;
+
+5. 若满足上述预期,则[提交合并请求];
+
+6. 待文档所有讨论解决并成功提交 PR,即完成修改的流程
+
+## 新建分支
+
+新建分支都基于**主分支** 进行;操作时,请留意当前所在分支是否为你期望合入的分支。
+
+操作示例:
+
+```bash
+git status # 查看当前分支
+git checkout -b add/API-reference_machine_pin # 用于新增问题 "API-reference_machine pin"
+```
+
+## 分支命名规范
+
+- 新增问题:`add/API-reference_{q&a}`,`{q&a}` 使用文件名的英语简要,例如新增 `API-reference_machine pin` 问题,分支名:`add/API-reference_machine_pin`。
+
+- 修改问题:`mod/API-reference_{q&a}`,`{q&a}` 使用文件名的英语简要,例如修改 `API-reference_machine pin` 问题,分支名:`mod/API-reference_machine_pin`。
+
+
+## 问题编辑规范
+
+请按照以下格式规范规则添加或更新 Q&A:
+
+**通用规则:**
+
+- 添加新的 Q&A 时,切记将问题作为三级标题,并添加数字编号。
+
+- 示例:`### 1. CAT1下行带宽是多少?`
+
+**问题格式:**
+
+- 须简洁清晰地描述问题,如:
+ - QPYcom烧录固件失败。**(问题不清晰)**
+ - QPYcom烧录固件失败,如何解决?**(清晰)**
+
+- 问题不宜过长。如描述太多,可精炼出主要的问题作为标题,并在回答的正文中详细描述问题背景及细节。
+
+**答案格式:**
+
+- 如正文中需引用代码,请使用 code 语法将其与文字隔开。
+
+- 如某个问题的回答仅包含一句话,则使用正常段落书写即可,无需使用列表。
+
+- 需要列举多个条目或排列顺序时,请使用列表:
+
+ - 数字列表:有一定顺序(如操作步骤),或后文中需引用列表中的某个条目。
+
+ - 项目符号列表:无特定顺序。
+
+- 列表前需有介绍性文字,说明下述列表的含义或目的,且以冒号“:”结尾。
+
+- 如两项条目是互为选择的关系,应使用项目符号列表罗列(非数字列表),并在段前介绍性文字中说明这二者的关系。
+
+- 正文中(不论列表还是段落),每一行之前需空两格。
+
+- 如某项条目后需跟注释或说明性文字,应缩进该注释,使其成为子条目。
+
+## 本地编译环境
+
+- 测试验证环境使用 Windows10及以上版本、Ubuntu 或 Debian 系统,配置 python 环境为 `3.6`及以上版本。
+- 推荐使用 python 虚拟环境,或者 docker 环境。
+
+```bash
+# 安装 python3 与虚拟环境(Windows系统直接双击 python3 exe 安装包即可)
+
+sudo apt-get install python3 python3-pip python3-venv
+
+# 创建虚拟环境(Windows系统下的路径为 path\to\.pyenv3,path/to意为真实的路径)
+
+python3 -m venv path/to/.pyenv3
+
+# 激活虚拟环境(Windows系统需在工作目录下执行 path\to\.pyenv3\Scripts\activate.bat)
+
+source path/to/.pyenv3/bin/activate
+
+# 安装teedoc
+
+pip3 install teedoc
+
+# 获取源文件
+
+git clone https://gitee.com/qpy-doc-center/teedoc_with_qpydoc.git
+
+# 安装插件
+
+cd teedoc_with_qpydoc
+teedoc install
+
+# 编译并启动服务(追加 -s 选项,用于启动服务)
+./build.sh -s
+```
+
+## 提交信息规范
+
+在分支上添加提交信息,以说明添加/修改/删除问题功能。每个提交都有一条消息,例如:
+
+```
+API-reference_machine_pin: add 'value' method for machine.Pin class.
+
+1. add 'value' method for machine.Pin class.
+```
+
+提交信息的第一行应类似于“问题类别:添加/修复/删除/更改内容”。第一行以提交要更改的文件名的名称开头。例如:
+
+`API-reference_machine_pin: add 'value' method for machine.Pin class.`
+
+要添加有关该提交的更多详细信息,请将其放在第一行之后的提交消息中。
+
+一个好的 git 提交消息讲述了一个为什么发生更改的故事,因此,阅读提交日志的人可以了解项目的开发。编写良好的提交信息现在看来似乎是在浪费时间,但是在将来尝试了解某些原因更改时,这对您和您的同事很有用(对我们的客户也有用)。
+
+## 提交合并请求
+
+一旦完成修改就可以对分支进行第一次提交,如果您需要进行更多的更改,请进行更多提交。完成您对该分支的所有提交后,提交合并请求。
+
+我们使用 github 合并请求功能将分支合并到主分支中,步骤:
+
+- 将您的分支推送到 github 仓库;
+
+- 转到 teedoc_with_qpydoc,然后单击 “New pull request”;
+
+- 选择您刚创建准备合并的分支,然后填写“合并请求”详细信息。
+
+### 提交合并请求相关规范
+
+- Title 要求:
+
+ `add: 简要描述`
+
+- Description 要求:
+
+ `分点描述该合并修改的信息。`
+
+- 示例:
+
+ Title:
+
+ `API-reference_machine_pin: add 'value' method for machine.Pin class.`
+
+ Description:
+
+ `1. add 'value' method for machine.Pin class.`
diff --git "a/docs/FAQ/zh/\344\275\277\347\224\250\350\257\264\346\230\216/\351\227\256\351\242\230\346\237\245\346\211\276.md" b/docs/FAQ/zh/guide/use-search.md
similarity index 97%
rename from "docs/FAQ/zh/\344\275\277\347\224\250\350\257\264\346\230\216/\351\227\256\351\242\230\346\237\245\346\211\276.md"
rename to docs/FAQ/zh/guide/use-search.md
index 2a36bbaa24927b7080a38e839dfbd104efeb714f..5e3fadb5ea074b1967e4b3acb45091d9594042b3 100644
--- "a/docs/FAQ/zh/\344\275\277\347\224\250\350\257\264\346\230\216/\351\227\256\351\242\230\346\237\245\346\211\276.md"
+++ b/docs/FAQ/zh/guide/use-search.md
@@ -1,24 +1,24 @@
-# 问题查找
-
-此指南目前有以下两个部分:
-
-- 搜索问题技巧
-- 问题分类框架
-
-## 搜索问题技巧
-
-搜索框支持多个关键词使用空格分隔,将问题中的关键词提取出来并搜索它们,此时搜索结果会得到最匹配的结果。
-
-比如问题为:`CAT1的下行带宽是多少?`
-
-此时搜索:`CAT1`、`下行带宽`等关键字为宜。
-
-## 问题分类框架
-
-在掌握上述`搜索问题技巧`后,可以利用 ESP-FAQ 已经做好的分类来提取想搜索问题里的关键词并搜索。以下是此网站的框架:
-
-- [开发环境与工具](../开发环境与工具/README.md)
-- [应用方案](../应用方案/README.md)
-- [软件平台](../软件平台/README.md)
-- [硬件相关](../硬件相关/README.md)
-- [测试校验](../测试校验/README.md)
+# 问题查找
+
+此指南目前有以下两个部分:
+
+- 搜索问题技巧
+- 问题分类框架
+
+## 搜索问题技巧
+
+搜索框支持多个关键词使用空格分隔,将问题中的关键词提取出来并搜索它们,此时搜索结果会得到最匹配的结果。
+
+比如问题为:`CAT1的下行带宽是多少?`
+
+此时搜索:`CAT1`、`下行带宽`等关键字为宜。
+
+## 问题分类框架
+
+在掌握上述`搜索问题技巧`后,可以利用 ESP-FAQ 已经做好的分类来提取想搜索问题里的关键词并搜索。以下是此网站的框架:
+
+- [开发环境与工具](../开发环境与工具/README.md)
+- [应用方案](../应用方案/README.md)
+- [软件平台](../软件平台/README.md)
+- [硬件相关](../硬件相关/README.md)
+- [测试校验](../测试校验/README.md)
diff --git "a/docs/advanced_tutorial/zh/\344\275\216\345\212\237\350\200\227\345\272\224\347\224\250\345\274\200\345\217\221/README.md" b/docs/FAQ/zh/hardware/README.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\344\275\216\345\212\237\350\200\227\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
rename to docs/FAQ/zh/hardware/README.md
diff --git "a/docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/BSP\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md" b/docs/FAQ/zh/hardware/bsp.md
similarity index 91%
rename from "docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/BSP\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md"
rename to docs/FAQ/zh/hardware/bsp.md
index 58df1ca66afb33c6733ca1fa11c1566f06bdb77b..310fe95a2979bbe924c8de37577cbb7eb8ac2a11 100644
--- "a/docs/FAQ/zh/\350\275\257\344\273\266\345\271\263\345\217\260/BSP\345\274\200\345\217\221\345\270\270\350\247\201\351\227\256\351\242\230.md"
+++ b/docs/FAQ/zh/hardware/bsp.md
@@ -1,9 +1,9 @@
-# BSP开发常见问题
-
-### **问题1描述**
-
-问题1答案
-
-### **问题2描述**
-
-问题2答案
+# BSP开发常见问题
+
+### **问题1描述**
+
+问题1答案
+
+### **问题2描述**
+
+问题2答案
diff --git "a/docs/advanced_tutorial/zh/QuecPython\345\272\224\347\224\250\346\241\206\346\236\266/QuecPython\345\272\224\347\224\250\346\241\206\346\236\266-EventMesh.md" b/docs/FAQ/zh/hardware/bt.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/QuecPython\345\272\224\347\224\250\346\241\206\346\236\266/QuecPython\345\272\224\347\224\250\346\241\206\346\236\266-EventMesh.md"
rename to docs/FAQ/zh/hardware/bt.md
diff --git "a/docs/advanced_tutorial/zh/QuecPython\345\272\224\347\224\250\346\241\206\346\236\266/QuecPython\345\272\224\347\224\250\346\241\206\346\236\266-HeliosService.md" b/docs/FAQ/zh/hardware/external.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/QuecPython\345\272\224\347\224\250\346\241\206\346\236\266/QuecPython\345\272\224\347\224\250\346\241\206\346\236\266-HeliosService.md"
rename to docs/FAQ/zh/hardware/external.md
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/Cloud.xxx.png" b/docs/FAQ/zh/hardware/multimedia.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/Cloud.xxx.png"
rename to docs/FAQ/zh/hardware/multimedia.md
diff --git "a/docs/advanced_tutorial/zh/media/\350\223\235\347\211\231\345\274\200\345\217\221/BT.xxx.png" b/docs/FAQ/zh/hardware/pm.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/media/\350\223\235\347\211\231\345\274\200\345\217\221/BT.xxx.png"
rename to docs/FAQ/zh/hardware/pm.md
diff --git "a/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245-\345\215\216\344\270\272\344\272\221.md" b/docs/FAQ/zh/hardware/ui.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245-\345\215\216\344\270\272\344\272\221.md"
rename to docs/FAQ/zh/hardware/ui.md
diff --git "a/docs/advanced_tutorial/zh/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221/README.md" b/docs/FAQ/zh/mp/README.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221/README.md"
rename to docs/FAQ/zh/mp/README.md
diff --git "a/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245-\347\247\273\350\277\234\344\272\221.md" b/docs/FAQ/zh/mp/hd-design.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245-\347\247\273\350\277\234\344\272\221.md"
rename to docs/FAQ/zh/mp/hd-design.md
diff --git "a/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245-\350\205\276\350\256\257\344\272\221.md" b/docs/FAQ/zh/mp/mp-tools.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245-\350\205\276\350\256\257\344\272\221.md"
rename to docs/FAQ/zh/mp/mp-tools.md
diff --git "a/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245-\351\230\277\351\207\214\344\272\221.md" b/docs/FAQ/zh/mp/solution.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245-\351\230\277\351\207\214\344\272\221.md"
rename to docs/FAQ/zh/mp/solution.md
diff --git "a/docs/advanced_tutorial/zh/\345\256\232\344\275\215\345\272\224\347\224\250\345\274\200\345\217\221/README.md" b/docs/FAQ/zh/network/README.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\345\256\232\344\275\215\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
rename to docs/FAQ/zh/network/README.md
diff --git "a/docs/advanced_tutorial/zh/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221-Demo-\346\211\213\350\241\250.md" b/docs/FAQ/zh/network/basics.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221-Demo-\346\211\213\350\241\250.md"
rename to docs/FAQ/zh/network/basics.md
diff --git "a/docs/advanced_tutorial/zh/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221-Demo-\350\264\252\345\220\203\350\233\207.md" b/docs/FAQ/zh/network/cloud-platforms.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221-Demo-\350\264\252\345\220\203\350\233\207.md"
rename to docs/FAQ/zh/network/cloud-platforms.md
diff --git "a/docs/advanced_tutorial/zh/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221-LVGL\345\237\272\347\241\200\346\216\247\344\273\266\345\272\224\347\224\250.md" b/docs/FAQ/zh/network/connections.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221-LVGL\345\237\272\347\241\200\346\216\247\344\273\266\345\272\224\347\224\250.md"
rename to docs/FAQ/zh/network/connections.md
diff --git "a/docs/advanced_tutorial/zh/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221-LVGL\346\246\202\350\277\260.md" b/docs/FAQ/zh/network/voicecall-and-sms.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221/\345\233\276\345\275\242\345\214\226\347\225\214\351\235\242\345\274\200\345\217\221-LVGL\346\246\202\350\277\260.md"
rename to docs/FAQ/zh/network/voicecall-and-sms.md
diff --git a/docs/FAQ/zh/sidebar.yaml b/docs/FAQ/zh/sidebar.yaml
index 09b9d387e57e6c4c4aa9abc25e343156c36c2c69..cd4ad382b6e26d6106bb4eadb8e47693a9b31afe 100644
--- a/docs/FAQ/zh/sidebar.yaml
+++ b/docs/FAQ/zh/sidebar.yaml
@@ -1,45 +1,59 @@
items:
-- label: 使用说明
- file: 使用说明/README.md
+ - label: 操作指引
+ file: guide/README.md
items:
- - label: 问题查找
- file: 使用说明/问题查找.md
- - label: 文档贡献
- file: 使用说明/文档贡献.md
-- label: 开发环境与工具
- file: 开发环境与工具/README.md
+ - label: 搜索功能用法
+ file: guide/use-search.md
+ - label: 参与文档贡献
+ file: guide/contribute.md
+ - label: 开发环境和工具相关
+ file: tools/README.md
items:
- - label: 开发工具使用常见问题
- file: 开发环境与工具/开发工具使用常见问题.md
-- label: 应用方案
- file: 应用方案/README.md
+ - label: QPYcom
+ file: tools/QPYcom.md
+ - label: Qflash
+ file: tools/qflash.md
+ - label: 软件相关
+ file: software/README.md
items:
- - label: EventMesh框架常见问题
- file: 应用方案/EventMesh框架常见问题.md
- - label: sys_bus框架常见问题
- file: 应用方案/sys_bus框架常见问题.md
- - label: 云平台对接常见问题
- file: 应用方案/云平台对接常见问题.md
- - label: 解决方案常见问题
- file: 应用方案/解决方案常见问题.md
-- label: 软件平台
- file: 软件平台/README.md
+ - label: 系统基础功能常见问题
+ file: software/os.md
+ - label: 多线程开发常见问题
+ file: software/threads.md
+ - label: 编程框架
+ file: software/frameworks.md
+ - label: 硬件功能相关
+ file: hardware/README.md
items:
- - label: Python基础常见问题
- file: 软件平台/Python基础常见问题.md
- - label: 多线程开发常见问题
- file: 软件平台/多线程开发常见问题.md
- - label: BSP开发常见问题
- file: 软件平台/BSP开发常见问题.md
- - label: 外设应用开发常见问题
- file: 软件平台/外设应用开发常见问题.md
- - label: 网络通信开发常见问题
- file: 软件平台/网络通信开发常见问题.md
- - label: 蓝牙开发常见问题
- file: 软件平台/蓝牙开发常见问题.md
- - label: 图形化界面开发常见问题
- file: 软件平台/图形化界面开发常见问题.md
-- label: 硬件相关
- file: 硬件相关/README.md
-- label: 测试校验
- file: 测试校验/README.md
+ - label: BSP功能常见问题
+ file: hardware/bsp.md
+ - label: 多媒体功能常见问题
+ file: hardware/multimedia.md
+ - label: 图形界面功能常见问题
+ file: hardware/ui.md
+ - label: 蓝牙功能常见问题
+ file: hardware/bt.md
+ - label: 功耗常见问题
+ file: hardware/pm.md
+ - label: 外挂组件相关常见问题
+ file: hardware/external.md
+ - label: 网络功能相关
+ file: network/README.md
+ items:
+ - label: 注网拨号常见问题
+ file: network/basics.md
+ - label: 语音通话和短信常见问题
+ file: network/voicecall-and-sms.md
+ - label: 基础连接常见问题
+ file: network/connections.md
+ - label: 云平台相关常见问题
+ file: network/cloud-platforms.md
+ - label: 量产和商业应用
+ file: mp/README.md
+ items:
+ - label: 量产工具
+ file: mp/mp-tools.md
+ - label: 解决方案
+ file: mp/solution.md
+ - label: 硬件设计和验证
+ file: mp/hd-design.md
diff --git "a/docs/advanced_tutorial/zh/\350\223\235\347\211\231\345\274\200\345\217\221/README.md" b/docs/FAQ/zh/software/README.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\350\223\235\347\211\231\345\274\200\345\217\221/README.md"
rename to docs/FAQ/zh/software/README.md
diff --git "a/docs/advanced_tutorial/zh/\350\223\235\347\211\231\345\274\200\345\217\221/\344\275\216\345\212\237\350\200\227\350\223\235\347\211\231\345\274\200\345\217\221/\344\275\216\345\212\237\350\200\227\350\223\235\347\211\231\345\274\200\345\217\221-Master.md" b/docs/FAQ/zh/software/frameworks.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\350\223\235\347\211\231\345\274\200\345\217\221/\344\275\216\345\212\237\350\200\227\350\223\235\347\211\231\345\274\200\345\217\221/\344\275\216\345\212\237\350\200\227\350\223\235\347\211\231\345\274\200\345\217\221-Master.md"
rename to docs/FAQ/zh/software/frameworks.md
diff --git "a/docs/advanced_tutorial/zh/\350\223\235\347\211\231\345\274\200\345\217\221/\344\275\216\345\212\237\350\200\227\350\223\235\347\211\231\345\274\200\345\217\221/\344\275\216\345\212\237\350\200\227\350\223\235\347\211\231\345\274\200\345\217\221-Slave.md" b/docs/FAQ/zh/software/os.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\350\223\235\347\211\231\345\274\200\345\217\221/\344\275\216\345\212\237\350\200\227\350\223\235\347\211\231\345\274\200\345\217\221/\344\275\216\345\212\237\350\200\227\350\223\235\347\211\231\345\274\200\345\217\221-Slave.md"
rename to docs/FAQ/zh/software/os.md
diff --git "a/docs/advanced_tutorial/zh/\350\223\235\347\211\231\345\274\200\345\217\221/\347\273\217\345\205\270\350\223\235\347\211\231\345\274\200\345\217\221/\347\273\217\345\205\270\350\223\235\347\211\231\345\274\200\345\217\221-Master.md" b/docs/FAQ/zh/software/threads.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\350\223\235\347\211\231\345\274\200\345\217\221/\347\273\217\345\205\270\350\223\235\347\211\231\345\274\200\345\217\221/\347\273\217\345\205\270\350\223\235\347\211\231\345\274\200\345\217\221-Master.md"
rename to docs/FAQ/zh/software/threads.md
diff --git "a/docs/advanced_tutorial/zh/\350\223\235\347\211\231\345\274\200\345\217\221/\347\273\217\345\205\270\350\223\235\347\211\231\345\274\200\345\217\221/\347\273\217\345\205\270\350\223\235\347\211\231\345\274\200\345\217\221-Slave.md" b/docs/FAQ/zh/tools/QPYcom.md
similarity index 100%
rename from "docs/advanced_tutorial/zh/\350\223\235\347\211\231\345\274\200\345\217\221/\347\273\217\345\205\270\350\223\235\347\211\231\345\274\200\345\217\221/\347\273\217\345\205\270\350\223\235\347\211\231\345\274\200\345\217\221-Slave.md"
rename to docs/FAQ/zh/tools/QPYcom.md
diff --git "a/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/README.md" b/docs/FAQ/zh/tools/README.md
similarity index 100%
rename from "docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
rename to docs/FAQ/zh/tools/README.md
diff --git "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-UART\345\272\224\347\224\250\345\274\200\345\217\221.md" b/docs/FAQ/zh/tools/qflash.md
similarity index 100%
rename from "docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-UART\345\272\224\347\224\250\345\274\200\345\217\221.md"
rename to docs/FAQ/zh/tools/qflash.md
diff --git a/docs/development_guide/zh/Note.md b/docs/Getting_started/zh/Note.md
similarity index 100%
rename from docs/development_guide/zh/Note.md
rename to docs/Getting_started/zh/Note.md
diff --git a/docs/Getting_started/zh/README.md b/docs/Getting_started/zh/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..5a6a0fa08fa421ab8ebaa360d3fecfa8697a010b
--- /dev/null
+++ b/docs/Getting_started/zh/README.md
@@ -0,0 +1,222 @@
+# 目录
+
+
+ 1: 背景知识
+
+- [1.1: 物联网和低代码开发](./background/iot-and-low-code.md)
+
+- [1.2: 无线通信模块简介](./background/wireless-modules.md)
+
+- [1.3: QuecPython 简介](./background/about-qpy.md)
+
+- [1.4: 硬件选型](./background/selection-guide.md)
+
+
+
+
+ 2: 快速入门
+
+- [2.1: 准备工作](./quick-start/preparation.md)
+
+- [2.2: 上电与连接](./quick-start/boot-and-connect.md)
+
+- [2.3: 固件烧录](./quick-start/burn-firmware.md)
+
+- [2.4: QPYcom 基本操作](./quick-start/qpycom-basic.md)
+
+
+
+
+ 3: MicroPython 语言基础
+
+- [3.1: 基本语法规则](./mpy-syntax/rules.md)
+
+- [3.2: 变量和运算](./mpy-syntax/vars-and-ops.md)
+
+- [3.3: 程序流程控制](./mpy-syntax/flow-control.md)
+
+- [3.4: 常用容器类型](./mpy-syntax/containers.md)
+
+- [3.5: 函数](./mpy-syntax/functions.md)
+
+
+
+
+ 4: QuecPython 系统功能
+
+- [4.1: 系统信息](./os/os-info.md)
+
+- [4.2: 日志功能](./os/log.md)
+
+- [4.3: 文件管理](./os/files.md)
+
+- [4.4: 时间功能](./os/time.md)
+
+- [4.5: 数据格式转换](./os/data-formattng.md)
+
+- [4.6: 电源管理](./os/power.md)
+
+- [4.7: 内存管理](./os/ram.md)
+
+- [4.8: 多线程](./os/threads.md)
+
+
+
+
+ 5: QuecPython 硬件基础功能
+
+- [5.1: GPIO](./hardware-basic/gpio.md)
+
+- [5.2: 外部中断](./hardware-basic/extint.md)
+
+- [5.3: 串口](./hardware-basic/uart.md)
+
+- [5.4: I2C](./hardware-basic/i2c.md)
+
+- [5.5: SPI](./hardware-basic/spi.md)
+
+- [5.6: ADC](./hardware-basic/adc.md)
+
+- [5.7: Timer](./hardware-basic/timer.md)
+
+- [5.8: PWM](./hardware-basic/pwm.md)
+
+- [5.9: 看门狗](./hardware-basic/wdt.md)
+
+
+
+
+ 6: QuecPython 物联网基础功能
+
+- [6.1: 天线、SIM 卡和网络注册](./iot-basic/preparation.md)
+
+- [6.2: TCP 与 UDP 通信](./iot-basic/tcp-and-udp.md)
+
+- [6.3: HTTP 通信](./iot-basic/http.md)
+
+- [6.4: MQTT 通信](./iot-basic/mqtt.md)
+
+- [6.5: WebSocket 通信](./iot-basic/websocket.md)
+
+- [6.6: 通信异常处理](./iot-basic/exceptions.md)
+
+
+
+
+ 7: QuecPython 云平台功能
+
+- [7.1: 移远云](./clouds/quectel.md)
+
+- [7.2: 阿里云](./clouds/aliyun.md)
+
+- [7.3: 腾讯云](./clouds/tencent.md)
+
+- [7.4: 华为云](./clouds/huawei.md)
+
+- [7.5: 亚马逊云](./clouds/aws.md)
+
+- [7.6: 移动云](./clouds/onenet.md)
+
+- [7.7: 电信云](./clouds/ctyun.md)
+
+
+
+
+ 8: QuecPython 硬件高级功能
+
+- [8.1: 屏幕显示](./hardware-advanced/screen.md)
+
+- [8.2: LVGL](./hardware-advanced/lvgl.md)
+
+- [8.3: 摄像头](./hardware-advanced/camera.md)
+
+- [8.4: 低功耗](./hardware-advanced/pm.md)
+
+- [8.5: 音频和 TTS](./hardware-advanced/audio.md)
+
+- [8.6: 外接存储](./hardware-advanced/ext-storage.md)
+
+- [8.7: 外接以太网](./hardware-advanced/ext-ethernet.md)
+
+- [8.8: 矩阵键盘](./hardware-advanced/matrix-keypad.md)
+
+- [8.9: BT 和 BLE](./hardware-advanced/bt-and-ble.md)
+
+- [8.10: USB 网卡](./hardware-advanced/usb-wireless-card.md)
+
+- [8.11: 外接 WiFi](./hardware-advanced/ext-wifi.md)
+
+
+
+
+ 9: QuecPython 物联网高级功能
+
+- [9.1: APN 和数据拨号](./iot-advanced/apn-and-datacall.md)
+
+- [9.2: 语音通话](./iot-advanced/voicecall.md)
+
+- [9.3: 短信](./iot-advanced/sms.md)
+
+- [9.4: 定位](./iot-advanced/location.md)
+
+- [9.5: OTA 升级](./iot-advanced/ota.md)
+
+- [9.6: AES-128 加解密](./iot-advanced/aes128.md)
+
+
+
+
+ 10: 其他开发资源
+
+- [10.1: QuecPython 编程框架](./other-resources/programming-framework.md)
+
+- [10.2: HeliosSDK](./other-resources/helios-sdk.md)
+
+
+
+
+ 11: 量产相关
+
+- [11.1: 脚本加密和固件打包](./mass-production/encryption-and-packaging.md)
+
+- [11.2: 备份分区和数据安全区的使用](./mass-production/data-backup.md)
+
+- [11.3: 量产工具使用](./mass-production/production-tools.md)
+
+- [11.4: 产测工具使用](./mass-production/testing-tools.md)
+
+- [11.5: 硬件设计和生产注意事项](./mass-production/considerations.md)
+
+
+
+
+ 12: 产品方案介绍
+
+- [12.1: DTU](./solutions/dtu.md)
+
+- [12.2: 定位器](./solutions/tracker.md)
+
+- [12.3: 对讲机](./solutions/poc.md)
+
+- [12.4: 电表](./solutions/smart-meter.md)
+
+- [12.5: 云喇叭](./solutions/payment-speaker.md)
+
+- [12.6: 门磁开关](./solutions/door-sensor.md)
+
+- [12.7: 学生卡](./solutions/student-card.md)
+
+- [12.8: 充电桩](./solutions/charging-pile.md)
+
+
+
+
+ 13: 附录
+
+- [13.1: QuecPython 开发板板载资源列表](./appendix/evb-resources.md)
+
+- [13.2: QuecPython 错误码汇总](./appendix/error-code.md)
+
+- [13.3: QuecPython 异常处理流程](./appendix/exception-handling.md)
+
+
diff --git "a/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/README.md" b/docs/Getting_started/zh/appendix/README.md
similarity index 100%
rename from "docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
rename to docs/Getting_started/zh/appendix/README.md
diff --git "a/docs/development_tool_tutorial/zh/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213/README.md" b/docs/Getting_started/zh/background/README.md
similarity index 100%
rename from "docs/development_tool_tutorial/zh/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213/README.md"
rename to docs/Getting_started/zh/background/README.md
diff --git "a/docs/development_tool_tutorial/zh/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/README.md" b/docs/Getting_started/zh/clouds/README.md
similarity index 100%
rename from "docs/development_tool_tutorial/zh/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/README.md"
rename to docs/Getting_started/zh/clouds/README.md
diff --git a/docs/development_guide/zh/config.json b/docs/Getting_started/zh/config.json
similarity index 100%
rename from docs/development_guide/zh/config.json
rename to docs/Getting_started/zh/config.json
diff --git "a/docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LPWA\347\263\273\345\210\227\346\250\241\347\273\204/CAT-M\347\263\273\345\210\227\346\250\241\347\273\204/README.md" b/docs/Getting_started/zh/hardware-advanced/README.md
similarity index 100%
rename from "docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LPWA\347\263\273\345\210\227\346\250\241\347\273\204/CAT-M\347\263\273\345\210\227\346\250\241\347\273\204/README.md"
rename to docs/Getting_started/zh/hardware-advanced/README.md
diff --git a/docs/Getting_started/zh/hardware-advanced/bt-and-ble.md b/docs/Getting_started/zh/hardware-advanced/bt-and-ble.md
new file mode 100644
index 0000000000000000000000000000000000000000..665cc166225c3119f17f32cd7682c14dece78ff0
--- /dev/null
+++ b/docs/Getting_started/zh/hardware-advanced/bt-and-ble.md
@@ -0,0 +1,28 @@
+# BT和BLE
+
+本文将主要介绍支持QuecPython开发的模块自带的[BT(经典蓝牙)](../../../API_reference/zh/QuecPython类库/bt.html)和[BLE(低功耗蓝牙)](../../../API_reference/zh/QuecPython类库/ble.html)是什么,怎么使用等基础知识和如何获取学习资料。
+
+## BT和BLE分别是什么?
+
+经典蓝牙(BT)是一种短距离无线通信技术,广泛应用于音频设备、手机、电脑、车载系统等设备之间的数据传输。经典蓝牙的传输速度较快,可达到2.1Mbps,但功耗较高,适用于数据传输频繁的场景。
+
+低功耗蓝牙(BLE)是一种低功耗的无线通信技术,适用于物联网、健康监测、智能家居等设备的连接。BLE的传输速度较慢,最高可达1Mbps,但功耗非常低,可实现长期待机和低功耗数据传输。
+
+## BT和BLE的主要区别是什么?
+
+两者的主要区别在于功耗和传输速度。经典蓝牙速度快,但功耗大,而BLE功耗低,但速度慢。另外,BLE的连接距离比经典蓝牙更远,但传输速度也更慢。
+
+## BT和BLE的主要应用场景有什么不同?
+
+经典蓝牙适用于需要高速数据传输的场景,如音频传输、文件传输等。BLE适用于需要低功耗和长期待机的场景,如智能家居、健康监测、物联网等。
+
+## 怎么使用BT和BLE?
+
+关于如何使用BLE本文主要介绍如何进行基本的测试,详细资料仍需要参考对应的API文档:[BT(经典蓝牙)](../../../API_reference/zh/QuecPython类库/bt.html)和[BLE(低功耗蓝牙)](../../../API_reference/zh/QuecPython类库/ble.html),以及对应的[蓝牙应用指导文档](),[蓝牙官网文档](https://www.bluetooth.com/bluetooth-resources/?types=study-guide)等。
+
+### 1.准备工作
+
+在使用蓝牙功能之前请先确认您使用的固件发布时间是最新的,并且确认固件中包含BT或BLE功能,可以通过直接import尝试,如报错则不支持。需要注意,不支持的主要原因为,蓝牙协议栈占用较多资源,确需使用才会编译进固件,避免过多占用资源,导致其他常用功能无法支持。确需使用可以在下载区下载
+
+
+
diff --git a/docs/Getting_started/zh/hardware-advanced/matrix-keypad.md b/docs/Getting_started/zh/hardware-advanced/matrix-keypad.md
new file mode 100644
index 0000000000000000000000000000000000000000..da7f5c4afaaeb6ba7b45228db9301886d61431a2
--- /dev/null
+++ b/docs/Getting_started/zh/hardware-advanced/matrix-keypad.md
@@ -0,0 +1,162 @@
+# KeyPad - 矩阵键盘
+
+本文将介绍什么是矩阵键盘,以及如何在QuecPython平台上使用keypad矩阵键盘功能。
+
+## 什么是矩阵键盘
+
+矩阵键盘是一种常见的输入设备,通常用于电子设备和计算机中。它由多个按键组成,按键排列成一个矩阵形式,并通过连接线与控制器相连。
+
+其基本工作原理是通过行列扫描技术来检测按键的状态。具体来说,矩阵键盘中的按键被分为若干行和列,行列交叉部分形成了一个二维矩阵。控制器会依次扫描每一行或每一列,当检测到某一个按键被按下时,在该按键所处的行和列之间建立联系,从而确定该按键的位置和状态。
+
+这种工作原理使得矩阵键盘具有很高的灵活性和可编程性,因为可以通过编程设置哪些按键被映射到哪些行和列上。此外,矩阵键盘还具有体积小、成本低、反应速度快等优点,因此被广泛应用于各种类型的电子设备中。
+
+## 如何使用矩阵键盘
+
+### 1. 硬件准备
+
+在使用keypad矩阵键盘功能之前,需要准备以下硬件:
+
+- QuecPython开发板
+- keypad矩阵键盘模块
+
+将keypad矩阵键盘模块连接到开发板的矩阵键盘接口上,具体支持的模块和引脚对应关系请查看[矩阵键盘](../../../API_reference/zh/QuecPython类库/machine.KeyPad.html)API文档,同时需要注意,并不是所有开发板均引出了矩阵键盘引脚,请自行查看开发板原理图或资源列表,本文以QuecPython_EC2X_EVB_V1.0为例,开发板上搭载EC200UCNAA型号模块。如自行设计PCB则需要API文档和模块硬件设计手册同时参考,但引脚定义以API文档为准,电路特性以硬件设计手册为准。
+
+### 2.硬件电路
+
+本文使用的搭载EC200U的开发板中矩阵键盘相关原理图接线:
+
+
+
+
+
+
+
+
+
+通过API文档和上图我们可以知道EC200U系列模块支持4行3列的矩阵键盘,其中KEYOUT对应的是软件中的行号,从0开始,KEYIN对应的是软件中的列号,从1开始。
+
+由于开发板只是引出了引脚,所以我们还需要自行购买矩阵键盘模块,使用杜邦线进行连接,连接的实物图如图所示:
+
+
+
+### 3. 示例代码
+
+下面是一个完整的示例代码:
+
+```python
+import machine # 导入 'machine' 模块以便于使用硬件组件
+import utime # 导入 'utime' 模块以便于进行时间相关的任务
+
+keypad = machine.KeyPad() # 初始化一个名为 'keypad' 的 KeyPad 类对象。
+
+keypad.init() # 初始化 keypad 对象
+
+# 定义回调函数,此函数将在按下或释放按键时被触发
+def keypadCallback(return_list):
+ '''
+ return_list[0]: 1表示按下,0表示抬起
+ return_list[1] : row 行
+ return_list[2] : col 列
+ '''
+ if return_list[0] == 1:
+ print("按下的按键位置在第 {} 行 {}列".format(return_list[1], return_list[2]))
+ elif return_list[0] == 0:
+ print("释放的按键位置在第 {} 行 {}列".format(return_list[1], return_list[2]))
+
+
+# 将回调函数设置为先前定义的 'keypadCallback' 函数
+keypad.set_callback(keypadCallback)
+print('开始测试,请按下按键')
+
+# 程序等待60秒钟
+utime.sleep(60)
+
+keypad.deinit() # 取消初始化 keypad 对象
+print('已退出!') # 打印一条消息表示程序已经退出。
+```
+
+以上代码会在按键按下或释放时进行打印,关于API的详细说明参见[矩阵键盘](../../../API_reference/zh/QuecPython类库/machine.KeyPad.html)。
+
+### 5.典型问题解答
+
+买到的EVB没有引出引脚怎么进行测试?
+
+EVB没有引出是不方便测试的,可以自行设计PCB板进行测试验证。
+
+按键工作一会后失灵了是怎么回事?
+
+检查创建的矩阵键盘对象是否是全局变量,如是局部变量请修改为全局变量。
+
+KEYOUT一定是代表行,KEYIN一定是代表列吗?
+
+矩阵键盘的KEYOUT不一定是行,它可以是列或其他任何方向。矩阵键盘的KEYIN和KEYOUT可以组成一个矩阵,其中KEYIN是行,KEYOUT是列,也可以反过来,KEYIN是列,KEYOUT是行。因此,KEYOUT的方向取决于键盘的设计和实现。
+
+设计EC600N模块的矩阵键盘硬件电路时,55号引脚需要接地,但是会导致通电开机模块就进入下载模式怎么办?
+
+严格按照硬件设计手册说明选择下拉电阻,仍不能解决可以采用软件扫描方式实现矩阵键盘功能,此方法将不受限于硬件引脚功能,可以在多种模块上兼容使用,其他模块类似处理。
+
+如下是软件实现矩阵键盘的示例代码:
+
+```python
+# 导入所需的模块
+from machine import Pin
+from utime import sleep_ms
+
+# 定义键盘矩阵的行列数及按键对应的字符
+NUM_ROWS = 3
+NUM_COLS = 3
+
+key_matrix = [
+['1', '2', '3'],
+['4', '5', '6'],
+['7', '8', '9'],
+]
+
+# 定义行列引脚
+row_pins = [Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_DISABLE, 0), Pin(Pin.GPIO12, Pin.OUT, Pin.PULL_DISABLE, 0), Pin(Pin.GPIO13, Pin.OUT, Pin.PULL_DISABLE, 0)]
+col_pins = [Pin(Pin.GPIO9, Pin.IN, Pin.PULL_PU, 1), Pin(Pin.GPIO8, Pin.IN, Pin.PULL_PU, 1), Pin(Pin.GPIO14, Pin.IN, Pin.PULL_PU, 1)]
+
+# 定义全局变量,用于判断按键是否被按下或释放
+key_pressed = False
+key_released = False
+
+# 扫描键盘矩阵的函数
+def scan_keys():
+
+ global key_pressed, key_released
+
+ # 循环扫描每一列
+ for i in range(NUM_COLS):
+ row_pins[i].write(0)
+
+ # 循环扫描每一行
+ for j in range(NUM_ROWS):
+ # 如果检测到按键被按下且之前未被按下,则将全局变量设置为按下状态,并返回按键对应的字符
+ if not col_pins[j].read() and not key_pressed:
+ key_pressed = True
+ key_released = False
+ return key_matrix[j][i]
+
+ row_pins[i].write(1)
+
+ # 如果按键被按下且之前未被释放,则将全局变量设置为释放状态,并返回 None
+ if key_pressed and not key_released:
+ key_released = True
+ key_pressed = False
+
+ return None
+
+# 循环检测键盘矩阵
+while True:
+ key = scan_keys()
+ # 如果检测到按键被按下,则打印出按键对应的字符
+ if key is not None:
+ print('Key pressed:', key)
+ sleep_ms(50)
+```
+
+此示例代码仅供参考,实际使用还请自行完善逻辑。
+
+# 总结
+
+本文介绍了如何在QuecPython平台上使用keypad矩阵键盘功能,并列举了比较常见的问题类型,以及自行实现矩阵按键功能的示例,如有疑问或更好的建议欢迎联系我们,也可以直接向我们提交文档贡献,后续本文将继续完善和补充更多应用案例。
\ No newline at end of file
diff --git "a/docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LPWA\347\263\273\345\210\227\346\250\241\347\273\204/NB-IOT\347\263\273\345\210\227\346\250\241\347\273\204/README.md" b/docs/Getting_started/zh/hardware-basic/README.md
similarity index 100%
rename from "docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LPWA\347\263\273\345\210\227\346\250\241\347\273\204/NB-IOT\347\263\273\345\210\227\346\250\241\347\273\204/README.md"
rename to docs/Getting_started/zh/hardware-basic/README.md
diff --git "a/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-\344\272\256\345\272\246\344\274\240\346\204\237\345\231\250\345\272\224\347\224\250\345\274\200\345\217\221.md" b/docs/Getting_started/zh/hardware-basic/adc.md
similarity index 53%
rename from "docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-\344\272\256\345\272\246\344\274\240\346\204\237\345\231\250\345\272\224\347\224\250\345\274\200\345\217\221.md"
rename to docs/Getting_started/zh/hardware-basic/adc.md
index 4c6acbac50d17c693d28bb8068e6608c970abd95..ae6067027e327950068a0322637b3ec17ef4e9a8 100644
--- "a/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-\344\272\256\345\272\246\344\274\240\346\204\237\345\231\250\345\272\224\347\224\250\345\274\200\345\217\221.md"
+++ b/docs/Getting_started/zh/hardware-basic/adc.md
@@ -1,29 +1,64 @@
-# 亮度传感器应用介绍
+# ADC - 电压采集功能
-亮度传感器是一种能够检测周围环境亮度的传感器。在 QuecPython 平台上,您可以使用光敏电阻或光敏二极管作为亮度传感器,并使用相应的代码来读取其值。在本文档中,我们将讨论如何在 QuecPython 平台上使用光敏电阻作为亮度传感器。
+本文主要介绍什么是 ADC、怎么使用 ADC、ADC 可以做什么等相关问题。
+
+## ADC 简介
+
+### 什么是 ADC
+
+ADC(Analog to Digital Converter) 即模拟数字转换器即 [A/D 转换器](https://baike.baidu.com/item/A%2FD转换器/4883848?fromModule=lemma_inlink),对于嵌入式应用开发来说,可以简单理解为:在单片机或我们的模组上有一个引脚可以读取电路中的电压值。一般软件开发人员主要关注如何读出 ADC 引脚的电压值,并将电压值做一些运算从而间接得出外部传感器当前所测量的环境值,如温度值、亮度值等。
+
+### 怎么使用 ADC
-# 所需材料
+#### 硬件设计
-- QuecPython 模块(选择支持 ADC 的模块即可,参见[ADC](../../../API_reference/zh/QuecPython类库/misc.ADC.html))
+对于嵌入式产品开发来说,可靠的硬件电路是软件开发的前提条件。
+ADC 相关电路设计需要参考每个型号模组的硬件设计手册和参考设计手册,可以在主页的 [下载区](/download/) 检索下载,但具体功能引脚仍需以 QuecPython 的 [ADC 功能 API](../../../API_reference/zh/QuecPython类库/misc.ADC.html) 介绍的引脚号为准。关于 ADC 功能常见的应用电路也可以通过搜素引擎了解更多信息。简单应用电路也可参考 QuecPython 的学习开发板,开发板可以通过天猫旗舰店、京东旗舰店等移远通信官方销售渠道获取,开发板的硬件设计同样是参考的上述硬件文档,开发板的原理图也可以在主页的 [下载区](/download/) 检索下载。
+
+#### 软件应用
+
+使用 QuecPython 开发的模组,想要读取 ADC 引脚的电压需要先完成 QuecPython 开发环境的搭建,再参考 [ADC 功能的 API 介绍文档](../../../API_reference/zh/QuecPython类库/misc.ADC.html) 进行如下命令行测试即可打印出 ADC 通道 0 引脚当前的电压值,单位为毫安 (mA)。
+
+```python
+>>>from misc import ADC
+>>>adc = ADC()
+>>>adc.open()
+>>>voltage = adc.read(ADC.ADC0)
+>>>print("ADC channel 0 voltage = {}mA".format(voltage))
+```
+
+### ADC 功能测试
+
+使用 QPYcom 工具和模组进行交互,下面实例是基于 ADC0。
+
+
+
+## ADC 功能应用实例
+
+亮度传感器是一种能够检测周围环境亮度的传感器。在 QuecPython 平台上,您可以使用光敏电阻或光敏二极管作为亮度传感器,并使用相应的代码来读取其值。在本文档中,我们将讨论如何在 QuecPython 平台上使用光敏电阻作为亮度传感器。
+
+### 所需材料
+
+- QuecPython 模块(选择支持 ADC 的模块即可,参见 [ADC](../../../API_reference/zh/QuecPython类库/misc.ADC.html))
- 光敏电阻
-- 高精度电阻(具体以硬件设计手册为准)
-- 充足的导线(杜邦线即可)
+- 高精度电阻(具体以硬件设计手册为准)
+- 充足的导线(杜邦线即可)
- 如有自带光敏电阻的 QuecPython 开发板上述材料均包含
-# 电路连接
+### 电路连接
以 QuecPython 开发板为例,以下是 EC600X_QuecPython_EVB_V3.1 版本开发板光敏电阻电路连接图:
-
+
如上两图所示,左边图中的 R22 即为光敏电阻,型号为 GT36528,右图为连接到 QuecPython 模块 ADC 引脚的电路,模块型号为 EC600U。
上图电路可等效为下图所示电路:
-
+
-# 原理分析
+### 原理分析
想要得到当前光照度,首先我们需要知道光敏电阻在当前光照条件下的电阻值,再根据电阻值与光照度之间的关系计算得出光照度,电阻值我们不能直接通过 API 接口读出,但我们可以使用 ADC 的 API 读出电路中光敏电阻的电压值,再通过欧姆定律我们就可以计算得出光敏电阻的阻值,又由于 ADC 的测量电压范围有限,所以我们设计了电子电路进行分压,将电路中某一点的电压限制在 ADC 的测量范围内,再测量电路中这一点的电压,间接换算出光敏电阻的阻值,具体分析和计算原理如下。
@@ -39,7 +74,7 @@ $$
R_{22}=\frac{(R_3+R_4)R_{14}V_{A}}{(R_3+R_4)(V_{3.3}-V_A)-(R_{14}V_A)}
$$
-到这里,也许有些人会有疑问,R81 为什么没有被计算到?因为 R81 接到的是 ADC 引脚,我们可以认为只是接到了一个电压表上,所以并不会分压,无需加入计算中。即 ADC0 测得的电压即为 B 点的电压,那么 B 点电压对于我们来说是可以通过 API 变为已知的。但是在上述表达式中又并未用到 B 点电压,是怎么回事呢?
+到这里,也许有些人会有疑问,R81 为什么没有被计算到?因为 R81 接到的是 ADC 引脚,我们可以认为只是接到了一个电压表上,所以并不会分压,无需加入计算中。即 ADC0 测得的电压即为 B 点的电压,那么 B 点电压对于我们来说是可以通过 API 变为已知的。但是在上述表达式中又并未用到 B 点电压,是怎么回事呢?
从上述表达式中我们可以看出,表达式右侧的所有变量只有 A 点电压是未知量,左侧是待求量,一个表达式中有两个未知量是求不出结果的,所以我们需要将未知量 A 点电压变为已知量,此时就用到了已知量 B 点电压。我们再根据欧姆定律和串并联电路的知识可以知道,R22 所在支路的电压和 R3、R4 所在支路的电压是相同的,并且是 A 点电压。又由于整个支路是串联的,则支路上每一点电流是相同的,我们根据欧姆定律可以得出如下表达式:
@@ -50,13 +85,13 @@ $$
由上述表达式我们可以换算得出 A 点电压和 B 点电压的关系:
$$
-V_A=\frac{R_3+R_4}{R4}V_B
+V_A =\frac{R_3+R_4}{R4}V_B
$$
将上述表达式整理再统一单位后代入真实数值我们可以得到表达式:
$$
-V_A=5.02V_B
+V_A = 5.02V_B
$$
再将这一结果和真实数值代入 R22 的表达式可以得到如下表达式:
@@ -66,14 +101,12 @@ $$
$$
\begin{aligned}
R_{22}&=\frac{(R_3+R_4)R_{14}V_{A}}{(R_3+R_4)(V_{3.3}-V_A)-(R_{14}V_A)}\\
-&=\frac{((40.2+10)*1000)*40.2*1000*5.02*V_B}{((40.2+10)*1000)*(3.3-5.02*V_B)-(40.2*1000*5.02*V_B)}\\
-&=\frac{10130560800*V_B}{165660-453808*V_B}
+&=\frac{((40.2+10)*1000)* 40.2 *1000* 5.02 *V_B}{((40.2+10)* 1000)*(3.3-5.02* V_B)-(40.2 *1000* 5.02*V_B)}\\
+&=\frac{10130560800 *V_B}{165660-453808* V_B}
\end{aligned}
$$
-
-
-# 代码实现
+### 代码实现
在写代码之前我们需要了解到光敏电阻阻值和光照亮度之间的数学关系,一般需要通过实验测试得到,此示例仅展示我们如何获取光敏电阻的阻值,单位为欧姆,在代码中计算时一定记得统一为国际单位制再进行计算。
@@ -102,22 +135,6 @@ if __name__ == "__main__":
utime.sleep(1)
```
-$$
-
-$$
-
-$$
-
-$$
-
-$$
+## 总结
-$$
-
-$$
-
-$$
-
-$$
-
-$$
+ADC 功能的一般常见用法在此做了详细的介绍,如有疑问或更好的建议欢迎联系我们,也可以直接向我们提交文档贡献,后续本文将继续完善和补充更多应用案例。
diff --git a/docs/Getting_started/zh/hardware-basic/pwm.md b/docs/Getting_started/zh/hardware-basic/pwm.md
new file mode 100644
index 0000000000000000000000000000000000000000..caf091e2ac106801866fc426ca325cad548304bb
--- /dev/null
+++ b/docs/Getting_started/zh/hardware-basic/pwm.md
@@ -0,0 +1,112 @@
+# PWM - 脉宽调制
+
+## PWM 简介
+
+### 什么是 PWM
+
+[PWM](https://baike.baidu.com/item/脉冲宽度调制/10813756?fromtitle=PWM&fromid=3034961&fr=aladdin) 代表脉冲宽度调制(Pulse Width Modulation),是一种常见的电子信号调制技术。它通过改变信号的脉冲宽度来控制电路或设备的输出功率或速度。PWM 信号是一个周期性的信号,包含一个固定频率的基准信号和一个可变的占空比信号。占空比指的是脉冲宽度与周期之间的比率,它控制着信号的平均电平,从而控制电路或设备的输出功率或速度。
+
+PWM 技术在电子工程、控制系统和机械工程等领域得到广泛应用。例如,在电机控制中,PWM 信号可以用来控制电机的转速和转向。在电源管理中,PWM 信号可以用来调节直流-直流转换器的输出电压和电流。在 LED 灯控制中,PWM 信号可以用来控制 LED 的亮度和颜色。
+
+需要注意的是,在使用 PWM 技术时,需要选择适当的频率和占空比,以满足具体应用的需求。同时,还需要考虑 PWM 信号的稳定性和噪声等因素,以确保电路或设备的正常运行和可靠性。
+
+### 怎么使用 PWM
+
+使用 PWM 技术需要通过特定的电路或芯片来生成 PWM 信号,支持 QuecPython 开发的模组大部分都具有此功能,具体可见 [PWM 功能 API 文档](../../../API_reference/zh/QuecPython类库/misc.PWM.html) 确认是否支持此功能,可以按照以下步骤进行:
+
+#### 硬件设计
+
+根据上述 [PWM 功能 API 文档](../../../API_reference/zh/QuecPython类库/misc.PWM.html) 介绍的引脚号和模组的硬件设计文档(从 [下载区](/download/) 获取)设计好硬件电路即可。设计硬件电路注意需要注意电平转换,以及电平转换电路的最大输出频率。
+
+如模组本身不支持或支持的数量不够用,则可以使用模组支持的任意一个 [GPIO](../../../API_reference/zh/QuecPython类库/machine.Pin.html) 结合 [定时器](../../../API_reference/zh/QuecPython类库/machine.Timer.html) 来粗略模拟输出 PWM 信号,硬件设计相同,软件实现可见下文。
+
+#### 软件应用
+
+当使用模组自带 PWM 功能时:
+
+```python
+>>>from misc import PWM
+>>>pwm = PWM(PWM.PWM0, PWM.ABOVE_MS, 1, 5)
+>>>pwm.open()
+```
+
+当自行模拟 PWM 功能时需要注意 QuecPython 对于时序控制并不是很精确,请自行根据需求实现相关代码。
+
+#### PWM 功能测试
+
+在命令行中执行上面三行代码即可让模组的 PWM0 引脚输出一个周期为 5ms,占空比为 20%的方波,借助 [逻辑分析仪](https://baike.baidu.com/item/逻辑分析仪/2364388?fr=aladdin) 我们可以看到输出的波形。交互界面及逻辑分析仪获取到的波形如下图。
+
+
+
+
+
+如上图所示,填写的参数和实际抓取到的波形是能够对应上的,有关 API 具体参数含义可以仔细阅读 API 介绍文档进行理解。
+
+对于 QuecPython 的 PWM API 需要注意的是,填的参数不能超出填写范围,否则将会出现报错,这是常见问题。
+
+一般使用 PWM 功能主要步骤是:
+
+1. 设置 PWM 参数:根据具体应用需求,设置 PWM 信号的频率和占空比等参数。频率决定信号的周期,占空比决定信号的平均电平和电路或设备的输出功率或速度。对于 QuecPython API,则需要填写高电平时间和周期来决定占空比和频率。即占空比 = 高电平时间/周期,频率 = 1 秒/周期(单位:秒)。
+2. 连接 PWM 输出:将 PWM 信号的输出端口连接到需要控制的电路或设备,如电机、LED 等。通常需要使用适当的电路元件,如电容、电感、MOSFET 或三极管等,来控制 PWM 信号的幅值和波形。
+3. 调试和优化:根据实际情况,调试 PWM 电路或程序,以确保 PWM 信号的稳定性和准确性。可以通过示波器、数字万用表等仪器来监测 PWM 信号的波形和电平等参数,进行优化和调整。
+
+需要注意的是,在使用 PWM 技术时,需要根据具体应用需求选择合适的 PWM 芯片或电路,即选择合适的模组,并合理设置参数和连接电路。同时,还需要注意 PWM 信号的稳定性、可靠性和噪声等因素,以确保电路或设备的正常运行和安全性。
+
+## PWM 功能应用实例
+
+在本文中,我们将使用 QuecPython 板载的 PWM 功能,实现一个呼吸灯的效果。呼吸灯是一种灯光效果,类似于人类呼吸时的变化。它可以在各种电子设备中使用,例如嵌入式系统、智能家居、玩具等。
+
+### 准备工作
+
+我们需要使用 QuecPython 开发板、以及一个直插式 LED 灯(部分板载贴片式 LED 即可测试,详情请看电路原理图确认)。将 LED 灯连接到 QuecPython 开发板上。将 LED 的长脚连接到开发板的 PWM0 引脚,将短脚连接到开发板的 GND 引脚。
+
+### 代码实现
+
+以下是实现呼吸灯效果的 QuecPython 代码。代码中的注释将帮助您理解代码的工作原理。
+
+```python
+# 导入所需模块
+from misc import PWM
+from utime import sleep_ms
+
+# 设置 PWM 通道和频率
+PWM_CHANNEL = PWM.PWM0
+PWM_FREQ_Hz = 50
+
+# 初始化 PWM 占空比和周期时长
+pwm_duty = 100 # PWM 占空比初始值为 100%
+cycleTime = 1000 // PWM_FREQ_Hz # 周期时长(单位:ms)
+
+while True:
+ # 根据当前 PWM 占空比计算高电平时间
+ highTime = cycleTime * pwm_duty // 100
+
+ # 创建 PWM 对象并打开
+ pwm = PWM(PWM_CHANNEL, PWM.ABOVE_MS, highTime, cycleTime)
+ pwm.open()
+
+ # 根据 PWM 占空比的变化情况更新 PWM 占空比值
+ if pwm_duty >= 100:
+ pwm_duty_change_step = -10 # 如果 PWM 占空比达到了 100%,则向负方向降低
+ if pwm_duty <= 0:
+ pwm_duty_change_step = 10 # 如果 PWM 占空比达到了 0%,则向正方向增加
+ pwm_duty += pwm_duty_change_step # 更新 PWM 占空比
+
+ # 等待一段时间,再进行下一次循环操作
+ sleep_ms(100)
+```
+
+这段代码通过使用 `misc` 模块和 `utime` 模块中的函数实现对 PWM(脉冲宽度调制)信号的控制。PWM 信号的特点是占空比可以调整,因此可以通过占空比来控制输出的平均电压。在这段代码中,先选择一个 PWM 通道(`PWM_CHANNEL = PWM.PWM0`)和设定 PWM 信号的频率(`PWM_FREQ_Hz = 50`)。然后通过循环语句不断改变 PWM 信号的占空比,从而使输出的电平产生周期性的变化。
+
+具体来说,代码循环中的每个步骤如下:
+
+1. 根据当前的 PWM 占空比值计算出 PWM 信号的高电平时间(`highTime = cycleTime * pwm_duty // 100`)。这里 `cycleTime` 表示一个 PWM 信号的周期时长,单位为毫秒,由设定的 PWM 频率和公式 `cycleTime = 1000 / PWM_FREQ_Hz` 计算得出。`pwm_duty` 表示当前的 PWM 占空比,范围在 0%~100%之间。因此,当 `pwm_duty` 为 100%时,高电平时间等于一个周期的时长;当 `pwm_duty` 为 0%时,高电平时间为 0。
+2. 创建一个 PWM 对象,并指定输出方式为“高电平持续时间大于等于给定时间”(`PWM.ABOVE_MS`),同时将高电平时间和周期时长设置为计算得到的值。然后通过 `open()` 方法打开 PWM 输出。
+3. 根据当前 PWM 占空比的变化趋势更新 PWM 占空比值。当 PWM 占空比达到 100%时,向负方向(即减小 PWM 占空比)变化;当 PWM 占空比达到 0%时,向正方向(即增加 PWM 占空比)变化。
+4. 等待一段时间(这里是 100 毫秒),然后进入下一次循环。
+
+这样,即可实现对 PWM 信号的控制,从而产生周期性变化的平均电压输出。
+
+## 总结
+
+PWM 功能在此做了详细的介绍,如有疑问或更好的建议欢迎联系我们,也可以直接向我们提交文档贡献,后续本文将继续完善和补充更多应用案例。
diff --git "a/docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LPWA\347\263\273\345\210\227\346\250\241\347\273\204/README.md" b/docs/Getting_started/zh/iot-advanced/README.md
similarity index 100%
rename from "docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LPWA\347\263\273\345\210\227\346\250\241\347\273\204/README.md"
rename to docs/Getting_started/zh/iot-advanced/README.md
diff --git "a/docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LTE\347\263\273\345\210\227\346\250\241\347\273\204/ASR\347\263\273\345\210\227\346\250\241\347\273\204/README.md" b/docs/Getting_started/zh/iot-basic/README.md
similarity index 100%
rename from "docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LTE\347\263\273\345\210\227\346\250\241\347\273\204/ASR\347\263\273\345\210\227\346\250\241\347\273\204/README.md"
rename to docs/Getting_started/zh/iot-basic/README.md
diff --git a/docs/Getting_started/zh/iot-basic/exceptions.md b/docs/Getting_started/zh/iot-basic/exceptions.md
new file mode 100644
index 0000000000000000000000000000000000000000..2ee1a9eb1155bc8648c0fc1d0eb66a1737c4035b
--- /dev/null
+++ b/docs/Getting_started/zh/iot-basic/exceptions.md
@@ -0,0 +1,62 @@
+# 通信异常处理
+
+## 通信异常简介
+
+当使用 QuecPython 进行网络通信时,有时可能会遇到异常情况。这些异常情况可能包括连接超时、连接被拒绝、传输错误等等,可能出现的错误码及含义可见 [错误码汇总](./../appendix/error-code.html) 章节。在本文中,我们将探讨如何处理这些异常情况,以确保您的网络通信顺利进行,以 socket 通信为例,其他网络通信类同。
+
+可能出现的异常情况有:
+
+- Socket 创建失败:由于系统资源不足或权限不足等原因导致 Socket 对象创建失败。
+- Socket 绑定失败:如果两个程序在同一台机器上绑定相同的 IP 地址和端口号进行通信,则会导致绑定失败。
+- 远程主机拒绝连接:可能是由于远程主机未启动或端口未开放。
+- 网络不可达:可能是由于网络故障或路由器设置有误。
+- 连接超时:可能是由于远程主机响应过慢或网络传输延迟较大。
+- 目标主机主动关闭连接:目标主机或服务端主动关闭连接时,客户端也会抛出异常。
+- socket 被关闭:可能是由于网络原因或程序逻辑设计有误。
+- socket 已经被其他线程或机制关闭:可能是由于多个线程同时操作一个 socket 对象而导致的,也可能是 socket 对象被 gc 自动回收导致的。
+- 数据接收超时:可能是由于网络传输延迟较大或远程主机响应过慢。
+
+## 异常处理代码示例
+
+```python
+import usocket as socket
+
+try:
+ # 创建 socket 对象
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+except OSError as e:
+ print('Socket 创建失败:', e)
+
+try:
+ # 绑定 socket,这里的 ip 地址为模块拨号成功获取到的
+ s.bind(('10.145.58.21', 8888))
+except OSError as e:
+ print('Socket 绑定失败:', e)
+
+try:
+ # 连接远程主机
+ s.connect(('www.example.com', 80))
+except OSError as e:
+ print('连接服务器异常:', e)
+
+try:
+ # 发送数据
+ s.send(b'Hello, world!')
+except OSError as e:
+ print('发送数据异常:', e)
+
+# 接收数据
+try:
+ data = s.recv(1024)
+except OSError as e:
+ print('接收数据异常:', e)
+
+# 关闭 socket
+s.close()
+```
+
+以上是分步使用 try-except 语句块来捕获异常,我们为了方便也可以使用一个 try-except 语句块来捕获整个流程的异常,同时我们在接收和发送数据时使用 API 先查询连接状态再进行操作也可以避免大多异常。
+
+## 总结
+
+在 QuecPython 中进行网络通信时,可能会出现各种异常情况。为了保证程序的稳定性和可靠性,需要针对不同的异常情况采取相应的处理措施。例如,可以通过设置超时时间来防止连接超时或数据接收超时;可以捕获相应的异常来判断 socket 是否被关闭或网络是否可达等情况。通过这些措施,可以有效地避免网络通信异常,提高程序的可靠性和稳定性。除了以上三种异常,还有 Socket 创建失败、Socket 绑定失败以及目标主机主动关闭连接等其他异常情况,我们也需要进行相应的处理。本文介绍了一些常见的异常情况及其处理方法,希望对您有所帮助。
diff --git "a/docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LTE\347\263\273\345\210\227\346\250\241\347\273\204/Eigecomm\347\263\273\345\210\227\346\250\241\347\273\204/README.md" b/docs/Getting_started/zh/mass-production/README.md
similarity index 100%
rename from "docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LTE\347\263\273\345\210\227\346\250\241\347\273\204/Eigecomm\347\263\273\345\210\227\346\250\241\347\273\204/README.md"
rename to docs/Getting_started/zh/mass-production/README.md
diff --git a/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_0.png b/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_0.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ccbc981bd8e9fcce475a2828773675188848a5e
Binary files /dev/null and b/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_0.png differ
diff --git a/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_1.png b/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..b21d3f232d041f6ef76f51aac7db874cceaf3b46
Binary files /dev/null and b/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_1.png differ
diff --git a/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_2.png b/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..856a43a7e652746a524d17b1b3d98ed7cfae1edb
Binary files /dev/null and b/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_2.png differ
diff --git a/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_3.png b/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..10731885e4eede0a188ce78fc092dd0d9251e2e7
Binary files /dev/null and b/docs/Getting_started/zh/media/hardware-advanced/matrix-keypad/keypad_3.png differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_ADC_0.png" b/docs/Getting_started/zh/media/hardware-basic/adc/adc_0.png
similarity index 100%
rename from "docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_ADC_0.png"
rename to docs/Getting_started/zh/media/hardware-basic/adc/adc_0.png
diff --git "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276_\344\272\256\345\272\246\344\274\240\346\204\237\345\231\250_0.png" b/docs/Getting_started/zh/media/hardware-basic/adc/adc_1.png
similarity index 100%
rename from "docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276_\344\272\256\345\272\246\344\274\240\346\204\237\345\231\250_0.png"
rename to docs/Getting_started/zh/media/hardware-basic/adc/adc_1.png
diff --git "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276_\344\272\256\345\272\246\344\274\240\346\204\237\345\231\250_1.png" b/docs/Getting_started/zh/media/hardware-basic/adc/adc_2.png
similarity index 100%
rename from "docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276_\344\272\256\345\272\246\344\274\240\346\204\237\345\231\250_1.png"
rename to docs/Getting_started/zh/media/hardware-basic/adc/adc_2.png
diff --git "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276_\344\272\256\345\272\246\344\274\240\346\204\237\345\231\250_2.png" b/docs/Getting_started/zh/media/hardware-basic/adc/adc_3.png
similarity index 100%
rename from "docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276_\344\272\256\345\272\246\344\274\240\346\204\237\345\231\250_2.png"
rename to docs/Getting_started/zh/media/hardware-basic/adc/adc_3.png
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_PWM_0.png" b/docs/Getting_started/zh/media/hardware-basic/pwm/pwm_0.png
similarity index 100%
rename from "docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_PWM_0.png"
rename to docs/Getting_started/zh/media/hardware-basic/pwm/pwm_0.png
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_PWM_1.png" b/docs/Getting_started/zh/media/hardware-basic/pwm/pwm_1.png
similarity index 100%
rename from "docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_PWM_1.png"
rename to docs/Getting_started/zh/media/hardware-basic/pwm/pwm_1.png
diff --git "a/docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LTE\347\263\273\345\210\227\346\250\241\347\273\204/Qualcomm\347\263\273\345\210\227\346\250\241\347\273\204/README.md" b/docs/Getting_started/zh/mpy-syntax/README.md
similarity index 100%
rename from "docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LTE\347\263\273\345\210\227\346\250\241\347\273\204/Qualcomm\347\263\273\345\210\227\346\250\241\347\273\204/README.md"
rename to docs/Getting_started/zh/mpy-syntax/README.md
diff --git a/docs/Getting_started/zh/os/README.md b/docs/Getting_started/zh/os/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..c422c1463ea853286b83539f4962114028edc622
--- /dev/null
+++ b/docs/Getting_started/zh/os/README.md
@@ -0,0 +1,24 @@
+# 4: QuecPython 系统功能
+
+本章主要介绍如何查询 QuecPython 的一些系统信息,并使用系统自带的一些常用功能,如: 日志功能、文件功能等,具体可展开目录查看。
+
+
+ 目录
+
+- [4.1: 系统信息]()
+
+- [4.2: 日志功能]()
+
+- [4.3: 文件管理]()
+
+- [4.4: 时间功能]()
+
+- [4.5: 数据格式转换]()
+
+- [4.6: 电源管理]()
+
+- [4.7: 内存管理]()
+
+- [4.8: 多线程]()
+
+
diff --git a/docs/Getting_started/zh/os/os-info.md b/docs/Getting_started/zh/os/os-info.md
new file mode 100644
index 0000000000000000000000000000000000000000..8f23eafed3c31915bd8aa773b8a20cd3d870259c
--- /dev/null
+++ b/docs/Getting_started/zh/os/os-info.md
@@ -0,0 +1,134 @@
+# 系统信息
+
+本文主要介绍如何使用 uos、usys、modem 等模块查询模组的固件信息、模组剩余内存大小等用户经常关注的信息,本文将不断补充,以方便用户了解模组的基本信息。
+
+## 查询固件版本信息
+
+```python
+>>> import uos
+# 查询QuecPython固件版本信息(QuecPython独有命名规则)
+>>> uos.uname()
+# 返回值(EC600U型号为例)
+# ('sysname=EC600U-CNLB', 'nodename=EC600U', 'release=1.13.0', 'version=v1.12 on Sat_Nov_19_2022_5:29:48_PM', 'machine=EC600U with QUECTEL', 'qpyver=V0002')
+```
+
+如上所示我们可以查询到模组型号 machine = EC600U with QUECTEL,即 EC600U,但固件中对型号的区分是 sysname = EC600U-CNLB,即这个固件可以在 EC600UCNLB 这个子型号中使用,一般严格遵循字母数字一一对应原则,但是也有例外情况存在,固件具体适用的模组型号以下载区的固件描述和移远官方技术人员描述为准。还可以查询到固件的编译日期和 microPython 版本 version = v1.12 on Sat_Nov_19_2022_5: 29: 48_PM,一般用于判断 BETA 版本(仅用于测试严禁量产的版本)新旧,由于 BETA 版本仅仅用于测试,所以 QuecPython 版本并非是正式发布的,故版本号信息不会变更,只能通过编译时间来确认版本,建议用户进行版本控制时也使用这种方式判断版本,拿到测试版本进行测试时也可以方便的进行版本控制。qpyver = V0002 这个字段即为 QuecPython 固件官网发布的正式版本号,在此不过多赘述。
+
+为什么要查询固件版本?
+
+在开发的过程中难免会遇到一些问题,并找到官方人员或技术前辈咨询,那么此时需要提供的信息中,固件版本就是必不可少的,除此之外使用 uos 库查询固件版本还有如下方法:
+
+```python
+>>> import uos
+>>> uos.uname2()
+# 返回值(以EC600U型号为例,需要注意此方法较老的固件版本不支持)
+# (sysname='EC600U-CNLB', nodename='EC600U', release='1.13.0', version='v1.12 on Sat_Nov_19_2022_5:29:48_PM', machine='EC600U with QUECTEL', qpyver='V0002')
+```
+
+如上所示,此接口和 uos.uname()返回的信息是一样的,只是返回值兼容了 microPython 的用法,更方便用户在脚本中访问返回值中“=”右边的信息,具体用法参考 [uos - 基本系统服务](../../../API_reference/zh/QuecPython标准库/uos.html)。
+
+除此之外我们还可以使用如下方法获取固件版本信息:
+
+```python
+>>> import modem
+# 查询Quectel固件版本信息(Quectel通用命名规则)
+>>> modem.getDevFwVersion()
+# 常见返回值类型(以EC600U型号为例)
+# 'EC600UCNLBR03A01M08_OCPU_QPY_BETA1207'
+# 'EC600UCNLBR03A02M08_OCPU_QPY'
+```
+
+如上所示,常见的两种返回值主要区别为是否包含 BETA 字段,包含 BETA 字段的固件为非正式发布版本固件,仅能用于测试,不用于项目量产,BETA 后为编译固件的日期,12 月 7 日。我们一般仅需关注是否包含 BETA 字段和 BETA 后的日期。
+
+此版本号除了使用 QuecPython 脚本查询外还可以使用 AT+GMR 命令进行查询,在这里不是我们的重点。
+
+AT 命令仅需一行即可查询,脚本需要两行,怎么解决?
+
+```python
+>>> import modem;modem.getDevFwVersion() # 两行合为一行,交互界面回车即可返回结果
+```
+
+## 查询模组运行内存和文件系统剩余空间
+
+```python
+import gc
+import uos
+
+usr = uos.statvfs("/usr")
+
+print('获取usr目录状态信息:', usr)
+print('f_bsize – 文件系统块大小,单位字节:', usr[0])
+print('f_bfree – 可用块数:', usr[3])
+print('usr剩下总空间 {} 字节'.format(usr[0] * usr[3]))
+print('usr剩下总空间 {} KB'.format((usr[0] * usr[3])/1024))
+print('usr剩下总空间 {} MB'.format((usr[0] * usr[3]) / 1024 / 1024))
+
+bak = uos.statvfs("/bak")
+
+print('获取bak目录状态信息:', bak)
+print('f_bsize – 文件系统块大小,单位字节:', bak[0])
+print('f_bfree – 可用块数:', bak[3])
+print('bak剩下总空间 {} 字节'.format(bak[0] * bak[3]))
+print('bak剩下总空间 {} KB'.format((bak[0] * bak[3])/1024))
+print('bak剩下总空间 {} MB'.format((bak[0] * bak[3]) / 1024 / 1024))
+
+mem = gc.mem_free()
+print('剩余可用RAM空间:{}KB'.format(mem / 1024))
+```
+
+如上所示我们使用 uos.statvfs 这个函数查询了根目录下'usr'和'bak'两个文件夹的状态信息,可以获取到文件夹的剩余空间大小。关于根目录和这两个文件夹做如下简介,根目录:对于用户来说是不允许操作的,所以对根目录做的任何操作都会导致报 OSerror 异常。'usr'目录:此目录是允许客户做文件读写操作的,通常客户代码等文件均是主要存放在这里,如需扩展请看 [外扩存储](./../hardware-advanced/ext-storage.html) 章节。'bak'目录:此目录是用于量产时存放客户需要备份的重要文件,可读不可写,存放重要文件请看 [备份分区和数据安全区的使用](./../mass-production/data-backup.html) 章节。
+
+其他 uos 相关使用请查看 [uos - 基本系统服务](../../../API_reference/zh/QuecPython标准库/uos.html)。
+
+## 查询 microPython 虚拟机版本
+
+```python
+>>> try:import usys as sys
+... except ImportError:import sys
+>>> sys.implementation
+# 返回值
+# (name='micropython', version=(1, 13, 0), mpy=10245)
+```
+
+如上所示可以直接查询到 microPython 虚拟机版本是 1.13.0 版本,虽然可以查询到 microPython 虚拟机版本,但是不少用法仍和 microPython 不同,需要注意。以上示例使用 try-except 语句进行 import 的原因就是不同时期的固件 microPython 虚拟机版本不同,部分模块出现了更名的情况,为避免出现异常导致程序退出运行,使用了 python 的异常处理语法。后续 QuecPython 将为避免出现此类情况,在移植 microPython 新虚拟机时即将模块命名同历史版本进行兼容,方便用户的使用。
+
+## 查询 microPython 语言版本
+
+```python
+>>> try:import usys as sys
+... except ImportError:import sys
+>>> sys.version
+# 返回值
+# '3.4.0'
+>>> sys.version_info
+# 返回值
+# (3, 4, 0)
+```
+
+如上所示,使用了两个 API 进行的查询,两个 API 的主要差异为返回值形式不同。当前查询的 microPython 语言版本是 3.4.0,在语法上是兼容电脑端 CPython 的 3.4.0 版本,后续是否有变更可以使用此接口查询。
+
+## 查询设备的 IMEI
+
+```python
+>>> import modem
+>>> modem.getDevImei()
+# 返回值
+# '866327040830317'
+```
+
+如上所示,获取设备的 IMEI 号虽然十分简单,但是又特别的常用,所以在这里介绍一下如何查询。那么,IMEI 是什么呢?
+
+物联网模块的 IMEI 是国际移动设备身份码(International Mobile Equipment Identity)的缩写,它是用于识别物联网模块的唯一标识符。在物联网场景中,IMEI 可以用于以下几个方面:
+
+1. 设备识别和管理:通过 IMEI,可以唯一地识别和管理物联网设备,包括设备的制造商、型号和版本等信息。这些信息对于设备的维护和升级非常重要。
+2. 安全性和防盗:IMEI 可以用于防止设备被盗或丢失。如果设备的 IMEI 被注册到一个中央数据库中,就可以通过该数据库来追踪设备的位置和使用情况。
+3. 远程管理和控制:IMEI 可以用于远程管理和控制物联网设备。例如,如果设备出现故障或需要更新固件,就可以通过 IMEI 来远程诊断和修复设备。
+4. 数据统计和分析:IMEI 可以用于统计和分析物联网设备的使用情况。例如,可以根据 IMEI 来确定设备的使用时间、位置、频率和使用模式等信息,以便更好地了解设备的使用情况和优化设备的性能。
+
+总之,IMEI 是物联网设备非常重要的标识符,可以用于设备管理、安全性、远程管理和数据分析等方面。
+
+使用 modem 库查询其他设备信息不再赘述,请查看 [modem - 设备相关](./../API_reference/zh/QuecPython类库/modem.html)。
+
+## 总结
+
+用户经常关注的模块相关的,可以通过 microPython 脚本查询到的信息均在此做了介绍,如有疑问或更好的建议欢迎联系我们,也可以直接向我们提交文档贡献,后续本文将继续完善和补充。
diff --git a/docs/Getting_started/zh/os/time.md b/docs/Getting_started/zh/os/time.md
new file mode 100644
index 0000000000000000000000000000000000000000..bfbea624a1498856c08c7b6162c028699cce646a
--- /dev/null
+++ b/docs/Getting_started/zh/os/time.md
@@ -0,0 +1,142 @@
+# 时间功能
+
+在使用 QuecPython 开发物联网应用程序时,时间功能对于一些用户来说是非常重要的一部分。本文将介绍如何在 QuecPython 中使用时间功能。
+
+主要围绕以下几个功能展开介绍:
+
+[ntptime - NTP 对时](../../../API_reference/zh/QuecPython组件库/ntptime.html)
+
+[class RTC – 实时时钟](../../../API_reference/zh/QuecPython类库/machine.RTC.html)
+
+[utime - 时间相关功能](../../../API_reference/zh/QuecPython标准库/utime.html)
+
+[machine.Timer - 硬件定时器](../../../API_reference/zh/QuecPython类库/machine.Timer.html)
+
+## 时间同步
+
+在一些需要准确时间的应用中,可以通过与网络时间服务器进行同步来保证时间的准确性,虽然不主动对时我们也可以在模块联网的时候从网络获取到时间,但是这个时间出现过不准确的情况,所以建议先进行时间同步。在 QuecPython 中,可以使用 `ntptime` 模块与 NTP 服务器进行时间同步,但是此功能依赖于网络,在使用此功能前务必确保我们的网络已经正常,可以参见 [天线、SIM 卡和网络注册](./../iot-basic/preparation.html) 章节。并且确保您的卡没有被限制 ip 访问范围,如有限制需要联系运营商将 NTP 服务器加入白名单,或者自己实现对时功能确保时间能够被校准。
+
+当前我们的 `ntptime` 模块默认支持五个常用服务器域名:"ntp.aliyun.com", "pool.ntp.org", "asia.pool.ntp.org", "cn.ntp.org.cn", "cn.pool.ntp.org",当其中任何一个异常时,都将自动切换下一个域名,如仍不能满足您的需求,您可以选择设置自己更为可靠的服务器。
+
+```python
+import utime
+import ntptime
+
+# 设置 NTP 服务器
+ntptime.host = "pool.ntp.org"
+
+# 同步时间(以同步东八区时间为例)
+ntptime.settime(timezone=8)
+
+# 获取同步后的时间戳
+current_timestamp = utime.time()
+
+# 将时间戳转换为本地时间
+local_time = utime.localtime(current_timestamp)
+
+# 打印本地时间
+print(local_time)
+```
+
+在上面的代码中,`ntptime.host` 变量设置了 NTP 服务器的地址,`ntptime.settime()` 函数与 NTP 服务器进行时间同步,`utime.time()` 函数获取同步后的时间戳。
+
+ 需要注意的是,并不能过于频繁的进行 NTP 对时,下面的文章将会继续介绍原因。
+
+## 获取当前时间
+
+获取当前时间是最基本的时间操作。在 QuecPython 中,可以使用 `utime` 模块获取当前时间上一部分也有实际用到,但是实际上可以更简单,并且 `utime` 模块还有其他更加实用的时间功能,具体查看 API 介绍,这里介绍用的较多的。
+
+```python
+import utime
+
+# 直接获取本地时间
+local_time = utime.localtime()
+
+# 打印本地时间
+print(local_time)
+
+# 设置时区,不建议使用,建议使用 ntptime
+utime.setTimeZone(offset)
+
+# 休眠即延时
+utime.sleep(1)
+utime.sleep_ms(1)
+utime.sleep_us(1)
+```
+
+在上面的代码中,`utime.localtime()` 函数可以直接获取本地时间,十分方便,但是前提是 RTC 时间已经是正确的,因为这里的时间实际来源于 RTC 时间,关于 RTC 的介绍详见下文。
+
+`utime` 模块中的设置时区实际并不好用,不如使用 ntptime 对时的同时设置时区。
+
+`utime` 模块中的 sleep 延时功能有着很多的用处,同时也有一些使用建议。
+
+1. 首先从其字面含义来说,在我们想让模块处于睡眠状态时(依赖其他前提条件,详见 [低功耗](./../hardware-advanced/pm.html) 章节),需要正在执行这个函数。
+
+2. 之所以调用这个函数时模块可以处于睡眠,是因为调用这个函数时,模块主动让出了 CPU 执行权限,基于这个特性,当我们在使用多线程时每个死循环里也必须使用这个函数,来主动让出 CPU 执行权限,使得各个线程均能够正常得到调度,sleep 时间无特殊要求,详见 [多线程](./threads.html) 章节。
+
+3. 使用 sleep 函数来进行软件延时。需要注意 sleep 的软件延时并不精准,无法作为高精度延时来使用,并且虽然具有 sleep_us 这个函数,但是并不能进行微秒级的延时,延时的最小时间需要实测确认。
+
+4.`utime.sleep`、`utime.sleep_ms` 及 `utime.sleep_us` 函数的调用会导致程序休眠阻塞。
+
+`utime` 模块除了这些功能,还有一个比较实用的功能,可以测量两段脚本之间的执行时间,详见 API 介绍文档,不过多赘述。
+
+## RTC 实时时钟
+
+RTC(Real Time Clock) 实时时钟是一种硬件设备,它可以提供独立于操作系统的时间计时服务,即使设备关机(不断电)也能保持时间的准确性。在 QuecPython 中,可以使用 `machine` 模块访问 RTC 实时时钟。对于 RTC 的所有用法参见 [class RTC – 实时时钟](../../../API_reference/zh/QuecPython类库/machine.RTC.html) 章节,下面主要介绍常用操作与注意事项。
+
+```python
+from machine import RTC
+
+# 初始化 RTC 实时时钟
+rtc = RTC()
+
+# 设置 RTC 时间
+rtc.datetime([2020, 3, 12, 1, 12, 12, 12, 0])
+
+# 获取 RTC 时间
+rtc_time = rtc.datetime()
+
+# 打印 RTC 时间
+print(rtc_time)
+```
+
+在上面的代码中,主要介绍了如何使用 RTC 获取和设置模块的时间,至此,我们可以知道,虽然 `utime` 和 `RTC` 都能够获取时间,但是只有 `RTC` 是能够设置时间的,所以 `utime` 的时间也是来源于 `RTC` 设置的时间,整个系统中的时间,除了从网络中获取的,其余均来自于 `RTC`,网络中同步的时间,如基站提供的时间、NTP 服务器提供的时间则是通过 `RTC` 来设置到系统中的。
+
+上面提到不能频繁进行 NTP 对时的原因也在这里,因为 RTC 每设置一次时间都会擦写模块内部的 flash,会导致 flash 的寿命减少,flash 的擦写次数上限一般为 10 万次。
+
+`RTC` 模块中还有一个函数对于部分场景比较实用,`rtc.set_alarm`,具体用法和适用的模块详见对应的 API 介绍文档,这个函数同样会擦写 flash,不宜频繁调用。其实用性主要体现在,部分型号可以在关机后由 `RTC` 唤醒开机,而开机时间就是由这个函数进行设置的,这个功能可以应用于对功耗要求较高的场景,除此之外还可以对一般的低功耗模式进行唤醒,详见 [低功耗](./../hardware-advanced/pm.html)。
+
+## 综合示例代码
+
+以下是一个完整的示例代码,该代码实现了获取当前时间、RTC 时间、时间同步、时间格式化、时间延时等功能。
+
+```python
+import utime
+import machine
+import ntptime
+
+# 同步东八区时间
+ntptime.host = "pool.ntp.org"
+ntptime.settime(timezone=8)
+current_timestamp = utime.localtime()
+print("Synchronized time:", current_timestamp)
+
+# 获取 RTC 时间
+rtc = machine.RTC()
+rtc_time = rtc.datetime()
+print("RTC time:", rtc_time)
+
+# 获取当前时间
+current_timestamp = utime.localtime()
+print("Current timestamp:", current_timestamp)
+
+# 延时
+utime.sleep(1)
+print("Delay 1 second.")
+utime.sleep_ms(500)
+print("Delay 500ms.")
+```
+
+## 总结
+
+用户经常关注的时间相关的功能应用均在此做了介绍,如有疑问或更好的建议欢迎联系我们,也可以直接向我们提交文档贡献,后续本文将继续完善和补充。
diff --git "a/docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LTE\347\263\273\345\210\227\346\250\241\347\273\204/README.md" b/docs/Getting_started/zh/other-resources/README.md
similarity index 100%
rename from "docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LTE\347\263\273\345\210\227\346\250\241\347\273\204/README.md"
rename to docs/Getting_started/zh/other-resources/README.md
diff --git "a/docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LTE\347\263\273\345\210\227\346\250\241\347\273\204/Unisoc\347\263\273\345\210\227\346\250\241\347\273\204/README.md" b/docs/Getting_started/zh/quick-start/README.md
similarity index 100%
rename from "docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/LTE\347\263\273\345\210\227\346\250\241\347\273\204/Unisoc\347\263\273\345\210\227\346\250\241\347\273\204/README.md"
rename to docs/Getting_started/zh/quick-start/README.md
diff --git a/docs/Getting_started/zh/sidebar.yaml b/docs/Getting_started/zh/sidebar.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9b53f50148c369135ce54f3b1690d39564adaadc
--- /dev/null
+++ b/docs/Getting_started/zh/sidebar.yaml
@@ -0,0 +1,226 @@
+items:
+- label: '1: 背景知识'
+ file: background/README.md
+ items:
+
+ - label: '1.1: 物联网和低代码开发'
+ file: background/iot-and-low-code.md
+ - label: '1.2: 无线通信模块简介'
+ file: background/wireless-modules.md
+ - label: '1.3: QuecPython 简介'
+ file: background/about-qpy.md
+ - label: '1.4: 硬件选型'
+ file: background/selection-guide.md
+
+- label: '2: 快速入门'
+ file: quick-start/README.md
+ items:
+
+ - label: '2.1: 准备工作'
+ file: quick-start/preparation.md
+ - label: '2.2: 上电与连接'
+ file: quick-start/boot-and-connect.md
+ - label: '2.3: 固件烧录'
+ file: quick-start/burn-firmware.md
+ - label: '2.4: QPYcom 基本操作'
+ file: quick-start/qpycom-basic.md
+
+- label: '3: MicroPython 语言基础'
+ file: mpy-syntax/README.md
+ items:
+
+ - label: '3.1: 基本语法规则'
+ file: mpy-syntax/rules.md
+ - label: '3.2: 变量和运算'
+ file: mpy-syntax/vars-and-ops.md
+ - label: '3.3: 程序流程控制'
+ file: mpy-syntax/flow-control.md
+ - label: '3.4: 常用容器类型'
+ file: mpy-syntax/containers.md
+ - label: '3.5: 函数'
+ file: mpy-syntax/functions.md
+
+- label: '4: QuecPython 系统功能'
+ file: os/README.md
+ items:
+
+ - label: '4.1: 系统信息'
+ file: os/os-info.md
+ - label: '4.2: 日志功能'
+ file: os/log.md
+ - label: '4.3: 文件管理'
+ file: os/files.md
+ - label: '4.4: 时间功能'
+ file: os/time.md
+ - label: '4.5: 数据格式转换'
+ file: os/data-formattng.md
+ - label: '4.6: 电源管理'
+ file: os/power.md
+ - label: '4.7: 内存管理'
+ file: os/ram.md
+ - label: '4.8: 多线程'
+ file: os/threads.md
+
+- label: '5: QuecPython 硬件基础功能'
+ file: hardware-basic/README.md
+ items:
+
+ - label: '5.1: GPIO'
+ file: hardware-basic/gpio.md
+ - label: '5.2: 外部中断'
+ file: hardware-basic/extint.md
+ - label: '5.3: 串口'
+ file: hardware-basic/uart.md
+ - label: '5.4: I2C'
+ file: hardware-basic/i2c.md
+ - label: '5.5: SPI'
+ file: hardware-basic/spi.md
+ - label: '5.6: ADC'
+ file: hardware-basic/adc.md
+ - label: '5.7: Timer'
+ file: hardware-basic/timer.md
+ - label: '5.8: PWM'
+ file: hardware-basic/pwm.md
+ - label: '5.9: 看门狗'
+ file: hardware-basic/wdt.md
+
+- label: '6: QuecPython 物联网基础功能'
+ file: iot-basic/README.md
+ items:
+
+ - label: '6.1: 天线、SIM 卡和网络注册'
+ file: iot-basic/preparation.md
+ - label: '6.2: TCP 与 UDP 通信'
+ file: iot-basic/tcp-and-udp.md
+ - label: '6.3: HTTP 通信'
+ file: iot-basic/http.md
+ - label: '6.4: MQTT 通信'
+ file: iot-basic/mqtt.md
+ - label: '6.5: WebSocket 通信'
+ file: iot-basic/websocket.md
+ - label: '6.6: 通信异常处理'
+ file: iot-basic/exceptions.md
+
+- label: '7: QuecPython 云平台功能'
+ file: clouds/README.md
+ items:
+
+ - label: '7.1: 移远云'
+ file: clouds/quectel.md
+ - label: '7.2: 阿里云'
+ file: clouds/aliyun.md
+ - label: '7.3: 腾讯云'
+ file: clouds/tencent.md
+ - label: '7.4: 华为云'
+ file: clouds/huawei.md
+ - label: '7.5: 亚马逊云'
+ file: clouds/aws.md
+ - label: '7.6: 移动云'
+ file: clouds/onenet.md
+ - label: '7.7: 电信云'
+ file: clouds/ctyun.md
+
+- label: '8: QuecPython 硬件高级功能'
+ file: hardware-advanced/README.md
+ items:
+
+ - label: '8.1: 屏幕显示'
+ file: hardware-advanced/screen.md
+ - label: '8.2: LVGL'
+ file: hardware-advanced/lvgl.md
+ - label: '8.3: 摄像头'
+ file: hardware-advanced/camera.md
+ - label: '8.4: 低功耗'
+ file: hardware-advanced/pm.md
+ - label: '8.5: 音频和 TTS'
+ file: hardware-advanced/audio.md
+ - label: '8.6: 外接存储'
+ file: hardware-advanced/ext-storage.md
+ - label: '8.7: 外接以太网'
+ file: hardware-advanced/ext-ethernet.md
+ - label: '8.8: 矩阵键盘'
+ file: hardware-advanced/matrix-keypad.md
+ - label: '8.9: BT 和 BLE'
+ file: hardware-advanced/bt-and-ble.md
+ - label: '8.10: USB 网卡'
+ file: hardware-advanced/usb-wireless-card.md
+ - label: '8.11: 外接 WiFi'
+ file: hardware-advanced/ext-wifi.md
+
+- label: '9: QuecPython 物联网高级功能'
+ file: iot-advanced/README.md
+ items:
+
+ - label: '9.1: APN 和数据拨号'
+ file: iot-advanced/apn-and-datacall.md
+
+ - label: '9.2: 语音通话'
+ file: iot-advanced/voicecall.md
+
+ - label: '9.3: 短信'
+ file: iot-advanced/sms.md
+
+ label: '9.4: 定位'
+ file: iot-advanced/location.md
+
+ label: '9.5: OTA 升级'
+ file: iot-advanced/ota.md
+
+ label: '9.6: AES-128 加解密'
+ file: iot-advanced/aes128.md
+
+- label: '10: 其他开发资源'
+ file: other-resources/README.md
+ items:
+
+ - label: '10.1: QuecPython 编程框架'
+ file: other-resources/programming-framework.md
+ - label: '10.2: HeliosSDK'
+ file: other-resources/helios-sdk.md
+
+- label: '11: 量产相关'
+ file: mass-production/README.md
+ items:
+
+ - label: '11.1: 脚本加密和固件打包'
+ file: mass-production/encryption-and-packaging.md
+ - label: '11.2: 备份分区和数据安全区的使用'
+ file: mass-production/data-backup.md
+ - label: '11.3: 量产工具使用'
+ file: mass-production/production-tools.md
+ - label: '11.4: 产测工具使用'
+ file: mass-production/testing-tools.md
+ - label: '11.5: 硬件设计和生产注意事项'
+ file: mass-production/considerations.md
+
+- label: '12: 产品方案介绍'
+ file: solutions/README.md
+ items:
+
+ - label: '12.1: DTU'
+ file: solutions/dtu.md
+ - label: '12.2: 定位器'
+ file: solutions/tracker.md
+ - label: '12.3: 对讲机'
+ file: solutions/poc.md
+ - label: '12.4: 电表'
+ file: solutions/smart-meter.md
+ - label: '12.5: 云喇叭'
+ file: solutions/payment-speaker.md
+ - label: '12.6: 门磁开关'
+ file: solutions/door-sensor.md
+ - label: '12.7: 学生卡'
+ file: solutions/student-card.md
+ - label: '12.8: 充电桩'
+ file: solutions/charging-pile.md
+
+- label: '13: 附录'
+ file: appendix/README.md
+ items:
+
+ - label: '13.1: QuecPython 开发板板载资源列表'
+ file: appendix/evb-resources.md
+ - label: '13.2: QuecPython 错误码汇总'
+ file: appendix/error-code.md
+ - label: '13.3: QuecPython 异常处理流程'
+ file: appendix/exception-handling.md
diff --git "a/docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/README.md" b/docs/Getting_started/zh/solutions/README.md
similarity index 100%
rename from "docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/README.md"
rename to docs/Getting_started/zh/solutions/README.md
diff --git a/docs/advanced_tutorial/zh/Note.md b/docs/advanced_tutorial/zh/Note.md
deleted file mode 100644
index 8dfeeb80b1ddf2308faf68e3766e67cfb1c85db9..0000000000000000000000000000000000000000
--- a/docs/advanced_tutorial/zh/Note.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# QuecPython 高级教程文档编写注意事项
-
-## 目录结构
-
-高级教程根目录下存在一个名为`README.md`的文件,作为高级教程的首页入口。
-
-> 文档中心使用的[teedoc](https://gitee.com/teedoc)架构要求每个版块的首页文件都要是名为`README.md`的文件。
-
-每个功能板块在根目录下均对应一个文件夹,在该文件夹内,按照功能板块,拆分为多个对应的md文件。
-
-所有md文件中引用的图片,均存放于media目录中:
-- 高级教程文件夹下有多少文件夹,在media也按照目录关系建立相应的文件夹。
-- 图片统一为png格式,命名请见名知意,如`BT.xxx.png`,其中`xxx`表示用简短英文编写的图片作用描述。
-
-目录结构示例如下:
-
-```
-QuecPython官网文档中心/高级教程
-├── Note.md
-├── QuecPython应用框架
-│ ├── QuecPython应用框架-EventMesh.md
-│ ├── QuecPython应用框架-HeliosService.md
-│ └── QuecPython应用框架.md
-├── README.md
-├── media
-│ ├── 云平台对接
-│ │ └── Cloud.xxx.png
-│ └── 蓝牙开发
-│ └── BT.xxx.png
-├── 云平台对接
-│ ├── 云平台对接-AWS.md
-│ ├── 云平台对接-华为云.md
-│ ├── 云平台对接-移远云.md
-│ ├── 云平台对接-腾讯云.md
-│ ├── 云平台对接-阿里云.md
-│ └── 云平台对接.md
-├── 图形化界面开发
-│ ├── 图形化界面开发-Demo-手表.md
-│ ├── 图形化界面开发-Demo-贪吃蛇.md
-│ ├── 图形化界面开发-LVGL概述.md
-│ ├── 图形化界面开发-基础控件应用.md
-│ └── 图形化界面开发.md
-└── 蓝牙开发
- ├── 低功耗蓝牙开发
- │ ├── 低功耗蓝牙开发-Master.md
- │ └── 低功耗蓝牙开发-Slave.md
- ├── 经典蓝牙开发
- │ ├── 经典蓝牙开发-Master.md
- │ └── 经典蓝牙开发-Slave.md
- └── 蓝牙开发.md
-```
-
-## README.md
-
-README.md作为板块的首页入口,需要对该板块做综合性描述,并且在最后提供板块的所有二级目录链接。
-
-## 正文内容格式
-
-参照以下格式:
-
-```markdown
-# 低功耗蓝牙开发教程
-
-正文
-
-```
-
-## QuecPython 高级教程
-
-[点此查看](./README.md)
diff --git a/docs/advanced_tutorial/zh/README.md b/docs/advanced_tutorial/zh/README.md
deleted file mode 100644
index a5d261f627a43980bca5f9c9d963844d63f257ec..0000000000000000000000000000000000000000
--- a/docs/advanced_tutorial/zh/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# 高级教程
-
-高级教程主要介绍QuecPython开发中复杂度偏高的内容,期望可以通过这些文档让用户的项目开发更加简单方便。
-
-# 高级教程文档目录
-
-- [QuecPython应用框架](QuecPython应用框架/README.md)
-- [蓝牙开发](蓝牙开发/README.md)
-- [图形化界面开发](图形化界面开发/README.md)
-- [云平台对接](云平台对接/README.md)
-- [HeliosSDK](HeliosSDK/README.md)
-- [定位应用开发](定位应用开发/README.md)
-- [低功耗应用开发](低功耗应用开发/README.md)
\ No newline at end of file
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_01.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_01.png"
deleted file mode 100644
index 6ce502a3c5166c2dfd63feca1b95aa02681d5138..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_01.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_02.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_02.png"
deleted file mode 100644
index d62b95b986a065f7e652bad1f200d197a8f7f4f5..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_02.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_03.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_03.png"
deleted file mode 100644
index 1895ead687c6c14d25a86df471d3346e10e2a30b..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_03.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_04.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_04.png"
deleted file mode 100644
index 6d1c6da36e220508a35d3bfaae0537ee547472eb..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_04.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_05.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_05.png"
deleted file mode 100644
index 5cce5810dad9d53ffc8835d350c9de1c39df788a..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_05.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_06.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_06.png"
deleted file mode 100644
index 8f8e0615e0f1da2cd3b7041af333cdbddec67b3e..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_06.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_07.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_07.png"
deleted file mode 100644
index 74d35fd8549c2801686910a6cbf6bdf59f9669de..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_07.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_08.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_08.png"
deleted file mode 100644
index bdffec3a62de8adcc55e982c4751ea8dcb2193ba..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_08.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_09.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_09.png"
deleted file mode 100644
index deecd9e1054541ee5a5cd4d2d080486f8deb102f..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_09.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_10.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_10.png"
deleted file mode 100644
index aa8744987075cd4e4a52d84b33460b26ccae0f65..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_10.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_11.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_11.png"
deleted file mode 100644
index 3edf0e0f35a7eeab130700beecd5cb1309db62af..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_11.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_12.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_12.png"
deleted file mode 100644
index db4f7608ff92912a9dc20c6269bbcefede711da0..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_12.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_13.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_13.png"
deleted file mode 100644
index 22918c0e9ef023385e93b5be9ddf9248d8abb5ad..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_13.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_14.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_14.png"
deleted file mode 100644
index 9cdea6e45f0dd590284eb192340a44a3850ae743..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_14.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_15.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_15.png"
deleted file mode 100644
index da0e93167b0be9269b18fdf709325db2822c80bd..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_15.png" and /dev/null differ
diff --git "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_16.png" "b/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_16.png"
deleted file mode 100644
index 79856c073eed6f73b8b477e31092b224daf35553..0000000000000000000000000000000000000000
Binary files "a/docs/advanced_tutorial/zh/media/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245AWS_16.png" and /dev/null differ
diff --git a/docs/advanced_tutorial/zh/sidebar.yaml b/docs/advanced_tutorial/zh/sidebar.yaml
deleted file mode 100644
index 261db4c25845f8c91c82664c15ea8c1e7f2a3ef8..0000000000000000000000000000000000000000
--- a/docs/advanced_tutorial/zh/sidebar.yaml
+++ /dev/null
@@ -1,86 +0,0 @@
-items:
-- label: QuecPython应用框架
- file: QuecPython应用框架/README.md
-
- items:
-
- - label: QuecPython应用框架-EventMesh
- file: QuecPython应用框架/QuecPython应用框架-EventMesh.md
- - label: QuecPython应用框架-HeliosService
- file: QuecPython应用框架/QuecPython应用框架-HeliosService.md
-
-- label: 蓝牙开发
- file: 蓝牙开发/README.md
-
- items:
-
- - label: 蓝牙开发-低功耗蓝牙开发
- file: 蓝牙开发/低功耗蓝牙开发.md
- - label: 蓝牙开发-经典蓝牙开发
- file: 蓝牙开发/经典蓝牙开发.md
-
-- label: 图形化界面开发
- file: 图形化界面开发/README.md
-
- items:
-
- - label: 图形化界面开发-LVGL概述
- file: 图形化界面开发/LVGL概述.md
- - label: 图形化界面开发-LVGL基础控件应用
- file: 图形化界面开发/LVGL基础控件应用.md
- - label: 图形化界面开发-Demo-手表
- file: 图形化界面开发/Demo-手表.md
- - label: 图形化界面开发-Demo-贪吃蛇
- file: 图形化界面开发/Demo-贪吃蛇.md
-
-- label: 云平台对接
- file: 云平台对接/README.md
-
- items:
-
- - label: 云平台对接-移远云
- file: 云平台对接/云平台对接-移远云.md
- - label: 云平台对接-阿里云
- file: 云平台对接/云平台对接-阿里云.md
- - label: 云平台对接-腾讯云
- file: 云平台对接/云平台对接-腾讯云.md
- - label: 云平台对接-华为云
- file: 云平台对接/云平台对接-华为云.md
- - label: 云平台对接-移动OneNET
- file: 云平台对接/云平台对接-移动OneNET.md
- - label: 云平台对接-电信CTWing
- file: 云平台对接/云平台对接-电信CTWing.md
- - label: 云平台对接-MQTT私有云
- file: 云平台对接/云平台对接-MQTT私有云.md
-
-- label: HeliosSDK
- file: HeliosSDK/README.md
-
- items:
-
- - label: HeliosSDK
- file: HeliosSDK/初级教程.md
- - label: HeliosSDK
- file: HeliosSDK/中级教程.md
- - label: HeliosSDK
- file: HeliosSDK/高级教程.md
-
-- label: 定位应用开发
- file: 定位应用开发/README.md
-
- items:
-
- - label: 基站定位-WiFi定位-GNSS定位
- file: 定位应用开发/基站定位-WiFi定位-GNSS定位.md
- - label: RTK高精度厘米级定位
- file: 定位应用开发/RTK高精度厘米级定位.md
-
-- label: 低功耗应用开发
- file: 低功耗应用开发/README.md
-
- items:
-
- - label: 低功耗应用开发-休眠
- file: 低功耗应用开发/低功耗应用开发-休眠.md
- - label: 低功耗应用开发-PSM
- file: 低功耗应用开发/低功耗应用开发-PSM.md
\ No newline at end of file
diff --git "a/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS.md" "b/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS.md"
deleted file mode 100644
index 1f7d3bc7982e805e7d426c0fe2be2ec82d5ed4f1..0000000000000000000000000000000000000000
--- "a/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/AWS.md"
+++ /dev/null
@@ -1,242 +0,0 @@
-# 云平台对接-AWS应用开发
-
-## 什么是云平台AWS
-
-AWS 全称Amazon web service(亚马逊网络服务),是亚马逊公司旗下云计算服务平台,为全世界各个国家和地区的客户提供一整套基础设施和云解决方案。 AWS面向用户提供包括弹性计算、存储、数据库、物联网在内的一整套云计算服务,帮助企业降低IT投入和维护成本,轻松上云 从概念是来看,AWS提供了一系列的托管产品,帮助我们在没有物理服务器的情况下,照样可以正常完成软件开发中的各种需求,也就是我们常说的云服务。
-
-## 怎么使用云平台AWS
-
-#### 【进入平台】
-
-[亚马逊云首页](https://amazonaws-china.com/cn/)点击【产品】---【物联网】---【AWS IoT Core】
-
-
-
-
-
-
-
-#### 【创建策略】
-
-
-
-
-
-#### 【创建物品】
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-至此完成“创建物品”。用证书连接AWS IoT平台,同一个证书可以用于多个设备,不同设备的Client ID保持唯一。
-
-
-
-#### 【设备通信】
-
-获取AWS服务器的MQTT连接地址、端口:
-
-
-
-使用MQTT.fx工具测试通信,在订阅主题栏填写“#”,表示接收所有主题。
-
-
-
-
-
-
-
-
-
-### 软件应用
-
-看到代码在创建MQTTClient的时间,设置了ssl=True,"cert": certificate_content,"key": private_content 等关键参数,其中证书是在AWS平台下载获取。
-
-```python
-from umqtt import MQTTClient
-import modem
-import _thread
-import checkNet
-import utime
-from misc import Power
-
-CLIENT_ID = b'Chic_001'
-SERVER = b'ambzd54j67b7h-ats.iot.us-west-2.amazonaws.com'
-PORT = 8883
-USER = None # b''
-PASSWORD = None # b''
-
-# 1. 数字证书 (certificate.crt)
-# 2. 私钥 (private.pem)
-
-certificate_content = """
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIVAKxYi7zakXXKtbz5k2T72amn9k0GMA0GCSqGSIb3DQEB
-CwUAME0xSzBJBgNVBAsMQkFtYXpvbiBXZWIgU2VydmljZXMgTz1BbWF6b24uY29t
-IEluYy4gTD1TZWF0dGxlIFNUPVdhc2hpbmd0b24gQz1VUzAeFw0yMjA2MDYwNzU1
-MzNaFw00OTEyMzEyMzU5NTlaMB4xHDAaBgNVBAMME0FXUyBJb1QgQ2VydGlmaWNh
-dGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDW9JpDiRLvYBt/62o7
-1fGfXG+MH9fC4+AnjPT1Kn4l1jKulEyix6ICGXL2+Ms77GXJrB+uIpMb4NgxG2D1
-qeA/xDKkh2QHXWvXsVf2KqWjRekprHLLNDWjZuig14cOhaDrIRlQfPoMMFsnehBZ
-BUwyZZferg9u/GXor5hKAkLSpmCLsMAex6tn1f/ZpNwrrXABumLD+GX64L0XUla9
-kzj7b7qc2bSLirQVCmS44tk3Jvu2B3eS8Xf05CNkTLvdlHWhjepLtyDbukj9/HIJ
-+CC0uYk7OYmfz85RhfVM0jbmFd2ebFS9yLnTsM0MZ/9weV/1NbEbQwwNnajKy3Q9
-LcsHAgMBAAGjYDBeMB8GA1UdIwQYMBaAFBruG06tF4R5Jac0d3Vq+WPmtW8hMB0G
-A1UdDgQWBBSzpZijfWVvj/e9yy/+mYFP46lPgjAMBgNVHRMBAf8EAjAAMA4GA1Ud
-DwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEAIxfbQzXNn8wnSOd/O1mEKdpu
-nqw1FScwBSrKAx5IMb4LouOwl2OiLvPRNyCvKF5vVRsLHlCVFC2F4epJ2GgUhkid
-rE0aiIACPgmtjF1vzHRU8nMOLKMsqE0gehw5zlqWaVKICIBe8ZrzTspipONeJL/B
-MUWc5Jc1LoR37CmUKe2M//b3dh1Q4/aaSYEWG1J1cAk0mpKogBhJzK/JIsnzoW8D
-Ho9pMvj8hdd5/PVx4Euj02IkG/uoxLqAcUu7TPotu5kTa5SWPhk7PANv84rlN5Xn
-FyqMdt3hj3kHutTAv+MjAvjp/nmoi80NVEHhNlXYb2Cs4b877xxHMv/uzmZI7A==
------END CERTIFICATE-----
-"""
-
-private_content = """
------BEGIN RSA PRIVATE KEY-----
-MIIEogIBAAKCAQEA1vSaQ4kS72Abf+tqO9Xxn1xvjB/XwuPgJ4z09Sp+JdYyrpRM
-oseiAhly9vjLO+xlyawfriKTG+DYMRtg9angP8QypIdkB11r17FX9iqlo0XpKaxy
-yzQ1o2booNeHDoWg6yEZUHz6DDBbJ3oQWQVMMmWX3q4Pbvxl6K+YSgJC0qZgi7DA
-HserZ9X/2aTcK61wAbpiw/hl+uC9F1JWvZM4+2+6nNm0i4q0FQpkuOLZNyb7tgd3
-kvF39OQjZEy73ZR1oY3qS7cg27pI/fxyCfggtLmJOzmJn8/OUYX1TNI25hXdnmxU
-vci507DNDGf/cHlf9TWxG0MMDZ2oyst0PS3LBwIDAQABAoIBAEqP7FbS3HOWRdO4
-iFAbJUYfHT5g6UncG6v8dBf61mkvhMMUBAVO9D6AL2XF5VFy7dfn0dFogtjfxH48
-PgTZGUVlPB/gKu13FWprRNTJ9EzPelKPU/5yrMxybO0l9d4usiP9hjdqMp45w9TM
-vZDzinvMy8JdZFMeUAdHqa66XA2PL99kaRbptzWx3nX60auDMIIvzO7mORdl+TwU
-AFX5VA7ixkIWl55gH45exU6U1Px93WeUaG05QtECtj69MjQevgcT+xJ8bk7qZYjD
-nHsyuf3MRdt5mASNG29dA3/WIbBPfn+65RdZFNm2KdGV78pDsoLQEZJU+iGqPq2E
-QNcZeBECgYEA9845Qo4O0adLxStNwBszSROWp2zmitF1dAEBb8Ycjdngy/XplwLO
-0+1xJAyek2Vjam8oHEmvGNr3QUqlIIP8xKBZs2zZyxiYYo/E4h4J5QIV1uQL/Zqe
-wE+2wfVCgfMhjOnXDPjuSyV9NkwQxYYsHQv4X6RKN3QrYysyqDVoDFkCgYEA3hBK
-F2C9jm7OOO0M77EQGwAb4aSIlSfJFXcl6ef18Rgido2oiA3GssckorssxorGdnhj
-0lIgFK84SPokGYFVc5xh93zL9hskSEyrHDceeVAfsnp/xTmwk4Z+ngJrfCpP6mrx
-I8DGVxc2MgurXYsVS8Gx7zqmqe9Uvchf0qAcJl8CgYAifd/WdbN2VxTi0s41qROQ
-Xluf3jaQp+rzRJiQmECtNeBmQ0pKLKfhM7GF1QPVfE1EKUip90+Z5BB6VAt75SMv
-syoJIWOHM1syjNRYrNmvuISVrpRErlreZboIcTzanZ7T4FCAi72PVB6Dij7jX3OQ
-b3QYy+NQqKjJWt/oLdbXsQKBgFO1rkhrxmkn6gNZkPPWOm0DOH9x567aZZn65Ubs
-kzDEWVF5ixtmng2MtonFp1Zcv/2u2mpRXRiPCNexu+QFdjHztJZ36+clSiMbC7HC
-MXGnu5srRHkTizXBkH9+CAixZpjGoYpJxDrWXC63aW0E3g1Fwg6dfHA48Sftnfmn
-M5VfAoGAUUBGEbg7kImiSx1r357EMB2Vt4UwgWdY5idiaajYEJNSPIlrsBbi5WZH
-X6R85MWT+UD9Y7FSiZo2acf/rO4CUWZcqSI22KgErBB4boBpwtVLMpF+MGFR9b5G
-as/T8DAMikugyGkzogMGMZEK7DLfXwSA7VuiQ/uiSA3kMCLHesM=
------END RSA PRIVATE KEY-----
-"""
-
-
-IMEI = None # modem.getDevImei()
-SUB_TOPIC = '{}'
-PUB_TOPIC = SUB_TOPIC
-
-def sub_cb(topic, msg):
- global c
- print(
- "Subscribe Recv: Topic={},Msg={}".format(
- topic.decode(),
- msg.decode()))
-
-
-def wait_msg():
- global c
- while True:
- if c is not None:
- c.wait_msg()
- # ret = c.get_mqttsta()
- # print('wait_msg get_mqttsta:', ret)
- utime.sleep_ms(100)
-
-
-def MQTT_PUB():
- global c
- while True:
- try:
- if c is not None:
- c.publish(PUB_TOPIC.format(IMEI), "Hello World!")
- # c.publish(PUB_TOPIC.format(IMEI), bytearray(b'\x30\x31\x32\x33\x00\x01\x02\x03'))
- utime.sleep_ms(3000)
- # ret = c.get_mqttsta()
- # print('MQTT_PUB get_mqttsta:', ret)
- except BaseException as e:
- print('BaseException, Resatrting...', e)
-
-
-def MQTT_Init():
- global c
-
- # 创建一个mqtt实例
- c = MQTTClient(
- client_id=CLIENT_ID,
- server=SERVER,
- port=PORT,
- user=USER,
- password=PASSWORD,
- keepalive=30,
- ssl=True,
- ssl_params={
- "cert": certificate_content,
- "key": private_content})
- # 设置消息回调
- c.set_callback(sub_cb)
- # 设置遗嘱消息
- c.set_last_will(
- topic='set_last_will',
- msg='set_last_will',
- retain=False,
- qos=1)
- # 建立连接
- c.connect()
- # 订阅主题
- c.subscribe(SUB_TOPIC.format(IMEI))
- # 发布消息
- c.publish(PUB_TOPIC.format(IMEI), "Hello World!")
-
- # 关闭连接
- # c.disconnect()
-
-
-def GetDevImei():
- global IMEI
- IMEI = modem.getDevImei()
- print(IMEI)
-
-
-def main():
- GetDevImei()
- MQTT_Init()
- _thread.start_new_thread(MQTT_PUB, ())
- _thread.start_new_thread(wait_msg, ())
-
-
-if __name__ == '__main__':
- stagecode, subcode = checkNet.wait_network_connected(30)
- print('stagecode = {}, subcode = {}'.format(stagecode, subcode))
- if stagecode == 3 and subcode == 1:
- print('Network connection successful!')
- else:
- print('Not Net, Resatrting...')
- utime.sleep_ms(200)
- Power.powerRestart()
-
- main()
-
-```
-
-## 云平台AWS功能测试
-
-使用QPYcom运行代码,下面实例是基于uMQTT执行连接云平台的效果。
-
-
-
-## 云平台AWS功能应用实例
-
-[code](https://gitee.com/q767904101/quec-python_-code.git)
-
diff --git "a/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/README.md" "b/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/README.md"
deleted file mode 100644
index 2b0c674371e68866ea906b283f0b1d236fdaa746..0000000000000000000000000000000000000000
--- "a/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/README.md"
+++ /dev/null
@@ -1,11 +0,0 @@
-# 云平台对接应用开发
-
-云平台对接应用开发主要介绍模组连接各个云平台的步骤和通信测试结果,本部分内容主要介绍基本概念和理论,实际操作验证通过文章最后的链接跳转到应用文档。
-
-# 云平台对接应用开发文档目录
-
-- [云平台对接-移远云连接教程](云平台对接-移远云连接教程.md)
-- [云平台对接-阿里云连接教程](云平台对接-阿里云连接教程.md)
-- [云平台对接-腾讯云连接教程](云平台对接-腾讯云连接教程.md)
-- [云平台对接-华为云](云平台对接-华为云.md)
-- [云平台对接-AWS](云平台对接-AWS.md)
diff --git "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-ADC\345\272\224\347\224\250\345\274\200\345\217\221.md" "b/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-ADC\345\272\224\347\224\250\345\274\200\345\217\221.md"
deleted file mode 100644
index 14101ba6516f263aea9616f97401a51ed1bf56e6..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-ADC\345\272\224\347\224\250\345\274\200\345\217\221.md"
+++ /dev/null
@@ -1,38 +0,0 @@
-# BSP-ADC应用开发
-
-## 什么是ADC
-
-ADC(Analog to Digital Converter)即模拟数字转换器即[A/D转换器](https://baike.baidu.com/item/A%2FD转换器/4883848?fromModule=lemma_inlink),对于嵌入式应用开发来说,可以简单理解为:在单片机或我们的模组上有一个引脚可以读取电路中的电压值。一般软件开发人员主要关注如何读出ADC引脚的电压值,并将电压值做一些运算从而间接得出外部传感器当前所测量的环境值,如温度值、亮度值等。
-
-## 怎么使用ADC
-
-### 硬件设计
-
-对于嵌入式产品开发来说,可靠的硬件电路是软件开发的前提条件。
-
-ADC相关电路设计需要参考每个型号模组的硬件设计手册和参考设计手册,可以在主页的[下载区](/download/)检索下载,但具体功能引脚仍需以QuecPython的[ADC功能API](../../../API_reference/zh/QuecPython类库/misc.ADC.html)介绍的引脚号为准。关于ADC功能常见的应用电路也可以通过搜素引擎了解更多信息。简单应用电路也可参考QuecPython的学习开发板,开发板可以通过天猫旗舰店、京东旗舰店等移远通信官方销售渠道获取,开发板的硬件设计同样是参考的上述硬件文档,开发板的原理图也可以在主页的[下载区](/download/)检索下载。
-
-### 软件应用
-
-使用QuecPython开发的模组,想要读取ADC引脚的电压需要先完成QuecPython开发环境的搭建,再参考[ADC功能的API介绍文档](../../../API_reference/zh/QuecPython类库/misc.ADC.html)进行如下命令行测试即可打印出ADC通道0引脚当前的电压值,单位为毫安(mA)。
-
-```python
->>>from misc import ADC
->>>adc = ADC()
->>>adc.open()
->>>voltage = adc.read(ADC.ADC0)
->>>print("ADC channel 0 voltage = {}mA".format(voltage))
-```
-
-## ADC功能测试
-
-使用QPYcom工具和模组进行交互,下面实例是基于ADC0。
-
-
-
-## ADC功能应用实例
-
-- [读取环境光照强度](../外设应用开发/外设-亮度传感器应用开发.html)
-
-- [读取环境温度值](../外设应用开发/外设-温度传感器应用开发.html)
-
diff --git "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-Audio\345\272\224\347\224\250\345\274\200\345\217\221.md" "b/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-Audio\345\272\224\347\224\250\345\274\200\345\217\221.md"
deleted file mode 100644
index aa3c41fe494c4d0b7e96fe67db9db9ee682703bd..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-Audio\345\272\224\347\224\250\345\274\200\345\217\221.md"
+++ /dev/null
@@ -1,240 +0,0 @@
-# BSP-Audio应用开发
-
-## 硬件连接
-
-| 开发板型号 | 开发板对应PIN脚 | 开发板上对应的连接位置 | 对应的音频通道 |
-| -------------------------------------------------------- | ------------------------------ | ---------------------- | -------------- |
-| EC600N_QuecPython_EVB_V2.0
EC600N_QuecPython_EVB_V3.1 | PIN21、PIN22 | J7 | 通道0 |
-| EC600U_QuecPython_EVB_V2.0 | PIN21、PIN22
PIN109、PIN110 | J7
J6的PIN14、PIN15 | 通道0
通道2 |
-
-针对EC600N_QuecPython_EVB_2.0和EC600N_QuecPython_EVB_3.1 通道0的硬件连接图如下:
-
-喇叭直接开发板的SPK-、SPK+
-
-
-
-针对EC600U_QuecPython_EVB_2.0 通道0的硬件连接图如下:
-
-喇叭直接开发板的SPK-、SPK+,另外短接PIN40引脚
-
-
-
-针对EC600U_QuecPython_EVB_2.0 通道2的硬件连接图如下:
-
-喇叭直接开发板的J6的PIN14、PIN15引脚
-
-
-
-## GPIO查找
-
-Q:拉高GPIO,PIN引脚如何查找对应的GPIO?
-
-A:请认真查看下面步骤。
-
-注:不同型号对应PIN脚可能不同,对应的GPIO也不同,以原理图和wiki为准,以下以EC600N为例步骤查询:
-
-①查看原理图,找到AUDIO模块的CTRL对应的引脚。
-
-
-
-
-
-②在原理图找到PIN40,然后移步到wiki上面查找对应的GPIO口即可。
-
-
-
-
-
-## 软件实现
-
-### Audio
-
-下载验证:
-
-1. 根据测试场景,调整下面代码的注释。
-
- ```python
- import utime as time
- import audio
- from machine import Pin
- import utime
-
- #以EC600NCNLF为例:
- def example_audio_mp3():
- aud = audio.Audio(0) # 配置通道0
- # aud = audio.Audio(2) # 配置通道2
- aud.setVolume(2) #设置音量大小
- # 使能外接喇叭播放
- gpio=Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) #GPIO配置拉高
- print(gpio.read()) #查看引脚电平状态
- # U: 表示用户目录, 将文件下载到 /usr 文件下
- # 以下格式选一种来演示
- aud.play(2, 1, "U:/audio_audio_haixiu.mp3") #mp3格式
- #aud.play(2, 1, "U:/audio_audio_connect_ok.amr") #amr格式
- # aud.play(2, 1, "U:/audio_audio_haixiu.wav") #wav格式
- pass
-
- if __name__ == "__main__":
- example_audio_mp3()
-
- ```
-
-2. 将随包的 audio_audio_haixiu.mp3 和修改好的 example_audio_file.py 文件下载到开发板中。
-
-3. 运行 example_audio_file.py 脚本即可。
-
-
-
-注意:
-
-以EC600N和EC600U为例验证(注意各个开发板引脚不同)
-
-- 对于EC600N的3.1V版本的开发板,配置通道0,需要GPIO拉高
-- 对于EC600N的2.0V版本的开发板,配置通道0,需要GPIO拉高
-- 对于EC600U的通道0的话,代码注释掉配置通道2,短接PIN40,需要GPIO拉高
-- 对于EC600U的通道2的话,代码注释掉配置通道0,接引脚J6的14、15引脚,需要GPIO拉高
-
-
-
-### TTS
-
-下载验证:
-
-1.根据测试场景,调整下面代码的注释。
-
-参数及详情请看wiki链接:[QuecPython 类库 (quectel.com)](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=tts)
-
-以下以EC600NCNLF_QuecPython_EVB_3.1 版本测试
-
-```python
-# -*- coding: UTF-8 -*-
-#注意,python文件开头需要加上“-- coding: UTF-8 --”
-import audio
-import utime
-from machine import Pin
-# tts = audio.TTS(0)
-tts = audio.TTS(2)
-#参数具体看wiki
-#tts播放中文示例:
-gpio=Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) #GPIO配置拉高
-print(gpio.read())
-tts.play(1, 1, 2, '移联万物,志存高远')
-
-#以下是各种场景使用,用到可以去掉注释,用不到可以忽略
-# 1.
-#TTS引擎自动决定是以号码形式播放还是以数值的形式播放
-#TTS引擎以数值形式播放
-# tts.play(1,1,2, '[n2]12345')
-# utime.sleep(2)
-# #TTS引擎以号码形式播放
-# tts.play(1,1,2, '[n1]12345')
-# utime.sleep(2)
-
-# 2.
-#TTS引擎以默认语速5播放语音
-#TTS引擎以默认语速的0.5倍速播放语音
-# tts.play(1,1,2, '[s0]12345')
-# utime.sleep(2)
-# #TTS引擎以默认语速的2倍语速播放语音
-# tts.play(1,1,2, '[s10]12345')
-# utime.sleep(3)
-
-# 3.
-# 语调设置:
-#TTS引擎以默认语调基频减64Hz播放语音
-# tts.play(1,1,2, '[t0]12345')
-# utime.sleep(2)
-# #TTS引擎以默认语调基频加128Hz播放语音
-# tts.play(1,1,2, '[t10]12345')
-
-# 4.
-# 汉字指定拼音:
-#汉字:声调用后接一位数字 1 ~ 5 分别表示阴平、阳平、上声、去声和轻声 5 个声调。
-# tts.play(1,1,2, '乐[=le4]')
-# utime.sleep(2)
-# tts.play(1,1,2, '乐[=yue4]')
-# utime.sleep(2)
-
-# 5.
-#变声,默认女声
-# tts.play(1, 1, 2, '[m51]移远通信,移联万物') #男生
-# utime.sleep(3)
-# tts.play(1, 1, 2, '[m53]移远通信,客户第一') #女声
-# utime.sleep(3)
-# tts.play(1, 1, 2, '[m54]移远通信,以人为本') #童声
-# utime.sleep(3)
-
-
-
-```
-
-2.将随包的example_tts_file.py 文件下载到开发板中。
-
-3.运行example_tts_file.py 脚本即可。
-
-
-
-### Record
-
-下载验证:
-
-1.根据测试场景,调整下面代码的注释。
-
-参数及详情请看wiki链接:[QuecPython 类库 (quectel.com)](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=record)
-
-以下以EC600NCNLF_QuecPython_EVB_3.1 版本测试
-
-```python
-import utime
-import audio
-from machine import Pin
-
-
-flag = 1
-'''
-外接喇叭播放录音文件,EC600N参数通道选择0,EC600U参数通道选择0或者2
-'''
-aud = audio.Audio(0)
-tts = audio.TTS(0)
-
-aud.setVolume(11)
-#使能把电平拉高,GPIO的选择根据各个模块的audio引脚不同在wiki上选择不同的GPIO
-audio_EN = Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1)#GPIO配置拉高
-
-def record_callback(args):
- global flag
- print('file_name:{}'.format(args[0]))
- print('file_size:{}'.format(args[1]))
- print('record_sta:{}'.format(args[2]))
-
- record_sta = args[2]
- if record_sta == 3:
- print('The recording is over, play it')
- tts.play(1, 0, 2, '录音结束,准备播放录音文件')
- aud.play(1, 0, record.getFilePath(path))
- flag = 0
- elif record_sta == -1:
- print('The recording failure.')
- tts.play(1, 0, 2, '录音失败')
- flag = 0
-
-record = audio.Record()
-record.start('U:/recordfile.wav',5)
-record.end_callback(record_callback)
-path='U:/recordfile.wav'
-
-while 1:
- utime.sleep(1)
- if flag:
- pass
- else:
- break
-
-```
-
-2.将随包的example_record_file.py 文件下载到开发板中。
-
-3.运行example_record_file.py 脚本即可。
-
-
-
diff --git "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-ExtInt\345\274\225\350\204\232\344\270\255\346\226\255\345\272\224\347\224\250\345\274\200\345\217\221.md" "b/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-ExtInt\345\274\225\350\204\232\344\270\255\346\226\255\345\272\224\347\224\250\345\274\200\345\217\221.md"
deleted file mode 100644
index 4737cd695298a248d8f0c1f7b73f59003969c08f..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-ExtInt\345\274\225\350\204\232\344\270\255\346\226\255\345\272\224\347\224\250\345\274\200\345\217\221.md"
+++ /dev/null
@@ -1,81 +0,0 @@
-# BSP-ExtInt引脚中断应用开发
-
-## Extlnt概述
-
- GPIO介绍过后,接着介绍外部中断,普通GPIO可以随时查询Pin引脚的电平状态,但却不能及时发现电平的变化,而外部中断就能完美的解决这个问题。若设定了上升沿触发外部中断时,当电平从低电平上升到高电平瞬间,就会触发外部中断,从而在电平变化时立马执行回调函数。
-
-### 功能描述
-
-用于配置I/O引脚在发生外部事件时中断
-
-### API介绍
-
-[QuecPython 类库 (quectel.com)](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=extint)
-
-### 快速开发
-
-#### PIN对应关系
-
-示列:
-
-①查看原理图,找出按键PIN脚。(可咨询FAE获取或者Q群文件获取)
-
-
-
-②查看wiki里的machine-硬件功能模块下的Pin模块,可查找到PIN脚对应的GPIO。
-
-
-
-#### 命令行操作
-
-使用QPYcom工具和模组进行交互,示例如下:
-
-以EC600NCNLF为例,详情Extlnt接口链接:[QuecPython 类库 (quectel.com)](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=extint)
-
-
-
-
-
-#### 代码操作
-
-```python
-from machine import ExtInt
-import utime
-def fun1(args):
- print(args)
- print("key1 extint")
-def fun2(args):
- print(args)
- print("key2 extint")
-extint1 = ExtInt(ExtInt.GPIO13, ExtInt.IRQ_RISING, ExtInt.PULL_PD, fun1) #S4 kye1
-extint2 = ExtInt(ExtInt.GPIO12, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, fun2) #S5 kye2
-extint1.enable()
-extint2.enable()
-while True:
- utime.sleep_ms(200)
-```
-
-把上面的代码编写成.py文件,使用QPYcom工具下载到模组里面运行,按键按下key1、key2,即可看到以下结果显示:
-
-
-
-## 名词解释
-
-低电平:通常用0来表示低电平
-
-高电平:通常用1来表示高电平
-
-上升沿:从低电平上升到高电平的边沿
-
-下降沿:从高电平上升到低电平的边沿
-
-回调函数:一个普通函数,在满足设定条件下被触发执行这个函数
-
-浮空:Pin引脚直出,没有默认电平,处于不稳定状态
-
-上拉:Pin引脚内部有个电阻拉到VCC,默认为高电平
-
-下拉:Pin引脚内部有个电阻拉到GND,默认为低电平
-
-中断:停止执行当前的程序去执行另一段程序,这个过程叫中断
-
diff --git "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-GPIO\345\272\224\347\224\250\345\274\200\345\217\221.md" "b/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-GPIO\345\272\224\347\224\250\345\274\200\345\217\221.md"
deleted file mode 100644
index 8cc36eb68faef328dc3deb7e698af1099a5d1f40..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-GPIO\345\272\224\347\224\250\345\274\200\345\217\221.md"
+++ /dev/null
@@ -1,93 +0,0 @@
-# BSP-GPIO应用开发
-
-## GPIO概述
-
- GPIO:(General-purpose input/output),通用型之输入输出的简称。本文介绍如何使用QuecPython里的GPIO,GPIO通常用于连接驱动LED、蜂鸣器、继电器、读取外部IC的引脚电平状态等等.
-
-### 功能描述
-
-GPIO可以输出高电平、低电平两种状态,设置为1即高电平,0即为低电平
-
-
-
-GPIO可以读取外部电平状态,读到高电平返回1,读到低电平返回0
-
-
-
-
-
-### API介绍
-
-API链接:[PIN_API库](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin)
-
-### 快速开发
-
-#### PIN对应关系
-
-示列:
-
-①查看原理图,找出按键PIN脚。(可咨询FAE获取或者Q群文件获取)
-
-
-
-②查看wiki里的machine-硬件功能模块下的Pin模块,可查找到PIN脚对应的GPIO。
-
-
-
-
-
-#### 命令行操作
-
-使用QPYcom工具和模组进行交互,示例如下:
-
-以EC600NCNLF为例,详情Pin接口链接:[QuecPython 类库 (quectel.com)](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin)
-
-
-
-
-
-#### 代码操作
-
-```python
-from machine import Pin
-import utime
-
-gpio1 = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_DISABLE, 0)
-gpio2 = Pin(Pin.GPIO2, Pin.OUT, Pin.PULL_DISABLE, 0)
-gpio3 = Pin(Pin.GPIO3, Pin.OUT, Pin.PULL_DISABLE, 0)
-
-while True:
- gpio1.write(1)
- gpio2.write(1)
- gpio3.write(1)
- print('Output high level')
- utime.sleep_ms(500)
- gpio1.write(0)
- gpio2.write(0)
- gpio3.write(0)
- print('Output low level')
- utime.sleep_ms(500)
-```
-
-把上面的代码编写成.py文件,使用QPYcom工具下载到模组里面运行,即可看到以下结果显示。
-
-
-
-
-
-## 名词解释
-
-低电平:通常用0来表示低电平
-
-高电平:通常用1来表示高电平
-
-浮空:Pin引脚直出,没有默认电平,处于不稳定状态
-
-上拉:Pin引脚内部有个电阻拉到VCC,默认为高电平
-
-下拉:Pin引脚内部有个电阻拉到GND,默认为低电平
-
-输入:Pin引脚的电平状态随外部变化
-
-输出:Pin引脚的电平驱动外围电路
-
diff --git "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-PWM\345\272\224\347\224\250\345\274\200\345\217\221.md" "b/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-PWM\345\272\224\347\224\250\345\274\200\345\217\221.md"
deleted file mode 100644
index d73149d9d63a40c77277693256d6b073262265ee..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP-PWM\345\272\224\347\224\250\345\274\200\345\217\221.md"
+++ /dev/null
@@ -1,55 +0,0 @@
-# BSP-PWM应用开发
-
-## 什么是PWM
-
-[PWM](https://baike.baidu.com/item/脉冲宽度调制/10813756?fromtitle=PWM&fromid=3034961&fr=aladdin)代表脉冲宽度调制(Pulse Width Modulation),是一种常见的电子信号调制技术。它通过改变信号的脉冲宽度来控制电路或设备的输出功率或速度。PWM信号是一个周期性的信号,包含一个固定频率的基准信号和一个可变的占空比信号。占空比指的是脉冲宽度与周期之间的比率,它控制着信号的平均电平,从而控制电路或设备的输出功率或速度。
-
-PWM技术在电子工程、控制系统和机械工程等领域得到广泛应用。例如,在电机控制中,PWM信号可以用来控制电机的转速和转向。在电源管理中,PWM信号可以用来调节直流-直流转换器的输出电压和电流。在LED灯控制中,PWM信号可以用来控制LED的亮度和颜色。
-
-需要注意的是,在使用PWM技术时,需要选择适当的频率和占空比,以满足具体应用的需求。同时,还需要考虑PWM信号的稳定性和噪声等因素,以确保电路或设备的正常运行和可靠性。
-
-## 怎么使用PWM
-
-使用PWM技术需要通过特定的电路或芯片来生成PWM信号,支持QuecPython开发的模组大部分都具有此功能,具体可见[PWM功能API文档](../../../API_reference/zh/QuecPython类库/misc.PWM.html)确认是否支持此功能,可以按照以下步骤进行:
-
-### 硬件设计
-
-根据上述[PWM功能API文档](../../../API_reference/zh/QuecPython类库/misc.PWM.html)介绍的引脚号和模组的硬件设计文档(从[下载区](/download/)获取)设计好硬件电路即可。设计硬件电路注意需要注意电平转换,以及电平转换电路的最大输出频率。
-
-如模组本身不支持或支持的数量不够用,则可以使用模组支持的任意一个[GPIO](../../../API_reference/zh/QuecPython类库/machine.Pin.html)结合[定时器](../../../API_reference/zh/QuecPython类库/machine.Timer.html)来粗略模拟输出PWM信号,硬件设计相同,软件实现可见下文。
-
-### 软件应用
-
-当使用模组自带PWM功能时:
-
-```python
->>>from misc import PWM
->>>pwm = PWM(PWM.PWM0, PWM.ABOVE_MS, 1, 5)
->>>pwm.open()
-```
-
-当自行模拟PWM功能时需要注意QuecPython对于时序控制并不是很精确,请自行根据需求实现相关代码。
-
-### PWM功能测试
-
-在命令行中执行上面三行代码即可让模组的PWM0引脚输出一个周期为5ms,占空比为20%的方波,借助[逻辑分析仪](https://baike.baidu.com/item/逻辑分析仪/2364388?fr=aladdin)我们可以看到输出的波形。交互界面及逻辑分析仪获取到的波形如下图。
-
-
-
-
-
-如上图所示,填写的参数和实际抓取到的波形是能够对应上的,有关API具体参数含义可以仔细阅读API介绍文档进行理解。
-
-对于QuecPython的PWM API需要注意的是,填的参数不能超出填写范围,否则将会出现报错,这是常见问题。
-
-一般使用PWM功能主要步骤是:
-
-1. 设置PWM参数:根据具体应用需求,设置PWM信号的频率和占空比等参数。频率决定信号的周期,占空比决定信号的平均电平和电路或设备的输出功率或速度。对于QuecPython API,则需要填写高电平时间和周期来决定占空比和频率。即占空比=高电平时间/周期,频率=1秒/周期(单位:秒)。
-2. 连接PWM输出:将PWM信号的输出端口连接到需要控制的电路或设备,如电机、LED等。通常需要使用适当的电路元件,如电容、电感、MOSFET或三极管等,来控制PWM信号的幅值和波形。
-3. 调试和优化:根据实际情况,调试PWM电路或程序,以确保PWM信号的稳定性和准确性。可以通过示波器、数字万用表等仪器来监测PWM信号的波形和电平等参数,进行优化和调整。
-
-需要注意的是,在使用PWM技术时,需要根据具体应用需求选择合适的PWM芯片或电路,即选择合适的模组,并合理设置参数和连接电路。同时,还需要注意PWM信号的稳定性、可靠性和噪声等因素,以确保电路或设备的正常运行和安全性。
-
-### PWM功能应用实例
-
-- 暂无。
\ No newline at end of file
diff --git "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/README.md" "b/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
deleted file mode 100644
index 128017ca9eab0d0d3c68d2166423030ad918c784..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/BSP\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
+++ /dev/null
@@ -1,17 +0,0 @@
-# BSP应用开发
-
-BSP应用开发主要介绍模组自带外设功能的基础知识及入门测试操作,例如GPIO、UART等。部分测试需要依赖外设设备,本部分内容主要介绍基本概念和理论,实际操作验证通过文章最后的链接跳转到外设应用文档部分。
-
-# BSP应用开发文档目录
-
-- [BSP-Audio应用开发](BSP-Audio应用开发.md)
-- [BSP-GPIO应用开发](BSP-GPIO应用开发.md)
-- [BSP-ExtInt引脚中断应用开发](BSP-ExtInt引脚中断应用开发.md)
-- [BSP-UART应用开发](BSP-UART应用开发.md)
-- [BSP-IIC(I2C)应用开发](BSP-IIC(I2C)应用开发.md)
-- [BSP-SPI应用开发](BSP-SPI应用开发.md)
-- [BSP-ADC应用开发](BSP-ADC应用开发.md)
-- [BSP-PWM应用开发](BSP-PWM应用开发.md)
-- [BSP-Timer应用开发](BSP-Timer应用开发.md)
-- [BSP-RTC应用开发](BSP-RTC应用开发.md)
-- [BSP-WDT看门狗应用开发](BSP-WDT看门狗应用开发.md)
\ No newline at end of file
diff --git "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/OTA\345\215\207\347\272\247-\346\226\207\344\273\266.md" "b/docs/development_guide/zh/OTA\345\215\207\347\272\247/OTA\345\215\207\347\272\247-\346\226\207\344\273\266.md"
deleted file mode 100644
index 4505ac400277dbd3913dd07346434b5720892b0b..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/OTA\345\215\207\347\272\247-\346\226\207\344\273\266.md"
+++ /dev/null
@@ -1,64 +0,0 @@
-# OTA升级-文件
-
-## 什么是OTA升级-文件
-
-OTA:Over-the-Air Technology空中下载技术,是通过移动通信的空中接口实现对移动终端设备进行远程管理的技术。
-
-OTA升级-文件就是利用这项技术对模块进行文件升级。在QuecPython中该功能接口为[APP_FOTA](../../../API_reference/zh/QuecPython类库/app_fota.html)。为阅读体验以下均命名为APP_FOTA。
-
-## 怎么使用APP_FOTA
-
-### 升级准备
-
-在之前的引言中已经说到OTA升级需要使用到HTTP服务器作为升级内容的存放点。对于APP_FOTA而言,服务器需要存储客户需要升级文件内容。此部分工作由客户自主完成。目的就是得到一个可以访问下载到该文件的URL地址即可。
-
-### 硬件设计
-
-APP_FOTA升级主要为网络侧与模块内部交互,除前提条件模块需要组网成功外无需其他外围硬件支持。
-
-### 软件应用
-
-QuecPython中APP_FOTA功能支持单文件下载与批量文件下载。API接口分别为:**fota.download(url, file_name)**与**fota.bulk_download(info=[])**,有关API的详细介绍请参考[APP_FOTA](../../../API_reference/zh/QuecPython类库/app_fota.html)。
-
-需要注意是:调用APP_FOTA接口后文件不是直接下载到**usr**分区(模块存放用户文件的分区),而是下载到一个临时的**.updater**文件夹中。该文件夹可能存在与**usr.updater**文件夹下,也可能存在于**./fota/usr/.updater**。但对于实际使用不需要关注这些。只需了解APP_FOTA后文件并非直接存在**usr**目录,需要**fota.set_update_flag()**设置升级标志位后重启模组才会自动将对应文件搬运至**usr**目录。
-
-示例代码如下:
-
-```python
-import app_fota
-from misc import Power
-import utime as time
-
-
-files = ["file_name"]
-download_list = []
-url = r"url"
-
-for file in files:
- download_list.append({'url': (url + file), 'file_name': '/usr/%s' % file})
-
-if download_list:
- print("downlist: %d\r\n" % len(download_list), download_list)
- fota = app_fota.new()
- result = fota.bulk_download(download_list)
- fota.set_update_flag()
-
- print("update ....", result)
- time.sleep(1)
- Power.powerRestart() # 重启模块
-```
-
-注:`file_name`替换为需要下载的文件名加后缀一起。`url`替换为文件存放服务器的连接。
-
-## APP_FOTA文件下载测试
-
-使用QPYcom工具和模组进行交互,下载示例代码至模组进行运行。
-
-APP_FOTA_DEMO运行前:
-
-
-
-APP_FOTA_DEMO运行后:
-
-
-
diff --git "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/README.md" "b/docs/development_guide/zh/OTA\345\215\207\347\272\247/README.md"
deleted file mode 100644
index 3eb800034fb0f63ce26d7e90bee4c133ab38fc3b..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/OTA\345\215\207\347\272\247/README.md"
+++ /dev/null
@@ -1,8 +0,0 @@
-# OTA升级
-
-OTA:Over-the-Air Technology空中下载技术,是通过移动通信的空中接口实现对移动终端设备进行远程管理的技术。QuecPython的OTA升级包含两部分:[OTA升级-固件](OTA升级-固件.md)及[OTA升级-文件](OTA升级-文件.md)。由于此部分功能测试需用到HTTP服务器作为升级内容的存放点,该部分内容先介绍基本概念和理论,实际操作以操作演示为主进行讲解。
-
-# OTA升级文档目录
-
-- [OTA升级-固件](OTA升级-固件.md)
-- [OTA升级-文件](OTA升级-文件.md)
\ No newline at end of file
diff --git "a/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/QuecPython\345\205\245\351\227\250\345\255\246\344\271\240\350\267\257\347\272\277.md" "b/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/QuecPython\345\205\245\351\227\250\345\255\246\344\271\240\350\267\257\347\272\277.md"
deleted file mode 100644
index 6ebe614882230d4224abccbee7fba0f1d5a22b25..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/QuecPython\345\205\245\351\227\250\345\255\246\344\271\240\350\267\257\347\272\277.md"
+++ /dev/null
@@ -1,45 +0,0 @@
-# QuecPython 入门学习路线
-
- QuecPython 移植于 MicroPython 开源库,开发者在移远通信模块上 使 用 MicroPython 即可调用模块软件功能和外部硬件接口,进行二次开发。与open C相比,QuecPython开发具有轻松入门、语法简介、随写随测等优点,大大降低了用户开发学习的门槛。
-
-## 入门要求
-
-物联网开发向上承接了互联网,向下承接了嵌入式硬件。QuecPython开发需要有一定的嵌入式开发经验,了解相关硬件知识,API接口等。
-
-## 语法学习
-
-QuecPython移植于MicroPython,无论是在功能接口定义还是目录结构形式都与MicroPython保持高度的一致。MicroPython是Python3语言的精简高效实现,开发者在入门学习时因掌握基础的Pyhton3语法。需要注意的是Python3与QuecPython只是语法上兼容,脚本里导入的库和函数会存在差异,不能将电脑端运行的脚本放在QuecPyhton上运行,QuecPython相关库可参考官网WIKI。
-
-## 开发板选型
-
-目前QuecPython的开发板有QuecPython 开发板、核心板和DTU开发板等,用户可根据自身需求选择对应的开发板。如果是初学者可购买QuecPython 开发板,它资源相对丰富,适合入门学习。其他两种型号开发板可用于项目调试上,只需要用到部分硬件资源。
-
-## 快速上手
-
-一、Hello World打印
-
-1.开发板接入电脑,需要安装驱动和烧录模块固件,具体的操作方法参照《QPYcom工具使用说明》
-
-2.hello world打印
-
-(1)交互窗口打印
-
-如下图所示,使用QPYcom工具,端口连接“QuecPython的交互端口”,选择“交互”界面,进行如下交互打印。
-
-
-
-(2)编写*test_helloworld.py*文件打印
-
-创建*test_helloworld.py*文件,编写脚本如下所示
-
-```python
-import utime # 导入定时模块
-print_num = 5 # 定义打印次数
-while print_num:
- print("hello world")
- print_num -= 1 # 自减
- utime.sleep(2) # 延迟2秒
-```
-
-
-
diff --git "a/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/README.md" "b/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/README.md"
deleted file mode 100644
index 264592ff2d6bc53c1ed7bf6566b206aad5bbb544..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/README.md"
+++ /dev/null
@@ -1,9 +0,0 @@
-# QuecPython快速入门
-
-QuecPython快速入门是每一位开发者拿到每一块新的模组或者开发板都必须看的一篇文档,在这里你可以快速的学习到如何搭建好QuecPython的开发环境,测试刚到手的模组。
-
-# QuecPython快速入门文档目录
-
-- [QuecPython入门学习路线](QuecPython入门学习路线.html)
-- [从Python到MicroPython](从Python到MicroPython.html)
-- [从AT命令到QuecPython](从AT命令到QuecPython.html)
\ No newline at end of file
diff --git "a/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\344\273\216AT\345\221\275\344\273\244\345\210\260QuecPython.md" "b/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\344\273\216AT\345\221\275\344\273\244\345\210\260QuecPython.md"
deleted file mode 100644
index d5596f6d82ee47fcd05261901e09d15e87a64249..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\344\273\216AT\345\221\275\344\273\244\345\210\260QuecPython.md"
+++ /dev/null
@@ -1,45 +0,0 @@
-# 从 AT 到 QuecPython
-
-## 关于模块
-
-无线通信模块(模组)是实现数据上云和远程通信的必不可少的组件,在各类物联网场景中已经得到了极为广泛的应用。其本质可理解为一种将主芯片、无线基带、存储器、功放等器件集成在一起,用于完成本地电路与云端服务的数据通信功能的高密度、小体积、带屏蔽罩的“核心板”。
-
-就像电脑插上网卡就可以上网一样,在嵌入式系统中加入了模块,系统就具有了连接无线网络的可能性。
-
-
-
- EC200A_TE-A_EVB板
-
-## 模块的标准开发方式
-
-在大部分应用场景中,本地电路上的主处理器(主控)通过特定的接口(通常为串口)与模块建立连接,发送特定的指令(AT 指令)控制模块实现包括数据上传、无线通话、设备定位等在内的一系列功能。这种工作方式通常称为标准模式或传统模式,是当前应用最普遍、历史最悠久的模块使用方式。
-
-
-
-如上图所示,在标准模式中,通信模块是作为主控(MCU,如 STM32)的一个外设的角色而存在的。两者之间通过 UART 串口相连接,基于 AT 指令进行双向交互。系统的主要业务逻辑(用户应用,APP)在 MCU 中运行,其他外设通过 UART、I2C 等接口与 MCU 相连,受 MCU 控制。
-
-在标准模式下,主控中运行的用户 APP 需要包含较为复杂的 AT 指令发送和解析功能,例如对于 URC(Unsolicited Result Code,非请求结果码)的处理等。对于新手而言,整体开发难度较大。
-
-## 模块的 OpenCPU 开发方式
-
-模块所搭载的主芯片为了满足无线通信的需要,通常具有较高的性能和较多的资源,同时也配备了包括 GPIO、ADC、I2C 等在内的丰富的外设接口,运行着较为完备的操作系统(RTOS 或 Linux),因而在一定程度上具备了取代传统模式中的主控的能力。部分厂家会开放模块内部的软硬件资源供用户使用。这种使用模块作为主处理器,对模块进行二次开发的应用模式常被称为 OpenCPU(不同厂家可能有不同的称呼,如移远的 QuecOpen、芯讯通的 OpenLinux 等)。
-
-
-
-如图所示,与标准模式相比,OpenCPU 模式由于将模块本身作为主控使用,用户应用(APP)直接置于模块内部运行,整个系统中无需外部处理器(MCU),因而可以有效地达到精简硬件设计、降低器件成本、缩小产品尺寸的目的。在单片机价格居高不下的当下,OpenCPU 方案受到了众多公司的青睐。
-
-但是,OpenCPU 方案也具有较为明显的局限性。由于这一模式通常需要用户直接在模块底层运行的操作系统的基础上进行开发,技术门槛较高,传统的、不具备系统级开发经验的单片机开发者很难适应。其次,由于 OpenCPU 技术支持难度大,模块厂家通常只向大客户提供相关的工具和资料,入门较为不便。最后,不同厂家、不同型号的模块,其 OpenCPU 开发环境和开发工具存在较大差别,用户编写的程序在不同模块间的移植存在一定的难度。
-
-## 使用脚本语言开发模块
-
-传统的 OpenCPU 开发通常使用 C 语言,因此也被称作 CSDK 开发。用户需要直接修改和控制底层的操作系统,具有较高的难度和一定的风险性。部分模块厂商通过在 CSDK 的基础上移植解释器 / 虚拟机的方式,使得用户可以使用 Lua、Python 等脚本语言对模块进行开发。
-
-与 C 语言相比,脚本语言在语法和使用方式上普遍较为简单,开发者无需花费太多时间和精力即可掌握,并可相对轻松地实现业务逻辑,便于项目的快速开发和功能迭代。同时,在使用脚本语言进行开发时,开发者通常也无需考虑内存回收、基础任务调度等底层细节,显著降低了模块二次开发的技术门槛。最后,对于不同型号的模块,只要它们运行的是同一种脚本语言解释器,用户编写的程序通常只需少量修改(甚至无需修改)即可完成移植。
-
-## 关于 QuecPython
-
-Python 是一种热门的解释型脚本语言。因其语法简单、功能丰富的特点,被广泛应用于服务器、数据库、图像处理、人工智能等领域。MicroPython 是 Python 语言的精简高效实现。它基本兼容 Python 3.4 版本的语法特性,同时进行了针对性优化,使其能够在微控制器和其他资源受限的环境中运行。目前,MicroPython 已经支持包括 STM32、ESP32、RP2040 在内的多种硬件平台。
-
-移远将 MicroPython 移植到了多款 4G 和 NB-IoT 模块上,并增加了大量与无线通信相关的功能库,称之为 QuecPython。由此,用户可以使用 MicroPython 脚本对移远通信模块进行快速便捷的二次开发。
-
-目前,QuecPython 方案已经在智能家电、工业控制、智慧交通等场景得到应用。各类公司基于 QuecPython 方案推出的产品包括车载定位器、DTU、4G 对讲机等数十种。
\ No newline at end of file
diff --git "a/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\344\273\216Python\345\210\260MicroPython.md" "b/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\344\273\216Python\345\210\260MicroPython.md"
deleted file mode 100644
index 6570738f8c27778ea97d1299450533e64642b675..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\344\273\216Python\345\210\260MicroPython.md"
+++ /dev/null
@@ -1,21 +0,0 @@
-# 从 Python 到 MicroPython
-
-Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。作为一种代表极简主义的编程语言,和传统的 C/C++、Java、C# 等语言相比,Python 对代码格式的要求相对宽松。在开发 Python 程序时,可以专注于解决问题本身,而不用顾虑语法的细枝末节。
-
-下方展示了一个使用 Python 语言编写的 while 循环示例。可以看出,Python 语法较为简洁,易于掌握,可读性较高。
-
-```python
-x = 256
-total = 0
-while x > 0:
- if total > 500:
- break
- total += x
- x = x // 2
-```
-
-作为一种解释型语言,Python 具备较好的可移植性,可在多种不同软硬件平台上运行。使用 Python 编写的程序不需提前编译成二进制代码,可以直接从源代码运行。此外,Python 具有脚本语言中最丰富和强大的类库。这些类库覆盖了文件 I/O、GUI、网络编程、数据库访问等绝大部分应用场景。用 Python 语言开发程序时,许多功能可以通过调用库实现,开发者通常无需从零编写。
-
-MicroPython 可理解为一个可以运行在微处理器上的 Python 解释器,它使得用户可以编写 Python 脚本来控制硬件。MicroPython 继承了 Python 的完备的 REPL 交互功能,可以通过 REPL 串口随时输入代码执行,便于测试。MicroPython 还内置了文件系统,用户可以随意向设备端上传任意文件内容,并对目录结构进行修改。基于这一点,设备端可以同时储存多个程序脚本和其他文件,用户可根据需要手动选择并运行,类似于手机 App 的机制,极为灵活。此外,得益于 Python 解释型语言的特性,用户在使用 MicroPython 进行开发时,无需因为代码的更改而反复编译代码和烧录固件,仅需将修改过的代码重新上传至设备内即可。
-
-目前,MicroPython 已经支持在包括 STM32、Raspberry Pi Pico、ESP32 等数十种硬件平台上运行。
\ No newline at end of file
diff --git a/docs/development_guide/zh/README.md b/docs/development_guide/zh/README.md
deleted file mode 100644
index 558b86529c37057bc31140346083276d7ff68ab2..0000000000000000000000000000000000000000
--- a/docs/development_guide/zh/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# 开发指南
-
-开发指南主要包括QuecPython的入门操作和一些功能使用案例、测试方法等。
-
-# 开发指南文档目录
-
-- [QuecPython快速入门](./QuecPython快速入门/README.md)
-- [BSP应用开发](./BSP应用开发/README.md)
-- [OTA升级](./OTA升级/README.md)
-- [多线程应用开发](./多线程应用开发/README.md)
-- [外设应用开发](./外设应用开发/README.md)
-- [网络通信应用开发](./网络通信应用开发/README.md)
-- ...
-
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP.xxx.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP.xxx.png"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_1.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_1.png"
deleted file mode 100644
index fcb08d697c48526a3d31d0de3559e2453ac06f98..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_1.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_2.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_2.png"
deleted file mode 100644
index 659f13c654502c31389d77c146dfd8d03a2748d0..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_2.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_3.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_3.png"
deleted file mode 100644
index e3e33b45a92fb5c5c6f00f117ad026a3dd7a16a4..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_3.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_4.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_4.png"
deleted file mode 100644
index 878de8f049992468a6d825b6845825b45893f17f..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_4.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_5.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_5.png"
deleted file mode 100644
index f64bad3af1b232c354bf1dbe4b6c7faa2f59ef58..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_5.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_6.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_6.png"
deleted file mode 100644
index 7e7ea53562aadf68516d9d3d72824bc274bc8ea5..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Audio_6.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_1.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_1.png"
deleted file mode 100644
index dc1213e8cc6352144694f13f1eca7c8995595321..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_1.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_2.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_2.png"
deleted file mode 100644
index 43a9b0cbedd0336dfea46e2e8a68c027222412cc..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_2.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_3.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_3.png"
deleted file mode 100644
index 7b1cceab1dfa140b2a122ec487af5c74348ad3ff..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_3.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_4.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_4.png"
deleted file mode 100644
index 9b5ffe2f6f12b049fdc05861a1eb26e4eda13c71..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_Extlnt_4.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_1.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_1.png"
deleted file mode 100644
index b9bc03507e44a7147e7785e78f947a4fabc6c704..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_1.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_2.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_2.png"
deleted file mode 100644
index 57b30c80fa4a47470d969e0ac716a9d5f2f063d3..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_2.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_3.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_3.png"
deleted file mode 100644
index 261173b350be8348cb845bcfdff2544481956ee7..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_3.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_4.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_4.png"
deleted file mode 100644
index 9fe37930e9e3e811a6163bac692f6f37792c8c67..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_4.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_5.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_5.png"
deleted file mode 100644
index 77b668003fbc2b929d01d3b714aae5ca301ecfa4..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_5.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_6.png" "b/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_6.png"
deleted file mode 100644
index 2879e2ea4dc7ff0a6294d2f2b034e10c8fbce37f..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/BSP\345\272\224\347\224\250\345\274\200\345\217\221/BSP_GPIO_6.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/OTA\345\215\207\347\272\247/OTA.xxx.png" "b/docs/development_guide/zh/media/OTA\345\215\207\347\272\247/OTA.xxx.png"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_AT_1.jpg" "b/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_AT_1.jpg"
deleted file mode 100644
index 1fbd574da096010ab53817f8e3c59470981c2ea6..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_AT_1.jpg" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_AT_2.png" "b/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_AT_2.png"
deleted file mode 100644
index 6d8b9da3bb73c70d8421a4149e1ceeabbdc3dfd0..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_AT_2.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_AT_3.png" "b/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_AT_3.png"
deleted file mode 100644
index 3ca1d6d734f837a8b9ad246ee701ce022c2c3620..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_AT_3.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_\345\205\245\351\227\250\345\255\246\344\271\240_1.jpg" "b/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_\345\205\245\351\227\250\345\255\246\344\271\240_1.jpg"
deleted file mode 100644
index 35853a3f265a6b4be9851fc77e633b916f5ae303..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/QuecPython\345\277\253\351\200\237\345\205\245\351\227\250/\345\277\253\351\200\237\345\205\245\351\227\250_\345\205\245\351\227\250\345\255\246\344\271\240_1.jpg" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\206\205\345\255\230\347\256\241\347\220\206/\345\206\205\345\255\230\347\256\241\347\220\20601.png" "b/docs/development_guide/zh/media/\345\206\205\345\255\230\347\256\241\347\220\206/\345\206\205\345\255\230\347\256\241\347\220\20601.png"
deleted file mode 100644
index 02d58244a13c43c87f1973312f352355a5c0948c..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\206\205\345\255\230\347\256\241\347\220\206/\345\206\205\345\255\230\347\256\241\347\220\20601.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/Web\351\205\215\347\275\221_GET.png" "b/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/Web\351\205\215\347\275\221_GET.png"
deleted file mode 100644
index ef15e9959e9c4cb22dff990fcad6a64ba9cea98d..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/Web\351\205\215\347\275\221_GET.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/Web\351\205\215\347\275\221_ap.png" "b/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/Web\351\205\215\347\275\221_ap.png"
deleted file mode 100644
index b8bd8587762c8efb21231fb9b6f7ac8068e55da3..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/Web\351\205\215\347\275\221_ap.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/Web\351\205\215\347\275\221_sta.png" "b/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/Web\351\205\215\347\275\221_sta.png"
deleted file mode 100644
index d03bdf1d54feb0bb691fa18f92b3af6d552c9a39..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/Web\351\205\215\347\275\221_sta.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_ap.png" "b/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_ap.png"
deleted file mode 100644
index 705586684dcc25b1c9aac99857517563c3b932ec..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_ap.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_ap\346\211\213\346\234\272\347\225\214\351\235\242" "b/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_ap\346\211\213\346\234\272\347\225\214\351\235\242"
deleted file mode 100644
index 25eeaab3c7c4435528c0b257163ac2fb52f05dd1..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_ap\346\211\213\346\234\272\347\225\214\351\235\242" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_station.png" "b/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_station.png"
deleted file mode 100644
index d05e17a3d49eecd1ff0aed7827fbbe0fe840b433..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_station.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_station\346\211\213\346\234\272\347\225\214\351\235\242.png" "b/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_station\346\211\213\346\234\272\347\225\214\351\235\242.png"
deleted file mode 100644
index 89f247579e5bdbe7bcd2270e15d0f99226690b17..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221_station\346\211\213\346\234\272\347\225\214\351\235\242.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\346\240\270\345\277\203\346\235\277_\345\260\201.jpg" "b/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\346\240\270\345\277\203\346\235\277_\345\260\201.jpg"
deleted file mode 100644
index 1f92b6520f189ae0037cefa70c8008be439b55f5..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\346\240\270\345\277\203\346\235\277_\345\260\201.jpg" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-Queue.png" "b/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-Queue.png"
deleted file mode 100644
index 9896a301f381c4843277fdf012debb71d5f451f5..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-Queue.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-allocate_lock.png" "b/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-allocate_lock.png"
deleted file mode 100644
index 05f76571f08c16fa8c36e966b0a7c849fb7a168d..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-allocate_lock.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-start_new_thread.png" "b/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-start_new_thread.png"
deleted file mode 100644
index e84107a49481f4e822eea1652a84180e6342b125..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-start_new_thread.png" and /dev/null differ
diff --git "a/docs/development_guide/zh/media/\346\227\245\345\277\227\345\212\237\350\203\275/\346\227\245\345\277\227\345\212\237\350\203\27501.png" "b/docs/development_guide/zh/media/\346\227\245\345\277\227\345\212\237\350\203\275/\346\227\245\345\277\227\345\212\237\350\203\27501.png"
deleted file mode 100644
index e31350efa36a9aed1caf0e8339a2a41d4e73c7e7..0000000000000000000000000000000000000000
Binary files "a/docs/development_guide/zh/media/\346\227\245\345\277\227\345\212\237\350\203\275/\346\227\245\345\277\227\345\212\237\350\203\27501.png" and /dev/null differ
diff --git a/docs/development_guide/zh/sidebar.yaml b/docs/development_guide/zh/sidebar.yaml
deleted file mode 100644
index 4bf99ba4e36c44fb39a271cad5eb1c0e540b6c83..0000000000000000000000000000000000000000
--- a/docs/development_guide/zh/sidebar.yaml
+++ /dev/null
@@ -1,87 +0,0 @@
-items:
-- label: QuecPython快速入门
- file: QuecPython快速入门/README.md
- items:
-
- - label: QuecPython入门学习路线
- file: QuecPython快速入门/QuecPython入门学习路线.md
- - label: 从Python到MicroPython
- file: QuecPython快速入门/从Python到MicroPython.md
- - label: 从AT命令到QuecPython
- file: QuecPython快速入门/从AT命令到QuecPython.md
-- label: BSP应用开发
- file: BSP应用开发/README.md
- items:
- - label: BSP-Audio应用开发
- file: BSP应用开发/BSP-Audio应用开发.md
- - label: BSP-GPIO应用开发
- file: BSP应用开发/BSP-GPIO应用开发.md
- - label: BSP-ExtInt引脚中断应用开发
- file: BSP应用开发/BSP-ExtInt引脚中断应用开发.md
- - label: BSP-UART应用开发
- file: BSP应用开发/BSP-UART应用开发.md
- - label: BSP-IIC(I2C)应用开发
- file: BSP应用开发/BSP-IIC(I2C)应用开发.md
- - label: BSP-SPI应用开发
- file: BSP应用开发/BSP-SPI应用开发.md
- - label: BSP-ADC应用开发
- file: BSP应用开发/BSP-ADC应用开发.md
- - label: BSP-PWM应用开发
- file: BSP应用开发/BSP-PWM应用开发.md
- - label: BSP-Timer定时器应用开发
- file: BSP应用开发/BSP-Timer定时器应用开发.md
- - label: BSP-RTC应用开发
- file: BSP应用开发/BSP-RTC应用开发.md
- - label: BSP-WDT看门狗应用开发
- file: BSP应用开发/BSP-WDT看门狗应用开发.md
-- label: OTA升级
- file: OTA升级/README.md
- items:
- - label: OTA升级-固件
- file: OTA升级/OTA升级-固件.md
- - label: OTA升级-文件
- file: OTA升级/OTA升级-文件.md
-- label: 多线程应用开发
- file: 多线程应用开发/README.md
- items:
- - label: 多线程-创建线程
- file: 多线程应用开发/多线程-创建线程.md
- - label: 多线程-互斥锁应用
- file: 多线程应用开发/多线程-互斥锁应用.md
- - label: 多线程-消息队列应用
- file: 多线程应用开发/多线程-消息队列应用.md
-- label: 外设应用开发
- file: 外设应用开发/README.md
- items:
- - label: 外设-摄像头应用开发
- file: 外设应用开发/外设-摄像头应用开发.md
- - label: 外设-外扩存储应用开发
- file: 外设应用开发/外设-外扩存储应用开发.md
- - label: 外设-矩阵键盘应用开发
- file: 外设应用开发/外设-矩阵键盘应用开发.md
- - label: 外设-外挂以太网芯片应用开发
- file: 外设应用开发/外设-外挂以太网芯片应用开发.md
- - label: 外设-外挂WiFi应用开发
- file: 外设应用开发/外设-外挂WiFi应用开发.md
- - label: 外设-亮度传感器应用开发
- file: 外设应用开发/外设-亮度传感器应用开发.md
- - label: 外设-温度传感器应用开发
- file: 外设应用开发/外设-温度传感器应用开发.md
-- label: 网络通信应用开发
- file: 网络通信应用开发/README.md
- items:
- - label: 网络通信应用开发-数据拨号
- file: 网络通信应用开发/网络通信应用开发-数据拨号.md
- - label: 网络通信应用开发-TCP与UDP通信
- file: 网络通信应用开发/网络通信应用开发-TCP与UDP通信.md
- - label: 网络通信应用开发-HTTP通信
- file: 网络通信应用开发/网络通信应用开发-HTTP通信.md
- - label: 网络通信应用开发-MQTT通信
- file: 网络通信应用开发/网络通信应用开发-MQTT通信.md
- - label: 网络通信应用开发-SNMP通信
- file: 网络通信应用开发/网络通信应用开发-SNMP通信.md
- - label: 网络通信应用开发-WebSocket通信
- file: 网络通信应用开发/网络通信应用开发-WebSocket通信.md
- - label: 网络通信应用开发-通信异常处理
- file: 网络通信应用开发/网络通信应用开发-通信异常处理.md
-
diff --git "a/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-LCD\345\272\224\347\224\250\345\274\200\345\217\221.md" "b/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-LCD\345\272\224\347\224\250\345\274\200\345\217\221.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-\345\244\226\346\214\202WiFi\345\272\224\347\224\250\345\274\200\345\217\221.md" "b/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-\345\244\226\346\214\202WiFi\345\272\224\347\224\250\345\274\200\345\217\221.md"
deleted file mode 100644
index 2d6c86414268fcfa35169ce7feb640ee7c148ce3..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-\345\244\226\346\214\202WiFi\345\272\224\347\224\250\345\274\200\345\217\221.md"
+++ /dev/null
@@ -1,163 +0,0 @@
-# 外挂WiFi应用开发
-
-## 什么是外挂WiFi
-
-由于模组主要功能是4G联网,自身并不具备WiFi联网功能,而对于某些应用场景既需要4G又需要WiFi,就可以用模组+外挂ESP8266来实现。
-
-## 怎么使用外挂WiFi
-
-### 硬件设计
-
-准备一块模组和ESP8266,模组的UART:Rx、Tx、GND和ESP8266的Tx、Rx、GND交叉对接,注意电平需要匹配。本次实验使用的是“封”开发板,板子上的UART1和ESP8266已经连接好,可以直接使用。
-
-
-
-应用电路可以参考QuecPython的开发板,开发板可以通过天猫旗舰店、京东旗舰店等移远通信官方销售渠道获取,开发板的硬件设计同样是参考的上述硬件文档。
-
-### 软件应用
-
-模组搭配ESP8266实现ap模式、station模式,还可以提供给用户配网的web模式。作为station模式时,还可以设置网卡走4G还是走WiFi。
-
-
-## 外挂WiFi功能测试
-
-以下逐个功能演示,
-ap模式:
-
-把ap.py和 WLAN.py文件下载到usr区,执行ap.py即可看到实验现象。
-
-```python
-from usr.WLAN import ESP8266
-from machine import UART
-import dataCall
-
-# 初始化esp8266网卡
-esp8266 = ESP8266(UART.UART1, ESP8266.AP)
-# 启动esp8266以ap模式启动
-esp8266.ap('Chic_ap', '123456999')
-# 获取当前网卡状态 4表示网卡已启用,可以进行下一步操作
-# 0: esp8266设备不存在
-# 1: esp8266 station模式已连接
-# 2: esp8266 station模式未连接
-# 3: esp8266 web配网模式
-# 4: esp8266 ap模式
-esp8266.status()
-# 获取拨号信息
-Info = dataCall.getInfo(1, 0)
-# 设置默认网卡
-esp8266.set_default_NIC(Info[2][2])
-# 添加路由信息,设置网卡转发规则,默认ap的网段192.168.4.0,子网掩码255.255.255.0
-esp8266.router_add('192.168.4.0', '255.255.255.0')
-
-# esp8266.ipconfig()
-# esp8266.stop()
-
-'''
-UART.UART1
-'''
-```
-
-
-
-
-
-
-
-station模式:
-
-```python
-from usr.WLAN import ESP8266
-from machine import UART
-
-
-# 初始化esp8266网卡
-esp8266=ESP8266(UART.UART1, ESP8266.STA)
-# 启动esp8266以staion模式启动
-esp8266.station('iPhone 12 mini', '123456999')
-# esp8266.station('QQ', '123456999')
-# 获取当前网卡状态 4表示网卡已启用,可以进行下一步操作
-# 0: esp8266设备不存在
-# 1: esp8266 station模式已连接
-# 2: esp8266 station模式未连接
-# 3: esp8266 web配网模式
-# 4: esp8266 ap模式
-esp8266.status()
-# 设置dns服务器地址
-esp8266.set_dns('8.8.8.8', '114.114.114.114')
-# 设置esp8266作为默认网卡,使用esp8266进行网络连接
-ip = esp8266.ipconfig()[0]
-esp8266.set_default_NIC(ip)
-
-# esp8266.ipconfig()
-# esp8266.stop()
-
-'''
-UART.UART1
-'''
-```
-
-
-
-执行station.py后,可查询连接状态,返回1: esp8266 station模式已连接
-
-```python
->>> esp8266.status()
-1
->>>
-```
-
-
-
-
-
-web模式:
-
-```python
-from usr.WLAN import ESP8266
-from machine import UART
-
-# 初始化esp8266网卡
-#若使用web配置ap模式,需把以下模式ESP8266设置为ESP8266.AP
-esp8266=ESP8266(UART.UART1, ESP8266.STA)
-# 使esp8266以web配网模式启动
-esp8266.web_config('Chic_web','123456999') # 配网网址:192.168.4.1
-# 获取当前网卡状态 返回4表示已连接,可以使用esp8266进行下一步操作
-# 0: esp8266设备不存在
-# 1: esp8266 station模式已连接
-# 2: esp8266 station模式未连接
-# 3: esp8266 web配网模式
-# 4: esp8266 ap模式
-esp8266.status()
-# 获取当前网卡状态 返回3表示web配网已启用,可以使用web配网模式
-
-#使用手机等设备连接热点,使用浏览器进入网址192.168.4.1,进行配网
-
-# esp8266.ipconfig()
-# esp8266.stop()
-
-'''
-UART.UART1
-'''
-```
-
-执行web.py之后,终端可以连接'Chic_web','123456999',通过192.168.4.1进入web配网界面。
-也可以通过http请求方式取代web界面,
-使用get,http://192.168.4.1
-使用post,http://192.168.4.1/ap_set 具体参数设置参考以下截图
-使用post,http://192.168.4.1/station_set 具体参数设置参考以下截图
-
-web配网之后ESP8266会自动重启连接,之后每次上电ESP8266就会自动连接。
-
-
-
-
-
-
-
-
-
-
-## 外挂WiFi功能应用实例
-
-[code](https://gitee.com/q767904101/quec-python_-code.git)
-
diff --git "a/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-\346\221\204\345\203\217\345\244\264\345\272\224\347\224\250\345\274\200\345\217\221.md" "b/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-\346\221\204\345\203\217\345\244\264\345\272\224\347\224\250\345\274\200\345\217\221.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/README.md" "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
deleted file mode 100644
index 1dd2c0bb319f61e96e5dbd831252fe3dd4429f49..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
+++ /dev/null
@@ -1,9 +0,0 @@
-# 多线程应用开发
-
-多线程应用开发主要介绍模组支持的多线程功能,学习了多线程后,使读者在做项目时更加灵活编写代码,本部分内容主要介绍基本概念和理论,实际操作验证通过文章最后的链接跳转到应用文档。
-
-# 多线程应用开发文档目录
-
-- [多线程-创建线程应用开发](多线程-创建线程.md)
-- [多线程-互斥锁应用开发](多线程-互斥锁应用.md)
-- [多线程-消息队列应用开发](多线程-消息队列应用.md)
diff --git "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\206\205\345\255\230\347\256\241\347\220\206.md" "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\206\205\345\255\230\347\256\241\347\220\206.md"
deleted file mode 100644
index 60643844be79054f3def564f8bc983b1cd1ed805..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\206\205\345\255\230\347\256\241\347\220\206.md"
+++ /dev/null
@@ -1,38 +0,0 @@
-# 内存管理
-## 什么是内存管理
-
-本文介绍如何使用QuecPython的内存管理功能,内存管理可以让应用程序重复循环使用RAM。
-
-## 怎么使用内存管理
-
-### 软件应用
-
-使用QuecPython开发的模组,调用gc模块中的gc.collect()可以手动回收一次内存,具体参数参考[gc功能的API介绍文档](/../../API_reference/zh/QuecPython标准库/gc.html),创建线程不会阻塞当前代码往下执行。
-
-```python
-import gc
-
-ret = gc.mem_free()
-print('Current remaining memory',ret)
-
-a = bytes(100*1024)
-ret = gc.mem_free()
-print('After requesting 100K of memory',ret)
-
-del a
-ret = gc.mem_free()
-print('Variable not freed after deletion',ret)
-
-ret = gc.collect()
-ret = gc.mem_free()
-print('After manually reclaiming memory',ret)
-```
-
-
-
-## gc功能测试
-
-使用QPYcom工具执行代码,从输出信息中可以看出gc.collect()后回收了内存。
-
-
-
diff --git "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\344\272\222\346\226\245\351\224\201\345\272\224\347\224\250.md" "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\344\272\222\346\226\245\351\224\201\345\272\224\347\224\250.md"
deleted file mode 100644
index b1a4fd30c82ecd918c06e42ae277e3d5ffebe522..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\344\272\222\346\226\245\351\224\201\345\272\224\347\224\250.md"
+++ /dev/null
@@ -1,44 +0,0 @@
-# 多线程-互斥锁应用
-## 什么是多线程-互斥锁
-
-本文介绍如何使用QuecPython的多线程-互斥锁功能,互斥锁可以资源不会冲突,通常用于保护硬件接口通信的完整性,如SPI、I2C通信命令要严格的指令顺序才能正确通信。
-
-## 怎么使用多线程-互斥锁
-
-### 软件应用
-
-使用QuecPython开发的模组,调用\_thread模块中的_thread.allocate_lock()可以创建互斥锁,具体参数参考[_thread功能的API介绍文档](/../../API_reference/zh/QuecPython标准库/_thread-多线程.html),互斥锁必须成对使用。
-
-```python
-import utime
-import _thread
-
-def thread_1():
- while True:
- for i in range(3):
- lock.acquire()
- print('thread_1', i)
- utime.sleep_ms(2000)
- lock.release()
-
-def thread_2():
- while True:
- for i in range(3):
- lock.acquire()
- print('thread_2', i)
- utime.sleep_ms(2000)
- lock.release()
-
-lock = _thread.allocate_lock()
-_thread.start_new_thread(thread_1, ())
-_thread.start_new_thread(thread_2, ())
-```
-注意:线程里调用lock.acquire后进入阻塞并切换上下文,直到系统获得锁立即往下执行,lock.release()释放锁,有等待锁的线程会立即执行。
-
-
-## _thread功能测试
-
-使用QPYcom工具执行代码,可以看出两条线程在打印信息,值得注意的是执行到utime.sleep_ms(2000)的时候并没有切换线程,是因为锁还没释放。
-
-
-
diff --git "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\345\210\233\345\273\272\347\272\277\347\250\213.md" "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\345\210\233\345\273\272\347\272\277\347\250\213.md"
deleted file mode 100644
index 4f143a9440cf91531d30df7aa07dbfba01583a78..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\345\210\233\345\273\272\347\272\277\347\250\213.md"
+++ /dev/null
@@ -1,39 +0,0 @@
-# 多线程-创建线程
-## 什么是多线程
-
-本文介绍如何使用QuecPython的多线程功能,多线程可以让应用程序的多个功能看起来在同时运行。
-
-## 怎么使用多线程
-
-### 软件应用
-
-使用QuecPython开发的模组,调用\_thread模块中的_thread.start_new_thread()可以创建新线程,具体参数参考[_thread功能的API介绍文档](/../../API_reference/zh/QuecPython标准库/_thread-多线程.html),创建线程不会阻塞当前代码往下执行。
-
-```python
-import utime
-import _thread
-
-def thread_1():
- while True:
- for i in range(10):
- print('thread_1', i)
- utime.sleep_ms(1000)
-
-def thread_2():
- while True:
- for i in range(10):
- print('thread_2', i)
- utime.sleep_ms(1000)
-
-_thread.start_new_thread(thread_1, ())
-_thread.start_new_thread(thread_2, ())
-```
-注意:线程里需要调用utime.sleep代码才能上下文切换。
-
-
-## _thread功能测试
-
-使用QPYcom工具执行代码,可以看出两条线程在打印信息。
-
-
-
diff --git "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\346\266\210\346\201\257\351\230\237\345\210\227\345\272\224\347\224\250.md" "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\346\266\210\346\201\257\351\230\237\345\210\227\345\272\224\347\224\250.md"
deleted file mode 100644
index 4fe77fceae34873db2f347613b1447cc42b4074f..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\346\266\210\346\201\257\351\230\237\345\210\227\345\272\224\347\224\250.md"
+++ /dev/null
@@ -1,44 +0,0 @@
-# 多线程-消息队列
-## 什么是多线程-消息队列
-
-本文介绍如何使用QuecPython的多线程-消息队列功能,消息队列用于线程间通信,如A是中断回调线程接收数据,B是普通线程处理数据,A线程把接收到的数据通过Queue发送到B线程后立即结束A线程,从而减少A线程占用CPU的时间。
-
-## 怎么使用多线程-消息队列
-
-### 软件应用
-
-使用QuecPython开发的模组,调用queue模块中的queue.Queue()可以创建消息队列,具体参数参考[queue功能的API介绍文档](/../../API_reference/zh/QuecPython标准库/Queue - 普通队列.html),获取队列数据时,若队列有数据则立即返回,否则进入阻塞并切换上下文,直到队列有数据才继续往下执行。
-
-```python
-import _thread
-from queue import Queue
-import utime
-
-# 初始化队列
-q = Queue(maxsize=100)
-
-def thread_get():
- while True:
- # q.get 会阻塞等待消息过来,每当有q.put()执行完后 q.get()会收到数据,解除阻塞往下执行
- item = q.get()
- print("q.get:", item)
-
-# 开启线程在哪等待消息
-_thread.start_new_thread(thread_get, ())
-# put消息到队列
-q.put(1)
-utime.sleep(1)
-q.put() # 空数据默认 None
-utime.sleep(1)
-q.put(None) # 空数据默认 None
-utime.sleep(1)
-q.put(3)
-```
-
-
-## queue功能测试
-
-使用QPYcom工具执行代码,可以看出每当q.put()数据后,等待消息的线程立即执行打印数据。
-
-
-
diff --git "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\346\227\245\345\277\227\345\212\237\350\203\275.md" "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\346\227\245\345\277\227\345\212\237\350\203\275.md"
deleted file mode 100644
index b67e8622b78c7120983f246644dddb10eed1f640..0000000000000000000000000000000000000000
--- "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\346\227\245\345\277\227\345\212\237\350\203\275.md"
+++ /dev/null
@@ -1,36 +0,0 @@
-# 日志功能
-## 什么是日志功能
-
-本文介绍如何使用QuecPython的日志功能,使用日志功能可以让应用程序在执行过程中输出相关的内部信息,以供观察程序运行过程是否有异常。
-
-## 怎么使用日志功能
-
-### 软件应用
-
-使用QuecPython开发的模组,调用log模块中的log.getLogger()可以获取logger对象,具体参数参考[log功能的API介绍文档](/../../API_reference/zh/QuecPython组件库/log.html)。
-
-```python
-import log
-log.basicConfig(level=log.INFO)
-Testlog = log.getLogger("TestLog")
-
-# 设置输出到debug口
-from machine import UART
-uart = UART(UART.UART0, 115200, 8, 0, 1, 0)
-
-log.set_output(uart)
-Testlog.info("this is a Test log") # 会输出带对应的uart口
-
-
-# 从uart口切换成交互口输出
-import usys
-log.set_output(usys.stdout)
-Testlog.info("this is a Test log") # 会输出到交互口
-```
-
-
-## 日志功能测试
-
-使用QPYcom工具执行代码,可以看出QPYcom和串口调试助手都有打印信息。
-
-
\ No newline at end of file
diff --git "a/docs/development_guide/zh/\345\277\253\351\200\237\345\205\245\351\227\250.md" "b/docs/development_guide/zh/\345\277\253\351\200\237\345\205\245\351\227\250.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-HTTP\351\200\232\344\277\241.md" "b/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-HTTP\351\200\232\344\277\241.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-MQTT\351\200\232\344\277\241.md" "b/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-MQTT\351\200\232\344\277\241.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-SNMP\351\200\232\344\277\241.md" "b/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-SNMP\351\200\232\344\277\241.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-TCP\344\270\216UDP\351\200\232\344\277\241.md" "b/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-TCP\344\270\216UDP\351\200\232\344\277\241.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-WebSocket\351\200\232\344\277\241.md" "b/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-WebSocket\351\200\232\344\277\241.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-\346\225\260\346\215\256\346\213\250\345\217\267.md" "b/docs/development_guide/zh/\347\275\221\347\273\234\351\200\232\344\277\241\345\272\224\347\224\250\345\274\200\345\217\221/\347\275\221\347\273\234\351\200\232\344\277\241-\346\225\260\346\215\256\346\213\250\345\217\267.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/docs/development_tool_tutorial/zh/Note.md b/docs/development_tool_tutorial/zh/Note.md
deleted file mode 100644
index f15f2f1dd8e6f2aabb3c558351b3f69c35e683ee..0000000000000000000000000000000000000000
--- a/docs/development_tool_tutorial/zh/Note.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# QuecPython 开发工具使用教程编写注意事项
-
-## 目录结构
-
-开发工具使用教程根目录下存在一个名为`README.md`的文件,作为开发工具使用教程的首页入口。
-
-> 文档中心使用的[teedoc](https://gitee.com/teedoc)架构要求每个版块的首页文件都要是名为`README.md`的文件。
-
-每个工具在根目录下均对应一个`XXX使用教程`的文件夹,在该文件夹内,按照工具的功能板块,拆分为多个对应的md文件。
-
-所有md文件中引用的图片,均存放于media目录中:
-- 工具文档下有多少文件夹,在media也按照目录关系建立相应的文件夹。
-- 图片统一为png格式,命名请见名知意,如`QPYcom.xxx.png`,其中`xxx`表示用简短英文编写的图片作用描述。
-
-目录结构示例如下:
-
-```
-QuecPython官网文档中心/开发工具使用教程
-├── Note.md
-├── QPYcom使用教程
-│ ├── QPYcom使用教程-REPL交互.md
-│ ├── QPYcom使用教程-固件合成与烧录.md
-│ └── QPYcom使用教程-文件传输.md
-├── media
-│ ├── QPYcom使用教程
-│ │ └── QPYcom.xxx.png
-│ └── 产测工具使用教程
-│ └── 产测工具.xxx.png
-└── 产测工具使用教程
- ├── 产测工具使用教程-fnc1.md
- └── 产测工具使用教程-fnc2.md
-```
-
-## README.md
-
-README.md作为板块的首页入口,需要对该板块做综合性描述,并且在最后提供板块的所有二级目录链接。
-
-## 正文内容格式
-
-参照以下格式:
-
-```markdown
-# QPYcom REPL交互使用教程
-
-正文
-
-```
-
-## QuecPython 开发工具使用教程
-
-[点此查看](./README.md)
diff --git "a/docs/development_tool_tutorial/zh/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213-REPL\344\272\244\344\272\222.md" "b/docs/development_tool_tutorial/zh/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213-REPL\344\272\244\344\272\222.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_tool_tutorial/zh/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213-\345\233\272\344\273\266\345\220\210\346\210\220\344\270\216\347\203\247\345\275\225.md" "b/docs/development_tool_tutorial/zh/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213-\345\233\272\344\273\266\345\220\210\346\210\220\344\270\216\347\203\247\345\275\225.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_tool_tutorial/zh/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213-\346\226\207\344\273\266\344\274\240\350\276\223.md" "b/docs/development_tool_tutorial/zh/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213-\346\226\207\344\273\266\344\274\240\350\276\223.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/docs/development_tool_tutorial/zh/README.md b/docs/development_tool_tutorial/zh/README.md
deleted file mode 100644
index df786694301ca43bb5b7e94df47aa7a356db4105..0000000000000000000000000000000000000000
--- a/docs/development_tool_tutorial/zh/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 开发工具使用教程
-
-开发工具使用教程主要介绍QuecPython项目开发时需要从移远通信获取的各种工具。
-
-# 开发工具使用教程文档目录
-
-- [模组驱动下载安装教程](./模组驱动下载安装教程/README.md)
-- [QPYcom使用教程](./QPYcom使用教程/README.md)
-- [量产工具使用教程](./量产工具使用教程/README.md)
-- [产测工具使用教程](./产测工具使用教程/README.md)
-- [其他工具使用教程](./其他工具使用教程/README.md)
\ No newline at end of file
diff --git a/docs/development_tool_tutorial/zh/config.json b/docs/development_tool_tutorial/zh/config.json
deleted file mode 100644
index 1f431357204bbe495680f35f6e868b7153d6dc9f..0000000000000000000000000000000000000000
--- a/docs/development_tool_tutorial/zh/config.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "import": "config_zh",
- "name": "工具使用教程"
-}
\ No newline at end of file
diff --git "a/docs/development_tool_tutorial/zh/media/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213/QPYcom.xxx.png" "b/docs/development_tool_tutorial/zh/media/QPYcom\344\275\277\347\224\250\346\225\231\347\250\213/QPYcom.xxx.png"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_tool_tutorial/zh/media/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\344\272\247\346\265\213\345\267\245\345\205\267.xxx.png" "b/docs/development_tool_tutorial/zh/media/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\344\272\247\346\265\213\345\267\245\345\205\267.xxx.png"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\344\270\213\350\275\275.png" "b/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\344\270\213\350\275\275.png"
deleted file mode 100644
index c8054938daa301f0bc319e9e84678117faa43c3a..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\344\270\213\350\275\275.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2151.png" "b/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2151.png"
deleted file mode 100644
index b2051f342473cf74dd82f74349d989910e80dfcf..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2151.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2152.png" "b/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2152.png"
deleted file mode 100644
index 4416c51ed22816be1bcb97363ce12b1b7e6e4ffc..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2152.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2153.png" "b/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2153.png"
deleted file mode 100644
index 267635da622d6f0e4b81b5e8a1af7afd64223a41..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2153.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2154.png" "b/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2154.png"
deleted file mode 100644
index 76cafc869538329d4010a2e8a96add1a1ee3fe49..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2154.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2155.png" "b/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2155.png"
deleted file mode 100644
index e8b89fa8d9cd668a65a8847774d4cac35f70c610..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QCOM\347\225\214\351\235\242\344\273\213\347\273\2155.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QFlash\345\233\272\344\273\266\347\203\247\345\275\2251.png" "b/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QFlash\345\233\272\344\273\266\347\203\247\345\275\2251.png"
deleted file mode 100644
index a76a10770ebfb1a2315fde81efee99a99a3b18b7..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QFlash\345\233\272\344\273\266\347\203\247\345\275\2251.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QFlash\345\233\272\344\273\266\347\203\247\345\275\2252.png" "b/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QFlash\345\233\272\344\273\266\347\203\247\345\275\2252.png"
deleted file mode 100644
index 9495b039d9fda47557cb1667325bb80f1d7a9917..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QFlash\345\233\272\344\273\266\347\203\247\345\275\2252.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QFlash\347\225\214\351\235\242\344\273\213\347\273\2151.png" "b/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QFlash\347\225\214\351\235\242\344\273\213\347\273\2151.png"
deleted file mode 100644
index b9673c08aa9dbcd902034fbe1e04cf0b81815bfb..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\345\205\266\344\273\226\345\267\245\345\205\267_QFlash\347\225\214\351\235\242\344\273\213\347\273\2151.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Qmulti\346\225\231\347\250\2131.png" "b/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Qmulti\346\225\231\347\250\2131.png"
deleted file mode 100644
index d6741ceba451e5f041789cc55c05db9052d82be0..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Qmulti\346\225\231\347\250\2131.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Qmulti\346\225\231\347\250\2132.png" "b/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Qmulti\346\225\231\347\250\2132.png"
deleted file mode 100644
index 1f7e8c7a3024eccdfadb353bd72b8faec7ef8102..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Qmulti\346\225\231\347\250\2132.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Qmulti\346\225\231\347\250\2133.png" "b/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Qmulti\346\225\231\347\250\2133.png"
deleted file mode 100644
index cbbcddbff88e825a522b3b880ef519ebcefcda60..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Qmulti\346\225\231\347\250\2133.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Quectel_Customer_FW_Download_Tool_\346\225\231\347\250\2131.png" "b/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Quectel_Customer_FW_Download_Tool_\346\225\231\347\250\2131.png"
deleted file mode 100644
index 5d123080590eec4d1ddf4bc4d5761a94670914ca..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Quectel_Customer_FW_Download_Tool_\346\225\231\347\250\2131.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Quectel_Customer_FW_Download_Tool_\346\225\231\347\250\2132.png" "b/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Quectel_Customer_FW_Download_Tool_\346\225\231\347\250\2132.png"
deleted file mode 100644
index c973569df6e85878ebb4aebd38ea060048216881..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Quectel_Customer_FW_Download_Tool_\346\225\231\347\250\2132.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Quectel_Customer_FW_Download_Tool_\346\225\231\347\250\2133.png" "b/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Quectel_Customer_FW_Download_Tool_\346\225\231\347\250\2133.png"
deleted file mode 100644
index 176393c821e8893fbfccd8ede12499bb9d444717..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_Quectel_Customer_FW_Download_Tool_\346\225\231\347\250\2133.png" and /dev/null differ
diff --git "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_\346\263\250\345\206\214.png" "b/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_\346\263\250\345\206\214.png"
deleted file mode 100644
index 9f5b64f292dc44d36d2f0f1ebbd4e6e52f10ac5e..0000000000000000000000000000000000000000
Binary files "a/docs/development_tool_tutorial/zh/media/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\351\207\217\344\272\247\345\267\245\345\205\267_\346\263\250\345\206\214.png" and /dev/null differ
diff --git a/docs/development_tool_tutorial/zh/sidebar.yaml b/docs/development_tool_tutorial/zh/sidebar.yaml
deleted file mode 100644
index 6da6caf6474590c906c17fdd55a01d14e1c40d9e..0000000000000000000000000000000000000000
--- a/docs/development_tool_tutorial/zh/sidebar.yaml
+++ /dev/null
@@ -1,68 +0,0 @@
-items:
-- label: 模组驱动下载安装教程
- file: 模组驱动下载安装教程/README.md
-
- items:
-
- - label: LTE系列模组
- file: LTE系列模组/README.md
-
- items:
-
- - label: ASR系列模组
- file: ASR系列模组/README.md
- - abel: Unisoc系列模组
- file: Unisoc系列模组/README.md
- - abel: Qualcomm系列模组
- file: Qualcomm系列模组/README.md
- - abel: Eigecomm系列模组
- file: Eigecomm系列模组/README.md
-
- - label: LPWA系列模组
- file: LPWA系列模组/README.md
-
- items:
-
- - label: NB-IOT系列模组
- file: NB-IOT系列模组/README.md
- - label: CAT-M系列模组
- file: CAT-M系列模组/README.md
-
- - label: WiFi系列模组
- file: WiFi系列模组/README.md
-
-- label: QPYcom使用教程
- file: QPYcom使用教程/README.md
-
- items:
-
- - label: QPYcom使用教程-REPL交互
- file: QPYcom使用教程-REPL交互.md
- - label: QPYcom使用教程-文件传输
- file: QPYcom使用教程-文件传输.md
- - label: QPYcom使用教程-固件合成与烧录
- file: QPYcom使用教程-固件合成与烧录.md
-
-- label: 量产工具使用教程
- file: 量产工具使用教程/README.md
-
- items:
-
- - label: QMulti_DL使用教程
- file: 量产工具使用教程/QMulti_DL使用教程.md
- - label: Quectel_Customer_FW_Download_Tool使用教程
- file: 量产工具使用教程/Quectel_Customer_FW_Download_Tool使用教程.md
-
-- label: 产测工具使用教程
- file: 产测工具使用教程/README.md
-
-- label: 其他工具使用教程
- file: 其他工具使用教程/README.md
-
- items:
-
- - label: QCOM使用教程
- file: 其他工具使用教程/QCOM使用教程.md
- - label: Qflash使用教程
- file: 其他工具使用教程/Qflash使用教程.md
-
diff --git "a/docs/development_tool_tutorial/zh/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213-fnc1.md" "b/docs/development_tool_tutorial/zh/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213-fnc1.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_tool_tutorial/zh/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213-fnc2.md" "b/docs/development_tool_tutorial/zh/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/\344\272\247\346\265\213\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213-fnc2.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_tool_tutorial/zh/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/QCOM\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/development_tool_tutorial/zh/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/QCOM\344\275\277\347\224\250\346\225\231\347\250\213.md"
deleted file mode 100644
index 2fa9b9c69eabe937c71427f111ea0496361c5508..0000000000000000000000000000000000000000
--- "a/docs/development_tool_tutorial/zh/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/QCOM\344\275\277\347\224\250\346\225\231\347\250\213.md"
+++ /dev/null
@@ -1,89 +0,0 @@
-## QCOM
-
-该工具用于串口发送和接收数据。
-
-在QuecPython官网中对该工具进行[下载](https://python.quectel.com/download),解压后双击运行QCOM_V1.6.exe
-
-功能如图所示:
-
-黄色区域用于设置端口信息。
-
-红色区域显示接收到的数据。
-
-蓝色区域显示状态信息。
-
-紫色区域用于发送数据或文件。
-
-绿色区域用于连续发送数据。
-
-根据PC与终端的连接情况,设置对应的端口信息,其中包含对端口号、波特率、数据位、校验位、停止位、流控制的设置,在完成以上设置之后,点击Open Port打开所选择的端口。
-
-
-
-
-
-A)红色区域用于输入将要发送的数据。
-
-B)绿色区域用于选择需要的文件并发送整个文件。
-
-C)蓝色区域用于将接收到的数据保存为文件。
-
-D) DTR:开启COM口的DTR引脚。
-
-E) RTS:启用COM口的RTS引脚。
-
-F) View File:显示已发送文件的数据。
-
-G) Show Time:显示每个接收数据的时间。
-
-H) HEX String:输入字符串为HEX String。
-
-I) Show in HEX:接收到的数据以HEX格式显示。
-
-J) Send with Enter:按“Enter”发送数据。
-
-K)Clear Information:清除所有接收到的数据和状态信息。
-
-L)Send Command:开始发送您输入的数据。
-
-M)Select File:选择要发送的文件。
-
-N)Send File:开始发送您选择的文件。
-
-O) Save Log:选择保存日志数据的文件。
-
-
-
-A)红色区域用于发送数据。
-
-B)蓝色区域用于输入将要发送的命令或数据。
-
-C)绿色区域用于开始数据发送。
-
-D)Choose All Commands:启用所有可发送的命令。
-
-E) HEX:输入字符串为HEX字符串。
-
-F) Enter:按“Enter”键发送数据。
-
-G)延迟:每个数据的延迟时间。
-
-H)延迟时间:默认延迟时间。
-
-I)运行次数:连续发送所有选定数据的次数。
-
-J) Run:开始连续发送所有选中的数据。
-
-K)Stop:停止连续发送所有所选数据。
-
-L) Save As Script:保存所有数据并配置为ini文件。
-
-M)Load Test Script:从ini文件加载数据和配置。
-
-N)Clear All Commands:清除所有的命令或数据。
-
-### AT命令的发送
-
-打开设备管理器,确定AT串口,打开QCOM,选择AT串口,点击**Open Port**,端口设置会变灰,同时也会看到 Open COM Port Success字样,说明串口已经成功打开;勾选**Send With Enter**,在 Input String 框内输入 **AT**,然后点击 **Send Command** 按钮进行发送,模块端正常回复相应数据。
-
-
\ No newline at end of file
diff --git "a/docs/development_tool_tutorial/zh/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/Qflash\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/development_tool_tutorial/zh/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/Qflash\344\275\277\347\224\250\346\225\231\347\250\213.md"
deleted file mode 100644
index b708fc9f30b511af49872c5ad5e020ed9d5b69ad..0000000000000000000000000000000000000000
--- "a/docs/development_tool_tutorial/zh/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/Qflash\344\275\277\347\224\250\346\225\231\347\250\213.md"
+++ /dev/null
@@ -1,25 +0,0 @@
-## Qflash
-
-该工具用于固件升级烧录,无需安装便可直接在装有Windows系统上运行,在[下载](https://python.quectel.com/download)之后对压缩包进行解压,运行 QFlash.exe
-
-注意事项:
-
-1、工具和固件包的存储路径不应包含任何空格,推荐使用英文字符;
-
-2、固件包的存储/载入路径需是本地路径,不能使用 U 盘或网盘路径;
-
-支持型号:ASR,RDA双平台,移芯平台目前需要特定版本才能烧录,请联系技术支持人员;
-
-ASR平台需要把固件后缀改为.zip;
-
-官网下载固件并解压,模块上电开机之后,选择适配的固件,端口选择AT Port串口或通过发送AT指令**AT+QDOWNLOAD=1**进入强制下载模式选择下载口,点击“**Start**”后工具会自动切换到下载端口并完成升级。若升级完成后仍是下载口,需要重启模块恢复端口加载。
-
-
-
-固件烧录中
-
-
-
-固件烧录完成
-
-
\ No newline at end of file
diff --git "a/docs/development_tool_tutorial/zh/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/README.md" "b/docs/development_tool_tutorial/zh/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/README.md"
deleted file mode 100644
index c339442fdb6a37f24c46ec44cdef2be942427010..0000000000000000000000000000000000000000
--- "a/docs/development_tool_tutorial/zh/\345\205\266\344\273\226\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/README.md"
+++ /dev/null
@@ -1,9 +0,0 @@
-# 其他工具使用教程
-
-其他工具使用教程主要介绍Qcom 、QFlash两个工具是如何使用的。
-
-# 量产工具文档目录
-
-[Qcom使用教程](./Qcom使用教程.md)
-
-[QFlash使用教程](./QFlash使用教程.md)
\ No newline at end of file
diff --git "a/docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/WiFi\347\263\273\345\210\227\346\250\241\347\273\204/README.md" "b/docs/development_tool_tutorial/zh/\346\250\241\347\273\204\351\251\261\345\212\250\344\270\213\350\275\275\345\256\211\350\243\205\346\225\231\347\250\213/WiFi\347\263\273\345\210\227\346\250\241\347\273\204/README.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/development_tool_tutorial/zh/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/QMulti_DL\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/development_tool_tutorial/zh/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/QMulti_DL\344\275\277\347\224\250\346\225\231\347\250\213.md"
deleted file mode 100644
index f396b033250e7acd1304d5e7435b0ea33d14a34d..0000000000000000000000000000000000000000
--- "a/docs/development_tool_tutorial/zh/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/QMulti_DL\344\275\277\347\224\250\346\225\231\347\250\213.md"
+++ /dev/null
@@ -1,21 +0,0 @@
-## QMulti
-
-支持型号:ASR平台:EC600N-CN、EC600M-CN、EC200A系列、EC800M;RDA平台:EC200U系列、EC600U-CN、EC600G、EC800G。
-
-步骤:
-
-(1)点击“**Load FW Files**”按钮,加载固件文件。
-
-(2)选择需要下载到模块的后缀为.mbn、.zip 或者.pac 的固件文件。
-
-注意事项:ASR平台系列选择.zip固件包后,工具会自动勾选“**Auto All**”,且只支持“**Auto All**”模式,模块开机后自动升级,无需点击“**Start**”按钮;RDA平台系列选择.PAC固件包后,需要在模块通电后手动点击“**Start**”或“**Start All**”按钮开始升级,默认情况下工具不会自动勾选“**Auto All**”。
-
-
-
-开始烧录固件:
-
-
-
-批量烧录完成:
-
-
\ No newline at end of file
diff --git "a/docs/development_tool_tutorial/zh/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/Quectel_Customer_FW_Download_Tool\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/development_tool_tutorial/zh/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/Quectel_Customer_FW_Download_Tool\344\275\277\347\224\250\346\225\231\347\250\213.md"
deleted file mode 100644
index b08f965cfa0b8ef22540c7ec9d6b9cd45239b119..0000000000000000000000000000000000000000
--- "a/docs/development_tool_tutorial/zh/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/Quectel_Customer_FW_Download_Tool\344\275\277\347\224\250\346\225\231\347\250\213.md"
+++ /dev/null
@@ -1,15 +0,0 @@
-## Quectel_Customer_FW_Download_Tool
-
-支持型号:EC200U系列、EC600U-CN、EC600G、EC800G、EC600E。
-
-(1)点击“**Load FW Files**”按钮,加载量产固件,需要手动选择AT端口,点击Start或Start All开始升级。
-
-
-
-(2)等待下载完成
-
-
-
-(3)当出现PASS时下载成功
-
-
\ No newline at end of file
diff --git "a/docs/development_tool_tutorial/zh/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/README.md" "b/docs/development_tool_tutorial/zh/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/README.md"
deleted file mode 100644
index b10bc7cacc5c1609b50bfd2b64a4816be304d3e2..0000000000000000000000000000000000000000
--- "a/docs/development_tool_tutorial/zh/\351\207\217\344\272\247\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213/README.md"
+++ /dev/null
@@ -1,21 +0,0 @@
-# 量产工具使用教程
-
-量产工具使用教程主要介绍QMulti_DL_CMD 、Quectel_Customer_FW_Download_Tool这两个量产工具是如何使用的。
-
-QMulti_DL_CMD 、Quectel_Customer_FW_Download_Tool这两个工具是多串口固件升级工具,最多可支持 8 个模块同时升级,且不需要特定夹具,通过Hub连接多个设备之后开机即可对[合并固件](https://python.quectel.com/doc/doc/Advanced_development/zh/Mass_production/index.html#%E5%90%88%E5%B9%B6%E6%9D%A1%E4%BB%B6)进行批量烧录,该工具无需安装便可直接运行,首次运行需注册与授权后方可正常使用。请[下载](https://python.quectel.com/download)之后运行工具弹出如下图所示提示框时,请复制并提供“Information Code”给技术支持人员申请“License Code”;申请成功后请输入“License Code”并点击“**OK**”完成工具授权。
-
-
-
-注意事项:
-
-1、工具和固件的存储路径不应包含任何空格、中文和特殊符号,否则可能导致升级失败,推荐使用英文字符;
-
-2、固件包的存储/载入路径需是本地路径,不能使用 U 盘或网盘路径;
-
-3、ASR平台系列需要把固件后缀改为.zip,RDA平台系列则不用修改固件后缀;
-
-# 量产工具文档目录
-
-[QMulti_DL使用教程](./QMulti_DL使用教程.md)
-
-[Quectel_Customer_FW_Download_Tool使用教程](./Quectel_Customer_FW_Download_Tool使用教程.md)
\ No newline at end of file
diff --git "a/docs/solutions/zh/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221-\345\274\200\345\217\221\346\265\201\347\250\213.md" "b/docs/solutions/zh/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221-\345\274\200\345\217\221\346\265\201\347\250\213.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221-\346\241\206\346\236\266\344\273\213\347\273\215.md" "b/docs/solutions/zh/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221-\346\241\206\346\236\266\344\273\213\347\273\215.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221/README.md" "b/docs/solutions/zh/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/DTU\345\272\224\347\224\250\345\274\200\345\217\221/DTU\345\272\224\347\224\250\345\274\200\345\217\221-\345\274\200\345\217\221\346\265\201\347\250\213.md" "b/docs/solutions/zh/DTU\345\272\224\347\224\250\345\274\200\345\217\221/DTU\345\272\224\347\224\250\345\274\200\345\217\221-\345\274\200\345\217\221\346\265\201\347\250\213.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/DTU\345\272\224\347\224\250\345\274\200\345\217\221/DTU\345\272\224\347\224\250\345\274\200\345\217\221-\346\241\206\346\236\266\344\273\213\347\273\215.md" "b/docs/solutions/zh/DTU\345\272\224\347\224\250\345\274\200\345\217\221/DTU\345\272\224\347\224\250\345\274\200\345\217\221-\346\241\206\346\236\266\344\273\213\347\273\215.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/DTU\345\272\224\347\224\250\345\274\200\345\217\221/README.md" "b/docs/solutions/zh/DTU\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/docs/solutions/zh/Note.md b/docs/solutions/zh/Note.md
deleted file mode 100644
index e2b7a649f55164a0dccd309f6eff1a32f9f55e2c..0000000000000000000000000000000000000000
--- a/docs/solutions/zh/Note.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# QuecPython 解决方案文档编写注意事项
-
-## 目录结构
-
-解决方案根目录下存在一个名为`README.md`的文件,作为解决方案的首页入口。
-
-> 文档中心使用的[teedoc](https://gitee.com/teedoc)架构要求每个版块的首页文件都要是名为`README.md`的文件。
-
-每个功能板块在根目录下均对应一个文件夹,在该文件夹内,拆分为框架介绍和开发流程两个md文件。
-
-所有md文件中引用的图片,均存放于media目录中:
-- 解决方案文件夹下有多少文件夹,在media也按照目录关系建立相应的文件夹。
-- 图片统一为png格式,命名请见名知意,如`BMS.xxx.png`,其中`xxx`表示用简短英文编写的图片作用描述。
-
-目录结构示例如下:
-
-```
-QuecPython官网文档中心/解决方案
-├── BMS通信云盒应用开发
-│ ├── BMS通信云盒应用开发-开发流程.md
-│ └── BMS通信云盒应用开发-框架介绍.md
-├── DTU应用开发
-│ ├── DTU应用开发-开发流程.md
-│ └── DTU应用开发-框架介绍.md
-├── Note.md
-├── PoC应用开发
-│ ├── PoC应用开发-开发流程.md
-│ └── PoC应用开发-框架介绍.md
-├── README.md
-├── media
-│ ├── BMS通信云盒应用开发
-│ │ └── BMS.xxx.png
-│ └── DTU应用开发
-│ └── DTU.xxx.png
-├── tracker应用开发
-│ ├── tracker应用开发-开发流程.md
-│ └── tracker应用开发-框架介绍.md
-└── 学生卡应用开发
- ├── 学生卡应用开发-开发流程.md
- └── 学生卡应用开发-框架介绍.md
-```
-
-## README.md
-
-README.md作为板块的首页入口,需要对该板块做综合性描述,并且在最后提供板块的所有二级目录链接。
-
-## 正文内容格式
-
-参照以下格式:
-
-```markdown
-# BMS 通信云盒框架介绍
-
-正文
-
-```
-
-## QuecPython 解决方案
-
-[点此查看](./README.md)
diff --git "a/docs/solutions/zh/PoC\345\272\224\347\224\250\345\274\200\345\217\221/PoC\345\272\224\347\224\250\345\274\200\345\217\221-\345\274\200\345\217\221\346\265\201\347\250\213.md" "b/docs/solutions/zh/PoC\345\272\224\347\224\250\345\274\200\345\217\221/PoC\345\272\224\347\224\250\345\274\200\345\217\221-\345\274\200\345\217\221\346\265\201\347\250\213.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/PoC\345\272\224\347\224\250\345\274\200\345\217\221/PoC\345\272\224\347\224\250\345\274\200\345\217\221-\346\241\206\346\236\266\344\273\213\347\273\215.md" "b/docs/solutions/zh/PoC\345\272\224\347\224\250\345\274\200\345\217\221/PoC\345\272\224\347\224\250\345\274\200\345\217\221-\346\241\206\346\236\266\344\273\213\347\273\215.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/PoC\345\272\224\347\224\250\345\274\200\345\217\221/README.md" "b/docs/solutions/zh/PoC\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/docs/solutions/zh/README.md b/docs/solutions/zh/README.md
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/docs/solutions/zh/config.json b/docs/solutions/zh/config.json
deleted file mode 100644
index 74473856de5925754d75d1888e5c1842cd944c9d..0000000000000000000000000000000000000000
--- a/docs/solutions/zh/config.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "import": "config_zh",
- "name": "解决方案"
-}
\ No newline at end of file
diff --git "a/docs/solutions/zh/media/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221/BMS.xxx.png" "b/docs/solutions/zh/media/BMS\351\200\232\344\277\241\344\272\221\347\233\222\345\272\224\347\224\250\345\274\200\345\217\221/BMS.xxx.png"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/media/DTU\345\272\224\347\224\250\345\274\200\345\217\221/DTU.xxx.png" "b/docs/solutions/zh/media/DTU\345\272\224\347\224\250\345\274\200\345\217\221/DTU.xxx.png"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/docs/solutions/zh/sidebar.yaml b/docs/solutions/zh/sidebar.yaml
deleted file mode 100644
index 6a330da5f19f6301a210c36bfed31c923789a592..0000000000000000000000000000000000000000
--- a/docs/solutions/zh/sidebar.yaml
+++ /dev/null
@@ -1,83 +0,0 @@
-items:
-- label: teedoc 简介
- file: README.md
-- label: 使用了 teedoc 的网站
- file: usage/sites.md
-- label: 基本使用
-- label: 快速开始
- file: usage/quick_start.md
-- label: 安装 teedoc
- file: install/README.md
-- label: 文档结构和配置
- file: usage/start.md
-- label: 编写文档内容(语法)
- collapsed: false
- items:
- - label: markdown 语法
- file: syntax/syntax_markdown.md
- - label: Jupyter 语法
- file: syntax/syntax_jupyter.ipynb
- - label: HTML 语法
- file: syntax/syntax_html.html
-- label: 写文档时需注意
- file: usage/write_attention.md
-- label: 博客
- file: usage/blog.md
-- label: 部署
- file: usage/deploy.md
- items:
- - label: 部署到 github
- file: usage/deploy_github_pages.md
- - label: 使用 nginx 部署到服务器
- file: usage/deploy_nginx.md
- - label: 部署到云服务商
- file: usage/deploy_cloud.md
- - label: 使用 CDN 加速网站
- file: usage/deploy_cdn.md
-- label: 常见问题
- file: usage/problems.md
-- label: 进阶使用
-- label: 插件
- file: plugins/README.md
- items:
- - label: 主题插件
- file: plugins/themes.md
- - label: 其它插件
- file: plugins/others.md
-- label: SEO(为搜索引擎优化)
- file: usage/seo.md
-- label: 自定义页面模板
- file: usage/layout_template.md
-- label: 国际化(i18n/翻译)
- file: usage/i18n.md
-- label: 自定义404页面
- file: usage/404.md
-- label: 从 gitbook 转换为 teedoc
- file: usage/gitbook2teedoc.md
-- label: 查找大文件
- file: usage/list_files_by_size.md
-- label: 找出两目录的不同文件
- file: usage/compare_dirs.md
-- label: 更多
-- label: 更新历史
- file: more/history.md
-- label: 更多样例(目录默认展开)
- collapsed: false
- items:
- - label: 二级子目录
- items:
- - label: 三级子目录样例
- items:
- - label: 文章1
- file: more/example_docs/doc1.md
- - label: 文章2
- file: more/example_docs/doc2.md
- - label: 文章标题自动编号
- items:
- - label: 页面有多个一级标题
- file: more/example_docs/multi_h1.md
- - label: 标题不自动编号
- file: more/example_docs/heading_no_counter.md
- - label: 这是一个外部链接
- url: https://github.com/teedoc/teedoc
- target: _blank
diff --git "a/docs/solutions/zh/tracker\345\272\224\347\224\250\345\274\200\345\217\221/README.md" "b/docs/solutions/zh/tracker\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/tracker\345\272\224\347\224\250\345\274\200\345\217\221/tracker\345\272\224\347\224\250\345\274\200\345\217\221-\345\274\200\345\217\221\346\265\201\347\250\213.md" "b/docs/solutions/zh/tracker\345\272\224\347\224\250\345\274\200\345\217\221/tracker\345\272\224\347\224\250\345\274\200\345\217\221-\345\274\200\345\217\221\346\265\201\347\250\213.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/tracker\345\272\224\347\224\250\345\274\200\345\217\221/tracker\345\272\224\347\224\250\345\274\200\345\217\221-\346\241\206\346\236\266\344\273\213\347\273\215.md" "b/docs/solutions/zh/tracker\345\272\224\347\224\250\345\274\200\345\217\221/tracker\345\272\224\347\224\250\345\274\200\345\217\221-\346\241\206\346\236\266\344\273\213\347\273\215.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/\345\255\246\347\224\237\345\215\241\345\272\224\347\224\250\345\274\200\345\217\221/README.md" "b/docs/solutions/zh/\345\255\246\347\224\237\345\215\241\345\272\224\347\224\250\345\274\200\345\217\221/README.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/\345\255\246\347\224\237\345\215\241\345\272\224\347\224\250\345\274\200\345\217\221/\345\255\246\347\224\237\345\215\241\345\272\224\347\224\250\345\274\200\345\217\221-\345\274\200\345\217\221\346\265\201\347\250\213.md" "b/docs/solutions/zh/\345\255\246\347\224\237\345\215\241\345\272\224\347\224\250\345\274\200\345\217\221/\345\255\246\347\224\237\345\215\241\345\272\224\347\224\250\345\274\200\345\217\221-\345\274\200\345\217\221\346\265\201\347\250\213.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git "a/docs/solutions/zh/\345\255\246\347\224\237\345\215\241\345\272\224\347\224\250\345\274\200\345\217\221/\345\255\246\347\224\237\345\215\241\345\272\224\347\224\250\345\274\200\345\217\221-\346\241\206\346\236\266\344\273\213\347\273\215.md" "b/docs/solutions/zh/\345\255\246\347\224\237\345\215\241\345\272\224\347\224\250\345\274\200\345\217\221/\345\255\246\347\224\237\345\215\241\345\272\224\347\224\250\345\274\200\345\217\221-\346\241\206\346\236\266\344\273\213\347\273\215.md"
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/pages/index/zh/README.md b/pages/index/zh/README.md
index 2b24884f740f43202319044654357af11c174556..f1d649cf98ffd18ca5b553e94852c454c96e7d26 100644
--- a/pages/index/zh/README.md
+++ b/pages/index/zh/README.md
@@ -30,7 +30,7 @@ id: home_page
-
+
API参考手册
- 最新:2023-01-19
+
最新:2023-03-15
-
-
-
+
-
-
-
-
-
-
+
-
-
+
+
-
云喇叭、DTU、对讲机、Tracker和BMS相关等solution介绍
+
QuecPython开发指南,包括BSP、网络通信、外设应用开发等
-
- 解决方案
+
+ 开发指南
最新:2023-01-16
@@ -149,7 +104,7 @@ id: home_page
-
常见问题,刷砖救砖,文档系统编写规范,
+
常见问题,固件烧录救砖,文档系统编写规范,
参与文档贡献流程,提交文档错误流程。
@@ -158,7 +113,7 @@ id: home_page
FAQ
-
最新:2023-01-16
+
最新:2023-03-15
diff --git a/site_config.json b/site_config.json
index c407fe4ee7a49ba728cff91e035d7ec6b114468c..d0d6b330feb19f312f80a5ba396961108f5c1d07 100644
--- a/site_config.json
+++ b/site_config.json
@@ -9,10 +9,8 @@
"route": {
"docs": {
"/API_reference/zh/": "docs/API_reference/zh",
- "/development_guide/zh/": "docs/development_guide/zh",
- "/development_tool_tutorial/zh/": "docs/development_tool_tutorial/zh",
- "/advanced_tutorial/zh/": "docs/advanced_tutorial/zh",
- "/solutions/zh/": "docs/solutions/zh",
+ "/Getting_started/zh/": "docs/Getting_started/zh",
+ "/Application_guide/zh/": "docs/Application_guide/zh",
"/FAQ/zh/": "docs/FAQ/zh"
},
"pages": {
diff --git a/static/css/theme_default/light.css b/static/css/theme_default/light.css
index 0f786254bb25f8424de18f90fe7c5d4c01433114..a9688d74a3149595e11603d9ebdb352883169d5a 100644
--- a/static/css/theme_default/light.css
+++ b/static/css/theme_default/light.css
@@ -1067,7 +1067,7 @@ a.toc-link {
/* class template */
.md_page #page_content > div {
width: 90%;
- max-width: 50em;
+ /* max-width: 50em; */
margin: auto;
line-height: 2em;
}