Class C+

总览

Class C+Class C 协议的增强版本

主要是将MTU升级至 247 bytes ,并增加了一些功能

最近修订历史

日期

备注

2022-02-07

[v3.0.0](docs/classC/changelog.md)

2020-01-20

[v2.0.0](docs/classC/changelog.md)

2019-05-07

[v1.0.4](docs/classC/changelog.md)

2018-11-28

[v1.0.3](docs/classC/changelog.md)

2018-06-10

[v1.0.1](docs/classC/changelog.md)

2017-10-29

[v0.2.2](docs/classC/changelog.md)

2017-05-24

[v0.2.1](docs/classC/changelog.md)

2016-05-29

[v0.2](docs/classC/changelog.md)

数据帧结构

byte

0

1

2~n

内容

流控

载荷长度

载荷

数据包内容

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

流控信息 (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 的数值。 作为最近发送数据包的唯一标识。对于任何数据包的返回包都应具有相同的流控数值。 在同时乱序发送多个数据包时,流控可以用来区分各个数据包的返回包。 为达到区分的目的,请勿连续使用相同的流控数值。一般建议采用递增的数值作为流控。

长度

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

索引

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

操作数

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

参数

具体协议相关的详细参数内容等。


内容

序号

内容

0

流控

1

载荷长度

2

接口索引

3

操作数

4-n

参数

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

应答 ACK

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

序号

内容

0

流控

同发送

1

长度

0

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

返回错误 0xFF

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

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

Code

含义

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.获取当前时间日期

发送:

序号

内容

2

接口索引

0x01

3

操作数

0x01

4

参数

/

返回:

序号

内容

2

接口索引

0x01

3

操作数

0x01

4

0~99

5

1~12

6

1~31

7

0~23

8

0~59

9

0~59

10

时区时

-12~+14

11

时区分

-59~+59

备注

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

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

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

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

  • 例:

    ->MCU: fc , length=2 , 0x01 , 0x01
    
    MCU->: fc , length=10 , 0x01 , 0x01 ,
            0x14 (2020), 0x0A (10) , 0x0F (15) ,
            hour , minute , sec ,
            timezone-hr , timezone-min
    

0x02.设置当前时间与日期

发送:

序号

内容

2

接口索引

0x01

3

操作数

0x02

4

0~99

5

1~12

6

1~31

7

0~23

8

0~59

9

0~59

10

时区时

-12~+14

11

时区分

-59~+59

返回:ACK0

备注

  • 当未包含时区信息(长度为8)时,视参数时间为 本地时间 ,否则为 UTC时间

  • 例1:

    ->MCU: fc , length=8 , 0x01 , 0x02 ,
            year(0-99) , month , day , hour , minute , sec
    
    MCU->: ACK
    
  • 例2:

    ->MCU: fc , length=10 , 0x01 , 0x02 ,
            year(0-99) , month , day , hour , minute , sec ,
            timezone-hr , timezone-min
    
    MCU->: ACK
    

指针控制 0x02

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

属性(1 byte)

值(n bytes)

  • 物理位置[ 0x01 ]

  • 逻辑位置[ 0x02 ]

  • 运行模式[ 0x03 ]

xxxx

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

运行模式

Hex

正常

0x00

停针

0x01

快速正转

0x02

快速反转

0x03

手动调整( +3.5.1 )

0x04

备注

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

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

0x01.获取

发送:

序号

内容

2

接口索引

0x02

3

操作数

0x01

4

对象

x

5

属性

x

返回:

序号

内容

2

接口索引

0x02

3

操作数

0x01

4

对象

x

5

属性

x

6~n

参数

x

例:

->MCU: fc , length=4 , 0x02 , 0x01 ,
        0x01(attr1:编号01的机芯) , 0x01(attr2:物理位置)

MCU->: fc , length=6 , 0x02 , 0x01 ,
        0x01(attr1:编号01的机芯) , 0x01(attr2:物理位置) ,
        0x10 , 0x27(0x2710=10000)

0x02.设置

发送:

序号

内容

2

接口索引

0x02

3

操作数

0x02

4

对象

x

5

属性

x

6~n

参数

x

返回:ACK0

备注

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

例:

->MCU: fc , length=6 , 0x02 , 0x02 ,
        0x01(attr1:编号01的机芯) , 0x01(attr2:物理位置) ,
        0x10 , 0x27(0x2710=10000)

MCU->: ACK

通知提醒 0x03

参数使用1个 byte 中的8个 bit 来分别表示提醒种类,如下表所示:

参数bit

含义

7

\

6

\

5

\

4

\

3

EMAIL

2

来电

1

其他

0

\

备注

app提醒包含在其他类别中

0x01.更新

发送:

序号

内容

2

接口索引

0x03

3

操作数

0x01

4

参数bit

x

返回:ACK0

例1:

->MCU: fc , length=3 ,
        0x03 , 0x01 , 0x04 (来电)

MCU->: ACK

例2:

->MCU: fc , length=3 ,
        0x03 , 0x01 , 0x02 (其他)

MCU->: ACK

0x02.取消

发送:

序号

内容

2

接口索引

0x03

3

操作数

0x02

4

参数bit

x

返回:ACK0

例:

->MCU: fc , length=3 ,
        0x03 , 0x02 , 0x04 (取消电话)

MCU->: ack

0x03.设置/获取间隔

备注

设置提醒间隔。

发送:

序号

内容

2

接口索引

0x03

3

操作数

0x03

4

设置

0x01

5~6

提醒间隔

2字节秒数

返回:ACK0

备注

获取提醒间隔

发送:

序号

内容

2

接口索引

0x03

3

操作数

0x03

4

获取

0x00

返回:

序号

内容

2

接口索引

0x03

3

操作数

0x03

4~5

提醒间隔

2字节秒数

例1:

->MCU: fc , length=5 ,
        0x03 , 0x03 , 0x01 , 0x02 , 0x01 (表示提醒间隔设置为0x0102=258)

MCU->: ack

例2:

->MCU: fc , length=3 , 0x03 , 0x03 , 0x00

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

0x04.设置提醒开关

发送:

序号

内容

2

接口索引

0x03

3

操作数

0x04

4

设置

0x01

5

参数

x

返回:ACK0

备注

使用 0xFF 参数可简单的开启所有提醒。 使用 0x00 参数可简单的关闭所有提醒。

例1:

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

MCU->: ACK

例2:

->MCU: fc , length=4 ,
        0x03 , 0x04 , 0x01 , 0x02 (其他提醒开启,且来电提醒关闭)

MCU->: ACK

例3:

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

MCU->: ACK

0x05.获取提醒开关

发送:

序号

内容

2

接口索引

0x03

3

操作数

0x05

4

获取

0x02

返回:

序号

内容

2

接口索引

0x03

3

操作数

0x05

4

参数

x

例1:

->MCU: fc , length=3 , 0x03 , 0x05 , 0x02

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

例2:

->MCU: fc , length=3 , 0x03 , 0x05 , 0x02

MCU->: fc , length=3 ,
        0x03 , 0x05 , 0xff (所有提醒均开启)

0x11. 内容推送

推送提醒内容至屏幕显示

发送:

序号

内容

2

接口索引

0x03

3

操作数

0x11

4~n

参数

x

返回:ACK0

备注

当超过单帧数据长度时,使用 总览 中描述的延续包传输方式。

例1:

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

->MCU: fc , 2(索引和操作数长度)+67(字符串长度) , 0x03 , 0x11 ,
        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

系统设置 0x04

0x01.设置节电时间

发送:

序号

内容

2

接口索引

0x04

3

操作数

0x01

4

起始时

x

5

起始分

x

6

结束分

x

7

结束分

x

8

开关

1/0

返回:ACK0

例:

->MCU: fc ,  length=7 ,  0x04 ,  0x01 ,
      23 ,  30 ,  7 ,  20 ,  0x01 (节电时间设置为:  23:30 - 7:20 )

MCU->: ack

备注

当设备在节电时间段内,会自动断开蓝牙连接,关闭蓝牙。 对设备的操作,比如按下按键,会暂时取消节电状态, 直到5-10分钟内没有操作,重新进入节电状态

0x02.获取节电时间

发送:

序号

内容

2

接口索引

0x04

3

操作数

0x02

返回:

序号

内容

2

接口索引

0x04

3

操作数

0x02

4

起始时

x

5

起始分

x

6

结束分

x

7

结束分

x

8

开关

1/0

例:

->MCU: fc ,  length=2 ,  0x04 ,  0x02

MCU->: fc ,  length=7 ,  0x04 ,  0x02 ,
      23 ,  30 ,  7 ,  20,  0x01

0x11.设置开关功能位

开关功能位定义:

参数bit

含义

7

\

6

\

5

\

4

\

3

\

2

\

1

抬手亮屏

0

\

发送:

序号

内容

2

接口索引

0x04

3

操作数

0x11

4

参数

x

返回:ACK0

例1:

->MCU: fc ,  length=3 ,  0x04 ,
        0x11 ,  0x02 (打开抬手亮屏)

MCU->: ACK

例2:

->MCU: fc ,  length=3 ,  0x04 ,
        0x11 ,  0x00 (关闭抬手亮屏)

MCU->: ACK

0x12.获取开关功能位

发送:

序号

内容

2

接口索引

0x04

3

操作数

0x12

返回:

序号

内容

2

接口索引

0x04

3

操作数

0x12

4

参数

x

例:

->MCU: fc ,  length=2 ,  0x04 ,  0x12

MCU->: fc ,  length=3 ,  0x04 ,  0x12 ,
        0x02 (抬手亮屏已打开)

闹钟设定 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

第一组闹钟时

x

5

第一组闹钟分

x

6

第一组重复设置

x

7

第一组开关

0为关,1为开

8

第二组闹钟时

x

9

第二组闹钟分

x

10

第二组重复设置

x

11

第二组开关

0为关,1为开

12

第三组闹钟时

x

13

第三组闹钟分

x

14

第三组重复设置

x

15

第三组开关

0为关,1为开

返回:ACK0

备注

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

例1:

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

MCU->:   ack

例2:

      ->MCU:   fc ,  length ,  0x05 ,  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

0x02.获取闹钟

发送:

序号

内容

2

接口索引

0x05

3

操作数

0x02

返回:

序号

内容

2

接口索引

0x05

3

操作数

0x02

4

闹钟时

x

5

闹钟分

x

6

重复设置

x

7

开关

x

8~n

例:

->MCU:fc ,  length=2 ,  0x05 ,  0x02 ,

MCU->:fc ,  length=22 ,  0x05 ,  0x02 ,
        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  重复: 周一 - 周五  闹钟关闭)

