Class L

总览

Class LClass C+ 协议的派生分支,对协议的语义进一步进行了规范和统一。

其MTU为 247 bytes

数据帧结构

byte

0

流控信息

1

载荷长度

2~n

载荷

字节序

鉴于目前常见的蓝牙MCU均使用 Little-Endian 小端字节序, 为避免在性能受限的MCU上产生额外的性能与储存开销,协议使用MCU的原生字节序,在这里即为 Little-Endian 小端字节序。

Little-Endian
  • 一个16位的数据,如 0x1234 = 4660 传输时为 0x34, 0x12

  • 一个24位的数据,如 0x123456 = 1193046 传输时为 0x56, 0x34, 0x12

  • 一个32位的数据,如 0x12345678 = 305419896 传输时为 0x78, 0x56, 0x34, 0x12

  • 一个Unix时间戳(32位),如 0x622B096C = 1646987628 = 2022-03-11 16:33:48 传输时为 0x6C, 0x09, 0x2B, 0x62

参考文档: 字节序

有符号数

在常规CPU中,有符号数以补码表示。在此为MCU原生的负整数表示方式。 在协议中,使用的有符号数均以此表示。

例如

  • 一个8位的负数, -1 = 0xFF-128 = 0x80 , -127 = 0x81

  • 一个16位的负数, -1 = 0xFFFF , -2 = 0xFFFE

  • 一个32位的负数, -1 = 0xFFFFFFFF , -2 = 0xFFFFFFFE

参考文档: 有符号数处理

数据包内容

数据包包含如下内容(括号中为长度):

流控信息 (1)

控制数据传输过程,提高传输可靠性,并完成差错控制

载荷长度 (1)

定义当前数据包中载荷的长度

载荷 (0~245)

数据载荷

向后兼容

在两个设备建立连接时,移动端读取设备端的相关信息与协议版本。由移动端兼容设备端。


约定

小技巧

简洁起见,描述中 flowcontrol(流控) 在以下文档中 使用未带 0x 前缀的 $FC 缩写表示。

小技巧

在文档描述中 ->MCUAPP-> 均表示移动端发送至MCU,
MCU->->APP 均表示MCU发送至移动端

小技巧

  • 在本文档中,形如 13 的无前缀数字表示十进制数

  • 形如 0x13 的以 0x 为前缀的数字表示十六进制数

  • 形如 0b11011011 的以 0b 为前缀的数字表示二进制数

危险

在本文档中, 没有 使用 BCD 编码

为便于理解,在某些如时间日期等的协议描述中使用了十进制来表示, 注意,这里举例说明,如果有描述为 1333 分的时间, 其对应十六进制描述应该为 0x0D0x21

数据结构

一个完整协议帧的格式如下表所示:

byte

内容

详情

0

流控

1

长度

2

载荷

索引

3

次级索引

4~n

参数

流控

使用一个 byte ,为一个 0~255 的数值。 作为最近发送数据包的唯一标识。对于任何数据包的返回包都应具有相同的流控数值。

在同时乱序发送多个相似的数据包时,流控可以用来区分各个数据包的返回包。 一般建议采用递增的数值作为流控。也可以使用随机的数值作为流控。 具体处理见下方详细描述。

小技巧

在传输中,如果是读取操作,没有收到对应的流控头的反馈,应当进行重传。

例1

->MCU: $FC= 0x1F , $length= 3 , 0xAB , 调用 0xAB 接口
0x02 , 0x01 执行 0x02 操作, 参数 0x01
->MCU: $FC= 0x20 , $length= 3 , 0xAB , 调用 0xAB 接口
0x02 , 0x00 执行 0x02 操作, 参数 0x00
->MCU: $FC= 0x21 , $length= 4 , 0x01 , 调用 0x01 接口
0x00 , 0x00 , 0xF0 , 执行 0x00 操作, 参数 0x00, 0xF0

->MCU: $FC= 0x1F , $length= 0 返回流控为 0x1F 的 ACK
->MCU: $FC= 0x21 , $length= 0 返回流控为 0x21 的 ACK

未收到流控 ``0x20`` 的ACK,意味着完整传输流程没有完成,需要重传。

MCU->: $FC= 0x20 , $length= 3 , 0xAB , 调用 0xAB 接口
0x02 , 0x00 执行 0x02 操作, 参数 0x00

