本能是什么意思| 直肠ca代表什么病| 经验是什么意思| 脸红是什么大病的前兆| 后厨打荷是干什么的| 树大招风的意思是什么| 送百合花代表什么意思| 脊髓空洞是什么意思| 发改委是干什么的| 龙涎香什么味道| 太原有什么特产| 吃什么蔬菜对眼睛好| 薄荷泡水喝有什么好处| 讲解是什么意思| igm阳性是什么意思| 音爆是什么| 婆什么起舞| 多囊是什么原因引起的| 医院红色手环代表什么| 什么叫精索静脉曲张啊| 槐子泡水喝有什么功效| 睡觉食管反流什么原因| 洗衣机脱水是什么意思| 美国为什么不敢动朝鲜| 左传是一部什么体史书| 梦见缝被子是什么意思| 隐翅虫皮炎用什么药| 吃完饭恶心想吐是什么原因| belkin是什么牌子| 外阴瘙痒是什么病| 做胃镜之前需要做什么准备| 镇静是什么意思| 胎儿左心室灶状强回声是什么意思| 禄是什么意思| 4月29号是什么星座的| 大腿内侧什么经络| 94年什么命| 穆斯林是什么| 出气臭是什么原因| 胃癌手术后吃什么补品| 付之东流是什么意思| 什么是动脉硬化| 牙周炎有什么症状| 什么什么大什么| 什么命的人会丧偶| 被孤立的一般是什么人| 政治面貌是什么意思| 鼻窦炎用什么药效果最好| 本是什么意思| 零八年属什么生肖| 基因是什么| 鹤膝风是什么病| 葛仙米是什么| 皮蛋吃了有什么好处和坏处| 脂溢性皮炎头皮用什么洗发水| 2014年什么年| vs什么意思| 日可以加什么偏旁| 87属什么| 基因突变是什么病| 牙冠是什么意思| 枸杞什么时候吃最好| 什么叫资本运作| 水肿吃什么药| 什么叫压缩性骨折| 日柱金舆是什么意思| 成佛是什么意思| 大器晚成什么意思| 什么是质子| 酱油什么时候发明的| 两面三刀是什么生肖| 1979年出生属什么生肖| 七杀大运是什么意思| 过敏性皮炎用什么药膏| 六月份适合种什么蔬菜| 桂枝茯苓丸主治什么病| 刷牙时牙酸是什么原因| rag是什么| gm是什么| 什么的高楼| 头晕做什么检查最准确| 右侧胸口疼是什么原因| x什么意思| 经常呛咳是什么病的征兆| 抽动症是什么原因造成的| 什么是三好学生| 亲热是什么意思| 半月板是什么部位| 泄泻什么意思| 鬼长什么样子| 甲磺酸倍他司汀片治什么病| qy是什么意思| 根源是什么意思| 黄疸高吃什么药| 衣衫褴褛是什么意思| 肠系膜淋巴结是什么病| 右肋骨下方隐隐疼痛是什么原因| 姐姐的女儿应该叫什么| 平均红细胞体积偏高是什么原因| 今是什么结构| 膑是什么意思| inr医学上是什么意思| 多晒太阳有什么好处| img是什么意思| afar是什么意思| 吃什么除体内湿气最快| la是什么| 布朗尼是什么| 厅级干部是什么级别| 半联动是什么意思| 小孩风热感冒吃什么药| 九月十七日是什么星座| 伤口溃烂不愈合用什么药| 做完肠镜需要注意什么| 重返20岁韩国版叫什么| 甲流吃什么药效果最好| 邹去掉耳朵旁读什么| 新生儿湿肺是什么意思| 天可以加什么偏旁| 尿酸高是什么情况| 目眩是什么症状| 早上出汗是什么原因| 梦见老公怀孕什么预兆| 梦见打老鼠是什么征兆| 灰指甲是什么| 心病是什么意思| 上环是什么意思| 红薯什么时候种植| 什么血型最多| 经常梳头有什么好处| 静脉曲张有什么症状| 抗风疹病毒抗体igg高是什么意思| lck是什么意思| 眼睛出现飞蚊症什么原因怎么办| 中性粒细胞偏低是什么原因| 中巴友谊为什么这么好| 低热吃什么药| 科班出身是什么意思| 女性潮热是什么症状| 吃了避孕药不能吃什么东西| 嗪读什么| 县公安局局长是什么级别| gln是什么氨基酸| 名落孙山的意思是什么| 一个家庭最重要的是什么| 73年属什么| 四肢肌力5级什么意思| 教唆是什么意思| 血常规什么颜色的管子| 启明星是什么意思| 红薯什么时候成熟| 部堂大人是什么职位| 什么运动瘦大腿| 六亲不认是什么生肖| 乳酪是什么东西| 喜金是什么意思| Ecmo医学上是什么意思| 黄瓜是绿色的为什么叫黄瓜| 属虎是什么命| 隐翅虫是什么样子| 黑户是什么意思| 晚上吃什么水果减肥效果最好| 精虫上脑是什么意思| 为什么空调外机会滴水| 一个黑一个今念什么| 无花果吃了有什么好处| 大便糊状什么原因| 每次上大便都出血是什么原因| adl是什么意思| 是什么东西| 大道无为是什么意思| 落户什么意思| 梦见手表是什么意思| 阎维文什么军衔| poems综合征是什么病| 钟乳石是什么| 血压高降不下来是什么原因| 白色的猫是什么品种| 玻璃是什么做的| 双子座和什么座最配对| 凤字五行属什么| 帆布是什么材质| 湿疹涂什么药| 湿气重有什么症状| amor是什么意思| 骨外科是看什么病的| 养老院护工都做些什么| 做肠镜检查需要提前做什么准备| 砼为什么念hun| 容易感冒是什么原因| 今天有什么新闻| 心如止水是什么意思| 三板斧是什么意思| 黄泉是什么意思| 小孩子手脚脱皮是什么原因| 茉莉花茶属于什么茶| 脾胃阴虚吃什么中成药| 火疖子吃什么药| 老年骨质疏松疼痛有什么好疗法| 1959年属什么生肖| 打无痛对身体有什么影响吗| 发烧38度吃什么药| 小孩个子矮小吃什么促进生长发育| 紫癜是一种什么病| 小精灵是什么意思| 两榜进士是什么意思| 又拉肚子又呕吐是什么原因| 门第什么意思| 果糖胺偏高说明什么| 阴茎是什么意思| 女人更年期有什么症状| 暖宫贴贴在什么位置| 什么药可以缩阴紧致| 四个金念什么| 心态崩了什么意思| 星期天为什么不叫星期七| 梦见孕妇大肚子是什么意思| 尿路感染是什么原因| 饭前吃药和饭后吃药有什么区别| 什么病会引起背部疼痛| fml什么意思| 三叉神经挂什么科| ed2k用什么下载| 什么水果不能上供| 经常做噩梦是什么原因| hpv12种高危型阳性是什么意思| 辛未日五行属什么| 三文鱼长什么样| 和氏璧是什么玉| 腰花是什么部位| 老头疼是什么原因导致的| 菠菜什么季节吃| 副局长什么级别| 78年属马的是什么命| 黄疸肝炎有什么症状| slay什么意思| 男人梦见老鼠什么征兆| 查肝功能挂什么科| 有利有弊是什么意思| 摩羯座是什么动物| 经期洗头有什么危害| 什么是led灯| 体温偏低是什么原因| 什么叫种水| 成都机场叫什么名字| 眼袋大是什么原因| 白花花的什么| 5月28日什么星座| 莲子是什么| rh血型是什么血型| 优越感是什么意思| 女人月经总是提前是什么原因| 青春痘是什么原因引起的| 取是什么意思| 7月8日是什么星座| 鼓的偏旁部首是什么| 霍光和卫子夫什么关系| 异曲同工是什么意思| 2020是什么年| 荣辱与共是什么意思| 类风湿因子是什么意思| MS医学上是什么意思| 腱鞘是什么| 吃阿司匹林有什么副作用| 百度

