说明
通信接口
通讯基本说明
以下"主机"如无特殊说明,则指手机;"从机"指蓝牙锁
主机发送基本格式
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");
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示例
通讯服务:
初始化绑定流程图:

基础通讯流程:

接口列表 →