diff --git a/ebike-maintenance/utils/bluetooth.js b/ebike-maintenance/utils/bluetooth.js
new file mode 100644
index 0000000..552299f
--- /dev/null
+++ b/ebike-maintenance/utils/bluetooth.js
@@ -0,0 +1,360 @@
+import { AES128ECBEncrypt } from '@/utils/aes_util.js';
+
+export default bluetooth = {
+ serviceId: '0000FFF0-0000-1000-8000-00805F9B34FB',
+ characteristicId: '0000FFF6-0000-1000-8000-00805F9B34FB',
+ deviceId: '',
+ blueSignal:'',
+ ecuSn:'',
+ blueState: 0,
+ blueMessage: '',
+ discovery:() => {
+ this.blueState = 0;
+ this.blueMessage = '';
+ uni.startBluetoothDevicesDiscovery({
+ success(res) {
+ if(res.errno == 0){
+ uni.onBluetoothDeviceFound(function (res) {
+ const devices = res.devices;
+ for(let i=0;i < devices.length; i++){
+ if(devices[i].localName == "ECU-" + this.ecuSn){
+ // 停止搜索
+ this.stopdiscovery();
+ this.blueState = 1;
+ this.blueMessage = '连接成功';
+ this.deviceId = devices[i].deviceId;
+ this.blueSignal = devices[i].RSSI;
+ this.bleconnection();
+ break;
+ }
+ }
+ });
+ setTimeout(function () {
+ if(this.blueState == 0) {
+ this.blueMessage = "未发现蓝牙设备";
+ this.blueState = -1;
+ }
+ //停止搜索
+ this.stopdiscovery();
+ }, 120000);
+ }
+ },
+ fail(err) {
+ this.blueMessage = "未发现蓝牙设备";
+ this.blueState = -1;
+ }
+ });
+ },
+ stopdiscovery:() =>{
+ uni.stopBluetoothDevicesDiscovery({
+ success(res) {
+ // if(res.errno != 0) {
+ // this.showmessage("停止蓝牙搜索失败", 'stopdiscovery');
+ // }
+ },
+ fail(){
+ // this.showmessage("停止蓝牙搜索失败", 'stopdiscovery');
+ }
+ });
+ },
+ bleconnection:() =>{
+ uni.createBLEConnection({
+ deviceId: this.deviceId,
+ success(res) {
+ this.startnotify();
+ },
+ fail(err) {
+ this.blueMessage = "蓝牙连接失败";
+ this.blueState = -1;
+ }
+ });
+ },
+ startnotify:() =>{
+ uni.notifyBLECharacteristicValueChange({
+ state:true,
+ deviceId: this.deviceId,
+ serviceId: this.serviceId,
+ characteristicId: this.characteristicId,
+ success(res) {
+ uni.onBLECharacteristicValueChange(function(res){
+ var hex = this.buftohex(res.value);
+ if (hex.length > 10) {
+ var header = hex.substring(0, 4);
+ if (header == '6774') {
+ var contentL1 = hex.substring(4, 6);
+ var contentL = parseInt(contentL1, 16);
+ if ((contentL + 5) * 2 == hex.length) {
+ //console.log('完整的一条数据contentL=', contentL)
+ this.distributecommandswithdatastr(hex)
+ } else if ((contentL + 5) * 2 > hex.length) { //需要分包接受数据
+ // 第一次接受分包数据
+ self.responseStr = hex;
+ //console.log('分包接受数据未实现', hex)
+ //console.log('第一次接受分包数据contentL2=', contentL)
+ } else { //数据异常 ,查看
+ //console.log('数据异常 ,查看1', hex)
+ }
+ return;
+ }
+ } else {
+ //console.log('分包接受数据未实现', hex)
+ }
+ });
+ this.verification();
+ },
+ fail(err) {
+ this.blueMessage = "蓝牙连接失败";
+ this.blueState = -1;
+ }
+ });
+ },
+ verification = (mac, key1, key2) => {
+ if (mac && key1 && key2) {
+ //数据总长度为21,第一天长度20
+ var buffer = new ArrayBuffer(20)
+ var dataView = new DataView(buffer)
+ dataView.setUint32(0, 0X6774108a)
+ var sourceKey1 = mac + key1
+ var AESEncrypt = AES128ECBEncrypt(sourceKey1, key2)
+ if (AESEncrypt.length != 32) {
+ return;
+ }
+ for (var i = 0; i < 4; i++) {
+ var subStr = AESEncrypt.substring(i * 8, i * 8 + 8, 16);
+ dataView.setUint32(i * 4 + 4, parseInt(subStr, 16)); //4字节01523947(16进制)-->>10进制数字-->放入dateView
+ }
+ var i;
+ var bcc;//17为数据长度16+1
+ for (i = 0; i < 17; i++) {
+ bcc ^= dataView.getInt8(i + 3);
+ }
+ var buffer2 = new ArrayBuffer(1)
+ var dataView2 = new DataView(buffer2)
+ dataView2.setUint8(0, bcc)
+ console.log('验证', this.buftohex(buffer));
+ this.writecharacteristicvalue(buffer);
+ setTimeout(() => {
+ this.writecharacteristicvalue(buffer2);
+ }, 300);
+ } else {
+ var buffer = new ArrayBuffer(5)
+ var dataView = new DataView(buffer)
+ dataView.setUint32(0, 0X6774008a)
+ dataView.setUint8(4, 0x8a)
+ this.writecharacteristicvalue(buffer);
+ }
+ },
+ writecharacteristicvalue = (buffer) => {
+ uni.writeBLECharacteristicValue({
+ deviceId: this.deviceId,
+ serviceId: this.serviceId,
+ characteristicId: this.characteristicId,
+ value: buffer,
+ success: function (res) {
+ console.log('writeBLECharacteristicValue success', res.errMsg)
+ },
+ fail: function (res) {
+ console.log('writeBLECharacteristicValue fail', res.errMsg)
+ this.blueMessage = "蓝牙连接失败";
+ this.blueState = -1;
+ },
+ complete: function (res) {
+ }
+ });
+ },
+ verificationTimes:0,
+ distributecommandswithdatastr:(hex) => {
+ var cmd = hex.substring(6, 8);
+ var code = hex.substring(8, 10);
+ var errCode = code
+ var desDic = {}
+ var des = '';
+ if (code == '00') {
+ des = '成功'
+ errCode = 0
+ } else if (code == 'ff') { //-1
+ des = '锁已打开'
+ errCode = -1
+ } else if (code == 'fe') { //-2
+ des = '电量不足'
+ errCode = -2
+ } else if (code == 'fd') { //-3
+ des = '加密验证失败'
+ errCode = -3
+ } else if (code == 'fc') { //-4
+ des = '内存空间不足'
+ errCode = -4
+ } else if (code == 'fb') { //-5
+ des = '格式错误'
+ errCode = -5
+ } else if (code == 'fa') { //-6
+ des = '没有验证或验证失败'
+ errCode = -6
+ desDic['mac'] = hex.substring(10, 22);
+ desDic['key'] = hex.substring(22, 30);
+ } else if (code == 'f9') { //-7
+ des = 'flash写入失败'
+ errCode = -7
+ } else if (code == 'f8') { //-8
+ des = '数据空'
+ errCode = -8
+ } else if (code == 'f7') { //-9
+ des = '操作失败'
+ errCode = -9
+ } else if (code == 'f6') { //-10
+ des = '运输模式下无法执行该指令'
+ errCode = -10
+ } else if (code == 'f5') { //-11
+ des = '锁车失败,车辆未停止'
+ errCode = -11
+ } else if (code == 'f4') { //-12
+ des = '未检测到道钉信息'
+ errCode = -12
+ } else if (parseInt(code,16) == 149) { //
+ des = '摄像头正在工作中'
+ errCode = parseInt(code,16)
+ } else if (parseInt(code,16) == 150) { //
+ des = '摄像头离线'
+ errCode = parseInt(code,16)
+ } else if (parseInt(code,16) == 151) { //
+ des = '车辆不在使用中(临时停车或是还车中)无法使用摄像头还车'
+ errCode = parseInt(code,16)
+ } else if (parseInt(code,16) == 152) { //
+ des = '执行命令超时'
+ errCode = parseInt(code,16)
+ } else if (parseInt(code,16) == 153) { //
+ des = '摄像头执行失败'
+ errCode = parseInt(code,16)
+ } else if (parseInt(code,16) == 154) { //
+ des = '不在站点中或没有垂直停车'
+ errCode = parseInt(code,16)
+ } else {
+ des = '未知错误码' + code
+ errCode = code
+ }
+ if (cmd == '4a') { //验证
+ if (verificationTimes >= 1) {
+ verificationTimes = 0
+ if (errCode == -6) {
+ verificationTimes = 1;
+ this.verification(desDic.mac, desDic.key, '6666660000888888')
+ return;
+ }
+ //验证成功
+ this.blueState = 10;
+ this.blueMessage = '验证成功';
+ return;
+ } else {
+ verificationTimes += 1;
+ }
+ if (errCode == -6) {
+ this.verification(desDic.mac, desDic.key, '6666660000888888')
+ }
+ }
+ },
+ buftohex: (buffer) => {
+ return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
+ },
+ closeconn: () =>{
+ uni.closeBLEConnection({
+ deviceId: this.deviceId,
+ success(res) {
+
+ }
+ });
+ },
+ execcommon = (comm) => {
+ switch(comm){
+ case "openLock": //开锁
+ var buffer = new ArrayBuffer(5);
+ var dataView = new DataView(buffer);
+ dataView.setUint32(0, 0X67740082);
+ dataView.setUint8(4, 0x82);
+ this.writecharacteristicvalue(buffer);
+ break;
+ case "closeLock": //关锁
+ var buffer = new ArrayBuffer(5);
+ var dataView = new DataView(buffer);
+ dataView.setUint32(0, 0X67740081);
+ dataView.setUint8(4, 0x81);
+ this.writecharacteristicvalue(buffer);
+ break;
+ // case "openBatteryHouse": //打开电池仓
+ // var buffer = new ArrayBuffer(6);
+ // var dataView = new DataView(buffer);
+ // dataView.setUint32(0, 0X67740189);
+ // dataView.setUint8(4, 0);
+ // var i;
+ // var bcc;
+ // for (i = 0; i < 2; i++) {
+ // bcc ^= dataView.getInt8(i + 3);
+ // }
+ // dataView.setInt8(5, bcc);
+ // this.writecharacteristicvalue(buffer);
+ // break;
+ // case "closeBatteryHouse": //关闭电池仓
+ // var buffer = new ArrayBuffer(6);
+ // var dataView = new DataView(buffer);
+ // dataView.setUint32(0, 0X67740189);
+ // dataView.setUint8(4, 1);
+ // var i;
+ // var bcc;
+ // for (i = 0; i < 2; i++) {
+ // bcc ^= dataView.getInt8(i + 3);
+ // }
+ // dataView.setInt8(5, bcc);
+ // this.writecharacteristicvalue(buffer);
+ // break;
+ }
+ },
+ openbluetooth:() => {
+ uni.openBluetoothAdapter({
+ success(res) {
+ if(res.errno == 0){
+ this.discovery();
+ }
+ else
+ {
+ this.blueMessage = "蓝牙未开启或未授权";
+ this.blueState = -1;
+ }
+ },
+ fail(err) {
+ let errmsg = err.errMsg;
+ if(err.errCode == 10001){
+
+ }
+ this.blueMessage = "蓝牙未开启或未授权";
+ this.blueState = -1;
+ }
+ });
+
+ uni.onBluetoothAdapterStateChange(function (res) {
+ if(res["available"]){
+ this.discovery();
+ }
+ else {
+ this.blueMessage = "蓝牙未开启或未授权";
+ this.blueState = -1;
+ }
+ });
+ },
+ openlock:() =>{
+ if(this.ecuSn == ''){
+ this.blueMessage = "开锁失败";
+ }
+ this.openbluetooth();
+ let connTime = 0;
+ let timer = setInterval(() =>{
+ if(this.blueState == 10){
+ clearInterval(timer);
+ this.execcommon("openLock");
+ }
+ else if(connTime > 6){
+ clearInterval(timer);
+ this.blueMessage = "开锁失败";
+ }
+ connTime += 1;
+ }, 10000);
+ }
+}
\ No newline at end of file
diff --git a/ebike-operate/src/utils/config.js b/ebike-operate/src/utils/config.js
index 26db082..d7fe41d 100644
--- a/ebike-operate/src/utils/config.js
+++ b/ebike-operate/src/utils/config.js
@@ -1,5 +1,12 @@
const config = {
- sm2PublicKey: "04f5084ee12767d932f293508e30e3b0100185042ec0f061dedaf92b793b93f79fd6179d5e47e25b7aec98e00cf90dd56df1f8191012537187e7bbfd2d1de299fc"
+ sm2PublicKey: "04f5084ee12767d932f293508e30e3b0100185042ec0f061dedaf92b793b93f79fd6179d5e47e25b7aec98e00cf90dd56df1f8191012537187e7bbfd2d1de299fc",
+ map: {
+ apiKey: "BECBZ-EJIEQ-LUU5N-B5ISQ-3TLMZ-BXFLG",
+ center:{
+ lat: 30.633158,
+ lng: 103.974997
+ }
+ }
,pageParam: {
pageNum: 1,
pageSize: 10,
diff --git a/ebike-operate/src/views/BackManage/BackSite/index.vue b/ebike-operate/src/views/BackManage/BackSite/index.vue
index 04d77f2..3934abd 100644
--- a/ebike-operate/src/views/BackManage/BackSite/index.vue
+++ b/ebike-operate/src/views/BackManage/BackSite/index.vue
@@ -49,23 +49,42 @@
{{ record.dealState == '0' ? '未处理' : record.dealState == '1' ? '处理中' : record.dealState == '2' ? '已处理' : '' }}
-