MCU->: $FC= 0x20 , $length= 0 返回流控为 0x20 的 ACK

小技巧

在传输中,如果是控制或写入操作,收到最近重复的流控头,应当忽略。

例2

本例在 递增流控 与 缓存深度 16 条件下进行描述。
缓存深度 16 表示若收到的流控位与最近收到的 16 个流控位中有出现相同,则视为重复。

->MCU: $FC= 0x1F , $length= 3 , 0xAB ,
0x02 , 0x01 调用 0xAB 接口, 执行 0x02 操作, 参数 0x01
->MCU: $FC= 0x20 , $length= 3 , 0xAB ,
0x02 , 0x00 调用 0xAB 接口, 执行 0x02 操作, 参数 0x00
->MCU: $FC= 0x21 , $length= 4 , 0x01 ,
0x00 , 0x00 , 0xF0 调用 0x01 接口, 执行 0x00 操作, 参数 0x00 , 0xF0
->MCU: $FC= 0x20 , $length= 3 , 0xAB ,
0x02 , 0x01 调用 0xAB 接口, 执行 0x02 操作, 参数 0x01

MCU->: $FC= 0x1F , $length= 0 返回流控为 0x1F 的 ACK
MCU->: $FC= 0x20 , $length= 0 返回流控为 0x20 的 ACK
MCU->: $FC= 0x21 , $length= 0 返回流控为 0x21 的 ACK
第二次发送的流控 0x20 因为与之前重复,所以此处忽略。
实际接收为:0xAB 接口, 执行 0x02 操作, 参数 0x00

备注

对于 接收方 来说,总结如下:

在传输中,接收方如果收到最近重复的流控头,根据不同操作,建议处理如下:

  • 如果是控制或写入操作,应当不执行操作,只返回ACK

  • 如果是读取操作,应当按正常逻辑再次返回

对于 发送方 来说,总结如下:

在传输中,发送方如果没有收到对应流控头的反馈,根据不同情况,建议处理如下:

  • 如果是有 副作用(side effect) 的控制、写入或读取操作,应当使用原流控头重传完全相同的内容

  • 如果是没有 副作用(side effect) 的控制、写入或读取操作,除同上操作外,可以考虑使用新的流控头重传

长度

表示协议帧中载荷的长度,接收方按此处长度进行解析,超出此长度定义的内容忽略。

->MCU: $FC= 0x1F , $length= 4 ,
0xAB , 0x02 , 0x01 , 0x01 , 0xFF , 0x00
此帧数据中,长度位为 4 ,所以解析的载荷部分为:
0xAB , 0x02 , 0x01 , 0x01
多余的部分忽略

索引次级索引参数

索引 为协议功能的第一级分类。包含在协议内容的标题中。

次级索引 为协议功能的第二级分类。包含在协议内容的次级标题中。

参数 为协议功能的详细内容。包含在功能的详细描述中。

公共语义

为保证协议逻辑的一致性,对部分 参数 的语义进行统一如下:

参数

语义

0x00

获取(Get)

0x01

设置(Set)

0x0C

控制

0x0D

清除(Delete)


内容

序号

内容

0

流控

1

载荷长度

2

接口索引

3

次级索引

4-n

参数

为简洁起见,在以下协议的描述表格中将会 省略 流控载荷长度 的表示。

应答 ACK

载荷长度0 的数据包表示 ACK ,如下所示:

序号

内容

0

流控

返回帧与发送帧相同

1

载荷长度

0

简洁起见,在以下内容中均以 ACK 直接表示,而不再重复描述其结构。

错误 0xFF

0xFF 的接口索引表示返回了一个错误。

当长度为 3 时,表示返回了一个 16位 的通用错误代码。

Code

含义

303

能源状态拒绝(如低电)

401

设备未注册

404

接口不存在

405

无效的次级索引

406

无效的参数

410

方法未实现或已删除

->MCU: $FC , $length= 3 , 0xAB ,
0x02 , 0x01 调用 0xAB 接口

MCU->: $FC , $length= 3 , 0xFF ,
0x94 , 0x01 返回错误 0x194 = 404 ,表示接口 0xAB 不存在

实时授时 0x01

0x01.当前时间

备注