0x81.设置闹钟(兼容)

发送:

序号

内容

2

接口索引

0x05

3

操作数

0x81

4

闹钟序号

x

5

闹钟时

x

6

闹钟分

x

7

重复设置

x

8

开关

0为关,1为开

闹钟序号最小为 1,发送 0 时,视为 1

返回:ACK0

例1:

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

MCU->:   ack

系统信息 0x06

0x21. 获取设备分类识别码

发送:

序号

内容

2

接口索引

0x06

3

操作数

0x21

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x21

4

识别码

x

例:

APP->: fc , length=2 , 0x06 , 0x21

->APP: fc , length , 0x06 , 0x21 ,
        0x01(识别码)

备注

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

备注

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

0x22. 获取设备唯一识别码

发送:

序号

内容

2

接口索引

0x06

3

操作数

0x22

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x22

4~n

识别码

x

例:

APP->: fc , length=2 , 0x06 , 0x22

->APP: fc , length , 0x06 , 0x22 ,
        {0xA1,0xB2,0xC3,0xD4,0xE5,0xF6}(唯一识别码)

备注

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

0x10.获取OTA名称

发送:

序号

内容

2

接口索引

0x06

3

操作数

0x10

3

内容选择

  • 0x00:项目名称

  • 0x01:分支名称

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x10

4~n

字符串

string

例1:

APP->: fc , length=3 , 0x06 ,
        0x10 , 0x00

->APP: fc , length , 0x06 ,
        0x10 , "CSW-V1-30"

例2:

APP->: fc , length=3 , 0x06 , 0x10 , 0x01

->APP: fc , length , 0x06 , 0x10 , "LSK"

0x11.获取固件版本

发送:

序号

内容

2

接口索引

0x06

3

操作数

0x11

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x11

4~n

字符串

string

例:

APP->: fc , length=2 , 0x06 , 0x11

->APP: fc , length=XX , 0x06 , 0x11 ,
        'v' , '1' , '.' , '0' , '.' , '0'

0x12.获取编译日期

发送:

序号

内容

2

接口索引

0x06

3

操作数

0x12

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x12

4~n

字符串

string

例:

APP->: fc , length=2 , 0x06 , 0x12

->APP: fc , length , 0x06 , 0x12 ,
        {日期字符串}

0x13.获取编译时间

发送:

序号

内容

2

接口索引

0x06

3

操作数

0x13

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x13

4~n

字符串

string

例:

APP->: fc , length=2 , 0x06 , 0x13

->APP: fc , length , 0x06 , 0x13 ,
        {时间字符串}

0x14.获取编译序列号

发送:

序号

内容

2

接口索引

0x06

3

操作数

0x14

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x14

4~n

字符串

string

例:

APP->: fc , length=2 , 0x06 , 0x14

->APP: fc , length , 0x06 , 0x14 ,
        {序列号字符串}

0x03.系统类型

系统

iOS

0x00

Android

0x01

Other

0xFF

备注

