# 蓝牙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