时间的设置与获取同时兼容 YYMMDDHHMMSSTTUnix timestamp 两种格式。 使用 YYMMDDHHMMSSTT 格式时,传输的时间为 UTC 时间。

获取

发送:

序号

内容

2

接口索引

0x01

3

次级索引

0x01

4

获取

0x00

5

类型

  • 0x00 = YYMMDDHHMMSSTT

  • 0x01 = Unix timestamp

返回 YYMMDDHHMMSSTT

序号

内容

2

接口索引

0x01

3

次级索引

0x01

4

获取

0x00

5

类型

0x00

6

0~99

7

1~12

8

1~31

9

0~23

10

0~59

11

0~59

12

时区时

-12~+14

13

时区分

-59~+59

备注

  • 返回的时间与日期均为 UTC时间 ,时区使用 8位有符号数 表示,

    MCU 计算时区会使用时区时和时区分相加,请保证符号正确。

  • -6 , -30 表示 UTC-6:30+6 , +30 表示 UTC+6:30

  • -6 , +30 会计算出 UTC-5:30 的结果,为保持代码的可读性,请勿如此使用

->MCU: $FC , $length= 4 , 0x01 , 0x01 , 0x00 , 0x00

MCU->: $FC , $length= 12 , 0x01 , 0x01 , 0x00 , 0x00 ,
0x16 , 0x0A , 0x0F , 0x16 = 2022 年, 0x0A = 10 月, 0x0F = 15 日
0x0D , 0x02 , 0x03 , 0x0D = 13 点, 0x02 = 02 分, 0x03 = 03 秒
0x08 , 0x1E UTC+0830

返回 Unix timestamp

序号

内容

2

接口索引

0x01

3

次级索引

0x01

4

获取

0x00

5

类型

0x01

6~9

Unix时间戳

x

10

时区时

-12~+14

11

时区分

-59~+59

->MCU: $FC , $length= 2 , 0x01 , 0x01 , 0x00 , 0x01

MCU->: $FC , $length= 10 , 0x01 , 0x01 , 0x00 , 0x01
0x6C , 0x09 , 0x2B , 0x62 0x622B096C = 2022 - 03 - 11 16 : 33 : 48
0x08 , 0x1E UTC+0830
设置

发送 YYMMDDHHMMSSTT

序号

内容

2

接口索引

0x01

3

次级索引

0x01

4

设置

0x01

5

类型

0x00

6

0~99

7

1~12

8

1~31

9

0~23

10

0~59

11

0~59

12

时区时

-12~+14

13

时区分

-59~+59

返回:ACK

->MCU: $FC , $length= 10 , 0x01 , 0x01 , 0x01 , 0x00 ,
0x16 , 0x0A , 0x0F , 0x16 = 2022 年, 0x0A = 10 月, 0x0F = 15 日
0x0D , 0x02 , 0x03 , 0x0D = 13 点, 0x02 = 02 分, 0x03 = 03 秒
0x08 , 0x1E UTC+0830

MCU->: ack

发送 Unix timestamp

序号

内容

2

接口索引

0x01

3

次级索引

0x01

4

设置

0x01

5

类型

0x01

6~9

Unix时间戳

x

10

时区时

-12~+14

11

时区分

-59~+59

->MCU: $FC , $length= 10 , 0x01 , 0x01 , 0x01 , 0x01
0x6C , 0x09 , 0x2B , 0x62 0x622B096C = 2022 - 03 - 11 16 : 33 : 48
8 , 30 UTC+0830

MCU->: ack

指针控制 0x02

指针参数由 属性 和对应的 来确定。 属性列表如下:

属性(1 byte)

值(n bytes)

  • 物理位置[ 0x01 ]

  • 逻辑位置[ 0x02 ]

  • 运行模式[ 0x03 ]

xxxx

其中 物理位置逻辑位置 的定义及指针驱动原理见 「行针控制」, 运行模式列表如下:

运行模式

Hex

正常

0x00

停针

0x01

快速正转

0x02

快速反转

0x03

手动调整

0x04

备注

未特殊说明时,物理位置与逻辑位置均采用 2 字节宽度

访问 「齿轮箱配置列表」 获取不同设备的齿轮箱配置

0x01.齿轮箱参数

获取

备注

支持同时获取多个对象的多个属性值。

发送:

序号

内容

2

接口索引

0x02

3

次级索引

0x01

4

获取

0x00

5

