腺病毒阳性是什么意思| 可可和咖啡有什么区别| 鸡伸脖子张嘴用什么药| 鼻翼长痘是什么原因| 两仪是什么意思| 容五行属什么| 骑驴找马是什么意思| 什么时候怀孕几率最高| 狗狗气喘吃什么药| 盗汗是什么| 为什么肚子总是胀胀的| 1202是什么星座| 心率过高是什么原因| 为什么会流产| 为什么冬天容易长胖| 中性粒细胞高说明什么| 糖类抗原什么意思| 榴莲补什么| 欲代表什么生肖| 考c1驾照需要什么条件| 高职本科什么意思| 水仙什么意思| 萎缩性胃炎有什么症状| 什么星座最渣| 徒手是什么意思| 10月23号是什么星座| 六月生日是什么星座| 什么名字最好听| 极有家是什么意思| 卵巢结节是什么意思| 窗口是什么意思| 普拉提和瑜伽有什么区别| 石加乏念什么| 生长发育挂什么科| ckd医学上是什么意思| 盗汗吃什么药效果最快| 蹲着有什么好处| 动脉硬化是什么症状| 屁股尾骨疼是什么原因| 最大的狗是什么品种| 微五行属什么| 蛤蚧是什么| 什么是工科| 我想成为一个什么样的人| 孕期小腿抽筋什么原因| 性激素六项什么时候查| 口渴是什么病的前兆| 梦到孩子被蛇咬是什么意思| 直肠炎吃什么药好的快| 咏柳中的咏是什么意思| rbp是什么意思| 氨曲南是什么药| 62岁属什么生肖| 舌炎吃什么药效果最好| 拔智齿后吃什么消炎药| 烧烤烤什么好吃| 头发容易油是什么原因| 面面俱到是什么意思| 皮可以加什么偏旁| 缄默是什么意思| 大便带血是什么原因男| 儿童经常头晕什么原因导致的| 三点水加盆读什么| 什么是认知| 宫颈炎用什么药| 打篮球对身体有什么好处| 女人梦见蛇预示着什么| 开字五行属什么| 什么药治肝最好最安全| 树莓色是什么颜色| bcl是什么意思| 什么驱蚊效果最好| 28.88红包代表什么意思| 玉越戴越亮是什么原因| 1924年属什么生肖| uniqlo是什么牌子| 手指甲的月牙代表什么| 孽缘什么意思| rds是什么意思| 玉对人身体健康有什么好处| 杏仁有什么功效| 大腿根疼是什么原因| 吃鸭蛋有什么好处和坏处| 角是什么结构| 指甲发青是什么原因| 黄痰是什么原因造成的| 辰砂是什么| 为什么夏天容易拉肚子| 面条吃多了有什么坏处| 经信局是做什么的| 红肉是什么| 带状疱疹用什么药膏| 进产房吃什么补充体力| 辐照食品什么意思| 鲁迅原名叫什么| 肺部有空洞是什么病症| 感冒了吃什么水果| 感情洁癖什么意思| 超声波检查是什么检查| rapper什么意思| gdp是什么意思啊| 男同是什么意思| 早上吃黄瓜有什么好处| 1月10日什么星座| 深水炸弹是什么| 梦见动物是什么意思| 孕妇贫血吃什么药| 澳大利亚有什么特产| 窒息是什么意思| 吃龟苓膏有什么好处| 卧虎藏龙是什么生肖| 肩胛骨麻麻的什么原因| vb是什么| 脂肪肝吃什么药效果好| 男人吃什么食物可以补肾壮阳| 全身痒但是身上什么都没有| 5月12号是什么星座| 秀禾服是什么意思| 吃什么能养肝护肝| 月经一直不停有什么办法止血| 掉头发去医院看什么科| 为什么会得脂溢性皮炎| 肾结石什么不可以吃| 春的五行属性是什么| 什么油炒菜好吃又健康| 荷花又什么又什么| 减肥期间吃什么水果好| 什么文什么字| 风调雨顺是什么生肖| 必承其重上一句是什么| 女性大腿酸痛什么原因| 肝在五行中属什么| 生理期吃什么比较好| 祛斑喝什么花茶最有效| 据说是什么意思| 肺结节吃什么药最好| 胃痛去药店买什么药| 嘴角发黑是什么原因| 失孤什么意思| 恶露后期为什么是臭的| 红鸾星动是什么意思| 伤风胶囊又叫什么| 在农村做什么| 满族八大碗都有什么菜| 屌丝是什么| 明是什么生肖| 梦见订婚是什么意思| 人这一生为了什么| mido手表什么牌子| 腋毛有什么作用| 卫生湿巾是干什么用的| 1979年是什么命| pumpkin是什么意思| 感冒咳嗽一直不好是什么原因| 12月28日什么星座| 什么是颈椎病| 环比是什么意思| 热锅凉油是什么意思| 子宫破裂有什么征兆| 宫内囊性回声代表什么| 火水是什么| 竹马是什么意思| 5月2日是什么星座| 特种兵是什么兵种| 慢性萎缩性胃炎伴糜烂吃什么药| 日光性皮炎用什么药| 任什么任什么| 右手掌心有痣代表什么| 计抛是什么意思| 面首是什么意思| 心机女是什么意思| 吃什么水果能壮阳| 包公是什么意思| 卡介苗是预防什么的| 小孩啃指甲是什么原因| 毛囊炎是什么原因引起的| 乱点鸳鸯谱什么意思| 舌尖长溃疡是什么原因| 扩招是什么意思| 撕漫男是什么意思| dunk是什么牌子| 自己开店做什么赚钱| 嘴角烂是什么原因| 梦见初恋男友是什么意思| 挂急诊和门诊有什么区别| 英文为什么怎么写| rh阳性是什么意思| 风邪是什么意思| 狐臭看什么科| 莫名心慌是什么原因| 土耳其烤肉是用什么肉| 外面下着雨犹如我心血在滴什么歌| 心火大吃什么能清火| fbi相当于中国的什么| 梦见蛇缠身是什么意思| 复活节是什么意思| 三心二意是什么意思| 口苦尿黄是什么原因| 喜欢吃冰的是什么原因| 颈椎挂什么科室| 自怨自艾什么意思| 母亲o型父亲b型孩子是什么血型| 检查肛门挂什么科| vans属于什么档次| 亲嘴为什么要伸舌头| 癞蛤蟆长什么样| 窜稀吃什么药| 霉菌有什么症状| 芹菜可以炒什么| 什么是甲状腺| 好五行属什么| 女性支原体感染有什么症状| 安厝是什么意思| 爱豆什么意思| 6月13日是什么星座| 什么颜色衣服显白| 喝中药尿黄是什么原因| 脉搏强劲有力代表什么| 履历是什么意思| 1.1是什么星座| 痰中带血吃什么药| 蝈蝈是什么动物| 五谷中的菽是指什么| 6月20号是什么星座| blazer是什么意思啊| 超滤是什么意思| 半夜容易醒是什么原因| 不尽人意是什么意思| 阴道出血是什么原因引起的| 满字是什么结构| 补钙吃什么食物最好最快中老年| 有什么四字词语| 胃动力不足吃什么药| 孕妇吃西红柿对胎儿有什么好处| 红细胞偏高是什么病| 琉璃色是什么颜色| 潜意识是什么意思| 锦衣卫是干什么的| 蜈蚣属于什么类动物| 什么是冰晶| 阴道发白是什么原因| edc是什么| 医院验光挂什么科| 托塔李天王的塔叫什么| 甲状腺结节吃什么药好| 农历9月11日是什么星座| 什么游戏赚钱| 百鸟朝凤是什么生肖| roma是什么牌子| 急性化脓性扁桃体炎吃什么药| 丁亥年五行属什么| 手发麻什么原因| 流鼻血去药店买什么药| 喝豆浆拉肚子什么原因| 冤家是什么意思| ast什么意思| 男孩学什么技术最好| 颈椎压迫神经手麻吃什么药| 气血亏虚什么症状| 贵格是什么意思| 2015属什么| cep是什么意思| 沙金是什么| 泰五行属什么| 百度

