123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- <template>
- <view style="width: 100%;">
- <button @click="getBluetoothDevices">获取设备</button>
- <view class="device-item" v-if="item.name=='FAYA'" @click="connectBlue(item)" v-for="item in deviceList" :key="item.name">
- <text>{{item.name}}</text>
- <text>点击连接</text>
- </view>
- <view>
- 状态:{{statusStr}}
- </view>
- <view>
- 结果:{{balanceData}}
- </view>
- </view>
- </template>
- <script>
- export default {
- data() {
- return {
- deviceList:[], // 设备列表
- deviceId: '',
- connectedDeviceId: '',
- services: [],
- notifyCharacteristicsId:'',
- notifyServicweId: '',
- writeDatas: '',
- balanceData: '',
- hexstr: '',
- statusStr: ''
- };
- },
- onShow() {
- let _this = this
- // this.closeConnect()
- const res = uni.getSystemInfoSync();
- // 初始化蓝牙模块
- uni.openBluetoothAdapter({
- success(res) {
- console.log(res)
- _this.statusStr = '初始化蓝牙模块成功'
- /* 获取本机的蓝牙状态 */
- setTimeout(() => {
- _this.init()
- }, 1000)
- }
- })
- // 监听蓝牙适配器状态变化事件
- uni.onBluetoothAdapterStateChange(function (res) {
- console.log(res,'适配器变化')
- })
-
- if(!res.bluetoothEnabled){
- uni.showModal({
- title:'提示',
- content:'请开启手机蓝牙',
- complete(e) {
- console.log(e)
- _this.statusStr = '请开启手机蓝牙'
- }
- })
- }
- },
- methods: {
- // 初始化蓝牙
- init(){
- let _this = this
- uni.getBluetoothAdapterState({
- success(res) {
- console.log(res)
- _this.statusStr = 'adapterState changed, now is'
- // 开始搜寻附近的蓝牙外围设备
- _this.startBluetoothDevicesDiscovery()
- },
- fail(res) {
- console.log(res)
- }
- })
- },
- startBluetoothDevicesDiscovery(){
- let _this = this
- uni.startBluetoothDevicesDiscovery({
- services: [],
- success(res) {
- console.log(res)
- // 监听寻找到新设备的事件
- uni.onBluetoothDeviceFound(function (res) {
- _this.statusStr = '发现新设备'
- console.dir(res.devices)
- if(res.devices[0].name == 'FAYA'){
- _this.deviceId = res.devices[0].deviceId
- _this.deviceList = res.devices
- // _this.createBLEConnection()
- }
- })
- }
- })
- },
- // 获取在蓝牙模块生效期间所有已发现的蓝牙设备
- getBluetoothDevices() {
- let _this = this
- uni.getBluetoothDevices({
- success(res) {
- console.log(res)
- if (res.devices.length) {
- _this.deviceList = res.devices
- }
- }
- })
- },
- connectBlue(item){
- this.deviceId = item.deviceId
- this.createBLEConnection()
- },
- // 连接指定设备
- createBLEConnection(){
- let _this = this
- uni.createBLEConnection({
- // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
- deviceId:this.deviceId,
- success(res) {
- console.log(res)
- _this.statusStr = '连接设备成功'
- _this.connectedDeviceId = _this.deviceId
- // 获取连接设备的service服务
- setTimeout(()=>{
- _this.getBLEDeviceServices()
- },1000)
- }
- })
- },
- // 获取连接设备的service服务
- getBLEDeviceServices(){
- let _this = this
- uni.getBLEDeviceServices({
- // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
- deviceId: _this.deviceId,
- success(res) {
- console.log('device services:', res.services)
- _this.statusStr = '获取连接设备的service服务成功'
- _this.services = res.services
- /* 获取连接设备的所有特征值 */
- setTimeout(()=>{
- _this.getBLEDeviceCharacteristics()
- },500)
- // 停止搜索
- uni.stopBluetoothDevicesDiscovery({
- success: function(res) {
- console.log(res, '停止搜索')
- },
- fail(res) {
- }
- })
- }
- })
- },
- // 获取连接设备的所有特征值
- getBLEDeviceCharacteristics(){
- let _this = this
- this.notifyServicweId = this.services[1].uuid
- uni.getBLEDeviceCharacteristics({
- deviceId: this.connectedDeviceId,
- serviceId: this.notifyServicweId,
- success: function(res) {
- console.log(res)
- _this.statusStr = '获取连接设备的所有特征值成功'
- for (let i = 0; i < res.characteristics.length; i++) {
- if ((res.characteristics[i].properties.notify || res.characteristics[i].properties.indicate) &&
- (res.characteristics[i].properties.read && res.characteristics[i].properties.write)) {
- console.log(res.characteristics[i].uuid, '蓝牙特征值 ==========')
- /* 获取蓝牙特征值 */
- _this.notifyCharacteristicsId = res.characteristics[i].uuid
- // 启用低功耗蓝牙设备特征值变化时的 notify 功能
- setTimeout(()=>{
- _this.notifyBLECharacteristicValueChange()
- },500)
- }
- }
- },
- fail: function(res) {
- console.log(res)
- }
- })
- },
- // 启用低功耗蓝牙设备特征值变化时的 notify 功能
- notifyBLECharacteristicValueChange() {
- let that = this;
- console.log(that.connectedDeviceId,that.notifyServicweId,that.notifyCharacteristicsId)
- uni.notifyBLECharacteristicValueChange({
- state: true,
- deviceId: that.connectedDeviceId,
- serviceId: that.notifyServicweId,
- // characteristicId: that.notifyCharacteristicsId,
- characteristicId: '49535343-1E4D-4BD9-BA61-23C647249616',
- success(res) {
- console.log(res,'notifyBLECharacteristicValueChange')
- that.statusStr = '启用低功耗蓝牙设备特征值变化成功'
- /*用来监听手机蓝牙设备的数据变化*/
- uni.onBLECharacteristicValueChange(function(res) {
- console.log(res,'read data')
- that.balanceData = that.buf2string(res.value)
- // that.hexstr = that.receiveData(res.value)
- })
- },
- fail(res) {
- console.log(res, '启用低功耗蓝牙设备监听失败')
- }
- })
- },
- /*转换成需要的格式*/
- buf2string(buffer) {
- let arr = Array.prototype.map.call(new Uint8Array(buffer), x => x)
- return arr.map((char, i) => {
- return String.fromCharCode(char);
- }).join('');
- },
- receiveData(buf) {
- return this.hexCharCodeToStr(this.ab2hex(buf))
- },
- /*转成二进制*/
- ab2hex (buffer) {
- let hexArr = Array.prototype.map.call(
- new Uint8Array(buffer), function (bit) {
- return ('00' + bit.toString(16)).slice(-2)
- }
- )
- return hexArr.join('')
- },
- /*转成可展会的文字*/
- hexCharCodeToStr(hexCharCodeStr) {
- let trimedStr = hexCharCodeStr.trim();
- let rawStr = trimedStr.substr(0, 2).toLowerCase() === '0x' ? trimedStr.substr(2) : trimedStr;
- let len = rawStr.length;
- let curCharCode;
- let resultStr = [];
- for (let i = 0; i < len; i = i + 2) {
- curCharCode = parseInt(rawStr.substr(i, 2), 16);
- resultStr.push(String.fromCharCode(curCharCode));
- }
- return resultStr.join('');
- },
- // 发送数据
- sendData(str) {
- let that = this;
- let dataBuffer = new ArrayBuffer(3)
- let dataView = new DataView(dataBuffer)
- // for (let i = 0; i < str.length; i++) {
- // dataView.setUint8(i, str.charAt(i).charCodeAt())
- // }
- dataView.setUint8(0, 0x02)
- dataView.setUint8(1, 0x42)
- dataView.setUint8(2, 0x03)
- let dataHex = that.ab2hex(dataBuffer);
- this.writeDatas = that.hexCharCodeToStr(dataHex);
- uni.writeBLECharacteristicValue({
- deviceId: that.connectedDeviceId,
- serviceId: that.notifyServicweId,
- characteristicId: that.notifyCharacteristicsId,
- // characteristicId: '49535343-1E4D-4BD9-BA61-23C647249616',
- value: dataBuffer,
- success: function (res) {
- console.log('发送的数据:' + that.writeDatas)
- console.log('message发送成功')
- },
- fail: function (res) {
- console.log('发送失败:' + res)
- },
- complete: function (res) {
- }
- })
- },
- // 断开设备连接
- closeConnect() {
- let that = this;
- if (that.connectedDeviceId) {
- uni.closeBLEConnection({
- deviceId: that.connectedDeviceId,
- success: function(res) {
- that.closeBluetoothAdapter()
- },
- fail(res) {
- }
- })
- } else {
- that.closeBluetoothAdapter()
- }
- },
- // 关闭蓝牙模块
- closeBluetoothAdapter() {
- let that = this;
- uni.closeBluetoothAdapter({
- success: function(res) {
- that.statusStr = '关闭蓝牙模块'
- that.balanceData = ''
- console.log(res,'closeBluetoothAdapter')
- },
- fail: function(err) {
- }
- })
- },
- },
- onUnload() {
- this.closeConnect()
- }
- }
- </script>
- <style lang="scss">
- .device-item{
- width: 100%;
- padding: 20upx;
- border-bottom: 2upx solid #eee;
- display: flex;
- align-items: center;
- justify-content: space-between;
- }
- </style>
|