通讯协议20241015
一、完整协议文档下载
下载附件:通讯协议_1015(1).xlsx
为了便于共享、理解、查阅,特此整理了以下文档说明。
以下文档说明,由此excel整理而来,如果与excel附件不同,以excel附件为准。
二、自定义广播包说明
自定义广播包中,包含了设备的MAC地址, 我们使用安卓版本的BLE调试助手查看对比即可知道
0x0BADF369BBDAF54C322E3237
- 0x0B:广播包数据长度:11字节(不含首字节)
- ADF369BBDAF5:设备的Mac地址反转
- 4C:表示产品型号
- 322E3237: 是ascii码2.27表示固件版本号
三、设备上电后与APP连接过程
数据顺序流程图
示例数据如下:

四、蓝牙UUID说明
4.1 指令通道
-
APP发送数据,蓝牙接收数据
uuid: 00010203-0405-0607-0809-0A0B0C0D2B16
属性:WRITE|WRITE_WITHOUT_RESPONSE
所属service:00010203-0405-0607-0809-0A0B0C0D1911
-
蓝牙发送数据,APP接收数据
uudi:00010203-0405-0607-0809-0A0B0C0D2B17
属性:READ|NOTIFY
所属service:00010203-0405-0607-0809-0A0B0C0D1911
4.2 音频通道
-
蓝牙发送音频,APP接收音频
uuid:00010203-0405-0607-0809-0A0B0C0D2B18
属性:READ|NOTIFY
所属service:00010203-0405-0607-0809-0A0B0C0D1913
4.3 文件通道
-
蓝牙发送文件内容,APP接收文件内容
uuid: 00010203-0405-0607-0809-0A0B0C0D2B22
属性:READ|NOTIFY
所属service:00010203-0405-0607-0809-0a0b0c0d1913
5 设备属性
设备当前具备的属性有: 电量、时间、麦克风状态、固件版本号、音频蓝牙信息、录音模式、sd卡容量、文件列表、指示灯状态
由于历史原因,部分格式不遵守此格式,以实际情况为准。
属性一般都具备get方法,部分具备set方法。
由于历史原因,有部分协议,可能不完全遵守此格式,以excel文件的说明为准。
5.1 get方法数据格式
app发出数据示例:
{
"method": "get",
"id": "123",
"ver": "1.0",
"data":"battery"
}
- method: "get"表示获取属性数据
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- data:属性的key。battery表示电量。
设备返回数据示例:
{
"method": "battery_reply",
"id": "123",
"ver": "1.0",
"data":[
{"battery":"100"}
],
"error":[]
}
- method: xxxx_reply,xxxx表示设属性的key。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- data:属性的key和value。battery表示电量。数组包含的多个属性值列表。
- error: 无错误则为空数组。
5.2 set方法数据格式
app发出数据示例:
{
"method": "set",
"id": "456",
"ver": "1.0",
"data":{"mic_status":"open"}
}
- method: "set"表示设置设备的属性参数。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- data:属性的key。mic_status表示设备麦克风的状态。"open"为开,"close"为关
设备返回数据示例:
{
"method": "mic_status_reply",
"id": "456",
"ver": "1.0",
"data":[
{"mic_status":"success"}
],
"error":[]
}
- method: xxxx_reply,xxxx表示设属性的key。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- data:属性的key。mic_status表示设备麦克风的状态。"success"表示设置成功,有可能是"打开"成功,有可能是"关闭"成功。
- error: 无错误则为空数组。
5.3 属性列表
name | key | value | type | get | set |
---|---|---|---|---|---|
当前电量 | battery | 返回值为电量百分比 | string | ✓ | ✕ |
设置设备的时间 | sync_time | 年月日时分秒YYYYMMDDHHMM的格式,比如:"20230801113301" | string | x | ✓ |
获取设备的时间 | cur_time | 年月日时分秒的格式,比如:"20230801113301" | string | ✓ | x |
振动麦克风开关状态 | mic_status | "open"为打开,"close"为关闭 | string | ✓ | ✓ |
当前ibeacon序号 | cur_ibeacon_id | 比如:"6"表示序号为6 | string | ✓ | x |
固件版本号 | sw_version | 比如:"1.0"表示当前设备固件版本为1.0 | string | ✓ | x |
查询录音状态 | rec_status | 比如:"rec_start"表示录音开始,"rec_start"表示录音结束 | string | ✓ | x |
自动录音模式 | rec_mode | 比如:"rec_auto"表示自动录音,"rec_head"表示手动录音 | string | ✓ | ✓ |
查询SD卡剩余容量 | sd_capacity | 比如:"490"表示可用容量为490MB | string | ✓ | x |
查询录音指示灯状态 | rec_led | "open"为打开,"close"为关闭 | string | ✓ | ✓ |
录音模式 | cur_rec_state | "live"表示不是通话录音,其它为通话录音 | string | ✓ | ✓ |
文件是否自动上传 | auto_update | "open"为打开,"close"为关闭 | string | ✓ | ✓ |
6. 设备服务
设备服务是指由设备提供的服务能力,比如,录音操作、音频列表查询,音频删除操作等。
设备服务都是由APP发起,设备返回执行结果的。
6.1 设备基础信息
app发出数据示例:
{
"method": "get",
"id": "123",
"ver": "1.0",
"data":"basic_info"
}
- method: 固定为"get"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- data:固定为"basic_info"。
设备返回结果数据示例:
{
"method": "basic_info_reply",
"id": "123",
"ver": "1.0",
"data":
[
{"sw_version":"1.0"},
{"battery":"100"},
{"rec_led":"open"},
{"rec_mode":"rec_auto"},
{"language":"EN"},
{"sd_total":65},
{"sd_capacity":"490"}
{"usb_otg":"open"}
{"total_capacity":"512"}
]
"error":[]
}
- method:固定为"basic_info_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。
- data:
- sw_version: 固件版本号
- battery: 电量
- rec_led: led灯状态
- rec_mode: 是否自动录音
- language: 语言。支持中,英
- sd_total: sd卡中音频数量
- sd_capacity: 剩余容量MB
- usb_otg: 是否打开usb功能。打开则可以通过usb读取sd卡中的音频。
- total_capacity: 总容量
6.2 查询SD卡音频列表
按页获取音频列表,每页最多返回10个音频。
app发出数据示例:
获取第1页音频列表
{
"method": "get",
"id": "123",
"ver": "1.0",
"data":{"sd_list":1}
}
- method: 固定为"get"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- data:固定为{"sd_list":1}。1表示获取第1页的音频列表数据。
设备返回结果数据示例:
{
"method":"sd_list_reply",
"id":"123",
"ver":"1.0",
"data":[
{"total":56}
{"id":1,"size":512,"name":"320030003200330030003900300031003000390035003000310032002E006D0070003300"},
{"id":2,"size":512,"name":"320030003200330030003900300031003000390035003000310033002E006D0070003300"},
{"id":3,"size":512,"name":"320030003200330030003900300031003000390035003000310034002E006D0070003300"},
{"id":4,"size":512,"name":"320030003200330030003900300031003000390035003000310035002E006D0070003300"},
{"id":5,"size":512,""name":"320030003200330030003900300031003000390035003000310036002E006D0070003300"},
{"id":6,"size":512,"name":"320030003200330030003900300031003000390035003000310037002E006D0070003300"},
{"id":7,"size":512,"name":"320030003200330030003900300031003000390035003000310038002E006D0070003300"},
{"id":8,"size":512,"name":"320030003200330030003900300031003000390035003000310039002E006D0070003300"},
{"id":9,"size":512,"name":"320030003200330030003900300031003000390035003000320030002E006D0070003300"},
{"id":10,"size":512,"name":"320030003200330030003900300031003000390035003000320031002E006D0070003300"},
"error":[]
}
每页最多10个数据,总页数据以此获取:(total/10+1)或0
- method:固定为"sd_list_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。
- data:
- id:为该文件在文件系统内部存储的序号
- size:表示文件大小 单位为字节
- name:为长文件名,utf8编码 比如:"320030003200330030003900300031003000390035003000310032002E006D0070003300" 表示:20230901095012.mp3 3200转码后为2,3000转码后为0,2E00转码后为.,6D00转码后为m, 7000转码后为p
6.3 获取音频蓝牙信息
app发出数据示例:
{
"method": "get",
"id": "123",
"ver": "1.0",
"data":"edr_ctkd"
}
- method: 固定为"get"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- data:固定为"edr_ctkd"
设备返回结果数据示例:
{
"method": "edr_ctkd_reply",
"id": "123",
"ver": "1.0",
"data":
[
{"edr_name":"Flash Note (BT)"RecNow616c"},
{"mac_addr":"ae92afd2616c"},
{"connect_state":"connected"}
],
"error":[]
}
- method:固定为"edr_ctkd_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。
- data:
- edr_name:为音频蓝牙名称,后面带数传蓝牙的最后4个mac地址
- mac_addr:为
音频数传蓝牙的mac地址, - connect_state:表示已经连接音频蓝牙的状态。“connected"/"disconnected"
6.4 根据序号删除SD卡中的指定音频(不建议使用)
此方法删除音频后,会导致音频序号自动重新分配。结果就是sd卡的音频序号与app的序号不同,会导致音频误删除。
如果要使用此方法,记得必须重新获取音频列表。
6.5 根据"音频名称"删除SD卡中的指定音频
app发出数据示例:
{
"method": "set",
"id": "123",
"ver": "1.0",
"data":{
"sd_del_name":"20240605105111.MP3"
}
}
- method: 固定为"set"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- data:
- sd_del_name为固定值
- 20240605105111.MP3表示要删除的SD卡中的音频名称,注意"MP3必须为大写"
设备返回结果数据示例:
{
"method": "sd_del_name_reply",
"id": "123",
"ver": "1.0",
"data":[
{"sd_del_name":"success"}
],
"error":[]
}
- method:固定为"sd_del_name_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。
- data:
- sd_del_name为固定值,success表示成功。
6.6 格式化SD卡
清空sd卡中所有音频
app发出数据示例:
{
"method": "set",
"id": "123",
"ver": "1.0",
"data":"sd_format"
}
- method: 固定为"set"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- data:sd_format为固定值
设备返回结果数据示例:
{
"method": "sd_format_reply",
"id": "123",
"ver": "1.0",
"data":[
{"sd_format":"success"}
],
"error":[]
}
- method:固定为"sd_format_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。
- data:
- sd_format为固定值,success表示成功。
6.7 开始录音
app发出数据示例:
{
"method":"s_begin_rec",
"id": "123",
"ver": "1.0",
"params":[]
}
- method: 固定为"s_begin_rec"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- params:
设备返回结果数据示例:
录音开始后,APP可以在音频通道00010203-0405-0607-0809-0A0B0C0D2B18,接收到设备发出的音频数据。
{
"method": "e_rec_start",
"id": "123",
"ver": "1.0",
"params":[{"rec_state":"live"}]
}
- method:固定为"e_rec_start"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。
- params:
- rec_state: live表示现场录音。phone_in表示来电录音,phone_out表示去电录音,null不在录音中
6.8 停止录音
app发出数据示例:
{
"method":"s_stop_rec",
"id": "123",
"ver": "1.0",
"params":[]
}
- method: 固定为"s_stop_rec"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- params:
设备返回结果数据示例:
{
"method": "e_rec_stop",
"id": "123",
"ver": "1.0",
"params":[]
}
- method:固定为"e_rec_stop"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。
- params:
6.9 恢复出厂设置
app发出数据示例:
{
"method":"s_recover",
"id": "123",
"ver": "1.0",
"params":[]
}
- method: 固定为"s_recover"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- params:
设备返回结果数据示例:
{
"method": "s_recover_reply",
"id": "123",
"ver": "1.0",
"data":[
{"s_recover":"suceess"}
],
"error":[]
}
- method:固定为"s_recover_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。
- data:{"s_recover":"suceess"}表示成功
6.10 设备重启
app发出数据示例:
{
"method":"s_reset",
"id": "123",
"ver": "1.0",
"params":[]
}
- method: 固定为"s_reset"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- params:
设备返回结果数据示例:
{
"method": "s_reset_reply",
"id": "123",
"ver": "1.0",
"data":[
{"s_reset":"suceess"}
],
"error":[]
}
- method:固定为"s_reset_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。或者不存在此key
- data:{"s_reset":"suceess"}表示成功
6.11 断开蓝牙
app发出数据示例:
{
"method":"s_ble_disconnect",
"id": "123",
"ver": "1.0",
"data":[]
}
- method: 固定为"s_ble_disconnect"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- data:
设备返回结果数据示例:
{
"method":"s_ble_disconnect_reply",
"id": "123",
"ver": "1.0",
"params":[]
}
- method:固定为"s_ble_disconnect_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。或者不存在此key
- params:{"s_reset":"suceess"}表示成功
6.12 解除绑定
app发出数据示例:
{
"method":"s_remove_binding",
"id": "123",
"ver": "1.0",
"data":[]
}
- method: 固定为"s_remove_binding"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- data:
设备返回结果数据示例:
{
"method":"s_remove_binding_reply",
"id": "123",
"ver": "1.0",
"params":[]
}
- method:固定为"s_remove_binding_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。或者不存在此key
- params:
6.13 射频物理层测试
app发出数据示例:
{
"method":"s_dut_test_mode",
"id": "123",
"ver": "1.0",
"params":[]
}
- method: 固定为"s_dut_test_mode"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- params:
设备返回结果数据示例:
{
"method":"s_dut_test_mode_reply",
"id": "123",
"ver": "1.0",
"params":[]
}
- method:固定为"s_dut_test_mode_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。或者不存在此key
- params:
7. 设备事件
由设备主动触发的事件。比如:电量低事件、录音开始/结束事件。不需要操作app,
设备主动推送到app, app接收后,需要返回执行结果给设备。
7.1 设备开始录音
设备物理按键触发后主动上报
设备主动推送数据示例:
{
"method": "e_rec_start",
"id": "123",
"ver": "1.0",
"params":[{"rec_state":"live"}]
}
- method: 固定为"e_rec_start"。
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- params:
APP响应数据示例:
{
"method":"e_rec_start_reply",
"id": "123",
"ver": "1.0",
"data":[{"e_rec_start":"success"}],
"error":[]
}
- method:固定为"e_rec_start_reply"
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:
7.2 设备结束录音
设备物理按键触发后主动上报
设备主动推送数据示例:
{
"method": "e_rec_stop",
"id": "123",
"ver": "1.0",
"data":[]
}
- method: 固定为"e_rec_stop"。
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- params:
APP响应数据示例:
{
"method":"e_rec_stop_reply",
"id": "123",
"ver": "1.0",
"data":[{"e_rec_stop":"success"}],
"error":[]
}
- method:固定为"e_rec_stop_reply"
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:{"e_rec_stop":"success"}表示app已经停止处理音频。
7.3 设备主动断开BLE连接
只在APP主动断开蓝牙时,才发送此信息。由设备主动断开连接的,断开后,APP禁止自动回连。
设备主动推送数据示例:
由设备主动断开连接的,断开后,APP禁止回连。
{
"method":"e_ble_disconnected",
"id":"233",
"ver":"V1.31",
"data":[]
}
- method: 固定为"e_ble_disconnected"。
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:
APP响应数据示例:
{
"method":"e_ble_disconnected",
"id": "123",
"ver": "V1.31",
"data":[{"e_ble_disconnected":"success"}],
"error":[]
}
- method:固定为"e_ble_disconnected"
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:{"e_ble_disconnected":"success"}表示app接收到断开消息。由设备主动断开连接的,断开后,APP禁止自动回连。
7.4 设备电量变化
电量等级为0-100,30 秒主动上报一次
设备主动推送数据示例:
{
"method": "e_battery",
"id": "123",
"ver": "1.0",
"data":[{"e_battery":100}]
}
- method: 固定为"e_battery"。
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:{"e_battery":100}表示电量为100
APP响应数据示例:
{
"method":"e_battery_reply",
"id": "123",
"ver": "1.0",
"data":[{"e_battery":"success"}],
"error":[]
}
- method:固定为"e_battery_reply"
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:{"e_battery":"success"}表示app接收到消息。
7.5 设备音频蓝牙连接成功
经典蓝牙状态,变化时主动通知
设备主动推送数据示例:
{
"method":"e_bt_connected",
"id":"233",
"ver":"V1.31",
"data":[]
}
- method: 固定为"e_bt_connected"。
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:{"e_battery":100}表示电量为100
APP响应数据示例:
{
"method":"e_bt_connected_reply",
"id": "123",
"ver": "1.0",
"data":[{"e_bt_connected":"success"}],
"error":[]
}
- method:固定为"e_bt_connected_reply"
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:{"e_bt_connected":"success"}表示app接收到消息。
7.6 设备音频蓝牙连接断开
经典蓝牙状态,变化时主动通知
设备主动推送数据示例:
{
"method":"e_bt_disconnected",
"id":"233",
"ver":"V1.31",
"data":[]
}
- method: 固定为"e_bt_connected"。
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:{"e_battery":100}表示电量为100
APP响应数据示例:
{
"method":"e_bt_connected_reply",
"id": "123",
"ver": "1.0",
"data":[{"e_bt_disconnected":"success"}],
"error":[]
}
- method:固定为"e_bt_connected_reply"
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:{"e_bt_disconnected":"success"}表示app接收到消息。
7.7 设备恢复出厂设置
设备主动推送数据示例:
{
"method": "s_recover_reply",
"id": "123",
"ver": "1.0",
"data":[
{"s_recover":"suceess"}
],
"error":[]
}
- method: 固定为"s_recover_reply"。
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:
APP响应数据示例:
{
"method":"recover_ready",
"id": "123",
"ver": "1.0",
"data":[]
}
- method:固定为"recover_ready"
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:
7.8 设备重启
设备主动推送数据示例:
{
"method": "s_reset_reply",
"id": "123",
"ver": "1.0",
"data":[
{"s_reset":"suceess"}
],
"error":[]
}
- method: 固定为"s_reset_reply"。
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:
APP响应数据示例:
{
"method":"s_reset_reply",
"id": "123",
"ver": "1.0",
"data":[]
}
- method:固定为"s_reset_reply"
- id:每次发送指令时的id,app返回的数据也有id,两者要相同。
- ver: 设备固件的版本号。
- data:
8. SD卡文件传输
SD卡文件的接收,是通过蓝牙uuid:00010203-0405-0607-0809-0A0B0C0D2B22
8.1 APP请求SD卡中的音频
支持断点续传,自定义开始传输的偏移位置。
一次只允许上传一个,APP若选中多个进行传输,需要在传输完后再用该指令申请传输。
app发出数据示例:
{
"method":"s_update_start",
"id":"123",
"ver":"1.0",
"params":[
{"file_name":"20240605103744.MP3"},
{"block_index":0},
{"block_size":1024}
]
}
- method: 固定为"s_update_start"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- params:
-
file_name:文件名
-
block_index:0为第一次传输,不为0为断点传输,第n块。
-
block_size: 每一块数据的大小。最大为1024字节。一般不要修改它。用于断点续传计算文件的偏移地址 offset=block_index*block_size;
block_size不是mtu,也不是实际接收的一包文件大小。受限于不同手机型号支持的蓝牙的包长,一般每包数据都可能小于block_size,不足block_size时,则要拼接为1024大小,才是完整的一包文件数据。
-
设备返回结果数据示例:
开始接收SD卡文件后,要在uuid:00010203-0405-0607-0809-0A0B0C0D2B22处理接收到的数据,保存成音频文件。
{
"method":"s_update_start_reply",
"id":"123",
"ver":"1.0",
"data":[
{"mtu":"186"},
{"file_size":"2048"},
{"file_name":"320030003200330030003900
300031003000390035003000310032002E00
6D0070003300"}
],
"error":[]
}
- method:固定为"s_update_start_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。或者不存在此key
- data:
- mtu:mtu为每包的数据最大限制,为手机和设备交互得到,目的为了提升传输效率,不超过此大小不需要做拼包处理
- file_size:为整个文件需要传输的大小,单位:字节
- file_name:为utf8的字符串名称 "202308101901.mp3"
注意事项
sd卡中的文件, 从数传蓝牙过来的每一包数据都有包头
- byte2~byte3: 这两个字节,是包的大小,即block_size
- byte4~byte8: 这四个字节,是包的序号,即block_index
在保存文件时,要把前8个字节排除。
8.2 APP取消请求SD卡中的音频
app发出数据示例:
{
"method":"s_update_cancel",
"id":"123",
"ver":"1.0",
"params":[]
}
- method: 固定为"s_update_cancel"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- params:
设备返回结果数据示例:
开始接收SD卡文件后,要在uuid:00010203-0405-0607-0809-0A0B0C0D2B22处理接收到的数据,保存成音频文件。
{
"method": "s_update_cancel_reply",
"id": "123",
"ver": "1.0",
"data":[
{"s_update_cancel":"suceess"}
],
"error":[]
}
- method:固定为"s_update_cancel_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。或者不存在此key
- data: {"s_update_cancel":"suceess"}取消成功
8.3 APP请求暂停传输SD卡中的音频
app发出数据示例:
{
"method":"s_update_pause",
"id":"123",
"ver":"1.0",
"params":[]
}
- method: 固定为"s_update_pause"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- params:
设备返回结果数据示例:
开始接收SD卡文件后,要在uuid:00010203-0405-0607-0809-0A0B0C0D2B22处理接收到的数据,保存成音频文件。
{
"method": "s_update_pause_reply",
"id": "123",
"ver": "1.0",
"data":[
{"s_update_pause":"suceess"}
],
"error":[]
}
- method:固定为"s_update_pause_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。或者不存在此key
- data: {"s_update_pause":"suceess"}暂停成功
8.4 设备通知文件上传完成
设备推送上传完成示例:
{
"method":"s_update_end",
"id":"123",
"ver":"1.0",
"params":[]
}
- method: 固定为"s_update_end"。
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- params:
APP收到数据后响应示例:
文件传输完的最后一包后,触发此数据
{
"method":"s_update_end_reply",
"id":"123",
"ver":"1.0",
"data":[
{"s_update_end_reply":"suceess"}
],
"error":[]
}
- method:固定为"s_update_end_reply"
- id:每次发送指令时的id,都是唯一的。蓝牙返回的数据也有id,两者相同。
- ver: 设备固件的版本号。
- error: 无错误则为空数组。或者不存在此key
- data: {"s_update_end_reply":"suceess"}。文件传输完成