本条指令根据长度区分是获取还是设置,长度为 2 则为获取,为 3 则为设置

获取:

序号

内容

2

接口索引

0x06

3

操作数

0x03

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x03

4

系统类型

x

例:

APP->: fc , length=2 , 0x06 , 0x03

->APP: fc , length=3 , 0x06 , 0x03 ,
        0x00(ios)

设置:

序号

内容

2

接口索引

0x06

3

操作数

0x03

4

系统类型

x

返回:ACK0

例:

APP->: fc , length=3 , 0x06 , 0x03 ,
        0x01(android)

->APP: ack

0x04.广播名称

获取:

序号

内容

2

接口索引

0x06

3

操作数

0x04

4

获取

0x00

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x04

4

字符串

x

例:

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

MCU->: fc , length=8 , 0x06 , 0x04 ,
        'C' , 'O' , 'R' , 'U' , 'M' , 'I'

设置:

序号

内容

2

接口索引

0x06

3

操作数

0x04

4

设置

0x01

5~n

名称

string

返回:ACK0

例:

->MCU: fc , length=7 , 0x06 , 0x04 , 0x01 ,
        'T' , 'E' , 'S' , 'T'

MCU->: ACK

备注

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

备注

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

0x05.获取MAC地址

获取:

序号

内容

2

接口索引

0x06

3

操作数

0x05

4

获取

0x00

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x05

4~9

mac地址

x

例:

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

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

0x06. 获取绑定状态

获取:

序号

内容

2

接口索引

0x06

3

操作数

0x06

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x06

4

绑定状态

x

例:

->MCU: fc , length=2 , 0x06 , 0x06

MCU->: fc , length=3 , 0x06 , 0x06 ,
        0x01(已绑定)

0x30. 获取马达使用率数据

获取:

序号

内容

2

接口索引

0x06

3

操作数

0x30

4

获取

0x01

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x30

4~7

总震动时长(ms)

x

8~11

提醒震动次数(次)

x

12~15

提醒震动时长(ms)

x

例:

->MCU :  fc , length=3 , 0x06 , 0x30 , 0x01

MCU-> :  fc , length=14 , 0x06 , 0x30 ,
        0x34 , 0x02 , 0x01 , 0x00 , (总震动时长=0x10234=66.100)
        0x28 , 0x00 , 0x00 , 0x00 , (提醒震动=0x28=40)
        0x40 , 0x9c , 0x00 , 0x00   (提醒震动时长=0x9c40=40.000)

清除:

序号

内容

2

接口索引

0x06

3

操作数

0x30

4

清除

0x04

返回:ACK0

0x31. 获取屏幕使用率数据

获取:

序号

内容

2

接口索引

0x06

3

操作数

0x31

4

获取

0x01

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x31

4~7

总亮屏时长(ms)

x

8~11

抬腕亮屏次数(次)

x

12~15

抬腕亮屏时长(ms)

x

例:

->MCU :  fc , length=3 , 0x06 , 0x31 , 0x01

MCU-> :  fc , length=14 , 0x06 , 0x31 ,
        0x10 , 0x0e , 0x00 , 0x00 , (总亮屏时长=0xe10=3600)
        0x20 , 0x03 , 0x00 , 0x00 , (抬腕亮屏次数=0x320=800)
        0x57 , 0x04 , 0x00 , 0x00   (抬腕亮屏时长=0x457=1111)

清除:

序号

内容

2

接口索引

0x06

3

操作数

0x31

4

清除

0x04

返回:ACK0

0x32. 获取心率使用率数据

获取:

序号

内容

2

接口索引

0x06

3

操作数

0x32

4

获取

0x01

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x32

4~7

心率测量时长(s)

x

8~11

心率测量次数(次)

x

例:

->MCU :  fc , length=3 , 0x06 , 0x32 , 0x01

MCU-> :  fc , length=10 , 0x06 , 0x32 ,
        0x83 , 0x04 , 0x00 , 0x00 , (心率测量=0x483=1155)
        0x19 , 0x00 , 0x00 , 0x00 , (心率测量次数=0x19=25)

清除:

序号

内容

2

接口索引

0x06

3

操作数

0x32

4

清除

0x04

返回:ACK0

0x33. 获取蓝牙使用率数据

获取:

序号

内容

2

接口索引

0x06

3

操作数

0x33

4

获取

0x01

返回:

序号

内容

2

接口索引

0x06

3

操作数

0x33

4~7

蓝牙广播时长(s)

x

8~11

蓝牙连接时长(s)

x

例:

->MCU :  fc , length=3 , 0x06 , 0x33 , 0x01