火速围观!云和梯田的美就这样征服了万千游客的心!

百度 轮值董事长在当值期间是公司最高领导,领导公司董事会和常务董事会。

主机模式:基础库 1.1.0(微信客户端 iOS 6.5.6,Android 6.5.7)开始支持。

从机模式:基础库 2.10.3 开始支持。

蓝牙低功耗是从蓝牙 4.0 起支持的协议,与经典蓝牙相比,功耗极低、传输速度更快,但传输数据量较小。常用在对续航要求较高且只需小数据量传输的各种智能电子产品中,比如智能穿戴设备、智能家电、传感器等,应用场景广泛。

# 1. 角色/工作模式

蓝牙低功耗协议给设备定义了若干角色,或称工作模式。小程序蓝牙目前支持的有以下几种:

# 1) 中心设备/主机 (Central)

中心设备可以扫描外围设备,并在发现有外围设备存在后与之建立连接,之后就可以使用外围设备提供的服务(Service)。

一般而言,手机会担任中心设备的角色,利用外围设备提供的数据进行处理或展示等等。小程序提供低功耗蓝牙接口是默认设定手机为中心设备的。

# 2) 外围设备/从机 (Peripheral)

外围设备一直处于广播状态,等待被中心设备搜索和连接,不能主动发起搜索。例如智能手环、传感器等设备。