对象1

x

6

属性1

x

7

对象2

x

8

属性2

x

返回:

序号

内容

2

接口索引

0x02

3

次级索引

0x01

4

获取

0x00

5

对象1

x

6

属性1

x

7~n

参数1

x

n+1

对象2

x

n+2

属性2

x

n+3~n+m

参数2

x

例1

->MCU: $FC , $length= 4 , 0x02 , 0x01 , 0x00 ,
0x01 编号 01 的机芯 , 0x01 物理位置

MCU->: $FC , $length= 6 , 0x02 , 0x01 , 0x00 ,
0x01 编号 01 的机芯 , 0x01 物理位置 ,
0x10 , 0x27 0x2710 = 10000

例2

->MCU: $FC , $length= 4 , 0x02 , 0x01 ,
0x00 获取 ,
0x01 编号 01 的机芯 , 0x01 物理位置 ,
0x01 编号 01 的机芯 , 0x02 逻辑位置 ,
0x02 编号 02 的机芯 , 0x01 物理位置

MCU->: $FC , $length= 6 , 0x02 , 0x01 ,
0x00 获取 ,
0x01 编号 01 的机芯 , 0x01 物理位置 ,
0x10 , 0x27 0x2710 = 10000 ,
0x01 编号 01 的机芯 , 0x02 逻辑位置 ,
0x20 , 0x28 0x2820 = 10272
0x02 编号 02 的机芯 , 0x01 物理位置 ,
0x20 , 0x00 0x0020 = 32
设置

备注

支持同时设置多个对象的多个属性值。

发送:

序号

内容

2

接口索引

0x02

3

次级索引

0x01

4

设置

0x01

5

对象1

x

6

属性1

x

7~n

参数1

x

n+1

对象2

x

n+2

属性2

x

n+3~n+m

参数2

x

返回:ACK

备注

当设置为非正常走时模式,设备会启动一个 30 秒的超时定时器, 超时后自动恢复正常模式。重发设置指令可以将超时重置为 30 秒。 当需要维持所设置状态时,建议间隔 10 秒左右重复发送此命令。

具体超时机制时长的设置由各项目自行定义。

例1

->MCU: $FC , $length= 6 , 0x02 , 0x01 ,
0x01 设置 ,
0x01 编号 01 的机芯 , 0x01 物理位置 ,
0x10 , 0x27 0x2710 = 10000

MCU->: ACK

例2

->MCU: $FC , $length= 6 , 0x02 , 0x01 ,
0x01 设置 ,
0x01 编号 01 的机芯 , 0x01 物理位置 ,
0x10 , 0x27 0x2710 = 10000 ,
0x01 编号 01 的机芯 , 0x02 逻辑位置 ,
0x20 , 0x28 0x2820 = 10272
0x02 编号 02 的机芯 , 0x01 物理位置 ,
0x20 , 0x00 0x0020 = 32

MCU->: ACK

通知提醒 0x03

参数使用 byte 中的 bit 来分别表示提醒种类,下表仅为示例:

参数bit

含义

7

\

6

\

5

\

4

\

3

\

2

来电

1

其他

0

\

具体提醒类别的定义与长度由项目文档所定义。 以下所用示例均参考上表的定义。

0x01.提醒更新

设置

发送:

序号

内容

2

接口索引

0x03

3

次级索引

0x01

4

设置

0x01

5~n

参数bit

x

返回:ACK

例1

->MCU: $FC , $length= 4 ,
0x03 , 0x01 , 0x01 ,
0x04 来电提醒

MCU->: ACK

例2

->MCU: $FC , $length= 4 ,
0x03 , 0x01 , 0x01 ,
0x02 其他提醒

MCU->: ACK
清除

发送:

序号

内容

2

接口索引

0x03

3

次级索引

0x01

4

清除

0x0D

5~n

参数bit

x

返回:ACK

->MCU: $FC , $length= 4 ,
0x03 , 0x01 , 0x0D ,
0x04 取消电话提醒

MCU->: ack

0x02.提醒间隔

设置

发送:

序号

内容

2

接口索引

0x03

3

次级索引

0x02

4

设置

0x01

5~6

提醒间隔

2字节秒数

返回:ACK

->MCU: $FC , $length= 5 ,
0x03 , 0x02 , 0x01 ,
0x02 , 0x01 提醒间隔设置为 0x0102 = 258 秒