MCU-> :  fc , length=14 , 0x06 , 0x33 ,
        0x03 , 0x02 , 0x01 , 0x00 , (广播=0x10203=66051)
        0x01 , 0x02 , 0x03 , 0x00 , (连接=0x30201=197121)
        0x71 , 0x00 , 0x00 , 0x00   (断开=0x71=113)

清除:

序号

内容

2

接口索引

0x06

3

操作数

0x33

4

清除

0x04

返回:ACK0

系统操作 0x07

0xE0-0xE2.链路测试

序号

内容

2

接口索引

0x07

3

操作数

0xE0/0xE2

例:

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

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

0xFE.设备重启

序号

内容

2

接口索引

0x07

3

操作数

0xFE

例:

APP->: fc , length=2 , 0x07 , 0xFE

备注

移动端可通过判断与设备之间蓝牙连接断开即为成功重启

0xFF.设备关机

序号

内容

2

接口索引

0x07

3

操作数

0xFF

例:

APP->: fc , length=2 , 0x07 , 0xFF

备注

移动端可通过判断与设备之间蓝牙连接断开即为成功关机

数据交互 0x08

备注

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

0x01.获取最近7天计步简报

数据格式如下:

序号

内容

0

当天步数低位

0xLL

1

当天步数高位

0xHH

2

昨天步数低位

X

3

昨天步数高位

X

4

前天步数低位

X

5

前天步数高位

X

n

依次类推

X

如上表所示,当天数据的值即为 0xHHLL

获取数据:

序号

内容

2

接口索引

0x08

3

操作数

0x01

4

参数

0x01(获取)

返回数据:

序号

内容

2

接口索引

0x08

3

操作数

0x01

4~n

计步数据

X

例:

      APP->: fc , length=3 , 0x08 , 0x01 , 0x01(获取)

      ->APP: fc , length=17 , 0x08 , 0x01 ,
              18(当月号数) , 0x34(当天数据低位) , 0x12(当天数据高位) ,
              0xZZ(前一天数据低位) , 0xYY(前一天数据高位)......

以上返回数据表示,数据读取时为当月18号,当天数据为0x1234=4660步,一条命令发送7天数据

0x02.每日计步目标

获取计步目标:

序号

内容

2

接口索引

0x08

3

操作数

0x02

4

参数

0x01

返回计步目标:

序号

内容

2

接口索引

0x08

3

操作数

0x02

4

目标低位

0xLL

5

目标高位

0xHH

例:

->MCU: fc , length=3 , 0x08 , 0x02 , 0x01

MCU->: fc , length=4 , 0x08 , 0x02 ,
        0xE8 , 0x03 (获取计步目标为0x3E8=1000)

设定计步目标:

序号

内容

2

接口索引

0x08

3

操作数

0x02

4

参数

0x02

4

目标低位

0xLL

5

目标高位

0xHH

返回:ACK0

例:

->MCU: fc , length=5 , 0x08 , 0x02 ,
        0x02 , 0xE8 , 0x03 (设置计步目标为0x3E8=1000)

MCU->: ack

0x03.获取最后心率测量结果

获取心率测量结果:

序号

内容

2

接口索引

0x08

3

操作数

0x03

返回心率测量结果:

序号

内容

2

接口索引

0x08

3

操作数

0x03

4~7

unix时间戳

X

8

心率值

Y

例:

      APP->: fc , length=3 , 0x08 , 0x03

      ->APP: fc , length=7 , 0x08 , 0x03 ,
              {0x06,0xF2,0x3D,0x5B}时间戳 , 0x59(心率=89)

以上返回数据表示,数据读取时 ``unix`` 时间戳为 ``0x5B3DF206`` ,心率为 ``0x59=89``

备注

当返回心率为 0xFF=255 时,表示没有数据

0x10.请求获取详细数据

请求获取详细数据:

序号

内容

2

接口索引

0x08

3

操作数

0x10

4

参数

0x01

5

数据类型

X

返回详细数据概况:

序号

内容

2

接口索引

0x08

3

操作数

0x10

4

数据类型

X

5

数据包数量低位

X

6

数据包数量高位

X

备注

请求获取详细数据,在获取数据包前必须请求。此请求会返回数据包的总数, 并且会临时锁定所有对应数据类型的数据包,防止新产生的数据包造成干扰。 当一分钟内没有获取详细数据时,会自动解除数据包锁定。

例1:

->MCU: fc , length=4 , 0x08 , 0x10 ,
        0x01(请求) , 0x01(计步数据)

MCU->: fc , length=5 , 0x08 , 0x10 ,
        0x01(计步数据) , 0xE8 , 0x03 (返回数据包数为 0x3E8=1000 个数据包)