神经皮肤综合症介绍,什么是神经皮肤综合症?

百度 其中,标称商标为Hisense、标称值功能网高效吸附空气中的甲醛、TVOC、臭气等有害气体,实测值为;标称商标为艾琳德、型号为KJ500F-D01的空气净化器,标称值冷触媒滤网,除甲醛、苯、二甲苯、TVOC等有害气体,实测值为<。

主机模式:基础库 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 字节为单位传输。
点击咨询小助手
私奔什么意思 心眼多是什么意思 二代试管是什么意思 se是什么国家 梦见手机屏幕摔碎了是什么意思
房间里放什么阳气旺 上海有什么好玩的地方适合小孩子 bodywash是什么意思 甲沟炎涂抹什么药膏最有效 解脲支原体是什么
做梦梦到对象出轨是什么意思 处女座的幸运色是什么颜色 黄瓜吃多了有什么坏处 大作是什么意思 装是什么意思
k金是什么金 司马光和司马迁是什么关系 黄芪什么人不能吃 向日葵什么时候种 古曼童是什么
为什么会铅中毒hcv8jop9ns9r.cn 小跟班是什么意思hcv9jop8ns1r.cn 拔罐对身体有什么好处hcv9jop2ns6r.cn 湿热喝什么茶可以调理hcv7jop5ns0r.cn 高血压什么不能吃tiangongnft.com
扁头适合什么发型hcv9jop4ns2r.cn 46属什么hcv9jop2ns5r.cn 亲友是什么意思cj623037.com 发烧咳嗽吃什么药hcv8jop3ns9r.cn 平的反义词是什么hcv8jop7ns6r.cn
什么叫管状腺瘤hcv8jop8ns0r.cn 东莞有什么区hcv9jop1ns9r.cn mdzz是什么意思hcv9jop8ns3r.cn 玉皇大帝叫什么名字hcv8jop9ns8r.cn 小孩咳嗽不能吃什么食物hcv8jop3ns5r.cn
星期一左眼皮跳是什么预兆hcv8jop4ns5r.cn 立加羽读什么hcv8jop3ns8r.cn 舒肝解郁胶囊治什么病hcv9jop5ns8r.cn 脱氢酶高是什么原因hcv7jop7ns0r.cn 脑梗什么东西不能吃hcv8jop9ns5r.cn
百度