说明

通信接口

通讯基本说明

以下"主机"如无特殊说明,则指手机;"从机"指蓝牙锁

主机发送基本格式

1、向从机发送信息使用hex格式,从机返回信息使用hex
2、基本格式如下:
协议格式表格

指令码 滚码 数据长度 操作对象的MAC 参数 日期时间参数 校验和
1Byte 1Byte 2Bytes 6Bytes N Bytes 6Bytes 1Byte
0x01 0x00 0x00,0x0d 0xA2,0xB2,0xD5,0xD4,0xEA,0x6D 数据参数 0x15,0x05,0x0F,0x16,0x19,0x20 XX

以下参数说明非常重要,请仔细阅读;接口示例仅为Demo演示使用,切不可照搬参数。

指令码:

a) 用于指示该数据帧的功能
b) 取值范围为0x01 - 0xff
c) 指令码为0x00的指令为空指令,不执行任何操作。主机可用于心跳,从机可直接丢弃

滚码:

a) 主机每发送一帧数据之后,对该值+1
b) 从机响应的时候,会将bit7置位之后返回
c) 用于表示帧序列,防止帧错位
d) 其取值范围为:0x00 - 0x7f,滚动到0x7f后继续从0x00开始
e) 从机在主机发生的值基础上置位bit7,因此主机接收到的值范围应该是:0x80 - 0xff

数据长度:

a) 不管是明文传输还是密文传输,该数据域都表示的是“MAC+参数+时间戳+校验和”的明文长度,计算数据长度时,校验和默认1字节
b) 实际接收到的“MAC+参数+时间戳+校验和”的长度受加密算法对齐影响;从机根据加密算法自动计算
c) 占用2字节,其值取值范围为:0x0000 - 0xffff

时间参数:

a) 共6字节的时间参数,例如:2021-05-15 22:25:32,则对应关系表如下:

21 05 15 22 25 32
0x15 0x05 0x0F 0x16 0x19 0x20

b) 作用1:可用于从机同步时间;
c) 作用2:不同的时间点受加密影响,从表面看,尽管同一帧数据在不同时间点发送该帧数据,看起来都是不一样的,防止破解
d) 格式:使用HEX表示,0x15 0x05 0x0F 0x16 0x19 0x20 表示 2021-05-15 22:25:32
时间参数非常重要,一定是当前系统获取的真实时间;切不可乱填,会导致无法开锁。

校验和

(1) 所有数据相加取最后1字节,如结果是5AB,则只要AB。

加密算法:

a) TEA加密算法 C 版本Java版本JS版本
b) 密钥16字节
c) 默认密钥为:0x12,0x34,0x56,0x78,0x9a,0xbc,0xef,0x01, 0x23,0x45,0x67,0x89,0xab,0xcd,0xde,0xef
d) 加密范围为:MAC+参数+时间戳+校验和
e) 加密密钥的转换处理(重要)每4个字节为一组,总共4组16个字节
f) 加密算法建议放在服务端处理,避免秘钥泄露导致风险

TIP

假如原先的密钥是:
0x12,0x34,0x56,0x78, 0x9a,0xbc,0xef,0x01, 0x23,0x45,0x67,0x89, 0xab,0xcd,0xde,0xef
我这个时候创建一个新的密钥是:
0xa1,0xa2,0xa3,0xa4, 0xa1,0xa2,0xa3,0xa4, 0xa1,0xa2,0xa3,0xa4, 0xa1,0xa2,0xa3,0xa4

那么此时发送给锁的时候的密钥顺序是:0xa1,0xa2,0xa3,0xa4, 0xa1,0xa2,0xa3,0xa4, 0xa1,0xa2,0xa3,0xa4, 0xa1,0xa2,0xa3,0xa4
此时你保存的密钥数据应该是小端模式:0xa4,0xa3,0xa2,0xa1, 0xa4,0xa3,0xa2,0xa1, 0xa4,0xa3,0xa2,0xa1, 0xa4,0xa3,0xa2,0xa1
当你使用该密钥加密时传入的密钥值是:a4a3a2a1a4a3a2a1a4a3a2a1a4a3a2a1

例如10指令,设置密钥全是0的情况下:
默认密钥:7856341201efbc9a89674523efdecdab
待加密指令:1000001DC1010101010100000000000000000000000000000000150c0e0b132c
校验和:6c
完整指令:1000001DC1010101010100000000000000000000000000000000150c0e0b132c6c000000
密文指令:1000001D32dd5f859fb59ddebaaaec2e775d556462b3f381c14b062043e5e501d19f792a


加密过程,每8个字节为一组加密一次,不够8个字节后面补0
注意指令的时间:01指令会同步当前时间给锁,后续其他指令的时间参数需取真实时间,并且与锁的时差在5秒内

提示:
01 指令不加密
10 指令初次使用时,使用默认密钥加密
剩余其他指令均需加密使用

// 实际使用的切记要转小端
Long[] keyLongs = new Long[4];
keyLongs[0] = Long.decode("0x78563412");
keyLongs[1] = Long.decode("0x01efbc9a");
keyLongs[2] = Long.decode("0x89674523");
keyLongs[3] = Long.decode("0xefdecdab");
1
2
3
4
5
6

密钥小端转换工具:

密钥:

广播消息:

advertisData值: 例如:a2b2d5d4ea6d626c654c6f636b000000000000000001010101

mac 设备识别名称 SN 锁状态 请求网关连接 震动报警 撬锁报警
字节数 6字节 7字节 8字节 1字节 1字节 1字节 1字节
返回值 0xA2,0xB2,0xD5,0xD4,0xEA,0x6D 0x62,0x6c,0x65,0x4c,0x6f,0x63,0x6b 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38 0x01 0x01 0x01 0x01
解析值 A2B2D5D4EA6D bleLock 3132333435363738(12345678) 01 01 01 01

TIP

如无特殊情况,一般可以通过该设备识别名称来过滤非我司的设备
sn只可以使用a-z,0-9之间的字母或数字,长度为8位
锁状态:0x00锁关、0x01锁开(某些锁可能没有这个标记)
是否请求网关连接:0x00不需要、0x01需要(某些锁可能没有这个标记)
是否震动报警:0x00无报警、0x01有报警(某些锁可能没有这个标记)
是否撬锁报警:0x00无报警、0x01有报警(某些锁可能没有这个标记)

通讯服务:

蓝牙主服务UUID:FFF0
主服务中特征值类型:notify 监听锁回复消息用到的特征,如无特别说明一般是FFF1
主服务中特征值类型:write 向锁体写入数据时用到的特征,如无特别说明一般是FFF2

TIP

蓝牙连接锁体后,监听FFF1服务的回复数据,向锁写入数据使用FFF2

下载蓝牙小程序Demo示例

小程序Demo示例

通讯服务:

初始化绑定流程图:

基础通讯流程: