diff --git a/src/core/service/api/device/bluetooth.js b/src/core/service/api/device/bluetooth.js new file mode 100644 index 0000000000000000000000000000000000000000..bda7eae6cccb08f423630da3095d92d2f9229652 --- /dev/null +++ b/src/core/service/api/device/bluetooth.js @@ -0,0 +1,24 @@ +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') diff --git a/src/core/service/api/device/compass.js b/src/core/service/api/device/compass.js new file mode 100644 index 0000000000000000000000000000000000000000..4c9aa58360f7f03a6a5fa68061819dbba81e849d --- /dev/null +++ b/src/core/service/api/device/compass.js @@ -0,0 +1,48 @@ +import { + invoke +} from 'uni-core/service/bridge' + +import { + onMethod, + invokeMethod +} from '../../platform' + +const callbacks = [] + +onMethod('onCompassChange', function (res) { + callbacks.forEach(callbackId => { + invoke(callbackId, res) + }) +}) + +let isEnable = false +/** + * 监听加速度 + * @param {*} callbackId + */ +export function onCompassChange (callbackId) { + // TODO 当没有 start 时,添加 on 需要主动 start? + callbacks.push(callbackId) + if (!isEnable) { + startCompass() + } +} + +export function startCompass ({ + interval // TODO +} = {}) { + if (isEnable) { + return + } + isEnable = true + return invokeMethod('enableCompass', { + enable: true + }) +} + +export function stopCompass () { + isEnable = false + return invokeMethod('enableCompass', { + enable: false + }) +} diff --git a/src/core/service/api/network/download-file.js b/src/core/service/api/network/download-file.js new file mode 100644 index 0000000000000000000000000000000000000000..05388832cf6ebce580a636b8689376ed28770f0e --- /dev/null +++ b/src/core/service/api/network/download-file.js @@ -0,0 +1,92 @@ +import { + invoke +} from 'uni-core/service/bridge' + +import { + onMethod, + invokeMethod +} from '../../platform' + +class DownloadTask { + constructor (downloadTaskId, callbackId) { + this.id = downloadTaskId + this._callbackId = callbackId + this._callbacks = [] + } + abort () { + invokeMethod('operateRequestTask', { + downloadTaskId: this.id, + operationType: 'abort' + }) + } + onProgressUpdate (callback) { + if (typeof callback !== 'function') { + return + } + this._callbacks.push(callback) + } + onHeadersReceived () { + + } + offProgressUpdate (callback) { + const index = this._callbacks.indexOf(callback) + if (index >= 0) { + this._callbacks.splice(index, 1) + } + } + offHeadersReceived () { + + } +} +const downloadTasks = Object.create(null) +onMethod('onDownloadTaskStateChange', ({ + downloadTaskId, + state, + tempFilePath, + statusCode, + progress, + totalBytesWritten, + totalBytesExpectedToWrite, + errMsg +}) => { + const downloadTask = downloadTasks[downloadTaskId] + const callbackId = downloadTask._callbackId + + switch (state) { + case 'progressUpdate': + downloadTask._callbacks.forEach(callback => { + callback({ + progress, + totalBytesWritten, + totalBytesExpectedToWrite + }) + }) + break + case 'success': + invoke(callbackId, { + tempFilePath, + statusCode, + errMsg: 'request:ok' + }) + // eslint-disable-next-line no-fallthrough + case 'fail': + invoke(callbackId, { + errMsg: 'request:fail ' + errMsg + }) + // eslint-disable-next-line no-fallthrough + default: + // progressUpdate 可能晚于 success + setTimeout(() => { + delete downloadTasks[downloadTaskId] + }, 100) + break + } +}) +export function downloadFile (args, callbackId) { + const { + downloadTaskId + } = invokeMethod('createDownloadTask', args) + const task = new DownloadTask(downloadTaskId, callbackId) + downloadTasks[downloadTaskId] = task + return task +} diff --git a/src/core/service/api/network/socket.js b/src/core/service/api/network/socket.js new file mode 100644 index 0000000000000000000000000000000000000000..eece053fc92814e760bd02d534e177f6d093391e --- /dev/null +++ b/src/core/service/api/network/socket.js @@ -0,0 +1,178 @@ +import { + invoke +} from 'uni-core/service/bridge' + +import { + onMethod, + invokeMethod +} from '../../platform' + +class SocketTask { + constructor (socketTaskId) { + this.id = socketTaskId + this._callbacks = { + open: [], + close: [], + error: [], + message: [] + } + this.CLOSED = 3 + this.CLOSING = 2 + this.CONNECTING = 0 + this.OPEN = 1 + this.readyState = this.CLOSED + } + send (args) { + if (this.readyState !== this.OPEN) { + this._callback(args, 'sendSocketMessage:fail WebSocket is not connected') + } + const { + errMsg + } = invokeMethod('operateSocketTask', Object.assign({}, args, { + operationType: 'send', + socketTaskId: this.id + })) + this._callback(args, errMsg.replace('operateSocketTask', 'sendSocketMessage')) + } + close (args) { + this.readyState = this.CLOSING + const { + errMsg + } = invokeMethod('operateSocketTask', Object.assign({}, args, { + operationType: 'close', + socketTaskId: this.id + })) + this._callback(args, errMsg.replace('operateSocketTask', 'closeSocket')) + } + onOpen (callback) { + this._callbacks.open.push(callback) + } + onClose (callback) { + this._callbacks.close.push(callback) + } + onError (callback) { + this._callbacks.error.push(callback) + } + onMessage (callback) { + this._callbacks.message.push(callback) + } + _callback ({ + success, + fail, + complete + }, errMsg) { + var data = { + errMsg + } + if (/:ok$/.test(errMsg)) { + if (typeof success === 'function') { + success(data) + } + } else { + if (typeof fail === 'function') { + fail(data) + } + } + if (typeof complete === 'function') { + complete(data) + } + } +} + +const socketTasks = Object.create(null) +const socketTasksArray = [] +const callbacks = Object.create(null) +onMethod('onSocketTaskStateChange', ({ + socketTaskId, + state, + data, + errMsg +}) => { + const socketTask = socketTasks[socketTaskId] + if (!socketTask) { + return + } + socketTask._callbacks[state].forEach(callback => { + if (typeof callback === 'function') { + callback(state === 'message' ? { + data + } : {}) + } + }) + if (state === 'open') { + socketTask.readyState = socketTask.OPEN + } + if (socketTask === socketTasksArray[0] && callbacks[state]) { + invoke(callbacks[state], state === 'message' ? { + data + } : {}) + } + if (state === 'error' || state === 'close') { + socketTask.readyState = socketTask.CLOSED + delete socketTasks[socketTaskId] + const index = socketTasksArray.indexOf(socketTask) + if (index >= 0) { + socketTasksArray.splice(index, 1) + } + } +}) + +export function connectSocket (args, callbackId) { + const { + socketTaskId + } = invokeMethod('createSocketTask', args) + const task = new SocketTask(socketTaskId) + socketTasks[socketTaskId] = task + socketTasksArray.push(task) + setTimeout(() => { + invoke(callbackId, { + errMsg: 'connectSocket:ok' + }) + }, 0) + return task +} + +export function sendSocketMessage (args, callbackId) { + const socketTask = socketTasksArray[0] + if (!socketTask || socketTask.readyState !== socketTask.OPEN) { + invoke(callbackId, { + errMsg: 'sendSocketMessage:fail WebSocket is not connected' + }) + return + } + return invokeMethod('operateSocketTask', Object.assign({}, args, { + operationType: 'send', + socketTaskId: socketTask.id + })) +} + +export function closeSocket (args, callbackId) { + const socketTask = socketTasksArray[0] + if (!socketTask) { + invoke(callbackId, { + errMsg: 'closeSocket:fail WebSocket is not connected' + }) + return + } + socketTask.readyState = socketTask.CLOSING + return invokeMethod('operateSocketTask', Object.assign({}, args, { + operationType: 'close', + socketTaskId: socketTask.id + })) +} + +export function onSocketOpen (callbackId) { + callbacks.open = callbackId +} + +export function onSocketError (callbackId) { + callbacks.error = callbackId +} + +export function onSocketMessage (callbackId) { + callbacks.message = callbackId +} + +export function onSocketClose (callbackId) { + callbacks.close = callbackId +} diff --git a/src/core/service/bridge.js b/src/core/service/bridge.js index b154cda998d75f5db854b475a184f5c163df35e0..9160f7844d3e6f3d3d018af221912d0759d363ef 100644 --- a/src/core/service/bridge.js +++ b/src/core/service/bridge.js @@ -1,3 +1,7 @@ +export function pack (args) { + return args +} + export function unpack (args) { return args } diff --git a/src/platforms/app-plus/service/api/device/bluetooth.js b/src/platforms/app-plus/service/api/device/bluetooth.js index e7f116a3faf3836e57a11b6360fd56c3d32eeeb4..02f755e5e804e3339b609881b40c351f617fba1b 100644 --- a/src/platforms/app-plus/service/api/device/bluetooth.js +++ b/src/platforms/app-plus/service/api/device/bluetooth.js @@ -1,12 +1,14 @@ import { invoke, - publish + publish, + pack, + unpack } from '../../bridge' /** * 执行蓝牙相关方法 */ -function bluetoothExec (method, callbackId, data = {}, beforeSuccess) { +function bluetoothExec (method, callbackId, data = {}) { var deviceId = data.deviceId if (deviceId) { data.deviceId = deviceId.toUpperCase() @@ -18,10 +20,7 @@ function bluetoothExec (method, callbackId, data = {}, beforeSuccess) { plus.bluetooth[method.replace('Changed', 'Change')](Object.assign(data, { success (data) { - if (typeof beforeSuccess === 'function') { - beforeSuccess(data) - } - invoke(callbackId, Object.assign({}, data, { + invoke(callbackId, Object.assign({}, pack(data), { errMsg: `${method}:ok`, code: undefined, message: undefined @@ -38,12 +37,9 @@ function bluetoothExec (method, callbackId, data = {}, beforeSuccess) { /** * 监听蓝牙相关事件 */ -function bluetoothOn (method, beforeSuccess) { +function bluetoothOn (method) { plus.bluetooth[method.replace('Changed', 'Change')](function (data) { - if (typeof beforeSuccess === 'function') { - beforeSuccess(data) - } - publish(method, Object.assign({}, data, { + publish(method, Object.assign({}, pack(data), { code: undefined, message: undefined })) @@ -51,16 +47,6 @@ function bluetoothOn (method, beforeSuccess) { return true } -function checkDevices (data) { - data.devices = data.devices.map(device => { - var advertisData = device.advertisData - if (advertisData && typeof advertisData !== 'string') { - device.advertisData = wx.arrayBufferToBase64(advertisData) - } - return device - }) -} - var onBluetoothAdapterStateChange var onBluetoothDeviceFound var onBLEConnectionStateChange @@ -81,7 +67,7 @@ export function getBluetoothAdapterState (data, callbackId) { } export function startBluetoothDevicesDiscovery (data, callbackId) { - onBluetoothDeviceFound = onBluetoothDeviceFound || bluetoothOn('onBluetoothDeviceFound', checkDevices) + onBluetoothDeviceFound = onBluetoothDeviceFound || bluetoothOn('onBluetoothDeviceFound') bluetoothExec('startBluetoothDevicesDiscovery', callbackId, data) } @@ -90,7 +76,7 @@ export function stopBluetoothDevicesDiscovery (data, callbackId) { } export function getBluetoothDevices (data, callbackId) { - bluetoothExec('getBluetoothDevices', callbackId, {}, checkDevices) + bluetoothExec('getBluetoothDevices', callbackId, {}) } export function getConnectedBluetoothDevices (data, callbackId) { @@ -116,18 +102,12 @@ export function getBLEDeviceCharacteristics (data, callbackId) { } export function notifyBLECharacteristicValueChange (data, callbackId) { - onBLECharacteristicValueChange = onBLECharacteristicValueChange || bluetoothOn('onBLECharacteristicValueChange', - data => { - data.value = wx.arrayBufferToBase64(data.value) - }) + onBLECharacteristicValueChange = onBLECharacteristicValueChange || bluetoothOn('onBLECharacteristicValueChange') bluetoothExec('notifyBLECharacteristicValueChange', callbackId, data) } export function notifyBLECharacteristicValueChanged (data, callbackId) { - onBLECharacteristicValueChange = onBLECharacteristicValueChange || bluetoothOn('onBLECharacteristicValueChange', - data => { - data.value = wx.arrayBufferToBase64(data.value) - }) + onBLECharacteristicValueChange = onBLECharacteristicValueChange || bluetoothOn('onBLECharacteristicValueChange') bluetoothExec('notifyBLECharacteristicValueChanged', callbackId, data) } @@ -136,6 +116,5 @@ export function readBLECharacteristicValue (data, callbackId) { } export function writeBLECharacteristicValue (data, callbackId) { - data.value = wx.base64ToArrayBuffer(data.value) - bluetoothExec('writeBLECharacteristicValue', callbackId, data) + bluetoothExec('writeBLECharacteristicValue', callbackId, unpack(data)) } diff --git a/src/platforms/app-plus/service/bridge.js b/src/platforms/app-plus/service/bridge.js index c79340c245fe1dcc06c08a8d17d457271be1758e..ae41b48500bad0c192f88e92be4cffd1971d08af 100644 --- a/src/platforms/app-plus/service/bridge.js +++ b/src/platforms/app-plus/service/bridge.js @@ -1,4 +1,5 @@ export { + pack, unpack, invoke } diff --git a/src/platforms/h5/service/api/network/download-file.js b/src/platforms/h5/service/api/network/download-file.js index 8fa33cc3d6ab37ffefdfde051e1e17341121e08d..aeef97f6dccab74d4043ccf9c7305611dd53c44e 100644 --- a/src/platforms/h5/service/api/network/download-file.js +++ b/src/platforms/h5/service/api/network/download-file.js @@ -18,6 +18,12 @@ class DownloadTask { } this._callbacks.push(callback) } + offProgressUpdate (callback) { + const index = this._callbacks.indexOf(callback) + if (index >= 0) { + this._callbacks.splice(index, 1) + } + } /** * 停止任务 */