MCU->: ack
获取

发送:

序号

内容

2

接口索引

0x03

3

次级索引

0x02

4

获取

0x00

返回:

序号

内容

2

接口索引

0x03

3

次级索引

0x02

4

获取

0x00

5~6

提醒间隔

2字节秒数

例2

->MCU: $FC , $length= 3 , 0x03 , 0x03 , 0x00

MCU->: $FC , $length= 4 ,
0x03 , 0x03 ,
0x04 , 0x01 表示获取到提醒间隔为 0x0104 = 260 秒

0x03.提醒开关

设置

发送:

序号

内容

2

接口索引

0x03

3

次级索引

0x03

4

设置

0x01

5

参数

x

返回:ACK

例1

->MCU: $FC , $length= 4 ,
0x03 , 0x03 , 0x01 ,
0x04 来电提醒开启,且其他提醒关闭

MCU->: ACK

例2

->MCU: $FC , $length= 4 ,
0x03 , 0x03 , 0x01 ,
0x02 其他提醒开启,且来电提醒关闭

MCU->: ACK

例3

->MCU: $FC , $length= 4 ,
0x03 , 0x04 , 0x01 ,
0x06 其他与来电提醒均开启

MCU->: ACK
获取

发送:

序号

内容

2

接口索引

0x03

3

次级索引

0x03

4

获取

0x00

返回:

序号

内容

2

接口索引

0x03

3

次级索引

0x03

4

获取

0x00

5~n

参数

x

例1

->MCU: $FC , $length= 3 , 0x03 , 0x03 , 0x00

MCU->: $FC , $length= 3 , 0x03 , 0x05 ,
0x04 来电提醒开启,其他提醒关闭

例2

->MCU: $FC , $length= 3 , 0x03 , 0x03 , 0x00

MCU->: $FC , $length= 3 , 0x03 , 0x05 ,
0xff 所有提醒均开启

0x11. 内容推送

控制

推送提醒内容至屏幕显示

发送:

序号

内容

2

接口索引

0x03

3

次级索引

0x11

4

控制

0x0C

5~n

参数

x

返回:ACK

例1

这个示例发送了如下一段文本:
这是一段测试文本, 用来测试显示推送内容的功能。

->MCU: $FC , 3+67 索引和次级索引长度+字符串长度 ,
0x03 , 0x11 , 0x0C ,
0xe8 , 0xbf , 0x99 , 0xe6 ,
0x98 , 0xaf , 0xe4 , 0xb8 , 0x80 , 0xe6 ,
0xae , 0xb5 , 0xe6 , 0xb5 , 0x8b , 0xe8 ,
0xaf , 0x95 , 0xe6 , 0x96 , 0x87 , 0xe6 ,
0x9c , 0xac , 0x2c , 0xe7 , 0x94 , 0xa8 ,
0xe6 , 0x9d , 0xa5 , 0xe6 , 0xb5 , 0x8b ,
0xe8 , 0xaf , 0x95 , 0xe6 , 0x98 , 0xbe ,
0xe7 , 0xa4 , 0xba , 0xe6 , 0x8e , 0xa8 ,
0xe9 , 0x80 , 0x81 , 0xe5 , 0x86 , 0x85 ,
0xe5 , 0xae , 0xb9 , 0xe7 , 0x9a , 0x84 ,
0xe5 , 0x8a , 0x9f , 0xe8 , 0x83 , 0xbd ,
0xe3 , 0x80 , 0x82

MCU->: ack

闹钟设定 0x05

备注

下面示例使用最多 5 组闹钟的配置,具体项目配置跟随项目定义。

在闹钟设置中,使用1个 byte 的8个 bit 来表示重复设置的内容,如下表所示:

参数bit

含义

7

是否重复

6

Sat

5

Fri

4

Thu

3

Wed

2

Tue

1

Mon

0

Sun

0x01.闹钟配置

设置

发送:

序号

内容

2

接口索引

0x05

3

次级索引

0x01

4

设置

0x01

5

第一组闹钟时

x

6

第一组闹钟分

x

7

第一组重复设置

x

8

第一组开关

0为关,1为开

9

第二组闹钟时

x

10

第二组闹钟分

x

11

第二组重复设置

x

12

第二组开关

0为关,1为开

