# 蓝牙BLE协议

带有蓝牙模块的功夫智盒终端支持蓝牙BLE协议,通过BLE协议可以进行网络配置等操作。

蓝牙BLE协议底层使用Generic Attribute Profile (GATT)通讯规格进行交互。

img

# 连接协议

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)

微信小程序 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"}
1

Base64编码之后的字符串(Base64 String)为:

eyJhY3QiOiJ3aWZpLnNjYW4ifQ==
1

最终发送或接收的数据包Package为:

*
eyJhY3QiOiJ3aWZp
LnNjYW4ifQ==
#
1
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)
1
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",
        ...
	}
}
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
			}
		}
	}
}
1
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
	}, ...]
}
1
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
    }
	}
}
1
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
	}
}
1
2
3
4
5
6
7