例2:

->MCU: fc , length=4 , 0x08 , 0x10 ,
        0x01(请求) , 0x02(心率数据)

MCU->: fc , length=5 , 0x08 , 0x10 ,
        0x02(心率数据) , 0x10 , 0x01 (返回数据包数为 0x110=272 个数据包)

0x11.获取详细数据

获取详细数据:

序号

内容

2

接口索引

0x08

3

操作数

0x11

4

参数

0x01

5

数据类型

X

6

索引低位

X

7

索引高位

X

8

配置

Flag

返回详细数据:

序号

内容

2

接口索引

0x08

3

操作数

0x11

4~n

数据包

X

获取数据包的内容。

计步数据包格式为 unix时间戳(4)-数据类型(1)-扩展(1)-数据值(2) , 其中,计步数据类型为 0x01 ,时间戳与数据值表示在这个时间戳与上个时间戳之间产生的步数。

心率数据包格式为 unix时间戳(4)-数据类型(1)-数据值(1) , 其中,心率数据类型为 0x02 ,时间戳与数据值表示在这个时间戳测量的心率。

睡眠数据包格式为 unix时间戳(4)-数据类型(1)-数据值(1) , 其中,睡眠数据类型为 0x03 ,时间戳与数据值表示在这个时间戳之后的睡眠状态。在数据值中 0 表示清醒, 1 表示浅睡, 2 表示深睡。

配置Flag=0x01 时,表示启用 burst 模式,将一次返回尽可能多的数据包,为从请求的索引开始递增的数据包。否则,返回一个数据包。

当返回的数据帧超过数据范围时,超出的数据包将不会返回。

例1:

->MCU: fc , length=6 , 0x08 , 0x11 ,
        0x01 , 0x01 , 0x05 , 0x00 (普通模式获取第5个计步数据包)

MCU->: fc , length=10 , 0x08 , 0x11 ,
        {0x06,0xF2,0x3D,0x5B}时间戳(0x5B3DF206) ,
        {0x01}(计步数据) , {0xFF} , {0xE8,0x03}(1000)

例2:

->MCU: fc , length=7 , 0x08 , 0x11 ,
        0x01 , 0x01 , 0x78 , 0x00 , 0x01 (burst模式从第120个数据包开始获取)

MCU->: fc , length=xx , 0x08 , 0x11 , (由返回长度可以计算返回的数据包数量)
        {0x06,0xF2,0x3D,0x5B}时间戳1(0x5B3DF206) ,
        {0x01}(计步数据) , {0xFF} , {0xE8,0x03}(1000) ,
        {0xB0,0xF2,0x3D,0x5B}时间戳2(0x5B3DF2B0) ,
        {0x01}(计步数据) , {0xFF} , {0xE7,0x03}(999)
        {0xB0,0xF2,0x3D,0x5B}时间戳3(0x5B3DF2B0) ,
        {0x01}(计步数据) , {0xFF} , {0xE7,0x03}(999)
        {0xB0,0xF2,0x3D,0x5B}时间戳4(0x5B3DF2B0) ,
        {0x01}(计步数据) , {0xFF} , {0xE7,0x03}(999)
        {0xB0,0xF2,0x3D,0x5B}时间戳5(0x5B3DF2B0) ,
        {0x01}(计步数据) , {0xFF} , {0xE7,0x03}(999)
        ......

例3:

->MCU: fc , length=6 , 0x08 , 0x11 ,
        0x01 , 0x02(心率数据) , 0x02 , 0x00 (普通模式获取第2个心率数据包)

MCU->: fc , length=10 , 0x08 , 0x11 ,
        {0x06,0xF2,0x3D,0x5B}时间戳(0x5B3DF206) ,
        {0x02}(心率数据) , {0x51}(心率81)

例4:

->MCU: fc , length=7 , 0x08 , 0x11 ,
        0x01 , 0x02 , 0x04 , 0x00 , 0x01 burst模式获取从第4个开始获取心率数据包

MCU->: fc , length=14 , 0x08 , 0x11 ,
        {0x06,0xF2,0x3D,0x5B}时间戳1(0x5B3DF206) ,
        {0x02}(心率数据) , {0x51}(心率81) ,
        {0xB0,0xF2,0x3D,0x5B}时间戳2(0x5B3DF2B0) ,
        {0x02}(心率数据) , {0x53}(心率83)

当使用 burst 模式获取到超出范围的数据包时,数据类型会填充为 0xFF

备注

