var serviceId = "14839AC4-7D7E-415C-9A42-167340CF2339" //设备主服务ID
var notifyID = "0734594A-A8E7-4B1A-A6B1-CD5243059A57" //监听数据变化ID
var writeID = "8B00ACE7-EB0B-49B0-BBE9-9AEE0A26E1A3" //写入蓝牙数据特征值ID
var url = getPort(); //数据接口地址
var devicesIds = []; //连接的设备号
var available = null; //蓝牙开关
var app_session = localStorage.getItem("app_session"); //app_session
let bluetooths = []
let deviceIdList = []
var availables = []; //可用设备
localStorage.removeItem("bluetooths");
// 页面初始化操作
document.addEventListener('plusready', function(e) {
openBluetoothAdapter();
listenerConnection()
// 监听蓝牙适配器状态变化
plus.bluetooth.onBluetoothAdapterStateChange(function(e) {
available = e.available
setTimeout(function() {
if (!e.available) {
stopBluetoothDiscovery()
// mui.alert("您的手机蓝牙未开启,请打开蓝牙后在进行操作", "温馨提示", function() {})
}
}, 600)
if (available && !e.discovering) {
location.reload()
}
});
// 监听搜索到新设备
plus.bluetooth.onBluetoothDeviceFound(function(e) {
var devices = e.devices[0];
var list = []
if (devices.advertisServiceUUIDs[0] === "00001802-0000-1000-8000-00805F9B34FB" && devices.advertisServiceUUIDs[0]) {
if (devices) {
if(bluetooths.length==0){
bluetooths.push({
bluetooth_name: devices.name,
deviceId: devices.deviceId
})
}else{
var list = bluetooths.every(i=>{return i.bluetooth_name!=devices.name})
if(list){
bluetooths.push({
bluetooth_name: devices.name,
deviceId: devices.deviceId
})
}
}
}
}
console.log(JSON.stringify(bluetooths))
if(bluetooths.length!=0){
localStorage.setItem("bluetooths", JSON.stringify(bluetooths))
}
if (availables.indexOf(devices.name) != -1) {
devicesIds.push(devices.deviceId)
}
});
//监听数据蓝牙数据变化
onBLECharacteristicValueChange()
}, false);
//初始化蓝牙模块
function openBluetoothAdapter() {
plus.bluetooth.openBluetoothAdapter({
success: function(e) {
startBluetoothDiscovery()
console.log("初始化蓝牙设备成功")
},
fail: function(e) {
mui.alert("您的手机蓝牙未开启,请打开蓝牙后在进行操作", "温馨提示", function() {})
}
});
}
// 开始搜索蓝牙
function startBluetoothDiscovery() {
plus.bluetooth.startBluetoothDevicesDiscovery({
services: ["00001802-0000-1000-8000-00805F9B34FB"],
allowDuplicatesKey: false,
success: function(e) {
console.log("开始搜索蓝牙设备")
},
fail: function(e) {}
});
}
//连接蓝牙
async function createConnection(deviceId) {
return new Promise(function(resolve, reject) {
plus.bluetooth.createBLEConnection({
deviceId: deviceId,
timeout: 2000,
success: function(e) {
resolve(e)
deviceIdList.push(deviceId)
// writeBLECharacteristicValue(deviceId)
str2ArrayBuffer("%SYNC=1,0", function(buffer) {
setTimeout(function() {
writeBLECharacteristicValue(deviceId, buffer).then(res => {
notifyBLECharacteristicValueChange(deviceId)
}).catch(err => {
})
}, 1000)
});
},
fail: function(e) {
reject(e)
}
});
})
}
//断开连接的蓝牙
async function closeConnection(deviceId) {
return new Promise(function(resolve, reject) {
plus.bluetooth.closeBLEConnection({
deviceId: deviceId,
success: function(e) {
resolve(e)
},
fail: function(e) {
reject(e)
}
});
})
}
let deviceIndex = 0
// 监听低功耗蓝牙设备的特征值变化
function onBLECharacteristicValueChange() {
plus.bluetooth.onBLECharacteristicValueChange(function(e) {
var value = buf2hex(e.value);
let device = bluetooths.find(item => {
return item.deviceId === e.deviceId
})
let bluetooth_name = device.bluetooth_name;
if (value.length == 20) {
var week = []; //一周的数据
for (let i = 1; i < 5; i++) {
week.push({
day: parseInt(value[2], 16),
time: parseInt(value[(i * 4)], 16),
steps: parseInt(value[(i * 4 + 3)], 16) + parseInt(value[(i * 4 + 2)], 16) * 250
})
}
mui.ajax({
url: url + "/api/index/getMovementList",
type: "POST",
data: {
bluetooth_name: bluetooth_name,
movement: week,
},
success: function(json) {
week = [];
console.log(bluetooth_name + ":" + value)
},
})
} else if (value.length == 6) {
mui.ajax({
url: url + "/api/index/getMovement",
type: "POST",
data: {
bluetooth_name: device.bluetooth_name,
number: parseInt(value[5], 16) + parseInt(value[4], 16) * 250,
hours: parseInt(value[2], 16)
},
success: function(data) {
console.log(JSON.stringify(data))
}
})
}
});
}
// 启用notify功能
async function notifyBLECharacteristicValueChange(deviceId) {
return new Promise(function(resolve, reject) {
plus.bluetooth.notifyBLECharacteristicValueChange({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: notifyID,
state: true,
success: function(e) {
resolve(e)
},
fail: function(e) {
reject(e)
}
});
})
}
//写入数据
async function writeBLECharacteristicValue(deviceId, buffer) {
return new Promise(function(resolve, reject) {
plus.bluetooth.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: writeID,
value: buffer,
success: function(e) {
resolve(e)
// notifyBLECharacteristicValueChange(deviceId)
},
fail: function(e) {
reject(e)
// writeBLECharacteristicValue(deviceId)
}
});
})
}
// 结束搜索蓝牙
function stopBluetoothDiscovery() {
plus.bluetooth.stopBluetoothDevicesDiscovery({
success: function(e) {
plus.bluetooth.closeBluetoothAdapter({
success: function(e) {},
fail: function(e) {}
});
},
fail: function(e) {}
});
}
// 转换为ArrayBuffer写入蓝牙
function str2ArrayBuffer(s, f) {
var b = new Blob([s], {
type: 'text/plain'
});
var r = new FileReader();
r.readAsArrayBuffer(b);
r.onload = function() {
if (f) f.call(null, r.result)
}
}
//转化为十六进制
function buf2hex(buffer) {
return Array.prototype.map.call(
new Uint8Array(buffer),
x => {
return ('00' + x.toString(16)).slice(-2)
});
}
var statusWrite = true;
// 监听蓝牙设备连接状态
function listenerConnection() {
plus.bluetooth.onBLEConnectionStateChange(function(e) {
let device = bluetooths.find(item => {
return item.deviceId === e.deviceId
})
if (!e.connected && !state) {
devicesIds.push(device.deviceId)
$("#" + device.bluetooth_name).removeClass("mui-active")
}
});
}
setInterval(function() {
devicesIds = [...new Set(devicesIds)]
if (devicesIds.length > 0) {
againCreateConnection()
}
}, 3000)
//自动连接
function againCreateConnection() {
let device = bluetooths.find(item => {
return item.deviceId === devicesIds[0]
})
createConnection(device.deviceId).then(res => {
$("#" + device.bluetooth_name).addClass("mui-active")
let index = devicesIds.indexOf(device.deviceId)
devicesIds.splice(index, 1)
}).catch(err => {
return false
})
}
i***@outlook.com
- 发布:2020-07-17 16:53
- 更新:2020-07-17 16:53
- 阅读:969
0 个回复