请注意通信类型选择“蓝牙”
一键下载 MCU 开发包资料
开发资源包,包含以下资料:
涂鸦蓝牙门锁模组,TYBN1 使用通讯框图如下图1所示。
针对低功耗门锁设备,蓝牙模组和 MCU 之间有两个控制 IO,作为低功耗控制引脚。
模块第 10 引脚 IO11 处于高电平时,为低功耗工作模式;处于低电平时为非低功耗工作模式,IO11 的电平由外部 MCU 控制。
模块第 11 引脚 IO14 为模块唤醒外部 MCU 的引脚,当模块需要发送数据给外部 MCU 时,模块会拉低 IO14 200ms,然后再发送数据,发送完成后拉高电平。
涂鸦 MCU 仿真调试助手,上位机可以模拟 MCU 的数据收发。将模组最小系统搭建好,将串口连接至电脑,可有以下用途:
与联网模块配对使用,验证模块是否正常工作。
在 MCU 未完成开发前,调试App面板显示
当 MCU 开发者不知如何发送、回复数据给模块时,仿真助手的数据可作为参考。
助手开始前记得把 PID 信息换成自己的
1.图中1处可切换助手,选择 BLE - BLE 门锁 MCU 助手
2.图中2处配置串口和波特率,模组通过 USB 转 TTL 工具连接到电脑,选择串口波特率 9600
3.图中3处导入平台下载的开发包中的 json 文件
4.图中4处点击启动,模组若正常工作,上电会主动发起心跳查询,收到回复后会自动进行初始化数据交互。
注:若连上什么反应都没有,检查模组硬件外围电路是否正确,IO11 是否有拉低,模组上电会有数据包发出。
MCU 上位机可以配合模组实测配网。初始化交互完成后,点击重置模块,模块进入待配网状态。
此时可以用涂鸦智能/智能生活 App 配网,产品选择蓝牙门锁,操作流程如下。
波特率:9600
数据位:8
奇偶校验:无
停止位:1
数据流控:无
MCU:用户控制板控制芯片,与涂鸦模块通过串口对对接
字段 | 长度(byte) | 说明 |
---|---|---|
帧头 | 2 | 固定为 0x55aa |
版本 | 1 | 升级扩展用 |
命令字 | 1 | 具体帧类型 |
数据长度 | 2 | 大端 |
数据 | N | |
校验和 | 1 | 从帧头开始按字节求和得出的结果对 256 求余 |
模组初始化协议主要命令字及流程图如下
常用命令字
Cmd ID | 说明 |
---|---|
0x00 | 心跳检测 |
0x01 | 产品信息查询 |
0x02 | 设定模块工作模式 |
0x03 | 上报模块工作状态 |
0x04 | 重置配网 |
0x06 | DP 数据下发 |
0x07 | DP 数据上报 |
0x08 | 状态查询 |
0x0A | OTA升级启动 |
0x0B | OTA 升级包传输 |
0x0E | Rf射频测试 |
0xE0 | 离线Flash缓存 |
0xE1 | 获取实时时间 |
0xE2 | 修改低功耗广播间隔 |
0xE4 | 关闭系统计时功能 |
0xE5 | 使能低功耗功能 |
概述:
mcu_sdk 包是根据涂鸦开发平台上定义的产品功能,自动生成的 MCU 代码。通讯及协议解析架构已写好,可直接添加到原有 MCU 工程中,快速完成 MCU 程序开发。
SDK 包对 MCU 硬件资源需求: Flash 4Kbyte 、RAM占用 与 DP 点数据长度有关,大概几十字节(OTA 功能需大于 260byte)。函数嵌套级数 9 级。若资源不足的用户,可自行对接协议,SDK 包中的函数依然可以作为参考。
步骤1: 编写 MCU 基础程序,移植 SDK 文件
步骤2: 确认 protocol.h 宏定义
步骤3: 移植 protocol.c 文件及函数调用
步骤4: DP 上报下发函数完善调用
步骤5: 配网功能函数完善
步骤6: 产测功能完善
若移植过程和调试过程需要了解 SDK 相关架构,可以观看 Wi-Fi SDK 视频教程函数架构讲解篇。虽然协议略有不同,SDK 构造基本一致,可供参考。
蓝牙门锁目前支持手机端发起添加、删除、修改、冻结,各类开门方式。支持蓝牙开门、临时密码、动态密码等功能,支持开门记录显示,告警推送等多种功能,用户可根据自己实际产品进行功能选择。
• 用户(成员):一个门锁可以有 255 个用户,编号为 0x00~0xFE,0xFF 表示为空(其中包括管理员和非管理员,管理员可以对普通用户进行权限设 置、删除等操作;非管理员只能对自身权限进行设置;管理员可以将非管理员设置为管理员)
• 管理员:在用户的基础上通过管理员标记位来标明用户的管理员权限(权限参考用户)
• 硬件编号:一个硬件编号是一种开锁方式,密码、门卡、指纹共用 0x01~0xFE 硬件编号,0xFF 表示为空
• 可用次数:可用次数是硬件编号层面的属性,一个硬件编号只有一个可用次数属性(比如硬件编号为 0x02 的开锁方式{密码、门卡或指纹},仅仅一次有效,即:采用该种方式只能开一次门之后便无法开锁)
• 时效性:时效性是用户层面的属性,一个用户只有一个时效性,时效性需要参考附录一(比如每周周 1~周 5,用户 1 在该时间段内可以开锁)
• 有效性:一个用户采用某种方式{密码、门卡或指纹}去开锁时,其有效性取决于用户时效性和开锁方式硬件编号可用次数的交集,只有两个都满足才能开锁
第一类:开门方式的增加,删除,修改等;
第二类:开门记录,警报记录的上报,主要用来上报开门日志和警报日志;
第三类:实时状态显示,主要用来显示设备的电量,开锁状态等信息;
第四类:门锁相关设置,例如门锁的按键音量,音效等。
主要为门锁具体开门方式(指纹,门卡,密码)的添加,修改,删除,冻结,解冻和同步。
其中涉及到的 DP 点主要为:
dpid | 说明 |
---|---|
1 | 添加开门方式,例如为某个成员添加一个密码或者一张门卡 |
2 | 删除开门方式,例如删除某个成员的密码或者指纹开门方式 |
3 | 修改开门方式,例如修改某个成员的密码或者修改开门方式的时效性 |
4 | 冻结开门方式,例如冻结某个成员的密码或门卡开门方式 |
5 | 解冻开门方式,例如解冻某个成员的密码或者指纹开门方式 |
35 | 同步某个成员的所有开门方式,使App可以实时获取某个成员所拥有的所有开门方式,以保持 App 端和设备端的一致性 |
添加开门方式dp点定义
创建开锁方式 DP1 raw | 下发 | 类型 | 阶段 | 管理员标记 | 成员 ID | 硬件编号 | 时效性 | 次数 | 密码长度 | 密码内容 |
1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | 17 字节 | 1 字节 | 1 字节 | N | ||
0x01:密码 0x02:门卡 0x03:指纹 |
0x00:开始录入 0xFE:取消录入(App端发起) |
0x00:普通成员 0x01:管理员 |
0x00 ~ 0xFE | 0xFF:创建默认为 0xFF | 见附录 1 | 0xFF:失效 0x01:一次有效 0x00:永久有效 |
密码字节数N(仅用于密码类型) | 密码以数值形式下发,例如:0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 代表密码为:123456 | ||
上报 | 类型 | 阶段 | 管理员标记 | 成员 ID | 硬件编号 | 次数 | 录入的返回状态 | |||
1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | ||||
0x01:密码 0x02:门卡 0x03:指纹 |
0x00:开始 | 0x00:普通成员 0x01:管理员 |
0x00~0xFE | 0x00~0xFE | 设备需要录入的总次数,假如指纹可能是五次,门卡可能只需要一次 | 0x00,暂时不用 | ||||
0xFE:取消录入(App端发起) | 管理员标记 | 0x00 ~ 0xFE | 0x00 ~ 0xFE | 0x00,暂时不用 | 0x00,暂时不用 | |||||
0xFD:录入失败 | 管理员标记 | 0x00 ~ 0xFE | 0x00 ~ 0xFE | 当前处于的阶段: 0x00:录入开始 0xFC:录入中 0xFF:录入结束 |
录入失败原因: 0x00:录入超时 0x01:录入失败 0x02:重复录入 0x03 : 硬件编号分配完 0x04 : 添加密码错误,字段为非数字 0x05 : 添加密码,密码长度错误 0x06 : 不支持添加的开门方式类型 0x07 : 当前正处于指纹录入 0x08 : 当前正处于绑定门卡 0xFE:错误编号 |
|||||
0xFC:录入中 | 管理员标记 | 0x00 ~ 0xFE | 0x00 ~ 0xFE | 录入的次数编号,例如指纹可能需要 5 次,填写 5 次的编号,门卡只需要录入一次,则不需要此过程 | 录入异常原因: 0x00:无异常 0x01:指纹不全 |
|||||
0xFC:录入结束 | 管理员标记 | 0x00 ~ 0xFE | 0x00 ~ 0xFE | 0x00:暂时不用 | 0x00:暂时不用 |
一个门锁的硬件开锁方式包括:键盘密码输入开锁、门卡开锁、指纹开锁;创建一个密码开锁和门卡开锁的云 - App - 设备的交互流程如下:
创建一个指纹开锁略有不同(指纹开锁需要多次录入指纹,密码或门卡只需要采集一次秘钥信息):
例:
添加门卡:
模组发送:55 AA 00 06 00 1D 01 00 00 19 02 00 01 01 00 38 6C D3 00 72 BC 9B 7F 00 00 00 00 00 00 00 00 00 00 01 01 01
MCU 回复:55 AA 00 07 00 0B 01 00 00 07 02 00 01 01 00 01 00 1E
添加密码:
模组发送:55 AA 00 06 00 22 01 00 00 1E 01 00 01 01 00 38 6C D3 00 72 BC 9B 7F 00 00 00 00 00 00 00 00 00 00 06 01 01 01 02 02 02 17
MCU 回复:55 AA 00 07 00 0B 01 00 00 07 01 00 01 01 00 01 00 1D
添加指纹:
模组发送:55 AA 00 06 00 1D 01 00 00 19 03 00 01 02 00 38 6C D3 00 72 BC 9B 7F 00 00 00 00 00 00 00 00 00 00 01 01 03
MCU 回复:
55 AA 00 07 00 0B 01 00 00 07 03 00 01 02 00 03 00 22
55 AA 00 07 00 0B 01 00 00 07 03 FC 01 02 00 01 00 1C
55 AA 00 07 00 0B 01 00 00 07 03 FC 01 02 00 02 00 1D
55 AA 00 07 00 0B 01 00 00 07 03 FF 01 02 00 00 00 1E
删除开门方式 DP 点定义
删除开锁方式 DP2 raw | 下发 | 类型 | 阶段 | 管理员标记 | 成员 ID | 硬件编号 | 删除方式 | |
1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | |||
0x00:删除成员 | 0x00:默认 | 0x00:普通成员 0x01:管理员 |
0x00 ~ 0xFE | 0xFF:删除成员 | 0x00:删除成员下所有开锁方式 | |||
0x01:密码 0x02:门卡 0x03:指纹 |
0x00:默认 | 0x00:普通成员 0x01:管理员 |
0x00 ~ 0xFE | 0x00 ~ 0xFE:硬件编号 | 0x01:删除成员中的一个开锁方式 | |||
上报 | 类型 | 阶段 | 管理员标记 | 成员 ID | 硬件编号 | 删除方式 | 修改返回状态 | |
1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | ||
0x00:删除成员 | 0x00:默认 | 0x00:普通成员 0x01:管理员 |
0x00 ~ 0xFE | 0xFF:删除成员 | 0x00:删除成员下所有开锁方式 | 0x00:修改失败 0xFF:修改成功 |
||
0x01:密码 0x02:门卡 0x03:指纹 |
0x00:默认 | 0x00:普通成员 0x01:管理员 |
0x00 ~ 0xFE | 0x00 ~ 0xFE:硬件编号 | 0x01:删除成员中的一个开锁方式 | 0x00:修改失败 0xFF:修改成功 |
例:
删除门卡:
模组发送:55 AA 00 06 00 0A 02 00 00 06 02 00 01 01 00 01 1C
MCU 回复:55 AA 00 07 00 0B 02 00 00 07 02 00 01 01 00 00 FF 1D
修改开门方式 DP 点定义
修改开锁方式 DP3 raw | 下发 | 类型 | 阶段 | 管理员标记 | 成员 ID | 硬件编号 | 时效性 | 次数 | 密码长度 | 密码内容 |
1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | 17 字节 | 1 字节 | 1 字节 | N | ||
0x00:只修改时效性 | 0x00:默认 | 0x00:普通成员 0x01:管理员 |
0x00 ~ 0xFE | 0xFF:删除成员 | 0x00:删除成员下所有开锁方式 | |||||
0x01:密码 0x02:门卡 0x03:指纹 |
0x00:默认 | 0x00:普通成员 0x01:管理员 |
0x00 ~ 0xFE | 0xFF:默认 | 见附录一 | 0x00:默认 | 密码字节数 N(仅用于密码类型) | 密码以数值形式下发:例如:0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 代表密码为:123456 | ||
上报 | 类型 | 阶段 | 管理员标记 | 成员 ID | 硬件编号 | 次数 | 修改返回状态 | |||
1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | 1 字节 | ||||
0x00:时效性 | 0x00:默认 | 0x00:普通成员 0x01:管理员 |
0x00 ~ 0xFE | 0xFF:默认 | 0x00:默认 | 0x00:修改失败 0xFF:修改成功 |
||||
0x01:密码 0x02:门卡 0x03:指纹 |
0x00:默认 | 0x00:普通成员 0x01:管理员 |
0x00 ~ 0xFE | 0x00 ~ 0xFE | 0x00:永久有效 0x01:一次有效 0xFF:失效 |
0x00:修改失败 0xFF:修改成功 |
开门方式冻结 DP 点定义
冻结开始方式 DP4 value | 下发 | 硬件编号 |
4 字节 | ||
0x00~0xFE | ||
上报 | 硬件编号 | |
4 字节 | ||
0x00~0xFE |
开门方式解冻 DP 点定义
解冻开始方式 DP5 value | 下发 | 硬件编号 |
4 字节 | ||
0x00 ~ 0xFE | ||
上报 | 硬件编号 | |
4 字节 | ||
0x00 ~ 0xFE |
开门方式同步 DP 点定义
成员开锁方式同步 DP35 raw | 下发 | 1 字节 | 3 字节 | 3 字节 | 3 字节 |
硬件 ID 个数 | 硬件 ID1 +硬件类型+硬件 CRC8 | 硬件 ID2 +硬件类型+硬件 CRC8 | 硬件 Idn +硬件类型+硬件 CRC8 | ||
上报 | 1 字节 | 5 字节 | 5 字节 | 5 字节 | |
硬件 ID 个数 | 操作类型+硬件 ID1 +硬件类型+硬件属性 | 操作类型+硬件 ID2 +硬件类型+硬件属性 | 操作类型+硬件 Idn +硬件类型+硬件属性 |
模组发送:55 AA 00 06 00 0E 23 00 00 0A 03 00 03 41 00 01 E0 00 02 10 7A
1.说明:
为了保持门锁本地和服务器端的开门方式一致,每次蓝牙连接后需要进行开门方式表格同步。为了尽量降低同步的数据量,每次只同步有差异化的部分。蓝牙连接后,App 会将服务器端储存的硬件 ID 以及每个硬件 ID 绑定的属性(例如归属成员,冻结状态)的 crc8 值,传递给门锁,门锁收到后进行比对。然后选取有差异化的硬件 id ,并将其属性值重新上传。
2.参数说明
硬件类型:1 字节,0x00 - 标识密码,0x0 - 表示门卡,0x03 - 表示指纹;
操作类型:1 字节,0x00 - 更新硬件属性,服务器和本地不一致,0x01-删除该硬件id,本地无记录;
硬件属性:
成员id:1 字节;
冻结状态:1 字节,0x01 表示生效,0x00 表示冻结;
注意:此处的 crc8 为 crc16 取低字节
记录型数据上报
时间戳:1569511829000 时间2019-09-26 23:30:29
55 AA 00 E0 00 16 03 31 35 36 39 35 31 31 38 32 39 30 30 30 0C 02 00 04 00 00 00 02 AB
在线会延迟1s推送到APP,离线后在线会推送缓存的数据到APP。
非记录型数据使用 CMD 0x07 上报。
55 AA 00 07 00 08 0C 02 00 04 00 00 00 02 22
附录一:(时效性)
时效性 | 说明 | 举例 | 举例表示 | |
生效起始时间 | Unsigned int 4 字节 (大端) |
例如unix时间为:(大端)123456789 | 07 | |
5B | ||||
CD | ||||
15 | ||||
生效结束时间 | Unsigned int 4 字节 (大端) |
例如 unix 时间为:(大端)999999999 | 3B | |
9A | ||||
C9 | ||||
FF | ||||
循环方式 | 说明后面的数据是按照哪种方式循环 | 0x01:天循环 0x02:月循环 0x03:周循环 |
||
循环天标志位 1 | 循环标志位第一个字节 | 按照天循环: 该字节默认为 0x00 |
按照周循环: 该字节默认为 0x00 |
按照月循环: 一个 bit 表示一月中的某一天要循环 第 8 位:默认为0 第 7 位:31 号循环 第 6 位:30 号循环 …… 第 1 位:25 号循环 |
循环天标志位 2 | 循环标志位第二个字节 | 按照天循环: 该字节默认为 0x00 |
按照周循环: 该字节默认为 0x00 |
按照月循环: 一个 bit 表示一月中的某一天要循环 第 8 位:24 号循环 第 7 位:23 号循环 …… 第 1 位:17 号循环 |
循环天标志位 3 | 循环标志位第三个字节 | 按照天循环: 该字节默认为 0x00 |
按照周循环: 该字节默认为 0x00 |
按照月循环: 一个 bit 表示一月中的某一天要循环 第 8 位:16 号循环 第 7 位:15 号循环 …… 第 1 位:9 号循环 |
循环天标志位 4 | 循环标志位第四个字节 | 按照天循环: 该字节默认为 0x00 |
按照周循环: 一个 bit 表示一周中的星期几要循环 第 8 位:默认为 0 第 7 位:周日循环 第 6 位:周六循环 …… 第 1 位:周一循环 |
按照月循环: 一个 bit 表示一月中的某一天要循环 第 8 位:8 号循环 第 7 位:7 号循环 …… 第 1 位:1 号循环 |
一天中有效起始时间 1 | 一字节 小时数 |
起始时间:8:30 | 08 | |
一天中有效起始时间 2 | 一字节 分钟数 |
30 | ||
一天中有效结束时间 1 | 一字节 小时数 |
失效时间:20:30 | 20 | |
一天中有效结束时间 2 | 一字节 分钟数 |
30 |