1 个数据包为最新的数据包。 一种建议的同步数据方式是,从第 1 包开始往后同步,直到遇到重复(同步过)的 时间戳 或者同步完了所有数据包为止。当遇到重复的 时间戳 后,再检查最后一个数据包的时间戳是否已经重复(同步过),如果没有,则从最后一个数据包往前同步,直到遇到重复(同步过)为止。 当需要计算有多少数据包没有同步时,可以使用二分法读取,由于数据包一般不会储存超过 2k 个,所以至多 11 次读取便可以确定最后同步的数据包的位置。

0x70.走动提醒

当用户在设定时间段内超过一定时间没有走动则震动提醒

备注

在设定的时间段内,每隔一定时间计算这段时间内的步数, 如果这段时间内低于45步,则当时间段结束时,会产生震动提醒

备注

当提醒间隔小于10分钟时会被设置为10分钟,大于240分钟时会被设置为240分钟 设定提醒间隔会刷新提醒时间,重新从0开始计算

设定走动提醒:

序号

内容

2

接口索引

0x08

3

操作数

0x70

4

参数

0x01

5

开关

1/0

6

间隔(分钟)

X

7

起始时

X

8

起始分

X

9

结束时

X

10

结束分

X

返回:ACK0

例:

->MCU: fc , length=8 , 0x08 , 0x70 , 0x01 ,
        1 , (启用)
        30 , (提醒间隔 30 分钟)
        11 , 30 , 19 , 20 (提醒时间段 11:30 - 19:20 )

MCU->: ack

获取走动提醒:

序号

内容

2

接口索引

0x08

3

操作数

0x70

4

参数

0x02

返回时间段:

序号

内容

2

接口索引

0x08

3

操作数

0x70

4

参数

0x02

5

开关

1/0

6

间隔

X

7

起始时

X

8

起始分

X

9

结束时

X

10

结束分

X

例:

->MCU: fc , length=3 , 0x08 , 0x70 , 0x02

MCU->: fc , length=8 , 0x08 , 0x70 , 0x02 ,
        1 , 30 , 11 , 30 , 19 , 20

0x80.APP拍照模式 <非HID模式>

备注

进入拍照模式后60秒内没有按键拍照则自动退出拍照模式,每次按键拍照会将超时时间重置为60秒(翻腕拍照则不会重置)

进入拍照模式(重置计时):

序号

内容

2

接口索引

0x08

3

操作数

0x80

4

参数

0x01

返回:ACK0

例:

->MCU: fc , length=3 , 0x08 , 0x80 , 0x01

MCU->: ack

退出拍照模式(重置计时):

序号

内容

2

接口索引

0x08

3

操作数

0x80

4

参数

0x00

返回:ACK0

例:

->MCU: fc , length=3 , 0x08 , 0x80 , 0x00

MCU->: ack

拍摄:

序号

内容

2

接口索引

0x08

3

操作数

0x80

4

参数

0x08

返回:ACK0

例:

MCU->: fc , length=3 , 0x08 , 0x80 , 0x08

->MCU: ack

0x81.拍照模式控制 <HID模式>

进入拍照模式(重置计时):

序号

内容

2

接口索引

0x08

3

操作数

0x81

4

参数

0x01

返回:ACK0

例:

->MCU: fc , length=3 , 0x08 , 0x81 , 0x01

MCU->: ack

退出拍照模式(重置计时):

序号

内容

2

接口索引

0x08

3

操作数

0x81

4

参数

0x00

返回:ACK0

例:

->MCU: fc , length=3 , 0x08 , 0x81 , 0x00

MCU->: ack

应用定制 0x0D

0x01.倒计时

设置

发送:

序号

内容

2

接口索引

0x0D

3

操作数

0x01

4

设置

0x01

5

状态

1/0

6~7

剩余秒数

x

返回:ACK0

备注

状态为1表示正在运行,状态为0表示没有运行

例1:

->MCU: fc , length , 0x0D , 0x01 ,
        0x01 , (设置)
        0x01 , (运行)
        0x58 , 0x02 (0x258 = 600s)

MCU->: ack

例2:

->MCU: fc , length , 0x0D , 0x01 ,
        0x01 , (设置)
        0x00 , (关闭)
        0x11 , 0x01 (0x111 = 273s 关闭时,设置的时间没有意义)

MCU->: ack
获取

发送:

序号

内容

2

接口索引

0x0D

3

操作数

0x01

4

获取

0x00

返回:

序号

内容

2

接口索引

0x0D

3

操作数

0x01

4

获取

0x00

5

状态

1/0

6~7

剩余秒数

x

例1:

->MCU: fc , length=3 , 0x0D , 0x01 ,
        0x00 , (获取)

