위챗 애플릿의 블루투스 링크

13887 단어
위챗 애플릿의 블루투스 링크
위챗 애플릿 블루투스 연결 2.0 설명:
1. 이 버전은 ANDROID와 IOS 시스템의 Bluetooth 연결 방식을 구분합니다.
2. 더 많은 상황에서 호환되는 링크는 다음과 같다.
(1) 장치 블루투스가 켜져 있지 않으면 모니터가 블루투스를 켜면 자동으로 연결됩니다.(2) 블루투스 초기화에 실패한 후 3000ms마다 자동으로 블루투스 어댑터를 초기화합니다.(3) 안드로이드에서 블루투스 어댑터를 켜는 데 실패하여 3000ms마다 자동으로 다시 켜집니다.(4) IOS 단말기는 연결된 블루투스 장치가 비어 있고 3000ms마다 자동으로 다시 가져옵니다.(5) 안드로이드 블루투스가 링크를 시작한 후 검색을 중단하고 연결에 실패하여 다시 검색을 시작합니다.(6) IOS 측에서 장치 연결을 시작하면 연결된 장치 가져오기가 중지되고 연결 실패가 발생하면 자동으로 가져오기가 다시 시작됩니다.(7) 연결이 성공하면 시스템 블루투스를 닫고 블루투스 어댑터를 리셋합니다.(8) 연결이 성공하면 시스템 블루투스를 닫고 블루투스를 다시 켜고 자동으로 다시 연결을 시작합니다.(9) 연결이 완료되면 대상 Bluetooth 장치를 닫고 자동으로 다시 검색(획득)을 시작합니다.(10) 연결이 성공하면 애플릿(연결이 끊기지 않음)을 최소화하고 애플릿을 켜면 연결된 것으로 표시됩니다.(11) 연결이 성공하면 애플릿 프로세스를 죽이고 연결이 닫히면 자동으로 다시 스캔(획득)을 시작합니다.
3、생각나면 다시 업데이트...
4. 흐름도, 내일 또는 모레 또는...누가 시간이 있으면 나를 도와 좀 그려 줘도 된다.
제 연결은 App입니다.js에서 했어요.
App.js의 onLaunch 트리거는 init() 메서드를 호출합니다.
init 코드:

init: function (n) {
  this.list = [];
  this.serviceId = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E";
  this.serviceId_2 = "00001803-0000-1000-8000-00805F9B34FB";
  this.serviceId_3 = "00001814-0000-1000-8000-00805F9B34FB";
  this.serviceId_4 = "00001802-0000-1000-8000-00805F9B34FB";
  this.serviceId_5 = "00001804-0000-1000-8000-00805F9B34FB";
  this.serviceId_6 = "00001535-1212-EFDE-1523-785FEABCD123";
  this.characterId_write = "6E400042-B5A3-F393-E0A9-E50E24DCCA9E";
  this.characterId_read = "6E400012-B5A3-F393-E0A9-E50E24DCCA9E";
  this.connectDeviceIndex = 0;
  this.isGettingConnected = false;
  this.isDiscovering = false;
  this.isConnecting = false;
  this.connectedDevice = {};
  console.log('init state', this.connectedDevice.state);
  if (!this.connectedDevice.state || n == 200) {
   this.connectedDevice.state = false;
   this.connectedDevice.deviceId = '';
   this.adapterHasInit = false
  }
  this.startConnect();
 }

설명:
1、 serviceId_2~6은 내가 알고 있는 연결하고 싶은 블루투스 장치의 서비스 Id입니다. 하나만 쓸 수 있습니다.2、characterId_write는 내가 알고 있는 연결하고자 하는 블루투스 장치가 데이터를 쓰는 특징값입니다.3、characterId_read는 내가 알고 있는 연결하고 싶은 블루투스 장치가 데이터를 읽는 특징값입니다.(이상 3개는 모두 비교하기 위한 것으로 실제 조작은 획득한 Sericeid,characterid에 따른다).4.connectedDevice는 연결된 장치 정보 대상입니다.
init가 완료되면 연결 startConnect() 호출을 시작합니다.
startConnect 코드:

startConnect: function () {
  var that = this;
  if (that.connectedDevice.state) return;
  that.connectedDevice.deviceId = "";
  that.connectedDevice.state = false;
  //                  (        )
  if (this.adapterHasInit == undefined || this.adapterHasInit) return;
  wx.showLoading({
   title: '     ',
   duration: 2000
  });
  //            
  this.listenAdapterStateChange();
  //           (    ,             )
  wx.openBluetoothAdapter({
   success: function (res) {
    console.log("          ");
    that.getBluetoothAdapterState();
    that.adapterHasInit = true;
   },
   fail: function (err) {
    console.log(err);
    wx.showLoading({
     title: '    ',
     icon: 'loading',
     duration: 2000
    })
   }
  });
 }

설명: 이 부분에 주석이 있으면 더 이상 말하지 않고 비교적 간단하다.
블루투스 어댑터 상태를 초기화한 후 getBluetoothAdapterState () 방법을 호출합니다.
getBluetoothAdapterState 코드:

getBluetoothAdapterState: function () {
  var that = this;
  wx.getBluetoothAdapterState({
   success: function (res) {
    console.log(res);
    var available = res.available;
    that.isDiscovering = res.discovering;
    if (!available) {
     wx.showLoading({
      title: '    ',
      icon: 'loading',
      duration: 2000
     })
    } else {
     if (!that.connectedDevice['state']) {
      that.judegIfDiscovering(res.discovering);
     }
    }
   },
   fail: function (err) {
    console.log(err);
   }
  })
 }

설명: 이 방법은 현재 블루투스 상태를 가져오는 데 사용됩니다.
Bluetooth 사용 가능 여부가 감지되면 judegIfDiscovering 메서드를 호출합니다.
judegIfDiscovering 코드:

judegIfDiscovering: function (discovering) {
  var that = this;
  if (this.isConnectinng) return;
  wx.getConnectedBluetoothDevices({
   services: [that.serviceId],
   success: function (res) {
    console.log("           ", res);
    var devices = res['devices'];
    if (devices[0]) {
     if (that.isAndroidPlatform) {
      wx.showToast({
       title: '      ',
       icon: 'success',
       duration: 2000
      });
     } else {
      that.getConnectedBluetoothDevices(256);
     }
    } else {
     if (discovering) {
      wx.showLoading({
       title: '     '
      })
     } else {
      if (that.isAndroidPlatform) {
       that.startBluetoothDevicesDiscovery();
      } else {
       that.getConnectedBluetoothDevices(267);
      }
     }
    }
   },
   fail: function (err) {
    console.log('getConnectedBluetoothDevices err 264', err);
    if (that.isAndroidPlatform) {
     that.startBluetoothDevicesDiscovery();
    } else {
     that.getConnectedBluetoothDevices(277);
    }
   }
  });
 }

설명:
1. 이 방법은 스캔 중인지 아닌지를 판단하는 데 쓰인다.
2. isAndroidPlatform은 애플릿의 getSystemInfo를 통해 안드로이드 장치인지 IOS 장치인지 판단할 수 있다.
안드로이드 장치가 start Bluetooth Devices Discovery () 를 호출하면 스캔을 시작하고, IOS 장치가 get Connected Bluetooth Devices () 를 호출하면 연결된 블루투스 장치를 가져옵니다.
startBluetoothDevicesDiscovery 코드:

startBluetoothDevicesDiscovery: function () {
  var that = this;
  if (!this.isAndroidPlatform) return;
  if (!this.connectedDevice['state']) {
   wx.getBluetoothAdapterState({
    success: function (res) {
     console.log(res);
     var available = res.available;
     that.isDiscovering = res.discovering;
     if (!available) {
      wx.showLoading({
       title: '    ',
       icon: 'loading',
       duration: 2000
      })
     } else {
      if (res.discovering) {
       wx.showLoading({
        title: '     '
       })
      } else {
       wx.startBluetoothDevicesDiscovery({
        services: [],
        allowDuplicatesKey: true,
        success: function (res) {
         that.onBluetoothDeviceFound();
         wx.showLoading({
          title: '     '
         })
        },
        fail: function (err) {
         if (err.isDiscovering) {
          wx.showLoading({
           title: '     '
          })
         } else {
          that.startDiscoveryTimer = setTimeout(function () {
           if (!that.connectedDevice.state) {
            that.startBluetoothDevicesDiscovery();
           }
          }, 5000)
         }
        }
       });
      }
     }
    },
    fail: function (err) {
     console.log(err);
    }
   })
  }

설명:
1. 안드로이드 장치에서만 근처의 블루투스 장치를 스캔합니다.
2. 성공적으로 실행된 리셋에서 새로운 블루투스 장치를 발견하는 이벤트 감청 onBluetoothDeviceFound()를 시작합니다.
onBluetoothDeviceFound 코드:

[mw_shl_code=javascript,true]onBluetoothDeviceFound: function () {
  var that = this;
  wx.onBluetoothDeviceFound(function (res) {
   console.log('new device list has founded');
   if (res.devices[0]) {
    var name = res.devices[0]['name'];
    if (name.indexOf('FeiZhi') != -1) {
     var deviceId = res.devices[0]['deviceId'];
     console.log(deviceId);
     that.deviceId = deviceId;
     if (!that.isConnecting) {
      that.startConnectDevices();
     }
    }
   }
  })
 }

설명:
1. 발견된 블루투스 장치를name 속성에 따라 필터합니다.
2. 연결이 필요한 장치의name 속성을 선택한 장치가 deviceId를 가져오면 startConnectDevices () 방법을 호출하기 시작합니다.
startConnectDevices 코드:

startConnectDevices: function (ltype, array) {
  var that = this;
  clearTimeout(this.getConnectedTimer);
  clearTimeout(this.startDiscoveryTimer);
  this.getConnectedTimer = null;
  this.startDiscoveryTimer = null;
  this.isConnectinng = true;
  wx.showLoading({
   title: '    '
  });
  that.stopBluetoothDevicesDiscovery();
  wx.createBLEConnection({
   deviceId: that.deviceId,
   success: function (res) {
    console.log('    ', res);
    wx.showLoading({
     title: '    '
    });
    that.connectedDevice.state = true;
    that.connectedDevice.deviceId = that.deviceId;
    if (res.errCode == 0) {
     setTimeout(function () {
      that.getService(that.deviceId);
     }, 5000)
    }
    wx.onBLEConnectionStateChange(function (res) {
     console.log('    ', res);
     that.connectedDevice.state = res.connected;
     that.connectedDevice.deviceId = res.deviceId;
     if (!res.connected) {
      that.init('200');
     }
    });
   },
   fail: function (err) {
    console.log('    :', err);
    wx.hideLoading();
    if (ltype == 'loop') {
     array = array.splice(0, 1);
     console.log(array);
     that.loopConnect(array);
    } else {
     if (that.isAndroidPlatform) {
      that.startBluetoothDevicesDiscovery();
     } else {
      that.getConnectedBluetoothDevices(488);
     }
    }
   },
   complete: function () {
    that.isConnectinng = false;
   }
  });
 }

설명:
1. 연결을 연 후 스캔을 종료합니다(짝짓기를 획득).2. deviceId에 따라 저전력 블루투스 연결을 만듭니다.연결이 성공하면 후속 읽기와 쓰기 작업을 계속합니다.3. 만약에 연결이 실패하면 장치 시스템에 따라 각각 startBluetoothDevices Discovery () 또는 getConnectedBluetoothDevices ()를 호출한다.
getConnectedBluetoothDevices 코드:

getConnectedBluetoothDevices: function (n) {
  var that = this;
  that.isGettingConnected = true;
  wx.showLoading({
   title: '     '
  });
  wx.getConnectedBluetoothDevices({
   services: [that.serviceId],
   success: function (res) {
    console.log("           ", res);
    var devices = res['devices'],
     flag = false,
     index = 0,
     conDevList = [];
    devices.forEach(function (value, index, array) {
     if (value['name'].indexOf('FeiZhi') != -1) {
      //       FeiZhi     
      flag = true;
      index += 1;
      conDevList.push(value['deviceId']);
      that.deviceId = value['deviceId'];
     }
    });
    if (flag) {
     that.connectDeviceIndex = 0;
     that.loopConnect(conDevList);
    } else {
     that.failToGetConnected();
    }
   },
   fail: function (err) {
    that.failToGetConnected();
   },
   complete: function () {
    that.isGettingConnected = false;
   }
  });
 }

설명: 블루투스 조립된 블루투스 장치를 가져오는 데 실패하거나 에어컨용failToGetConnected () 목록을 가져오는 경우
failToGetConnected 코드:

failToGetConnected: function () {
  var that = this;
  if (!that.getConnectedTimer) {
   clearTimeout(that.getConnectedTimer);
   that.getConnectedTimer = null;
  }
  that.getConnectedTimer = setTimeout(function () {
   wx.getBluetoothAdapterState({
    success: function (res) {
     console.log(res);
     var available = res.available;
     if (!available) {
      wx.showLoading({
       title: '    ',
       icon: 'loading',
       duration: 2000
      })
     } else {
      if (!that.connectedDevice['state']) {
       that.getConnectedBluetoothDevices();
      }
     }
    },
    fail: function (err) {
     console.log(err);
    }
   })
  }, 5000);
 }

설명:
1. 이 방법이 호출된 후에 되돌아오는 devices는 시스템이 조립된 여러 개의 블루투스 장치를 포함하는 그룹입니다.2. devices 목록에서loopConnect () 호출 방법을 가져오면 블루투스 연결 장치를 호출하기 시작합니다.
loopConnect 코드:

loopConnect: function (array) {
  var that = this;
  var listLen = array.length;
  if (array[0]) {
   that.deviceId = array[0];
   if (!that.isConnecting) {
    that.startConnectDevices('loop', array);
   }
  } else {
   console.log('               ');
   if (!that.isAndroidPlatform) {
    that.getConnectedBluetoothDevices(431);
   }
  }
 }

설명:looConnect는 연결을 만드는 방법에 실패했을 때 그룹의 첫 번째 값을 삭제한 다음 모든 장치가 연결될 때까지 이 방법을 계속 호출합니다.
하마터면 빠질 뻔했어요.js의 onShow에서 init () 방법을 호출합니다.
특별 설명:
1. 안드로이드와 IOS의 블루투스 연결은 현재 버전에서 다른 방식을 추천합니다.안드로이드 장치는 애플릿의 블루투스 연결을 직접 사용하여 시스템 짝짓기를 취소합니다.IOS 장치는 애플릿을 켜면 시효초에 연결할 수 있습니다.
2. 이 버전의 연결은 아직도 완벽해야 한다. 연결은 자동으로 종료되지 않고 (필요한 것은 스스로 추가할 수 있다) 무한히 스캔하고 다시 연결한다.
3. 링크가 성공한 후의 작업은 데이터를 쓰고 notify를 켜는 것과 동시에 진행해야 할 경우 먼저 쓰고 나중에 notify를 켜는 것을 권장합니다.(원인은 알 수 없습니다. 그렇지 않으면 10008 오류가 발생할 수밖에 없습니다.)
궁금한 점이 있으면 댓글을 남기거나 본 사이트 지역사회에 가서 토론을 교류하고 읽어주셔서 감사합니다. 여러분께 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기