mPaaS 10.1.60 及以上版本支持蓝牙接口。
目前不支持在开发者工具上进行调试,需要使用真机才能正常调用小程序蓝牙接口。
my.openBluetoothAdapter
初始化小程序蓝牙模块,生效周期为调用 my.openBluetoothAdapter
至调用 my.closeBluetoothAdapter
或小程序被销毁为止。在小程序蓝牙适配器模块生效期间,开发者可以正常调用下面的小程序 API,并会收到蓝牙模块相关的 on
事件回调。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
autoClose | Boolean | 否 | 表示是否在离开当前页面时自动断开蓝牙,不传的话默认是 true 注意 目前仅支持 Android 系统。 |
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
success 返回值
名称 | 类型 | 描述 |
---|---|---|
isSupportBLE | Boolean | 是否支持 BLE |
错误码描述
error | 描述 | 解决方案 |
---|---|---|
12 | 蓝牙未打开 | 请尝试打开蓝牙 |
13 | 与系统服务的链接暂时丢失 | 请尝试重新连接 |
14 | 未授权客户端使用蓝牙功能 | 请授权客户端使用蓝牙功能 |
15 | 未知错误 | - |
代码示例
<!-- .axml-->
<view class="page">
<view class="page-description">蓝牙 API</view>
<view class="page-section">
<view class="page-section-title">本机蓝牙开关状态</view>
<view class="page-section-demo">
<button type="primary" onTap="openBluetoothAdapter">初始化蓝牙</button>
<button type="primary" onTap="closeBluetoothAdapter">关闭本机蓝牙</button>
<button type="primary" onTap="getBluetoothAdapterState">获取蓝牙状态</button>
</view>
<view class="page-section-title">扫描蓝牙设备</view>
<view class="page-section-demo">
<button type="primary" onTap="startBluetoothDevicesDiscovery">开始搜索</button>
<button type="primary" onTap="getBluetoothDevices">所有搜索到的设备</button>
<button type="primary" onTap="getConnectedBluetoothDevices">所有已连接的设备</button>
<button type="primary" onTap="stopBluetoothDevicesDiscovery">停止搜索</button>
</view>
<view class="page-section-title">连接设备</view>
<view class="page-section-demo">
<input class="input" onInput="bindKeyInput" type="{{text}}" placeholder="输入要连接的设备的deviceId"></input>
<button type="primary" onTap="connectBLEDevice">连接设备</button>
<button type="primary" onTap="getBLEDeviceServices">获取设备服务</button>
<button type="primary" onTap="getBLEDeviceCharacteristics">获取读写特征</button>
<button type="primary" onTap="disconnectBLEDevice">断开设备连接</button>
</view>
<view class="page-section-title">读写数据</view>
<view class="page-section-demo">
<button type="primary" onTap="notifyBLECharacteristicValueChange">监听特征值数据变化</button>
<button type="primary" onTap="readBLECharacteristicValue">读取数据</button>
<button type="primary" onTap="writeBLECharacteristicValue">写入数据</button>
<button type="primary" onTap="offBLECharacteristicValueChange">取消特征值监听</button>
</view>
<view class="page-section-title">其他事件</view>
<view class="page-section-demo">
<button type="primary" onTap="bluetoothAdapterStateChange">本机蓝牙状态变化</button>
<button type="primary" onTap="offBluetoothAdapterStateChange">取消本机蓝牙状态监听</button>
<button type="primary" onTap="BLEConnectionStateChanged">蓝牙连接状态变化</button>
<button type="primary" onTap="offBLEConnectionStateChanged">取消蓝牙连接状态监听</button>
</view>
</view>
</view>
// .js
Page({
data: {
devid: '0D9C82AD-1CC0-414D-9526-119E08D28124',
serid: 'FEE7',
notifyId: '36F6',
writeId: '36F5',
charid: '',
alldev: [{ deviceId: '' }],
},
//获取本机蓝牙开关状态
openBluetoothAdapter() {
my.openBluetoothAdapter({
success: res => {
if (!res.isSupportBLE) {
my.alert({ content: '抱歉,您的手机蓝牙暂不可用' });
return;
}
my.alert({ content: '初始化成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
closeBluetoothAdapter() {
my.closeBluetoothAdapter({
success: () => {
my.alert({ content: '关闭蓝牙成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
getBluetoothAdapterState() {
my.getBluetoothAdapterState({
success: res => {
if (!res.available) {
my.alert({ content: '抱歉,您的手机蓝牙暂不可用' });
return;
}
my.alert({ content: JSON.stringify(res) });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//扫描蓝牙设备
startBluetoothDevicesDiscovery() {
my.startBluetoothDevicesDiscovery({
allowDuplicatesKey: false,
success: () => {
my.onBluetoothDeviceFound({
success: res => {
// my.alert({content:'监听新设备'+JSON.stringify(res)});
var deviceArray = res.devices;
for (var i = deviceArray.length - 1; i >= 0; i--) {
var deviceObj = deviceArray[i];
//通过设备名称或者广播数据匹配目标设备,然后记录 deviceID 后面使用
if (deviceObj.name == this.data.name) {
my.alert({ content: '目标设备被找到' });
my.offBluetoothDeviceFound();
this.setData({
deviceId: deviceObj.deviceId,
});
break;
}
}
},
fail: error => {
my.alert({ content: '监听新设备失败' + JSON.stringify(error) });
},
});
},
fail: error => {
my.alert({ content: '启动扫描失败' + JSON.stringify(error) });
},
});
},
//停止扫描
stopBluetoothDevicesDiscovery() {
my.stopBluetoothDevicesDiscovery({
success: res => {
my.offBluetoothDeviceFound();
my.alert({ content: '操作成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//获取正在连接中的设备
getConnectedBluetoothDevices() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有在连接中的设备!' });
return;
}
my.alert({ content: JSON.stringify(res) });
devid = res.devices[0].deviceId;
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//获取所有搜索到的设备
getBluetoothDevices() {
my.getBluetoothDevices({
success: res => {
my.alert({ content: JSON.stringify(res) });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
bindKeyInput(e) {
this.setData({
devid: e.detail.value,
});
},
//连接设备
connectBLEDevice() {
my.connectBLEDevice({
deviceId: this.data.devid,
success: res => {
my.alert({ content: '连接成功' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//断开连接
disconnectBLEDevice() {
my.disconnectBLEDevice({
deviceId: this.data.devid,
success: () => {
my.alert({ content: '断开连接成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//获取连接设备的 server,必须要再连接状态之下才能获取
getBLEDeviceServices() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
my.getBLEDeviceServices({
deviceId: this.data.devid,
success: res => {
my.alert({ content: JSON.stringify(res) });
this.setData({
serid: res.services[0].serviceId,
});
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
});
},
//获取连接设备的 charid,必须要再连接状态之下才能获取(这里分别筛选出读写特征字)
getBLEDeviceCharacteristics() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.getBLEDeviceCharacteristics({
deviceId: this.data.devid,
serviceId: this.data.serid,
success: res => {
my.alert({ content: JSON.stringify(res) });
//特征字对象属性见文档,根据属性匹配读写特征字并记录,然后后面读写使用
this.setData({
charid: res.characteristics[0].characteristicId,
});
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
});
},
//读写数据
readBLECharacteristicValue() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.readBLECharacteristicValue({
deviceId: this.data.devid,
serviceId: this.data.serid,
characteristicId: this.data.notifyId,
//1、安卓读取服务
// serviceId:'0000180d-0000-1000-8000-00805f9b34fb',
// characteristicId:'00002a38-0000-1000-8000-00805f9b34fb',
success: res => {
my.alert({ content: JSON.stringify(res) });
},
fail: error => {
my.alert({ content: '读取失败' + JSON.stringify(error) });
},
});
},
});
},
writeBLECharacteristicValue() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.writeBLECharacteristicValue({
deviceId: this.data.devid,
serviceId: this.data.serid,
characteristicId: this.data.charid,
//安卓写入服务
//serviceId:'0000180d-0000-1000-8000-00805f9b34fb',
//characteristicId:'00002a39-0000-1000-8000-00805f9b34fb',
value: 'ABCD',
success: res => {
my.alert({ content: '写入数据成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
});
},
notifyBLECharacteristicValueChange() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.notifyBLECharacteristicValueChange({
state: true,
deviceId: this.data.devid,
serviceId: this.data.serid,
characteristicId: this.data.notifyId,
success: () => {
//监听特征值变化的事件
my.onBLECharacteristicValueChange({
success: res => {
// my.alert({content: '特征值变化:'+JSON.stringify(res)});
my.alert({ content: '得到响应数据 = ' + res.value });
},
});
my.alert({ content: '监听成功' });
},
fail: error => {
my.alert({ content: '监听失败' + JSON.stringify(error) });
},
});
},
});
},
offBLECharacteristicValueChange() {
my.offBLECharacteristicValueChange();
},
//其他事件
bluetoothAdapterStateChange() {
my.onBluetoothAdapterStateChange(this.getBind('onBluetoothAdapterStateChange'));
},
onBluetoothAdapterStateChange() {
if (res.error) {
my.alert({ content: JSON.stringify(error) });
} else {
my.alert({ content: '本机蓝牙状态变化:' + JSON.stringify(res) });
}
},
offBluetoothAdapterStateChange() {
my.offBluetoothAdapterStateChange(this.getBind('onBluetoothAdapterStateChange'));
},
getBind(name) {
if (!this[`bind${name}`]) {
this[`bind${name}`] = this[name].bind(this);
}
return this[`bind${name}`];
},
BLEConnectionStateChanged() {
my.onBLEConnectionStateChanged(this.getBind('onBLEConnectionStateChanged'));
},
onBLEConnectionStateChanged(res) {
if (res.error) {
my.alert({ content: JSON.stringify(error) });
} else {
my.alert({ content: '连接状态变化:' + JSON.stringify(res) });
}
},
offBLEConnectionStateChanged() {
my.offBLEConnectionStateChanged(this.getBind('onBLEConnectionStateChanged'));
},
onUnload() {
this.offBLEConnectionStateChanged();
this.offBLECharacteristicValueChange();
this.offBluetoothAdapterStateChange();
this.closeBluetoothAdapter();
},
});
Bug & Tip
Bug:在用户蓝牙开关未开启或者手机不支持蓝牙功能的情况下,调用
my.openBluetoothAdapter
会返回错误,错误码见 蓝牙 API 错误码对照表;此时小程序蓝牙模块已经初始化完成,可通过my.onBluetoothAdapterStateChange
监听手机蓝牙状态的改变。Tip:在调用
my.openBluetoothAdapter
API 之前,调用小程序其它蓝牙模块相关 API,API 会返回错误。错误码:10000
错误描述:未初始化蓝牙适配器
解决方案:请调用
my.openBluetoothAdapter
my.closeBluetoothAdapter
关闭本机蓝牙模块。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
代码示例
my.closeBluetoothAdapter({
success: (res) => {
},
fail:(res) => {
},
complete: (res)=>{
}
});
Bug & Tip
Tip:调用该方法将断开所有已建立的蓝牙连接并释放系统资源。
Tip:建议在结束小程序蓝牙流程时调用,与
my.openBluetoothAdapter
成对调用。Tip:调用
my.closeBluetoothAdapter
释放资源为异步操作,不建议使用my.closeBluetoothAdapter
和my.openBluetoothAdapter
作为异常处理流程(相当于先关闭再开启,重新初始化,效率低,易发生线程同步问题)。
my.getBluetoothAdapterState
获取本机蓝牙模块状态。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
success 返回值
名称 | 类型 | 描述 |
---|---|---|
discovering | Boolean | 是否正在搜索设备 |
available | Boolean | 蓝牙模块是否可用(需支持 BLE 并且蓝牙是打开状态) |
代码示例
my.getBluetoothAdapterState({
success: (res) => {
console.log(res)
},
fail:(res) => {
},
complete: (res)=>{
}
});
my.startBluetoothDevicesDiscovery
开始搜寻附近的蓝牙外围设备。搜索结果将在 my.onBluetoothDeviceFound
事件中返回。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
services | Array | 否 | 蓝牙设备主 service 的 uuid 列表。 |
allowDuplicatesKey | Boolean | 否 | 是否允许重复上报同一设备, 如果允许重复上报,则 |
interval | Integer | 否 | 上报设备的间隔,默认为 0,即找到新设备立即上报,否则根据传入的间隔上报。 |
success | Function | 否 | 调用成功的回调函数。 |
fail | Function | 否 | 调用失败的回调函数。 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行)。 |
代码示例
my.startBluetoothDevicesDiscovery({
services: ['fff0'],
success: (res) => {
console.log(res)
},
fail:(res) => {
},
complete: (res)=>{
}
});
Bug & Tip
Tip:该操作比较耗费系统资源,请在搜索并连接到设备后调用
stop
方法停止搜索。
my.stopBluetoothDevicesDiscovery
停止搜寻附近的蓝牙外围设备。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
代码示例
my.stopBluetoothDevicesDiscovery({
success: (res) => {
console.log(res)
},
fail:(res) => {
},
complete: (res)=>{
}
});
my.getBluetoothDevices
获取所有已发现的蓝牙设备,包括已经和本机处于连接状态的蓝牙设备。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
success 返回值
名称 | 类型 | 描述 |
---|---|---|
devices | Array | 已发现的设备列表 |
device 对象
名称 | 类型 | 描述 |
---|---|---|
name | String | 蓝牙设备名称,某些设备可能没有 |
deviceName(兼容旧版本) | String | 值与 |
localName | String | 广播设备名称 |
deviceId | String | 设备 ID |
RSSI | Number | 设备信号强度 |
advertisData | Hex String | 设备的广播内容 |
manufacturerData | Hex String | 设备的 manufacturerData |
代码示例
my.getBluetoothDevices({
success: (res) => {
console.log(res)
},
fail:(res) => {
},
complete: (res)=>{
}
});
Bug & Tip
Tip:模拟器可能无法获取
advertisData
及RSSI
,请使用真机调试。Tip:开发者工具和 Android 上获取到的
deviceId
为设备 MAC 地址,iOS 上则为设备 UUID。因此deviceId
不能硬编码到代码中,需要分平台处理,iOS 可根据设备属性(localName
/advertisData
/manufacturerData
等属性)进行动态匹配。
my.getConnectedBluetoothDevices
获取处于已连接状态的设备。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
deviceId | String | 否 | 蓝牙设备 ID |
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
代码示例
my.getConnectedBluetoothDevices({
success: (res) => {
console.log(res)
},
fail:(res) => {
},
complete: (res)=>{
}
});
Bug & Tip
Tip:若小程序在之前已有搜索过某个蓝牙设备,即可直接传入之前搜索获取的
deviceId
尝试连接该设备,无需进行搜索操作。Tip:若指定的蓝牙设备已经连接,重复连接将直接返回
success
。
my.connectBLEDevice
连接低功耗蓝牙设备。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
deviceId | String | 是 | 蓝牙设备 ID |
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
代码示例
my.connectBLEDevice({
// 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
deviceId: deviceId,
success: (res) => {
console.log(res)
},
fail:(res) => {
},
complete: (res)=>{
}
});
Bug & Tip
Tip:若小程序在之前已有搜索过某个蓝牙设备,可直接传入之前搜索获取的
deviceId
直接尝试连接该设备,无需进行搜索操作。Tip:若指定的蓝牙设备已经连接,重复连接直接返回成功。
Tip:支持 iOS 客户端,Android 5.0 及以上版本客户端。
my.disconnectBLEDevice
断开与低功耗蓝牙设备的连接。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
deviceId | String | 是 | 蓝牙设备 ID |
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
代码示例
my.disconnectBLEDevice({
deviceId: deviceId,
success: (res) => {
console.log(res)
},
fail:(res) => {
},
complete: (res)=>{
}
});
Bug & Tip
Tip:蓝牙连接随时可能断开,建议监听
my.onBLEConnectionStateChanged
回调事件,当蓝牙设备断开时按需执行重连操作。Tip:若对未连接的设备或已断开连接的设备调用数据读写操作的接口,会返回 10006 错误,详见 蓝牙 API 错误码对照表,建议进行重连操作。
Tip:支持 iOS 客户端,Android 5.0 及以上版本客户端。
my.writeBLECharacteristicValue
向低功耗蓝牙设备特征值中写入数据。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
deviceId | String | 是 | 蓝牙设备 ID,参考 |
serviceId | String | 是 | 蓝牙特征值对应 |
characteristicId | String | 是 | 蓝牙特征值的 UUID |
value | Hex String | 是 | 蓝牙设备特征值对应的值,16 进制字符串,限制在 20 字节内 |
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
代码示例
my.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
value: 'fffe',
success: (res) => {
console.log(res)
},
fail:(res) => {
},
complete: (res)=>{
}
});
Bug & Tip
Tip:设备的特征值必须支持 write 才可以成功调用,具体参照 characteristic 的
properties
属性。Tip:写入的二进制数据需要进行 hex 编码。
Tip:支持 iOS 客户端,Android 5.0 及以上版本客户端。
my.readBLECharacteristicValue
读取低功耗蓝牙设备特征值中的数据。调用后在 my.onBLECharacteristicValueChange()
事件中接收数据返回。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
deviceId | String | 是 | 蓝牙设备 ID,参考 |
serviceId | String | 是 | 蓝牙特征值对应 |
characteristicId | String | 是 | 蓝牙特征值的 uuid |
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
success 返回值
名称 | 类型 | 描述 |
---|---|---|
characteristic | Object | 设备特征值信息 |
characteristic 对象
蓝牙设备 characteristic(特征值)信息。
名称 | 类型 | 描述 |
---|---|---|
characteristicId | String | 蓝牙设备特征值的 UUID |
serviceId | String | 蓝牙设备特征值对应服务的 UUID |
value | Hex String | 蓝牙设备特征值的 value |
代码示例
my.readBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
success: (res) => {
console.log(res)
},
fail:(res) => {
},
complete: (res)=>{
}
});
Bug & Tip
Tip:设备的特征值必须支持 read 才可以成功调用,具体参照 characteristic 的
properties
属性。Tip:并行多次调用读写接口存在读写失败的可能性。
Tip:如果读取超时,错误码 10015,
my.onBLECharacteristicValueChange
接口之后可能返回数据,需要接入方酌情处理。错误码信息及解决方案请参见 蓝牙 API 错误码对照表。Tip:支持 iOS 客户端,Android 5.0 及以上版本客户端。
my.notifyBLECharacteristicValueChange
启用低功耗蓝牙设备特征值变化时的 notify 功能。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
deviceId | String | 是 | 蓝牙设备 ID,参考 |
serviceId | String | 是 | 蓝牙特征值对应 |
characteristicId | String | 是 | 蓝牙特征值的 UUID |
descriptorId | String | 否 |
|
state | Boolean | 否 | 是否启用 notify 或 indicate |
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
代码示例
my.notifyBLECharacteristicValueChange({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
success: (res) => {
console.log(res)
},
fail:(res) => {
},
complete: (res)=>{
}
});
Bug & Tip
Tip:设备的特征值必须支持 notify/indicate 才可以成功调用,具体参照
characteristic
的properties
属性。Tip:必须先启用 notify 才能监听到设备
characteristicValueChange
事件。Tip:订阅操作成功后需要设备主动更新特征值的 value,才会触发
my.onBLECharacteristicValueChange
。Tip:订阅方式效率比较高,推荐使用订阅代替 read 方式。
my.getBLEDeviceServices
获取所有已发现的蓝牙设备,包括已经和本机处于连接状态的设备。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
deviceId | String | 是 | 蓝牙设备 ID,参考 |
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
success 返回值
名称 | 类型 | 描述 |
---|---|---|
services | Array | 已发现的设备服务列表,详见下表特征值信息 |
service对象
蓝牙设备 service(服务)信息。
名称 | 类型 | 描述 |
---|---|---|
serviceId | String | 蓝牙设备服务的 uuid |
isPrimary | Boolean | 该服务是否为主服务
|
代码示例
//获取连接设备的 server,必须要在连接状态之下才能获取
getBLEDeviceServices() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
my.getBLEDeviceServices({
deviceId: this.data.devid,
success: res => {
my.alert({ content: JSON.stringify(res) });
this.setData({
serid: res.services[0].serviceId,
});
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
});
},
返回值示例
{
"services": [{
"isPrimary": true,
"serviceId": "00001800-0000-1000-8000-00805f9b34fb"
}, {
"isPrimary": true,
"serviceId": "00001801-0000-1000-8000-00805f9b34fb"
}, {
"isPrimary": true,
"serviceId": "d0611e78-bbb4-4591-a5f8-487910ae4366"
}, {
"isPrimary": true,
"serviceId": "9fa480e0-4967-4542-9390-d343dc5d04ae"
}]
}
Bug & Tip
Tip:建立连接后先执行
my.getBLEDeviceServices
与my.getBLEDeviceCharacteristics
后再进行与蓝牙设备的数据交互。Tip:支持 iOS 客户端,Android 5.0 及以上版本客户端。
my.getBLEDeviceCharacteristics
获取蓝牙设备所有 characteristic
(特征值)。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
deviceId | String | 是 | 蓝牙设备 ID,参考 |
serviceId | String | 是 | 蓝牙特征值对应 |
success | Function | 否 | 调用成功的回调函数 |
fail | Function | 否 | 调用失败的回调函数 |
complete | Function | 否 | 调用结束的回调函数(调用成功、失败都会执行) |
success 返回值
名称 | 类型 | 描述 |
---|---|---|
characteristics | Array | 设备特征值列 |
characteristic 对象
蓝牙设备 characteristic
(特征值)信息。
名称 | 类型 | 描述 |
---|---|---|
characteristicId | String | 蓝牙设备特征值的 uuid |
serviceId | String | 蓝牙设备特征值对应服务的 uuid |
value | Hex String | 蓝牙设备特征值对应的 16 进制值 |
properties | Object | 该特征值支持的操作类型 |
properties 对象
名称 | 类型 | 描述 |
---|---|---|
read | Boolean | 该特征值是否支持 read 操作 |
write | Boolean | 该特征值是否支持 write 操作 |
notify | Boolean | 该特征值是否支持 notify 操作 |
indicate | Boolean | 该特征值是否支持 indicate 操作 |
代码示例
my.getBLEDeviceCharacteristics({
deviceId: deviceId,
serviceId: serviceId,
success: (res) => {
console.log(res)
},
fail:(res) => {
},
complete: (res)=>{
}
});
Bug & Tip
Tip:建立连接后先执行
my.getBLEDeviceServices
与my.getBLEDeviceCharacteristics
后再进行与蓝牙设备的数据交互。Tip:支持 iOS 客户端,Android 5.0 及以上版本客户端。
my.onBluetoothDeviceFound(callback)
搜索到新的蓝牙设备时触发此事件。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
callback | Function | 是 | 事件发生时回调 |
callback 返回值
名称 | 类型 | 描述 |
---|---|---|
devices | Array | 新搜索到的设备列表 |
device 对象
名称 | 类型 | 描述 |
---|---|---|
name | String | 蓝牙设备名称,某些设备可能没有 |
deviceName(兼容旧版本) | String | 值与 |
localName | String | 广播设备名称 |
deviceId | String | 设备 ID |
RSSI | Number | 设备信号强度 |
advertisData | Hex String | 设备的广播内容 |
代码示例
Page({
onLoad() {
this.callback = this.callback.bind(this);
my.onBluetoothDeviceFound(this.callback);
},
onUnload() {
my.offBluetoothDeviceFound(this.callback);
},
callback(res) {
console.log(res);
},
})
Bug & Tip
Tip:模拟器可能无法获取
advertisData
及RSSI
,请使用真机调试。Tip:开发者工具和 Android 上获取到的 deviceId 为设备 MAC 地址,iOS 上则为设备 uuid。因此 deviceId 不能硬编码到代码中,需要分平台处理,iOS 可根据设备属性(
localName
/advertisData
/manufacturerData
等)进行动态匹配。Tip:若在
my.onBluetoothDeviceFound
回调中包含了某个蓝牙设备,则此设备会添加到my.getBluetoothDevices
接口获取到的数组中。
my.offBluetoothDeviceFound
移除发现新的蓝牙设备事件的监听。
代码示例
my.offBluetoothDeviceFound();
是否需要传 callback 值
不传递 callback 值,则会移除监听所有的事件监听回调。示例代码如下:
my.offBluetoothDeviceFound();
传递 callback 值,只移除对应的 callback 事件。示例代码如下:
my.offBluetoothDeviceFound(this.callback);
Bug & Tip
Tip:为防止多次注册事件监听导致一次事件多次回调,建议每次调用
on
方法监听事件之前,先调用off
方法,关闭之前的事件监听。
my.onBLECharacteristicValueChange(callback)
监听低功耗蓝牙设备的特征值变化的事件。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
callback | Function | 是 | 事件回调函数 |
callback 返回值
名称 | 类型 | 描述 |
---|---|---|
deviceId | String | 蓝牙设备 ID,参考 |
connected | Boolean | 连接目前的状态 |
代码示例
Page({
onLoad() {
this.callback = this.callback.bind(this);
my.onBLECharacteristicValueChange(this.callback);
},
onUnload() {
my.offBLECharacteristicValueChange(this.callback);
},
callback(res) {
console.log(res);
},
})
Bug & Tip
Tip:为防止多次事件监听导致一次事件多次回调的情况,建议每次调用
on
方法监听事件之前,先调用off
方法,关闭之前的事件监听。
my.offBLECharacteristicValueChange
移除低功耗蓝牙设备的特征值变化事件的监听。
入参
Function 类型。callback
回调函数入参为 Object 类型,属性如下:
属性 | 类型 | 描述 |
---|---|---|
deviceId | String | 蓝牙设备 ID,参考 |
serviceId | String | 蓝牙特征值对应 |
characteristicId | String | 蓝牙特征值的 UUID。 |
value | Hex String | 特征值最新的 16 进制值。 |
是否传递 callback 值示例
不传递 callback 值,则会移除监听所有的事件监听回调。示例代码如下:
my.offBLECharacteristicValueChange();
传递 callback 值,只移除对应的 callback 事件。示例代码如下:
my.offBLECharacteristicValueChange(this.callback);
代码示例
Page({
onLoad() {
this.callback = this.callback.bind(this);
my.onBLECharacteristicValueChange(this.callback);
},
onUnload() {
my.offBLECharacteristicValueChange(this.callback);
},
callback(res) {
console.log(res);
},
})
my.onBLEConnectionStateChanged(callback)
监听低功耗蓝牙连接的错误事件,包括设备丢失,连接异常断开等。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
callback | Function | 是 | 事件回调函数 |
callback 返回值
名称 | 类型 | 描述 |
---|---|---|
deviceId | String | 蓝牙设备 ID,参考 |
connected | Boolean | 连接目前的状态 |
代码示例
/* .acss */
.help-info {
padding:10px;
color:#000000;
}
.help-title {
padding:10px;
color:#FC0D1B;
}
// .json
{
"defaultTitle": "Bluetooth"
}
<!-- .axml-->
<view class="page">
<view class="page-description">蓝牙 API</view>
<view class="page-section">
<view class="page-section-title">本机蓝牙开关状态</view>
<view class="page-section-demo">
<button type="primary" onTap="openBluetoothAdapter">初始化蓝牙</button>
<button type="primary" onTap="closeBluetoothAdapter">关闭本机蓝牙</button>
<button type="primary" onTap="getBluetoothAdapterState">获取蓝牙状态</button>
</view>
<view class="page-section-title">扫描蓝牙设备</view>
<view class="page-section-demo">
<button type="primary" onTap="startBluetoothDevicesDiscovery">开始搜索</button>
<button type="primary" onTap="getBluetoothDevices">所有搜索到的设备</button>
<button type="primary" onTap="getConnectedBluetoothDevices">所有已连接的设备</button>
<button type="primary" onTap="stopBluetoothDevicesDiscovery">停止搜索</button>
</view>
<view class="page-section-title">连接设备</view>
<view class="page-section-demo">
<input class="input" onInput="bindKeyInput" type="{{text}}" placeholder="输入要连接的设备的deviceId"></input>
<button type="primary" onTap="connectBLEDevice">连接设备</button>
<button type="primary" onTap="getBLEDeviceServices">获取设备服务</button>
<button type="primary" onTap="getBLEDeviceCharacteristics">获取读写特征</button>
<button type="primary" onTap="disconnectBLEDevice">断开设备连接</button>
</view>
<view class="page-section-title">读写数据</view>
<view class="page-section-demo">
<button type="primary" onTap="notifyBLECharacteristicValueChange">监听特征值数据变化</button>
<button type="primary" onTap="readBLECharacteristicValue">读取数据</button>
<button type="primary" onTap="writeBLECharacteristicValue">写入数据</button>
<button type="primary" onTap="offBLECharacteristicValueChange">取消特征值监听</button>
</view>
<view class="page-section-title">其他事件</view>
<view class="page-section-demo">
<button type="primary" onTap="bluetoothAdapterStateChange">本机蓝牙状态变化</button>
<button type="primary" onTap="offBluetoothAdapterStateChange">取消本机蓝牙状态监听</button>
<button type="primary" onTap="BLEConnectionStateChanged">蓝牙连接状态变化</button>
<button type="primary" onTap="offBLEConnectionStateChanged">取消蓝牙连接状态监听</button>
</view>
</view>
</view>
// .js
Page({
data: {
devid: '0D9C82AD-1CC0-414D-9526-119E08D28124',
serid: 'FEE7',
notifyId: '36F6',
writeId: '36F5',
charid: '',
alldev: [{ deviceId: '' }],
},
//获取本机蓝牙开关状态
openBluetoothAdapter() {
my.openBluetoothAdapter({
success: res => {
if (!res.isSupportBLE) {
my.alert({ content: '抱歉,您的手机蓝牙暂不可用' });
return;
}
my.alert({ content: '初始化成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
closeBluetoothAdapter() {
my.closeBluetoothAdapter({
success: () => {
my.alert({ content: '关闭蓝牙成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
getBluetoothAdapterState() {
my.getBluetoothAdapterState({
success: res => {
if (!res.available) {
my.alert({ content: '抱歉,您的手机蓝牙暂不可用' });
return;
}
my.alert({ content: JSON.stringify(res) });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//扫描蓝牙设备
startBluetoothDevicesDiscovery() {
my.startBluetoothDevicesDiscovery({
allowDuplicatesKey: false,
success: () => {
my.onBluetoothDeviceFound({
success: res => {
// my.alert({content:'监听新设备'+JSON.stringify(res)});
var deviceArray = res.devices;
for (var i = deviceArray.length - 1; i >= 0; i--) {
var deviceObj = deviceArray[i];
//通过设备名称或者广播数据匹配目标设备,然后记录deviceID后面使用
if (deviceObj.name == this.data.name) {
my.alert({ content: '目标设备被找到' });
my.offBluetoothDeviceFound();
this.setData({
deviceId: deviceObj.deviceId,
});
break;
}
}
},
fail: error => {
my.alert({ content: '监听新设备失败' + JSON.stringify(error) });
},
});
},
fail: error => {
my.alert({ content: '启动扫描失败' + JSON.stringify(error) });
},
});
},
//停止扫描
stopBluetoothDevicesDiscovery() {
my.stopBluetoothDevicesDiscovery({
success: res => {
my.offBluetoothDeviceFound();
my.alert({ content: '操作成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//获取正在连接中的设备
getConnectedBluetoothDevices() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有在连接中的设备!' });
return;
}
my.alert({ content: JSON.stringify(res) });
devid = res.devices[0].deviceId;
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//获取所有搜索到的设备
getBluetoothDevices() {
my.getBluetoothDevices({
success: res => {
my.alert({ content: JSON.stringify(res) });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
bindKeyInput(e) {
this.setData({
devid: e.detail.value,
});
},
//连接设备
connectBLEDevice() {
my.connectBLEDevice({
deviceId: this.data.devid,
success: res => {
my.alert({ content: '连接成功' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//断开连接
disconnectBLEDevice() {
my.disconnectBLEDevice({
deviceId: this.data.devid,
success: () => {
my.alert({ content: '断开连接成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//获取连接设备的server,必须要再连接状态之下才能获取
getBLEDeviceServices() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
my.getBLEDeviceServices({
deviceId: this.data.devid,
success: res => {
my.alert({ content: JSON.stringify(res) });
this.setData({
serid: res.services[0].serviceId,
});
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
});
},
//获取连接设备的charid,必须要再连接状态之下才能获取(这里分别筛选出读写特征字)
getBLEDeviceCharacteristics() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.getBLEDeviceCharacteristics({
deviceId: this.data.devid,
serviceId: this.data.serid,
success: res => {
my.alert({ content: JSON.stringify(res) });
//特征字对象属性见文档,根据属性匹配读写特征字并记录,然后后面读写使用
this.setData({
charid: res.characteristics[0].characteristicId,
});
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
});
},
//读写数据
readBLECharacteristicValue() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.readBLECharacteristicValue({
deviceId: this.data.devid,
serviceId: this.data.serid,
characteristicId: this.data.notifyId,
//1、安卓读取服务
// serviceId:'0000180d-0000-1000-8000-00805f9b34fb',
// characteristicId:'00002a38-0000-1000-8000-00805f9b34fb',
success: res => {
my.alert({ content: JSON.stringify(res) });
},
fail: error => {
my.alert({ content: '读取失败' + JSON.stringify(error) });
},
});
},
});
},
writeBLECharacteristicValue() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.writeBLECharacteristicValue({
deviceId: this.data.devid,
serviceId: this.data.serid,
characteristicId: this.data.charid,
//安卓写入服务
//serviceId:'0000180d-0000-1000-8000-00805f9b34fb',
//characteristicId:'00002a39-0000-1000-8000-00805f9b34fb',
value: 'ABCD',
success: res => {
my.alert({ content: '写入数据成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
});
},
notifyBLECharacteristicValueChange() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.notifyBLECharacteristicValueChange({
state: true,
deviceId: this.data.devid,
serviceId: this.data.serid,
characteristicId: this.data.notifyId,
success: () => {
//监听特征值变化的事件
my.onBLECharacteristicValueChange({
success: res => {
// my.alert({content: '特征值变化:'+JSON.stringify(res)});
my.alert({ content: '得到响应数据 = ' + res.value });
},
});
my.alert({ content: '监听成功' });
},
fail: error => {
my.alert({ content: '监听失败' + JSON.stringify(error) });
},
});
},
});
},
offBLECharacteristicValueChange() {
my.offBLECharacteristicValueChange();
},
//其他事件
bluetoothAdapterStateChange() {
my.onBluetoothAdapterStateChange(this.getBind('onBluetoothAdapterStateChange'));
},
onBluetoothAdapterStateChange() {
if (res.error) {
my.alert({ content: JSON.stringify(error) });
} else {
my.alert({ content: '本机蓝牙状态变化:' + JSON.stringify(res) });
}
},
offBluetoothAdapterStateChange() {
my.offBluetoothAdapterStateChange(this.getBind('onBluetoothAdapterStateChange'));
},
getBind(name) {
if (!this[`bind${name}`]) {
this[`bind${name}`] = this[name].bind(this);
}
return this[`bind${name}`];
},
BLEConnectionStateChanged() {
my.onBLEConnectionStateChanged(this.getBind('onBLEConnectionStateChanged'));
},
onBLEConnectionStateChanged(res) {
if (res.error) {
my.alert({ content: JSON.stringify(error) });
} else {
my.alert({ content: '连接状态变化:' + JSON.stringify(res) });
}
},
offBLEConnectionStateChanged() {
my.offBLEConnectionStateChanged(this.getBind('onBLEConnectionStateChanged'));
},
onUnload() {
this.offBLEConnectionStateChanged();
this.offBLECharacteristicValueChange();
this.offBluetoothAdapterStateChange();
this.closeBluetoothAdapter();
},
});
Bug & Tip
Tip:为防止多次注册事件监听导致一次事件多次回调,建议每次调用
on
方法监听事件之前,先调用off
方法,关闭之前的事件监听。
my.offBLEConnectionStateChanged
移除低功耗蓝牙连接状态变化事件的监听。
代码示例
my.offBLEConnectionStateChanged();
是否需要传 callback 值
不传递 callback 值,则会移除监听所有的事件监听回调。示例代码如下:
my.offBLEConnectionStateChanged();
传递 callback 值,只移除对应的 callback 事件。示例代码如下:
my.offBLEConnectionStateChanged(this.callback);
Bug & Tip
Tip:为防止多次注册事件监听导致一次事件多次回调,建议每次调用
on
方法监听事件之前,先调用off
方法,关闭之前的事件监听。
my.onBluetoothAdapterStateChange(callback)
监听本机蓝牙状态变化的事件。
入参
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
callback | Function | 是 | 事件回调函数 |
callback 返回值
名称 | 类型 | 描述 |
---|---|---|
available | Boolean | 蓝牙模块是否可用 |
discovering | Boolean | 蓝牙模块是否处于搜索状态 |
代码示例
/* .acss */
.help-info {
padding:10px;
color:#000000;
}
.help-title {
padding:10px;
color:#FC0D1B;
}
// .json
{
"defaultTitle": "Bluetooth"
}
<!-- .axml-->
<view class="page">
<view class="page-description">蓝牙 API</view>
<view class="page-section">
<view class="page-section-title">本机蓝牙开关状态</view>
<view class="page-section-demo">
<button type="primary" onTap="openBluetoothAdapter">初始化蓝牙</button>
<button type="primary" onTap="closeBluetoothAdapter">关闭本机蓝牙</button>
<button type="primary" onTap="getBluetoothAdapterState">获取蓝牙状态</button>
</view>
<view class="page-section-title">扫描蓝牙设备</view>
<view class="page-section-demo">
<button type="primary" onTap="startBluetoothDevicesDiscovery">开始搜索</button>
<button type="primary" onTap="getBluetoothDevices">所有搜索到的设备</button>
<button type="primary" onTap="getConnectedBluetoothDevices">所有已连接的设备</button>
<button type="primary" onTap="stopBluetoothDevicesDiscovery">停止搜索</button>
</view>
<view class="page-section-title">连接设备</view>
<view class="page-section-demo">
<input class="input" onInput="bindKeyInput" type="{{text}}" placeholder="输入要连接的设备的deviceId"></input>
<button type="primary" onTap="connectBLEDevice">连接设备</button>
<button type="primary" onTap="getBLEDeviceServices">获取设备服务</button>
<button type="primary" onTap="getBLEDeviceCharacteristics">获取读写特征</button>
<button type="primary" onTap="disconnectBLEDevice">断开设备连接</button>
</view>
<view class="page-section-title">读写数据</view>
<view class="page-section-demo">
<button type="primary" onTap="notifyBLECharacteristicValueChange">监听特征值数据变化</button>
<button type="primary" onTap="readBLECharacteristicValue">读取数据</button>
<button type="primary" onTap="writeBLECharacteristicValue">写入数据</button>
<button type="primary" onTap="offBLECharacteristicValueChange">取消特征值监听</button>
</view>
<view class="page-section-title">其他事件</view>
<view class="page-section-demo">
<button type="primary" onTap="bluetoothAdapterStateChange">本机蓝牙状态变化</button>
<button type="primary" onTap="offBluetoothAdapterStateChange">取消本机蓝牙状态监听</button>
<button type="primary" onTap="BLEConnectionStateChanged">蓝牙连接状态变化</button>
<button type="primary" onTap="offBLEConnectionStateChanged">取消蓝牙连接状态监听</button>
</view>
</view>
</view>
// .js
Page({
data: {
devid: '0D9C82AD-1CC0-414D-9526-119E08D28124',
serid: 'FEE7',
notifyId: '36F6',
writeId: '36F5',
charid: '',
alldev: [{ deviceId: '' }],
},
//获取本机蓝牙开关状态
openBluetoothAdapter() {
my.openBluetoothAdapter({
success: res => {
if (!res.isSupportBLE) {
my.alert({ content: '抱歉,您的手机蓝牙暂不可用' });
return;
}
my.alert({ content: '初始化成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
closeBluetoothAdapter() {
my.closeBluetoothAdapter({
success: () => {
my.alert({ content: '关闭蓝牙成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
getBluetoothAdapterState() {
my.getBluetoothAdapterState({
success: res => {
if (!res.available) {
my.alert({ content: '抱歉,您的手机蓝牙暂不可用' });
return;
}
my.alert({ content: JSON.stringify(res) });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//扫描蓝牙设备
startBluetoothDevicesDiscovery() {
my.startBluetoothDevicesDiscovery({
allowDuplicatesKey: false,
success: () => {
my.onBluetoothDeviceFound({
success: res => {
// my.alert({content:'监听新设备'+JSON.stringify(res)});
var deviceArray = res.devices;
for (var i = deviceArray.length - 1; i >= 0; i--) {
var deviceObj = deviceArray[i];
//通过设备名称或者广播数据匹配目标设备,然后记录deviceID后面使用
if (deviceObj.name == this.data.name) {
my.alert({ content: '目标设备被找到' });
my.offBluetoothDeviceFound();
this.setData({
deviceId: deviceObj.deviceId,
});
break;
}
}
},
fail: error => {
my.alert({ content: '监听新设备失败' + JSON.stringify(error) });
},
});
},
fail: error => {
my.alert({ content: '启动扫描失败' + JSON.stringify(error) });
},
});
},
//停止扫描
stopBluetoothDevicesDiscovery() {
my.stopBluetoothDevicesDiscovery({
success: res => {
my.offBluetoothDeviceFound();
my.alert({ content: '操作成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//获取正在连接中的设备
getConnectedBluetoothDevices() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有在连接中的设备!' });
return;
}
my.alert({ content: JSON.stringify(res) });
devid = res.devices[0].deviceId;
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//获取所有搜索到的设备
getBluetoothDevices() {
my.getBluetoothDevices({
success: res => {
my.alert({ content: JSON.stringify(res) });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
bindKeyInput(e) {
this.setData({
devid: e.detail.value,
});
},
//连接设备
connectBLEDevice() {
my.connectBLEDevice({
deviceId: this.data.devid,
success: res => {
my.alert({ content: '连接成功' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//断开连接
disconnectBLEDevice() {
my.disconnectBLEDevice({
deviceId: this.data.devid,
success: () => {
my.alert({ content: '断开连接成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
//获取连接设备的server,必须要再连接状态之下才能获取
getBLEDeviceServices() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
my.getBLEDeviceServices({
deviceId: this.data.devid,
success: res => {
my.alert({ content: JSON.stringify(res) });
this.setData({
serid: res.services[0].serviceId,
});
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
});
},
//获取连接设备的charid,必须要再连接状态之下才能获取(这里分别筛选出读写特征字)
getBLEDeviceCharacteristics() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.getBLEDeviceCharacteristics({
deviceId: this.data.devid,
serviceId: this.data.serid,
success: res => {
my.alert({ content: JSON.stringify(res) });
//特征字对象属性见文档,根据属性匹配读写特征字并记录,然后后面读写使用
this.setData({
charid: res.characteristics[0].characteristicId,
});
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
});
},
//读写数据
readBLECharacteristicValue() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.readBLECharacteristicValue({
deviceId: this.data.devid,
serviceId: this.data.serid,
characteristicId: this.data.notifyId,
//1、安卓读取服务
// serviceId:'0000180d-0000-1000-8000-00805f9b34fb',
// characteristicId:'00002a38-0000-1000-8000-00805f9b34fb',
success: res => {
my.alert({ content: JSON.stringify(res) });
},
fail: error => {
my.alert({ content: '读取失败' + JSON.stringify(error) });
},
});
},
});
},
writeBLECharacteristicValue() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.writeBLECharacteristicValue({
deviceId: this.data.devid,
serviceId: this.data.serid,
characteristicId: this.data.charid,
//安卓写入服务
//serviceId:'0000180d-0000-1000-8000-00805f9b34fb',
//characteristicId:'00002a39-0000-1000-8000-00805f9b34fb',
value: 'ABCD',
success: res => {
my.alert({ content: '写入数据成功!' });
},
fail: error => {
my.alert({ content: JSON.stringify(error) });
},
});
},
});
},
notifyBLECharacteristicValueChange() {
my.getConnectedBluetoothDevices({
success: res => {
if (res.devices.length === 0) {
my.alert({ content: '没有已连接的设备' });
return;
}
this.setData({
devid: res.devices[0].deviceId,
});
my.notifyBLECharacteristicValueChange({
state: true,
deviceId: this.data.devid,
serviceId: this.data.serid,
characteristicId: this.data.notifyId,
success: () => {
//监听特征值变化的事件
my.onBLECharacteristicValueChange({
success: res => {
// my.alert({content: '特征值变化:'+JSON.stringify(res)});
my.alert({ content: '得到响应数据 = ' + res.value });
},
});
my.alert({ content: '监听成功' });
},
fail: error => {
my.alert({ content: '监听失败' + JSON.stringify(error) });
},
});
},
});
},
offBLECharacteristicValueChange() {
my.offBLECharacteristicValueChange();
},
//其他事件
bluetoothAdapterStateChange() {
my.onBluetoothAdapterStateChange(this.getBind('onBluetoothAdapterStateChange'));
},
onBluetoothAdapterStateChange() {
if (res.error) {
my.alert({ content: JSON.stringify(error) });
} else {
my.alert({ content: '本机蓝牙状态变化:' + JSON.stringify(res) });
}
},
offBluetoothAdapterStateChange() {
my.offBluetoothAdapterStateChange(this.getBind('onBluetoothAdapterStateChange'));
},
getBind(name) {
if (!this[`bind${name}`]) {
this[`bind${name}`] = this[name].bind(this);
}
return this[`bind${name}`];
},
BLEConnectionStateChanged() {
my.onBLEConnectionStateChanged(this.getBind('onBLEConnectionStateChanged'));
},
onBLEConnectionStateChanged(res) {
if (res.error) {
my.alert({ content: JSON.stringify(error) });
} else {
my.alert({ content: '连接状态变化:' + JSON.stringify(res) });
}
},
offBLEConnectionStateChanged() {
my.offBLEConnectionStateChanged(this.getBind('onBLEConnectionStateChanged'));
},
onUnload() {
this.offBLEConnectionStateChanged();
this.offBLECharacteristicValueChange();
this.offBluetoothAdapterStateChange();
this.closeBluetoothAdapter();
},
});
my.offBluetoothAdapterStateChange
移除本机蓝牙状态变化的事件的监听
代码示例
my.offBluetoothAdapterStateChange();
是否需要传 callback 值
不传递 callback 值,则会移除监听所有的事件监听回调。示例代码如下:
my.offBluetoothAdapterStateChange();
传递 callback 值,只移除对应的 callback 事件。示例代码如下:
my.offBluetoothAdapterStateChange(this.callback);
Bug & Tip
Tip:为防止多次注册事件监听导致一次事件多次回调,建议每次调用
on
方法监听事件之前,先调用off
方法,关闭之前的事件监听。