蓝牙设备App线下开发——蓝牙 H5 开发指导
智慧生活 App 发现蓝牙设备
- 开发者修改设备蓝牙广播名称,使之符合蓝牙 HiLink 命名规则。
- 完成设备蓝牙广播名称修改后,由华为方进行后台配置,使 App 支持扫描该名称。(目前由人工配置,后续自动配置)
- 智慧生活 App 扫描到的蓝牙名字满足 HiLink 命名规则,即当做智慧生活设备处理。根据设备注册时传入的 SN 判断此设备是否已注册,未注册的显示,已注册的不显示。
蓝牙HiLink命名规则: Hi-AA…AA-XYYYYSSNNNN
- Hi- : 为固定前缀,3字节
- AA…AA :厂商名加上设备名,由厂商决定,1-14个字符。可以包含字母、数字、下划线,不支持其他字符
- - :为固定分隔符
- X:版本号,非0,目前填1. Hi-和-X可以做识别,减少误添加的几率
- YYYY:产品的唯一标识符,即产品的 ProductID,在开发者联盟网站上,注册产品后就会生成。
- SS: 预留扩展字段,缺省为00
- NNNN:序列号 SN,用于区分相同产品的多个设备。
说明
不足4位均做空字符串“”处理,大于等于4位截取前4位当做 SN,可以包含字母、数字、下划线,不支持其他字符。
H5 开发调试前准备
代码文件夹需遵循如下结构,方可在智慧生活 App 中正常访问相应页面。
表1 目录说明
蓝牙设备注册流程
此部分内容需配合蓝牙设备 JSAPI 接口描述使用。
获取手机系统信息,判断手机操作系统是 Android 还是 iOS。
function getSystemInfo() {
window.getSystemInfoSyncCallBack = info => {
let data = JSON.parse(info);
if(data.platform == "iOS") {
console.log("iOS设备")
isIOS = true;
} else {
console.log("andorid设备")
isIOS = false;
}
listeningBleChange();
getBluetoothAdapterState();
}
window.hilink.getSystemInfoSync('getSystemInfoSyncCallBack')
}
调用 hilink.onBluetoothAdapterStateChange() 监听蓝牙状态变化。
监听到蓝牙开启,则进入注册流程;监听到关闭,则调用 hilink.openBluetoothAdapter() 打开蓝牙。
function listeningBleChange() {
window.hilink.onBluetoothAdapterStateChange('onBlueToothAdapterStateChangeCallback') // 监听蓝牙状态
window.onBlueToothAdapterStateChangeCallback = res => { // 监听蓝牙状态回调函数
let data = JSON.parse(res)
console.log('监听蓝牙状态', data)
if(data.available) {
getUnRegisterDeviceFun();
} else {
openBlueTooth();
}
}
}
调用 hilink.getBluetoothAdapterState() 获取手机蓝牙开关状态。
如果未打开,则调用 hilink.openBluetoothAdapter() 打开蓝牙;如果是打开状态,则进入注册流程。
function getBluetoothAdapterState() {
window.hilink.getBluetoothAdapterState("getBlueToothAdapterStateCallback")
window.getBlueToothAdapterStateCallback = res => {
let data = JSON.parse(res)
console.log('1.蓝牙当前状态', data)
if(data.available) {
getUnRegisterDeviceFun();
} else {
openBlueTooth();
}
}
}
设备注册
注册时,蓝牙设备固件版本(fwv,如1.0)及蓝牙设备硬件版本(hwv,如1.0)需与 HiLink 开发者平台上的版本号一致。
注册页建议有连接设备的进度提示,进度条或百分比、连接成功、连接失败等。30秒连接不上,可以提示连接超时。
Android 系统
iOS系统
iOS 的注册流程分为两种情况,都需要蓝牙硬件暴露 MAC 地址。
- 情况一:通过 hilink.startBluetoothDevicesDiscovery([],0,1) 开启扫描,在 hilink.onBluetoothDeviceFound() 回调参数中包含 MAC 地址
- 情况二:通过 hilink.startBluetoothDevicesDiscovery([],0,1) 开启扫描,在 hilink.onBluetoothDeviceFound() 回调参数中不包含 MAC 地址
说明
- 如果蓝牙已打开,则获取当前页面被选中的未注册的设备,调用 hilink.getCurrentUnregisteredDevice() ,获取设备 deviceId (iOS 为 UUID)。
- 监听寻找到新设备, 同时调用 hilink.onBluetoothDeviceFound ()、hilink.startBluetoothDevicesDiscovery([],0,1)。
通过 hilink.onBluetoothDeviceFound () 的回调,查看监听到的新设备中的 deviceId 属性,与 getCurrentUnregisteredDevice 中获取的 UUID 对比,如匹配上,说明已经找到要注册设备。
通过扫描设备回调参数中的 manufacturerDate,解析获得 MAC 地址。
- 调用 hilink.stopBluetoothDevicesDiscovery() 停止扫描附近的蓝牙设备。
- 通过 UUID 连接蓝牙。连接成功后使用 mac 地址调用 hilink.registerBleDevice() 注册设备到 App 九宫格界面。
function getUnRegisterDeviceFun() { window.getCurrentUnregisteredDeviceCallback = res => { let data = JSON.parse(res) deviceId = data.deviceId console.log('2.获取A的MAC地址(ios的uuid)', data) if(isIOS) { getIOSdevices(); } else { mac = deviceId; connectDevice(); } } window.hilink.getCurrentUnregisteredDevice('getCurrentUnregisteredDeviceCallback') } function registerBleDevice(mac) { console.log('注册设备:', mac) window.hilink.registerBleDevice(mac, fwv, hwv, 'registerBleDeviceCallback') window.registerBleDeviceCallback = res => { console.log(res) } }
如果蓝牙已打开,则获取当前页面被选中的未注册的设备,调用 hilink.getCurrentUnregisteredDevice() ,获取设备 deviceId (iOS 为 UUID)。
通过 UUID 调用 hilink.createBLEConnection() 连接蓝牙。
连接成功后。通过 180a 服务和 2a23 特征值读取 MAC。首先调用 hilink.notifyBLECharacteristicValueChange (deviceId, '0000180a-0000-1000-8000-00805f9b34fb','00002a23-0000-1000-8000-00805f9b34fb', true),当返回0时,表示通知成功。
调用 readBLECharacteristicValue(deviceId, '0000180a-0000-1000-8000-00805f9b34fb','00002a23-0000-1000-8000-00805f9b34fb', callback),读取 MAC。
调用 hilink.registerBleDevice() 注册。
function getUnRegisterDeviceFun() {
window.getCurrentUnregisteredDeviceCallback = res => {
let data = JSON.parse(res)
deviceId = data.deviceId
console.log('2.获取A的MAC地址(ios的uuid)', data)
if(isIOS) {
getIOSdevices();
} else {
mac = deviceId;
connectDevice();
}
}
window.hilink.getCurrentUnregisteredDevice('getCurrentUnregisteredDeviceCallback')
}
function connectDevice() {
//去连接设备
window.hilink.createBLEConnection(deviceId)
window.hilink.onBLEConnectionStateChange('onBLEConnectionStateChangeCallback') // 监听蓝牙设备连接返回
window.onBLEConnectionStateChangeCallback = res => { // 监听蓝牙设备连接返回函数
let data = JSON.parse(res)
console.log('3.连接监听结果', data)
if(data.connected) {
registerBleDevice(mac);
} else {
getSystemInfo();
}
}
}
function getMacByRead() {
window.onBLECharacteristicValueChangeCallback = res => {
}
window.hilink.onBLECharacteristicValueChange("onBLECharacteristicValueChangeCallback")
window.hilink.createBLEConnection(deviceId)
window.hilink.onBLEConnectionStateChange('onIOSBLEConnectionStateChangeCallback')
window.onIOSBLEConnectionStateChangeCallback = res => {
let data = JSON.parse(res)
if(data.connected) {
let timer = null
clearInterval(timer);
timer = setInterval(() => {
let status = window.hilink.notifyBLECharacteristicValueChange(deviceId, serviceId, characteristicId, true)
console.log('notify status:',status)
if(status === 0) {
clearInterval(timer);
window.hilink.readBLECharacteristicValue (deviceId, serviceId, characteristicId, 'readBLECharacteristicValueCallback')
window.readBLECharacteristicValueCallback = res =>{
console.log('readBLECharacteristicValueCallback:',res)
registerBleDevice(res)
}
}
}, 200)
} else {
getSystemInfo();
}
}
}
function registerBleDevice(mac) {
console.log('注册设备:', mac)
window.hilink.registerBleDevice(mac, fwv, hwv, 'registerBleDeviceCallback')
window.registerBleDeviceCallback = res => {
console.log(res)
}
}
如果蓝牙已打开,则获取当前页面被选中的未注册的设备,调用 hilink.getCurrentUnregisteredDevice() ,获取设备 deviceId (安卓为 MAC 地址)。
获取 deviceId 后,调用 hilink.createBLEConnection() 连接蓝牙设备 。
连接蓝牙设备时,需要监听蓝牙连接状态的改变事件。调用 hilink.onBLEConnectionStateChange() 可以获得连接结果。
说明
如果连接异常,则重新启动注册流程。
成功连接蓝牙设备,则通知底层在IOT云端注册蓝牙设备,调用 hilink.registerBleDevice() 注册设备到 App 九宫格界面。
function getUnRegisterDeviceFun() {
window.getCurrentUnregisteredDeviceCallback = res => {
let data = JSON.parse(res)
deviceId = data.deviceId
console.log('2.获取A的MAC地址(ios的uuid)', data)
if(isIOS) {
getIOSdevices();
} else {
mac = deviceId;
connectDevice();
}
}
window.hilink.getCurrentUnregisteredDevice('getCurrentUnregisteredDeviceCallback')
}
function connectDevice() {
//去连接设备
window.hilink.createBLEConnection(deviceId)
window.hilink.onBLEConnectionStateChange('onBLEConnectionStateChangeCallback') // 监听蓝牙设备连接返回
window.onBLEConnectionStateChangeCallback = res => { // 监听蓝牙设备连接返回函数
let data = JSON.parse(res)
console.log('3.连接监听结果', data)
if(data.connected) {
registerBleDevice(mac);
} else {
getSystemInfo();
}
}
}
function registerBleDevice(mac) {
console.log('注册设备:', mac)
window.hilink.registerBleDevice(mac, fwv, hwv, 'registerBleDeviceCallback')
window.registerBleDeviceCallback = res => {
console.log(res)
}
}