13

第三组闹钟时

x

14

第三组闹钟分

x

15

第三组重复设置

x

16

第三组开关

0为关,1为开

返回:ACK

备注

设置闹钟时,如果发送闹钟组数少于最大支持组数,则未设置的闹钟将被置为关闭

例1

->MCU: $FC , $length= 7 , 0x05 , 0x01 , 0x01 ,
8 , 14 , 0xBE , 1 设置第一组闹钟,时间: 8 : 14 重复: 周一 ~ 周五 开启 其他关闭

MCU->: ack

例2

->MCU: $FC , $length= 19 , 0x05 , 0x01 , 0x01 ,
8 , 14 , 0xBE , 1 , 设置第一组闹钟,时间: 8 : 14 重复: 周一 ~ 周五 闹钟开启
9 , 30 , 0x00 , 1 , 设置第二组闹钟,时间: 9 : 30 重复: 无 闹钟开启
10 , 30 , 0xC1 , 1 , 设置第三组闹钟,时间: 10 : 30 重复: 周六 ~ 周日 闹钟开启
8 , 00 , 0x92 , 1 , 设置第四组闹钟,时间: 8 : 00 重复: 周一 、 周四 闹钟开启
其他未设置闹钟关闭

MCU->: ack
获取

发送:

序号

内容

2

接口索引

0x05

3

次级索引

0x01

3

获取

0x00

返回:

序号

内容

2

接口索引

0x05

3

次级索引

0x01

4

获取

0x00

5

闹钟时

x

6

闹钟分

x

7

重复设置

x

8

开关

x

9~n

->MCU:$FC , $length= 3 , 0x05 , 0x01 , 0x00

MCU->:$FC , $length= 23 , 0x05 , 0x01 , 0x00
10 , 25 , 0xC1 , 1 , 第一组闹钟,时间: 10 : 25 重复: 周六/周日 闹钟开启
9 , 30 , 0x00 , 0 , 第二组闹钟,时间: 9 : 30 重复: 无 闹钟关闭
10 , 30 , 0xC1 , 0 , 第三组闹钟,时间: 10 : 30 重复: 周六 ~ 周日 闹钟关闭
8 , 00 , 0x92 , 1 , 第四组闹钟,时间: 8 : 00 重复: 周一 、 周四 闹钟开启
8 , 14 , 0xBE , 0 , 第五组闹钟,时间: 8 : 14 重复: 周一 ~ 周五 闹钟关闭

系统信息 0x06

0x21. 设备分类识别码

获取

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x21

4

获取

0x00

返回:

序号

内容

2

接口索引

0x06

3

次级索引

0x21

4

获取

0x00

5~n

识别码

x

APP->: $FC , $length= 3 , 0x06 , 0x21 , 0x00

->APP: $FC , $length , 0x06 , 0x21 , 0x00
0x01 识别码

备注

设备分类识别码同时放置于广播包厂商信息的第 3 个字节处

备注

访问 「齿轮箱配置列表」 获取更多信息

0x22. 设备唯一识别码

获取

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x22

4

获取

0x00

返回:

序号

内容

2

接口索引

0x06

3

次级索引

0x22

4

获取

0x00

5~n

识别码

x

APP->: $FC , $length= 3 , 0x06 , 0x22 , 0x00

->APP: $FC , $length , 0x06 , 0x22 , 0x00
{ 0xA1 , 0xB2 , 0xC3 , 0xD4 , 0xE5 , 0xF6 } 唯一识别码

备注

返回的长度由具体设备决定,一般不少于 6 个字节

0x10.获取OTA名称

获取

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x10

4

获取

0x00

5

内容选择

  • 0x00:项目名称

  • 0x01:分支名称

返回:

序号

内容

2

接口索引

0x06

3

次级索引

0x10

4

获取

0x00

5~n

字符串

string

例1

APP->: $FC , $length= 3 , 0x06 , 0x10 ,
0x00 , 0x00 获取项目名称

->APP: $FC , $length , 0x06 , 0x10 ,
0x00 , "CC4573"

例2

APP->: $FC , $length= 3 , 0x06 , 0x10 ,
0x00 , 0x01 获取分支名称

->APP: $FC , $length , 0x06 , 0x10 ,
0x00 , "TTP"

0x11.固件版本

获取

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x11

4

获取