如果外围设备广播时被设置为不可连接的状态,也被称为广播模式 (Broadcaster),常见的例子是蓝牙信标 (Beacon) 设备。

# 注意

在小程序中,蓝牙设备可以同时处于主机和从机模式。在安卓设备上,只需要调用 wx.openBluetoothAdapter 初始化一次蓝牙适配器;而在 iOS 设备上,需要分别使用两种不同的 mode 参数分别初始化中心设备和外围设备的蓝牙适配器。建议统一对于主机和从机模式分别进行一次初始化。wx.closeBluetoothAdapter 会同时关闭两种模式的蓝牙适配器。

# 2. 通信协议

在两个蓝牙低功耗设备建立连接之后,双方的数据交互是基于 GATT (Generic Attribute Profile) 规范,根据该规范可以定义出一个个配置文件 (Profile),描述该蓝牙设备提供的服务 (Service)。

在整个通信过程中,有几个最主要的概念:

  • 配置文件 (Profile): Profile 是被蓝牙标准预先定义的一些 Service 的集合,并不真实存在于蓝牙设备中。如果蓝牙设备之间要相互兼容,它们只要支持相同的 Profile 即可。一个蓝牙设备可以支持多个 Profile。
  • 服务 (Service): Service 是蓝牙设备对外提供的服务,一个设备可以提供多个服务,比如电量信息服务、系统信息服务等。每个服务由一个 UUID 唯一标识。
  • 特征 (Characteristic): 每个 Service 包含 0 至多个 Characteristic。比如,电量信息服务就会有个 Characteristic 表示电量数据。Characteristic 包含一个值 (value)和 0 至多个描述符 (Descriptor) 组成。在与蓝牙设备通信时,主要就是通过读写 Characteristic 的 value 完成。 每个 Characteristic 由一个 UUID 唯一标识。
  • 描述符 (Descriptor): Descriptor 是描述特征值的已定义属性。例如,Descriptor 可指定人类可读的描述、特征值的取值范围或特定于特征值的度量单位。每个 Descriptor 由一个 UUID 唯一标识。

如下图所示,我们可以简单地理解为:每个蓝牙设备可能提供多个 Service,每个 Service 可能有多个 Characteristic,我们根据蓝牙设备的协议对对应 Characteristic 的值进行读写即可达到与其通信的目的。

GATT

# 3. UUID (Universally Unique Identifier)

根据蓝牙 4.2 协议规范(Vol 3, Part B, section 2.5.1 UUID),UUID 是一个 128 位的唯一标识符,用来标识 Service 和 Characteristic 等。

为了减少存储和传输 128 位 UUID 值的负担,蓝牙技术联盟预分配了一批 UUID,这一批 UUID 拥有一个共同部分,被称为 Bluetooth Base UUID,即 00000000-0000-1000-8000-00805F9B34FB。因此,预分配的 UUID 也可以使用 16 位或 32 位表示,其中 16 位 UUID 最为常用。使用 16/32 位的 UUID 可以降低存储和传输的负载。开发者自定义的 UUID 应注意不能与预分配的 UUID 冲突。

