提交 8ee0d17c 编写于 作者: Q qiang

fix: 修复蓝牙接口可以添加多次事件监听的问题 fixed #1988 #1964 #958

上级 9bd582ce
import {
invoke
} from 'uni-core/service/bridge'
import {
onMethod
} from '../../platform'
function on (method) {
const callbacks = []
onMethod(method, data => {
callbacks.forEach(callbackId => {
invoke(callbackId, data)
})
})
return function (callbackId) {
callbacks.push(callbackId)
}
}
export const onBluetoothDeviceFound = on('onBluetoothDeviceFound')
export const onBluetoothAdapterStateChange = on('onBluetoothAdapterStateChange')
export const onBLEConnectionStateChange = on('onBLEConnectionStateChange')
export const onBLECharacteristicValueChange = on('onBLECharacteristicValueChange')
import { import {
invoke, warpPlusEvent,
publish warpPlusMethod
} from '../../bridge' } from '../util'
/** export const onBluetoothDeviceFound = warpPlusEvent(plus.bluetooth, 'onBluetoothDeviceFound')
* 执行蓝牙相关方法 export const onBluetoothAdapterStateChange = warpPlusEvent(plus.bluetooth, 'onBluetoothAdapterStateChange')
*/ export const onBLEConnectionStateChange = warpPlusEvent(plus.bluetooth, 'onBLEConnectionStateChange')
function bluetoothExec (method, callbackId, data = {}, beforeSuccess) { export const onBLECharacteristicValueChange = warpPlusEvent(plus.bluetooth, 'onBLECharacteristicValueChange')
var deviceId = data.deviceId
function toUpperCase (options = {}) {
const deviceId = options.deviceId
if (deviceId) { if (deviceId) {
data.deviceId = deviceId.toUpperCase() options.deviceId = deviceId.toUpperCase()
} }
var serviceId = data.serviceId const serviceId = options.serviceId
if (serviceId) { if (serviceId) {
data.serviceId = serviceId.toUpperCase() options.serviceId = serviceId.toUpperCase()
} }
return options
plus.bluetooth[method.replace('Changed', 'Change')](Object.assign(data, { }
success (data) {
if (typeof beforeSuccess === 'function') { export const openBluetoothAdapter = warpPlusMethod(plus.bluetooth, 'openBluetoothAdapter')
beforeSuccess(data) export const closeBluetoothAdapter = warpPlusMethod(plus.bluetooth, 'closeBluetoothAdapter')
} export const getBluetoothAdapterState = warpPlusMethod(plus.bluetooth, 'getBluetoothAdapterState')
invoke(callbackId, Object.assign({}, data, { export const startBluetoothDevicesDiscovery = warpPlusMethod(plus.bluetooth, 'startBluetoothDevicesDiscovery', toUpperCase)
errMsg: `${method}:ok`, export const stopBluetoothDevicesDiscovery = warpPlusMethod(plus.bluetooth, 'stopBluetoothDevicesDiscovery')
code: undefined, export const getBluetoothDevices = warpPlusMethod(plus.bluetooth, 'getBluetoothDevices')
message: undefined export const getConnectedBluetoothDevices = warpPlusMethod(plus.bluetooth, 'getConnectedBluetoothDevices', toUpperCase)
})) export const createBLEConnection = warpPlusMethod(plus.bluetooth, 'createBLEConnection', toUpperCase)
}, export const closeBLEConnection = warpPlusMethod(plus.bluetooth, 'closeBLEConnection', toUpperCase)
fail (error = {}) { export const getBLEDeviceServices = warpPlusMethod(plus.bluetooth, 'getBLEDeviceServices', toUpperCase)
invoke(callbackId, { export const getBLEDeviceCharacteristics = warpPlusMethod(plus.bluetooth, 'getBLEDeviceCharacteristics', toUpperCase)
errMsg: `${method}:fail ${error.message || ''}`, export const notifyBLECharacteristicValueChange = warpPlusMethod(plus.bluetooth, 'notifyBLECharacteristicValueChange', toUpperCase)
errCode: error.code || 0 export const readBLECharacteristicValue = warpPlusMethod(plus.bluetooth, 'readBLECharacteristicValue', toUpperCase)
}) export const writeBLECharacteristicValue = warpPlusMethod(plus.bluetooth, 'writeBLECharacteristicValue', toUpperCase)
} export const setBLEMTU = warpPlusMethod(plus.bluetooth, 'setBLEMTU', toUpperCase)
})) export const getBLEDeviceRSSI = warpPlusMethod(plus.bluetooth, 'getBLEDeviceRSSI', toUpperCase)
}
/**
* 监听蓝牙相关事件
*/
function bluetoothOn (method, beforeSuccess) {
plus.bluetooth[method.replace('Changed', 'Change')](function (data) {
if (typeof beforeSuccess === 'function') {
beforeSuccess(data)
}
publish(method, Object.assign({}, data, {
code: undefined,
message: undefined
}))
})
return true
}
var onBluetoothAdapterStateChange
var onBluetoothDeviceFound
var onBLEConnectionStateChange
var onBLECharacteristicValueChange
export function openBluetoothAdapter (data, callbackId) {
onBluetoothAdapterStateChange = onBluetoothAdapterStateChange || bluetoothOn('onBluetoothAdapterStateChange')
bluetoothExec('openBluetoothAdapter', callbackId)
}
export function closeBluetoothAdapter (data, callbackId) {
bluetoothExec('closeBluetoothAdapter', callbackId)
}
export function getBluetoothAdapterState (data, callbackId) {
bluetoothExec('getBluetoothAdapterState', callbackId)
}
export function startBluetoothDevicesDiscovery (data, callbackId) {
onBluetoothDeviceFound = onBluetoothDeviceFound || bluetoothOn('onBluetoothDeviceFound')
bluetoothExec('startBluetoothDevicesDiscovery', callbackId, data)
}
export function stopBluetoothDevicesDiscovery (data, callbackId) {
bluetoothExec('stopBluetoothDevicesDiscovery', callbackId)
}
export function getBluetoothDevices (data, callbackId) {
bluetoothExec('getBluetoothDevices', callbackId, {})
}
export function getConnectedBluetoothDevices (data, callbackId) {
bluetoothExec('getConnectedBluetoothDevices', callbackId, data)
}
export function createBLEConnection (data, callbackId) {
onBLEConnectionStateChange = onBLEConnectionStateChange || bluetoothOn('onBLEConnectionStateChange')
bluetoothExec('createBLEConnection', callbackId, data)
}
export function closeBLEConnection (data, callbackId) {
bluetoothExec('closeBLEConnection', callbackId, data)
}
export function getBLEDeviceServices (data, callbackId) {
bluetoothExec('getBLEDeviceServices', callbackId, data)
}
export function getBLEDeviceCharacteristics (data, callbackId) {
bluetoothExec('getBLEDeviceCharacteristics', callbackId, data)
}
export function notifyBLECharacteristicValueChange (data, callbackId) {
onBLECharacteristicValueChange = onBLECharacteristicValueChange || bluetoothOn('onBLECharacteristicValueChange')
bluetoothExec('notifyBLECharacteristicValueChange', callbackId, data)
}
export function notifyBLECharacteristicValueChanged (data, callbackId) {
onBLECharacteristicValueChange = onBLECharacteristicValueChange || bluetoothOn('onBLECharacteristicValueChange')
bluetoothExec('notifyBLECharacteristicValueChanged', callbackId, data)
}
export function readBLECharacteristicValue (data, callbackId) {
onBLECharacteristicValueChange = onBLECharacteristicValueChange || bluetoothOn('onBLECharacteristicValueChange')
bluetoothExec('readBLECharacteristicValue', callbackId, data)
}
export function writeBLECharacteristicValue (data, callbackId) {
bluetoothExec('writeBLECharacteristicValue', callbackId, data)
}
export function setBLEMTU (data, callbackId) {
bluetoothExec('setBLEMTU', callbackId, data)
}
export function getBLEDeviceRSSI (data, callbackId) {
bluetoothExec('getBLEDeviceRSSI', callbackId, data)
}
import { import {
invoke warpPlusEvent,
} from '../../bridge' warpPlusMethod
} from '../util'
export function onBeaconUpdate (callbackId) { export const onBeaconUpdate = warpPlusEvent(plus.ibeacon, 'onBeaconUpdate')
plus.ibeacon.onBeaconUpdate(data => invoke(callbackId, data)) export const onBeaconServiceChange = warpPlusEvent(plus.ibeacon, 'onBeaconServiceChange')
}
export function onBeaconServiceChange (callbackId) { export const getBeacons = warpPlusMethod(plus.ibeacon, 'getBeacons')
plus.ibeacon.onBeaconServiceChange(data => invoke(callbackId, data)) export const startBeaconDiscovery = warpPlusMethod(plus.ibeacon, 'startBeaconDiscovery')
} export const stopBeaconDiscovery = warpPlusMethod(plus.ibeacon, 'stopBeaconDiscovery')
export const onBeaconServiceChanged = onBeaconServiceChange
export function getBeacons (params, callbackId) {
plus.ibeacon.getBeacons({
success: (result) => {
invoke(callbackId, {
errMsg: 'getBeacons:ok',
beacons: result.beacons
})
},
fail: (error) => {
invoke(callbackId, {
errMsg: 'getBeacons:fail:' + error.message
})
}
})
}
export function startBeaconDiscovery ({
uuids,
ignoreBluetoothAvailable = false
}, callbackId) {
plus.ibeacon.startBeaconDiscovery({
uuids,
ignoreBluetoothAvailable,
success: (result) => {
invoke(callbackId, {
errMsg: 'startBeaconDiscovery:ok',
beacons: result.beacons
})
},
fail: (error) => {
invoke(callbackId, {
errMsg: 'startBeaconDiscovery:fail:' + error.message
})
}
})
}
export function stopBeaconDiscovery (params, callbackId) {
plus.ibeacon.stopBeaconDiscovery({
success: (result) => {
invoke(callbackId, Object.assign(result, {
errMsg: 'stopBeaconDiscovery:ok'
}))
},
fail: (error) => {
invoke(callbackId, {
errMsg: 'stopBeaconDiscovery:fail:' + error.message
})
}
})
}
import {
invoke
} from '../bridge'
export { export {
isTabBarPage isTabBarPage
} from '../bridge' } from '../bridge'
...@@ -162,3 +166,38 @@ export function getScreenInfo () { ...@@ -162,3 +166,38 @@ export function getScreenInfo () {
screenHeight: Math.round(resolutionHeight) screenHeight: Math.round(resolutionHeight)
} }
} }
export function warpPlusEvent (origin, name) {
return function (callbackId) {
origin[name](function (data) {
if (data) {
delete data.code
delete data.message
}
invoke(callbackId, data)
})
}
}
export function warpPlusMethod (origin, name, before) {
return function (options, callbackId) {
if (typeof before === 'function') {
options = before(options)
}
origin[name](Object.assign(options, {
success (data = {}) {
delete data.code
delete data.message
invoke(callbackId, Object.assign({}, data, {
errMsg: `${name}:ok`
}))
},
fail (error = {}) {
invoke(callbackId, {
errMsg: `${name}:fail ${error.message || ''}`,
errCode: error.code || 0
})
}
}))
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册