0x00

返回:

序号

内容

2

接口索引

0x06

3

次级索引

0x11

4

获取

0x00

5~n

字符串

string

APP->: $FC , $length= 3 , 0x06 , 0x11 ,
0x00

->APP: $FC , $length , 0x06 , 0x11 ,
0x00 , "v0.92.1a"

0x12.编译时间戳

获取

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x12

4

获取

0x00

返回:

序号

内容

2

接口索引

0x06

3

次级索引

0x12

4

获取

0x00

5~8

unix时间戳

x

APP->: $FC , $length= 3 , 0x06 , 0x12 ,
0x00

->APP: $FC , $length , 0x06 , 0x12 ,
0x00 , "622B096C"

0x14.编译序列号

获取

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x14

4

获取

0x00

返回:

序号

内容

2

接口索引

0x06

3

次级索引

0x14

4

获取

0x00

5~n

字符串

string

APP->: $FC , $length= 3 , 0x06 , 0x14 ,
0x00

->APP: $FC , $length , 0x06 , 0x14 ,
0x00 , "B57483763"

0x03.系统类型

系统

iOS

0x00

Android

0x01

Other

0xFF

获取

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x03

4

获取

0x00

返回:

序号

内容

2

接口索引

0x06

3

次级索引

0x03

4

获取

0x00

5

系统类型

x

APP->: $FC , $length= 3 , 0x06 , 0x03 ,
0x00

->APP: $FC , $length= 4 , 0x06 , 0x03 ,
0x00 , 0x00 iOS
设置

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x03

4

设置

0x01

5

系统类型

x

返回:ACK

APP->: $FC , $length= 3 , 0x06 , 0x03 ,
0x01 , 0x01 android

->APP: ack

0x04.广播名称

获取

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x04

4

获取

0x00

返回:

序号

内容

2

接口索引

0x06

3

次级索引

0x04

4

获取

0x00

5~n

字符串

x

->MCU: $FC , $length= 3 , 0x06 , 0x04 ,
0x00

MCU->: $FC , $length= 10 , 0x06 , 0x04 ,
0x00 , "Comi-OK"
设置

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x04

4

设置

0x01

5~n

名称

string

返回:ACK

->MCU: $FC , $length= 7 , 0x06 , 0x04 ,
0x01 , "TEST"

MCU->: ACK

备注

更改广播名称后,重启生效。可询问用户是否立即重启,然后发送重启命令。

备注

广播名称设置不能超过12字节。如果长度为 0 ,或者第一个字节为 0x00 ,将视为无效。 iOS可能由于缓存原因不会立即更新显示名称

0x05.MAC地址

获取

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x05

4

获取

0x00

返回:

序号

内容

2

接口索引

0x06

3

次级索引

0x05

4

获取

0x00

5~10

mac地址

x

->MCU: $FC , $length= 3 , 0x06 , 0x05 , 0x00

MCU->: $FC , $length= 8 , 0x06 , 0x05 , 0x00
0xDE , 0xAD , 0xBF , 0xCC , 0xAA , 0xEE

0x06. 绑定状态

获取

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x06

4

获取

0x00

返回:

序号

内容

2

接口索引

0x06

3

次级索引

0x06

4

获取

0x00

5

绑定状态

1/0

->MCU: $FC , $length= 2 , 0x06 , 0x06 ,
0x00

MCU->: $FC , $length= 3 , 0x06 , 0x06 ,
0x00 , 0x01 已绑定

0x30. 使用率数据

备注

使用率数据的类别与数据格式由项目文档定义。此处仅以蓝牙使用率数据作为示例。

蓝牙使用率:

长度

内容

1

类别

0xBE

4

蓝牙广播时长(s)

x

4

蓝牙连接时长(s)

x

4

蓝牙断开次数(次)

x

获取

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x30

4

获取

0x00

5~n

类别

x

返回:

序号

内容

2

接口索引

0x06

3

次级索引

0x30

4

获取

0x00

5~n

数据内容

x

->MCU : $FC , $length= 4 , 0x06 , 0x30 ,
0x00 , 0xBE 获取蓝牙使用率数据

MCU-> : $FC , $length , 0x06 , 0x30 ,
0x00 ,
0x03 , 0x02 , 0x01 , 0x00 , 广播= 0x10203 = 66051 秒
0x01 , 0x02 , 0x03 , 0x00 , 连接= 0x30201 = 197121 秒
0x71 , 0x00 , 0x00 , 0x00 断开= 0x71 = 113 次
清除

