# 蓝牙BLE协议
带有蓝牙模块的功夫智盒终端支持蓝牙BLE协议,通过BLE协议可以进行网络配置等操作。
蓝牙BLE协议底层使用Generic Attribute Profile (GATT)通讯规格进行交互。
# 连接协议
KIC的BLE通讯协议基于GATT,对于底层查找设备、连接、传输严格按照GATT相关规范。
- 搜索匹配设备
扫描BLE设备,发现以KIC-
开头的设备名的BLE设备为功夫智盒设备,例如:KIC-abcdegf12345
。KIC-后的字符串为设备Code值。
- Service
BLE蓝牙协议只提供一个Service,UUID固定为 09fc95c0-c100-11e3-9904-0800200c9a66
- Characteristic
Service中包含两个特征值,一个 write 用于发送数据,一个 notify 用于接收数据。
Write 特征值 UUID固定为: 16fe0d80-c100-11e3-b8c8-0002a5d5c51b
Notify 特征值 UUID固定为: 1c927b50-c100-11e3-8a33-0002a5d5c51b
注意
蓝牙BLE协议只允许同时与1台设备建连,请在使用结束后断开连接。
参考:
Apple Bluetooth (opens new window)
Android BLE (opens new window)
# 数据通讯协议
# 数据收发方式
发送数据:通过Write特征值写入数据包
接收数据:通过Notify特征值监听读取数据包
客户端可以在蓝牙BLE建连之后,立即监听Notify特征值数据包,需要发送指令时通过Write特征值写入,此时监听的Notify特征值中会读取到指令的响应数据包。
通过此方式,可以进行数据的串行通讯。
# 数据包 Package
- 起始位
*
起始位是数据包开始时的标识位,在发送和接收数据时首先会进行传输,独立写入或读取一次。
- 结束位
#
结束位是数据包结束时的标识位,在发送和接收数据时会最后进行传输,独立写入或读取一次。
- 数据包内容
数据包原文格式为JSON UTF-8编码格式的字符串(JSON String),数据包内容为此字符串(JSON String)通过Base64编码之后的字符串(Base64 String)数据。
- 数据包分片
在得到数据包内容字符串(Base64 String)后,需要对此字符串按照每 16个字节 分片依次传输,每次传输之间间隔 20毫秒。这样做是为了兼容更多的蓝牙客户端设备。
- 示例
数据包原文(JSON String)为:
{"act":"wifi.scan"}
Base64编码之后的字符串(Base64 String)为:
eyJhY3QiOiJ3aWZpLnNjYW4ifQ==
最终发送或接收的数据包Package为:
*
eyJhY3QiOiJ3aWZp
LnNjYW4ifQ==
#
2
3
4
(内容按16字节分片,共分为2个片段)
其中共写入或接收4次数据,每次之间间隔20毫秒。第1行为发送起始位,第2行为发送数据包内容的第一块分片,第3行为数据包内容的第二块分片,第4行为数据包的结束位。
# 数据包JSON结构体
字段 | 类型 | 是否必须 | 说明 |
---|---|---|---|
act | String | 是 | 动作名称,详见下列方法 |
src | Integer | 否 | 数据包发送方向,0为发送请求的数据包,1为接收响应的数据包 (默认为0 发送) |
dat | Object | 否 | 数据内容对象,若无数据内容,可不包含此字段 |
例如:
{"act":"client.info"} // 发送请求(Write)
{"act":"wifi.scan", "src": 1, "dat": {"ssid_list": [...]}} // 接收响应(Notify)
2
# 获取设备信息 BLE
动作act:
client.info
请求数据dat:无
响应数据dat结构体:
字段 | 类型 | 是否必须 | 说明 |
---|---|---|---|
uuid | String | 是 | 设备UUID |
code | String | 是 | 设备Code |
version | String | 是 | 设备软件版本号 |
model | String | 是 | 设备型号 |
mac | String | 是 | 以太网卡MAC地址 |
wlan_mac | String | 是 | 无线网卡MAC地址 |
- 响应数据示例:
{
"act": "client.info",
"src": 1,
"dat": {
"code": "12345678",
"model": "KIC1000",
"uuid": "941e2dad-xxxx-xxxx-xxxx-ec78d66e227d",
"version": "0.0.1",
...
}
}
2
3
4
5
6
7
8
9
10
11
# 获取当前网络信息 BLE
动作act:
network.info
请求数据dat:无
响应数据dat结构体:
字段 | 类型 | 是否必须 | 说明 |
---|---|---|---|
connected | Bool | 是 | 网络是否已连接 |
local_ip | String | 是 | 当前网络的局域网IP地址 |
gateway_ip | String | 是 | 当前网络的局域网网关地址 |
setting | Object | 是 | 网络设置信息 |
current | String | 是 | 当前连接的网络类型 ethernet wifi cellular |
setting.ethernet | Object | 是 | 以太网设置 |
setting.ethernet.enable | Bool | 是 | 是否启用以太网 |
setting.ethernet.ipv4 | Object | 否 | 以太网IPv4设置 |
setting.ethernet.ipv4.auto | Bool | 否 | 是否DHCP自动获取IP |
setting.ethernet.ipv4.addresses | String | 否 | 设置静态IP地址 CIDR格式(auto false时必填) |
setting.ethernet.ipv4.gateway | String | 否 | 设置静态网关地址(auto false时必填) |
setting.ethernet.ipv4.dns | String | 否 | 设置DNS地址(auto false时必填) |
setting.wifi | Object | 否 | WiFi无线网设置 |
setting.wifi.enable | Bool | 是 | 是否启用WiFi无线网 |
setting.wifi.ssid | String | 否 | 连接的WiFi SSID |
setting.wifi.password | String | 否 | 连接的WiFi密码 |
setting.wifi.ipv4 | Object | 否 | WiFi无线网IPv4设置 |
setting.wifi.ipv4.auto | Bool | 否 | 是否DHCP自动获取IP |
setting.wifi.ipv4.addresses | String | 否 | 设置静态IP地址 CIDR格式(auto false时必填) |
setting.wifi.ipv4.gateway | String | 否 | 设置静态网关地址(auto false时必填) |
setting.wifi.ipv4.dns | String | 否 | 设置DNS地址(auto false时必填) |
setting.cellular | Object | 否 | 蜂窝网络设置(需硬件支持) |
setting.cellular.enable | Bool | 是 | 是否启用蜂窝网络 |
- 响应数据示例:
{
"act": "network.info",
"src": 1,
"dat": {
"connected": true,
"local_ip": "192.168.199.3",
"gateway_ip": "192.168.199.1",
"setting": {
"current": "wifi",
"ethernet": {
"enable": true,
"ipv4": {
"auto": false,
"addresses": "192.168.199.3/24",
"gateway": "192.168.199.1",
"dns": "114.114.114.114"
}
},
"wifi": {
"enable": true,
"ssid": "GFD-IOT",
"password": "gongfudouiot",
"ipv4": {
"auto": true,
"addresses": "",
"gateway": "",
"dns": ""
}
},
"cellular": {
"enable": false
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 扫描WiFi列表 BLE
动作act:
wifi.scan
请求数据dat:无
响应数据dat结构体( 扫描到的WiFi列表 Object Array ):
字段 | 类型 | 是否必须 | 说明 |
---|---|---|---|
ssid | String | 是 | WiFi 名称 SSID |
mac | String | 是 | WiFi 基站MAC地址 |
channel | Integer | 是 | 信道 |
quality | Integer | 是 | 信号质量(1-100) |
level | Integer | 是 | 信号强度(dBm) |
- 响应数据示例:
{
"act": "wifi.scan",
"src": 1,
"dat": [{
"ssid": "GFD-IOT",
"mac": "D4:EE:07:62:EA:3A",
"channel": 9,
"quality": 99,
"level": -18
}, {
"ssid": "360WiFi-B7F424",
"mac": "1C:68:7E:B7:F4:24",
"channel": 1,
"quality": 84,
"level": -37
}, {
"ssid": "测试Wifi",
"mac": "3A:9D:92:A8:D1:52",
"channel": 1,
"quality": 15,
"level": -51
}, ...]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 设置网络配置 BLE
动作act:
network.set
请求数据dat:
与
netowrk.info
响应中的 setting Object 结构一致。如需修改网络连接方式,请修改 current 为对应的网络类型,无论是否修改设置都会重新连接 current 设置的网络。
注意
当wifi与ethernet设为 enable 开启时,此时ipv4.auto一般需要传 true (自动获取IP),否则默认为 false (需要手动设置IP地址)。
- 请求数据示例:(当前连接以太网,设置静态IP,同时设置一个wifi作为备份)
{
"act": "network.set",
"dat": {
"current": "ethernet",
"ethernet": {
"enable": true,
"ipv4": {
"auto": false,
"addresses": "192.168.199.3/24",
"gateway": "192.168.199.1",
"dns": "114.114.114.114"
}
},
"wifi": {
"enable": true,
"ssid": "GFD-IOT",
"password": "gongfudouiot",
"ipv4": {
"auto": true,
"addresses": "",
"gateway": "",
"dns": ""
}
},
"cellular": {
"enable": false
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- 响应数据dat结构体:(是否设置成功)
字段 | 类型 | 是否必须 | 说明 |
---|---|---|---|
ok | Bool | 是 | 是否设置成功 |
设置成功不一定连接成功,后续可以调用network.info
查看网络当前的连接状态进行判定
- 响应数据示例:
{
"act": "network.set",
"src": 1,
"dat": {
"ok": true
}
}
2
3
4
5
6
7
← 网络连接 iBeacon蓝牙信标 →