MCU->: fc , length , 0x0D , 0x01 ,
        0x00 , (获取)
        0x01 , (运行)
        0x57 , 0x02 (0x257 = 599s)

例2:

->MCU: fc , length=3 , 0x0D , 0x01 ,
        0x00 , (获取)

MCU->: fc , length , 0x0D , 0x01 ,
        0x00 , (获取)
        0x00 , (未运行)
        0x00 , 0x00 (0s)

0x02.日程

设置

发送:

序号

内容

2

接口索引

0x0D

3

操作数

0x02

4

设置

0x01

5

当前小时

0-23

6~8

日程bit

x

返回:ACK0

备注

日程由 当前小时 与24个bit来描述由 当前小时 开始的连续24小时内的日程计划。 连续24个bit分别表示由 当前小时 开始的每个小时,其中最高位表示第一个小时。

例1:

->MCU: fc , length , 0x0D , 0x02 ,
        0x01 , (设置)
        8 , (8)
        0x80 , 0x00 , 0x00 (8-9点有日程)

MCU->: ack

例2:

->MCU: fc , length , 0x0D , 0x02 ,
        0x01 , (设置)
        0 , (0)
        0x00 , 0x80 , 0x00 (8-9点有日程)

MCU->: ack

例3:

->MCU: fc , length , 0x0D , 0x02 ,
        0x01 , (设置)
        12 , (12点)
        0x44 , 0x20 , 0x20 (13-14点,17-18点,22-23点,次日7-8点有日程)

MCU->: ack
获取

发送:

序号

内容

2

接口索引

0x0D

3

操作数

0x02

4

获取

0x00

返回:

序号

内容

2

接口索引

0x0D

3

操作数

0x02

4

获取

0x00

5

设置时的小时

0-23

6~8

日程bit

x

例:

->MCU: fc , length=3 , 0x0D , 0x02 ,
        0x00 , (获取)

MCU->: fc , length , 0x0D , 0x02 ,
        0x00 , (设置)
        12 , (12点)
        0x44 , 0x20 , 0x20 (13-14点,17-18点,22-23点,次日7-8点有日程)

备注

如果获取的 设置时的小时 大于当前小时,则为前一日的时间。

0x03.屏显设置

设置

发送:

序号

内容

2

接口索引

0x0D

3

操作数

0x03

4

设置

0x01

5

颜色

  • 正常 0x00

  • 反色 0x01

6

默认界面

  • 时间 0x00

  • 步数 0x01

  • 日期 0x02

  • 禁用 0xFF

7

圆环功能

  • 禁用 0x00

  • 日程 0x01

  • 运动 0x02

返回:ACK0

获取

发送:

序号

内容

2

接口索引

0x0D

3

操作数

0x03

4

获取

0x00

返回:

序号

内容

2

接口索引

0x0D

3

操作数

0x03

4

获取

0x00

5

颜色

6

默认界面

7

圆环功能

0x04.睡眠监测控制

发送:

序号

内容

2

接口索引

0x0D

3

操作数

0x04

4

控制

0x00

5

指令

  • 0x00 关闭

  • 0x01 启动

返回:ACK0

0x05.天气

备注

天气代码列表见 「共用信息」

发送:

序号

内容

2

接口索引

0x0D

3

操作数

0x05

4

设置

0x01

5~6

当日天气

x

7~8

次日天气

x

9~n

x

返回:ACK0

例:

->MCU: fc , length , 0x0D , 0x05 ,
        0x01 , (设置)
        0xF3 , 0x01 , (今日 0x01F3=499 )
        0x93 , 0x01 , (明日 0x0193=403 暴雪)
        0x65 , 0x00 , (后日 0x0065=101 多云)

MCU->: ack

0x06.显示同步

单次获取

发送:

序号

内容

2

接口索引

0x0D

3

操作数

0x06

4

获取

0x00

返回:

序号

内容

2

接口索引

0x0D

3

操作数

0x06

4

获取

0x00

5~n

显存上传

x

自动上传

发送:

序号

内容

2

接口索引

0x0D

3

操作数

0x06

4

控制

0x0C

5

自动上传

  • 关闭 0x00

  • 使能 0x01

返回:ACK0

备注

使能自动上传后,在显示发生变化时即会自动上传显存。 自动上传具有超时机制,超过 5s 没有重新使能则会超时关闭自动上传。 需要延续自动上传时,建议间隔 2s 发送使能命令。

自动上传:

序号

内容

2

接口索引

0x0D

3

操作数

0x06

4

自动上传

0x0A

5~n

显存上传

x