发送:

序号

内容

2

接口索引

0x06

3

次级索引

0x30

4

清除

0x0D

5~n

类别

x

返回:ACK

系统操作 0x07

0xE0-0xE7.测试

备注

具体测试功能与流程由项目文档定义。以下仅以链路测试作为说明。

序号

内容

2

接口索引

0x07

3

次级索引

0xE0~0xE7

APP->: $FC , $length= 2 , 0x07 , 0xE0
->APP: $FC , $length= 2 , 0x07 , 0xE1
APP->: $FC , $length= 2 , 0x07 , 0xE2

接收到 0xE0 指令后,设备将返回 0xE1 指令。 接收到 0xE2 指令后,设备将在数秒后关闭蓝牙,并使其 LED 灯低频闪烁,表示测试通过,可分拣出。

0xFE.设备控制

备注

设备控制码的数据格式由项目文档定义。此处仅以关机作为示例。

关机控制码:

长度

内容

2

关机控制代码

0xDE, 0xAD

发送:

序号

内容

2

接口索引

0x07

3

次级索引

0xFE

4

控制

0x0C

5~n

控制码

x

APP->: $FC , $length= 4 , 0x07 , 0xFE ,
0x0C , 0xDE , 0xAD 发送关机指令

数据交互 0x08

备注

在未同步过时间时,设备将不会产生与储存数据。

0x01.数据简报

获取(上行数据)

数据类型与格式由项目文档定义,此处仅以计步数据简报作为示例:

长度

内容

1

类型

0x5E

1

数据当日

x

14

7天计步总数

x

发送:

序号

内容

2

接口索引

0x08

3

次级索引

0x01

4

获取

0x00

5~n

类型&参数

x

返回:

序号

内容

2

接口索引

0x08

3

次级索引

0x01

4

获取

0x00

5

类型

x

6~n

数据内容

x

->MCU: $FC , $length= 4 , 0x08 , 0x01 , 0x00 , 获取
0x5E 计步简报

MCU->: $FC , $length , 0x08 , 0x01 , 0x00 ,
0x5E , 计步简报
0x10 , 数据当日 = 16日
0x10 , 0x11 16日步数 0x1110=4368
0x10 , 0x21 15日步数 0x1110=8464
0x64 , 0x05 14日步数 0x0564=1380
0x00 , 0x33 13日步数 0x3300=13056
0x71 , 0x47 12日步数 0x4771=18289
0x62 , 0x24 11日步数 0x2462=9314
0x49 , 0x05 10日步数 0x0549=1353
设置(下行数据)

此处仅以天气预报简报作为示例:

长度

内容

1

类型

0xEA

1

数据当日

x

6

3天天气预报

x

发送:

序号

内容

2

接口索引

0x08

3

次级索引

0x01

4

设置

0x01

5

类型

x

6~n

参数&内容

x

返回: ACK

->MCU: $FC , $length , 0x08 , 0x01 , 0x01 ,
0xEA , 天气预报简报
0x05 , 数据当日 = 5日
0x33 , 0x01 5日天气 0x0133=307 大雨
0x64 , 0x00 6日天气 0x0064=100 晴
0x67 , 0x00 7日天气 0x0067=103 晴间多云

MCU->: ack

0x11.详细数据

本类别用于传输由传感器采集、用户输入或从网络获取的可用于视觉展示的数据。

数据格式详见项目文档定义。

获取(上行数据)

发送:

序号

内容

2

接口索引

0x08

3

次级索引

0x11

4

获取

0x00

5~n

类型&参数

x

返回:

序号

内容

2

接口索引

0x08

3

次级索引

0x11

4

获取

0x00

5~n

类型&参数&内容

x

设置(下行数据)

发送:

序号

内容

2

接口索引

0x08

3

次级索引

0x11

4

设置

0x01

5~n

类型&参数&内容

x

返回: ACK

应用功能 0x0A

本类别用于传输即时或延时与设备进行交互的命令与数据。具体内容由项目文档定义。

功能设置 0xE0

本类别用于传输会改变设备行为的设置与数据,一般不用于视觉展示。具体内容由项目文档定义。