蓝牙设备App线下开发——蓝牙 H5 开发指导
头像 Tiechui.Wang 2020-10-14 10:40:00    发布
2066 浏览 19 点赞 25 收藏

智慧生活 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 中正常访问相应页面。

蓝牙设备App线下开发——蓝牙 H5 开发指导 -鸿蒙开发者社区

蓝牙设备App线下开发——蓝牙 H5 开发指导 -鸿蒙开发者社区

蓝牙设备App线下开发——蓝牙 H5 开发指导 -鸿蒙开发者社区

蓝牙设备App线下开发——蓝牙 H5 开发指导 -鸿蒙开发者社区

表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 九宫格界面。

如果蓝牙已打开,则获取当前页面被选中的未注册的设备,调用 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)

   }

}


©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
其它
地址:北京市朝阳区北三环东路三元桥曙光西里甲1号第三置业A座1508室 商务内容合作QQ:2291221 电话:13391790444或(010)62178877
版权所有:电脑商情信息服务集团 北京赢邦策略咨询有限责任公司
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,我司致力于保护作者版权,如有侵权,请与我司联系删除
京ICP备:2022009079号-2
京公网安备:11010502051901号
ICP证:京B2-20230255