在小程序中,wx.startBluetoothDevicesDiscoverywx.getConnectedBluetoothDevices 的参数支持 16/32/128 位 UUID。在其他接口的参数中,

  • iOS 支持直接使用 16 位 和 128 位的 UUID;
  • Android 8.0.9 版本开始,支持直接使用 16/32/128 位 UUID;
  • Android 8.0.9 以下版本,只支持 128 位的 UUID,需要开发者手动补位到 128 位。补位方式如下
    128位UUID = 16位UUID * 2^96 + Bluetooth Base UUID
    128位UUID = 32位UUID * 2^96 + Bluetooth Base UUID
    
    例如
    0x180F -> 0000180F-0000-1000-8000-00805F9B34FB
    

所有接口的返回值统一为 128 位 UUID。

# 4. 中心设备的使用流程

# 4.1 初始化蓝牙模块

在使用蓝牙接口前,必须首先调用 wx.openBluetoothAdapter 初始化蓝牙适配器模块,其他接口必须在初始化后成功方可调用。

当蓝牙开关未开启或手机不支持蓝牙时,会返回错误 (errCode=10001)。此时小程序蓝牙模块已经初始化完成,可通过 wx.onBluetoothAdapterStateChange 监听手机蓝牙状态的改变,也可以调用蓝牙模块的所有API。开发者在开发中应该考虑兼容用户在使用小程序过程中打开/关闭蓝牙开关的情况,并给出必要的提示,提高可用性。

# 4.2 扫描并发现蓝牙外围设备

蓝牙模块初始化成功后,一般需要通过 wx.startBluetoothDevicesDiscovery 扫描外围设备。当蓝牙外围设备被扫描到时,会回调 wx.onBluetoothDeviceFound 事件,返回扫描到的设备。扫描设备比较耗费系统资源,请在搜索到需要的设备后及时调用 wx.stopBluetoothDevicesDiscovery 停止搜索。

若之前已连接过某个设备,获取到了 deviceId,可跳过扫描步骤。

// 监听扫描到新设备事件
wx.onBluetoothDeviceFound((res) => {
  res.devices.forEach((device) => {
    // 这里可以做一些过滤
    console.log('Device Found', device)
  })
  // 找到要搜索的设备后,及时停止扫描
  wx.stopBluetoothDevicesDiscovery()
})

// 初始化蓝牙模块
wx.openBluetoothAdapter({
  mode: 'central',
  success: (res) => {
    // 开始搜索附近的蓝牙外围设备
    wx.startBluetoothDevicesDiscovery({
      allowDuplicatesKey: false,
    })
  },
  fail: (res) => {
    if (res.errCode !== 10001) return
    wx.onBluetoothAdapterStateChange((res) => {
      if (!res.available) return
      // 开始搜寻附近的蓝牙外围设备
      wx.startBluetoothDevicesDiscovery({
        allowDuplicatesKey: false,
      })
    })
  }
})

# 4.3 连接设备

蓝牙低功耗设备间要进行通信,必须首先建立连接。

wx.createBLEConnection({
  deviceId, // 搜索到设备的 deviceId
  success: () => {
    // 连接成功,获取服务
    wx.getBLEDeviceServices({
      deviceId,
    })
  }
})

# 4.4 获取蓝牙外围设备的服务

wx.getBLEDeviceServices({
  deviceId, // 搜索到设备的 deviceId
  success: (res) => {
    for (let i = 0; i < res.services.length; i++) {
      if (res.services[i].isPrimary) {
        // 可根据具体业务需要,选择一个主服务进行通信
      }
    }
  }
})

# 4.5 读写服务的特征值

wx.getBLEDeviceCharacteristics({
  deviceId, // 搜索到设备的 deviceId
  serviceId, // 上一步中找到的某个服务
  success: (res) => {
    for (let i = 0; i < res.characteristics.length; i++) {
      let item = res.characteristics[i]
      if (item.properties.write) { // 该特征值可写
        // 本示例是向蓝牙设备发送一个 0x00 的 16 进制数据
        // 实际使用时,应根据具体设备协议发送数据
        let buffer = new ArrayBuffer(1)
        let dataView = new DataView(buffer)
        dataView.setUint8(0, 0)
        wx.writeBLECharacteristicValue({
          deviceId,
          serviceId,
          characteristicId: item.uuid,
          value: buffer,
        })
      }
      if (item.properties.read) { // 改特征值可读
        wx.readBLECharacteristicValue({
          deviceId,
          serviceId,
          characteristicId: item.uuid,
        })
      }
      if (item.properties.notify || item.properties.indicate) {
        // 必须先启用 wx.notifyBLECharacteristicValueChange 才能监听到设备 onBLECharacteristicValueChange 事件
        wx.notifyBLECharacteristicValueChange({
          deviceId,
          serviceId,
          characteristicId: item.uuid,
          state: true,
        })
      }
    }
  }
})
// 操作之前先监听,保证第一时间获取数据
wx.onBLECharacteristicValueChange((result) => {
  // 使用完成后在合适的时机断开连接和关闭蓝牙适配器
  wx.closeBLEConnection({
    deviceId,
  })
  wx.closeBluetoothAdapter({})
})

# 4.6 断开连接和关闭蓝牙适配器

使用完成后,应该在合适的时机断开连接,并关闭蓝牙适配器。

# 5. 注意事项

  • iOS 上,对特征值的 readwritenotify 操作,由于系统需要获取特征值实例,传入的 serviceIdcharacteristicId 必须由 wx.getBLEDeviceServiceswx.getBLEDeviceCharacteristics 中获取到后才能使用。建议统一在建立连接后先执行 wx.getBLEDeviceServiceswx.getBLEDeviceCharacteristics 后再进行与蓝牙设备的数据交互。
  • 考虑到蓝牙功能可以间接进行定位,安卓 6.0 及以上版本,无定位权限或定位开关未打开时,无法进行设备搜索。
  • 安卓上,部分机型获取设备服务时会多出 0000180000001801 UUID 的服务,这是系统行为,注意不要使用这两个服务。
  • 建立连接和关闭连接必须要成对调用。如果未能及时关闭连接释放资源,安卓上容易导致 state 133 GATT ERROR 的异常。
  • 在与蓝牙设备传输数据时,需要注意 MTU(最大传输单元)。如果数据量超过 MTU 会导致错误,建议根据蓝牙设备协议进行分片传输。安卓设备可以调用 wx.setBLEMTU 进行 MTU 协商。在 MTU 未知的情况下,建议使用 20 字节为单位传输。
点击咨询小助手
为什么会长胎记 脑梗会有什么后遗症 吃什么睡眠最快 中耳炎是什么症状 什么的云彩
卦是什么意思 糖尿病可以吃什么菜 张国荣什么时候去世的 grp是什么意思 天上的月亮是什么生肖
什么是偏光镜 肌酸激酶偏低说明什么 局部是什么意思 玻璃体切除后对眼睛有什么影响 什么持不什么
哥谭市是什么意思 金字旁加全字念什么 面碱是什么 芹菜和什么不能一起吃 什么是小三阳
儒雅什么意思fenrenren.com 孺子可教也什么意思hcv9jop7ns5r.cn 舌苔白什么原因hcv8jop2ns2r.cn 做扩胸运动有什么好处hcv8jop5ns2r.cn 间接胆红素是什么意思hcv8jop8ns5r.cn
什么是造影hcv9jop2ns1r.cn 布病什么症状hcv8jop4ns6r.cn 什么球身上长毛hcv9jop7ns5r.cn 脆皮鸭什么意思hcv8jop3ns7r.cn 背部爱出汗是什么原因hcv8jop7ns4r.cn
怀孕前三个月忌吃什么xjhesheng.com 长智齿牙龈肿痛吃什么药hcv7jop4ns7r.cn 什么是焦虑dajiketang.com 灵芝有什么作用hcv8jop6ns9r.cn 腹部超声检查什么hcv9jop4ns2r.cn
尿少尿黄是什么原因引起的hcv7jop4ns6r.cn 光顾是什么意思hcv8jop7ns5r.cn ct什么意思hcv8jop6ns1r.cn 什么解酒快tiangongnft.com 本科什么意思hcv8jop3ns7r.cn
百度