promise封装小程序的蓝牙类
// pages/bluetooth/bluetooth.js
import { BluetoothMode } from '../../models/bluetooth.js'
import {System} from '../../models/system.js'
const bluetooth = new BluetoothMode()
const system = new System()
Page({ /**
* 页面的初始数据
*/
data: {
devicesData: [],
sys: {}
}, /**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
const res=system.getSync()
this.setData({
sys:res
})
}, // 点击连接蓝牙设备
connectionBluetooth: function (e) {
const deviceId = e.currentTarget.dataset.id
bluetooth.connect(deviceId).then(res => {
wx.setStorageSync('serviceData', res)
// 停止搜索 减少资源
bluetooth.stop()
wx.navigateTo({
url: '../device/device?name=' + e.currentTarget.dataset.name,
})
})
}, // 扫描设备
startBluetooth() {
this._initBluetooth()
}, //初始化蓝牙适配器
_initBluetooth: function () {
// 调用蓝牙子类的初始化事件
bluetooth.initBluetooth().then(res => {
// 监听发现新的设备
bluetooth.on('newDevice',data => {
this.setData({
devicesData:data
})
})
})
}, })
1.继上一篇文章中的观察者模式
import {
PublishtionModel
} from 'publishtion.js'
const tips = {
0: '正常',
10000: '未初始化蓝牙适配器',
10001: '当前蓝牙适配器不可用,请打开手机蓝牙后重试',
10002: '没有找到指定设备',
10003: '连接失败',
10004: '没有找到指定服务',
10005: '没有找到指定特征值',
10006: '当前连接已断开',
10007: '当前特征值不支持此操作',
10008: '其余所有系统上报的异常',
10009: 'Android 系统特有,系统版本低于 4.3 不支持 BLE',
10012: '连接超时',
10013: '连接 deviceId 为空或者是格式不正确',
20000: '蓝牙适配器不可用,蓝牙可能被关闭',
}
class BluetoothMode extends PublishtionModel {
//获取搜索到的蓝牙设备
data = []
//初始化蓝牙适配器
initBluetooth() {
return new Promise((resolve, reject) => {
this._initBluetooth().then(res => {
this._getBluetoothState()
return this._search()
}).then(res => {
// 开启监听
this._onDFound()
resolve(res)
})
})
}
_initBluetooth() {
return new Promise((resolve, reject) => {
wx.openBluetoothAdapter({
success: res => {
console.log(res)
console.log('初始化蓝牙模块成功')
resolve()
},
fail: error => {
console.log(error)
this._showTips(error.errCode)
}
})
})
}
// 连接低功耗蓝牙
connection(deviceId) {
return new Promise((resolve, reject) => {
wx.createBLEConnection({
deviceId,
success: res => {
console.log(res)
this._setDevice(deviceId)
// 暂停搜索
this.stop()
resolve({
res,
deviceId
})
},
fail: res => {
console.log(res)
}
})
})
}
connect(deviceId) {
return new Promise((resolve, reject) => {
this.connection(deviceId).then(res => {
return this.getServiceList(res.deviceId)
}).then(res => {
let promiseList = []
for (var i in res.services) {
promiseList.push(this.getBLEDeviveChar({
deviceId,
serviceId: res.services[i].uuid
}))
}
return Promise.all(promiseList)
}).then(res => {
resolve(res)
})
})
}
// 启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值。
// 注意:必须设备的特征值支持 notify 或者 indicate 才可以成功调用。
notify({
deviceId,
serviceId,
characteristicId
}) {
return new Promise((resolve, reject) => {
wx.notifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId,
success(res) {
resolve(res)
console.log('notifyBLECharacteristicValueChange success', res.errMsg)
}
})
})
}
// 获取服务列表
getServiceList(deviceId) {
return new Promise((resolve, reject) => {
wx.getBLEDeviceServices({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId,
success(res) {
console.log('device services:', res.services)
resolve({
services: res.services,
deviceId
})
}
})
})
}
// 获取蓝牙设备某个服务中所有特征值 getBLEDeviceCharacteristics
getBLEDeviveChar({
deviceId,
serviceId
}) {
return new Promise((resolve, reject) => {
wx.getBLEDeviceCharacteristics({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId,
success(res) {
resolve(res)
console.log('device getBLEDeviceCharacteristics:', res.characteristics)
}
})
})
}
// 断开与低功耗蓝牙设备的连接。
closeConnection() {
wx.closeBLEConnection({
deviceId,
success(res) {
console.log(res)
}
})
}
//向低功耗蓝牙设备特征值中写入二进制数据。
write({
deviceId,
serviceId,
characteristicId,
value
}) {
//传入String 返回 ArrayBuffer类型
let abf = this.__hexStringToArrayBuffer(value)
return new Promise((resolve, reject) => {
wx.writeBLECharacteristicValue({
// 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId,
// 这里的value是ArrayBuffer类型
value: abf,
success(res) {
resolve(res)
console.log('writeBLECharacteristicValue success', res.errMsg)
}
})
})
}
// 停止搜寻附近的蓝牙外围设备
stop() {
return new Promise((resolve, reject) => {
wx.stopBluetoothDevicesDiscovery({
success(res) {
console.log(res)
resolve(res)
}
})
})
}
// 关闭蓝牙适配器
close() {
wx.closeBluetoothAdapter()
}
// 获取设备Id
getDevice() {
return wx.getStorageSync('deviceId')
}
// 开启蓝牙搜索
_search() {
wx.showLoading({
title: '正在扫描中...',
})
return new Promise((resolve, reject) => {
wx.startBluetoothDevicesDiscovery({
success: res => {
console.log(res)
resolve(res)
},
fail: err => {
console.log(err)
},
complete: res => {
setTimeout(() => {
wx.hideLoading()
}, 2000)
}
})
})
}
//返回ArrayBuffe
_hexStringToArrayBuffer(str) {
if (!str) {
return new ArrayBuffer(0);
}
var buffer = new ArrayBuffer(str.length);
let dataView = new DataView(buffer)
let ind = 0;
for (var i = 0, len = str.length; i < len; i += 2) {
let code = parseInt(str.substr(i, 2), 16)
dataView.setUint8(ind, code)
ind++
}
return buffer;
}
// 开启监听获取到新的设备
_onDFound() {
wx.onBluetoothDeviceFound(devices =>{
this._getDevices().then(res=>{
// console.log(this)
this.publish(this.data,'newDevice')
})
// console.dir(devices)
})
}
// 获取寻找的所有设备
_getDevices() {
return new Promise((resolve, reject) => {
wx.getBluetoothDevices({
success: res => {
// console.log(res)
let array = []
for (var x in res.devices) {
if (res.devices[x].name != '未知设备') {
res.devices[x].advertisData = this._ab2hex(res.devices[x].advertisData)
array.push(res.devices[x])
}
}
// console.log(array)
this.data = array
resolve(array)
}
})
})
}
// 获取蓝牙适配器的状态
_getBluetoothState() {
const that = this
wx.onBluetoothAdapterStateChange(res => {
console.log(res)
if (res.available) {
console.log('蓝牙模块可用')
} else {
wx.showModal({
title: '提示',
content: '蓝牙已被关闭',
showCancel: false,
success(res) {
if (res.confirm) {
console.log('用户点击确定')
} else if (res.cancel) {
console.log('用户点击取消')
}
}
})
this._showTips(20000)
console.log('蓝牙模块不可用')
}
if (res.discovering) {
console.log('蓝牙适配器处于搜索状态')
} else {
console.log('蓝牙适配器不处于搜索状态')
}
})
}
// ArrayBuffer转16进度字符串示例
_ab2hex(buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
}
// 错误提示
_showTips(code) {
code && wx.showToast({
title: tips[code],
icon: 'none'
})
}
// 储存设备Id
_setDevice(id) {
wx.setStorageSync('deviceId', id)
}
}
export {
BluetoothMode
}
2.在需要使用的页面中调用

promise封装小程序的蓝牙类的更多相关文章
- promise封装小程序的请求类(request,清爽易懂)
话不多说直接上代码,清爽易懂: import { config } from '../config.js' const tips = { 1:'抱歉出现了一个错误', 2:'网络错误', 1005:' ...
- 超简单 Promise封装小程序ajax 超好用 以及封装登录
//网络类 //封装网络请求 const ajax = (ajaxData, method) => { wx.showLoading({ title: '加载中', mask: true }); ...
- 小程序-promise封装小程序的请求方法
// 在utils-->base.js中,封装一个Base类,有一个axios方法 class Base{ constructor(){ } axios(method,url,data){ co ...
- 微信小程序开发-蓝牙功能开发
0. 前言 这两天刚好了解了一下微信小程序的蓝牙功能.主要用于配网功能.发现微信的小程序蓝牙API已经封装的很好了.编程起来很方便.什么蓝牙知识都不懂的情况下,不到两天就晚上数据的收发了,剩下的就是数 ...
- 微信小程序调用蓝牙功能控制车位锁
第一次学用微信小程序,项目需要,被逼着研究了一下,功能是调用微信小程序的蓝牙功能,连接上智能车位锁,控制升降,大概步骤及调用的小程序接口API如下: 1.打开蓝牙模块 wx.openBluetooth ...
- 微信小程序之蓝牙开发(详细读数据、写数据、附源码)
本文将详细介绍微信小程序的蓝牙开发流程(附源码)准备:微信只支持低功耗蓝牙也就是蓝牙4.0,普通的蓝牙模块是用不了的,一定要注意. 蓝牙可以连TTL接到电脑上,再用XCOM调试 一开始定义的变量 va ...
- 微信小程序退款 处理类
<?php /** * 微信小程序退款 处理类参考https://www.cnblogs.com/afei-qwerty/p/7922982.html * */ class WeixinRefu ...
- 基于promise对小程序http请求方法封装
原因是我不想每次请求都复制粘贴那么长的请求地址,所以我把前边那一坨请求地址作为基础地址,只传后台给的路由就ok,而且,并不是每次请求都要显示正在加载,这对小程序体验很差,所以,我加了个形参,用来判断是 ...
- 微信小程序初探【类微信UI聊天简单实现】
微信小程序最近很火,火到什么程度,只要你一打开微信,就是它的身影,几乎你用的各个APP都可以在微信中找到它的复制版,另外官方自带的跳一跳更是将它推到了空前至高的位置.对比公众号,就我的感觉来说,有以下 ...
随机推荐
- 06 - Django应用第三步
知识点 1) 编写urls 配合include()的URL查找过程 获取正则抓取的值并命名, 给url取名 2) 模板的编写 for循环的遍历 用点的方式执行函数, 不带括号 3) 视图函数的编写 H ...
- Gym - 100570E:Palindrome Query (hash+BIT+二分维护回文串长度)
题意:给定字符串char[],以及Q个操作,操作有三种: 1:pos,chr:把pos位置的字符改为chr 2:pos:问以pos为中心的回文串长度为多长. 3:pos:问以pos,pos+1为中心的 ...
- JEECG datagrid 列表检索条件 添加下拉级联功能
$("#communityId").change( function(){ var id = $(this).children('option:selected').val(); ...
- TYVJ 1094 矩形分割
时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 YHOI Train#4 Problem 1 描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1× ...
- Java的native关键字
一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非j ...
- Centos6.5安装上传下载工具
执行下面命令即可. sudo yum install lrzsz rz 是上传命令 sz filename是下载命令 如果rz上传文件时提示 was skipped,则用sudo rz命令来进行上传.
- Logstash 2.0.0 beta2 发布,开源日志管理
Logstash 是一个应用程序日志.事件的传输.处理.管理和搜索的平台.你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计. Logstash 现在是 ElasticSea ...
- 【转】 Pro Android学习笔记(二七):用户界面和控制(15):FrameLayout
FrameLayout FrameLayout通常只包含一个控件.如果我们在FrameLayout中设置多个控件,则第二个控件会堆叠在第一个控件上面,如此类推,一层一层地叠上去.下面的例子,我们在Fr ...
- zk 02之 Windows安装和使用zookeeper
本文介绍的 Zookeeper 是以 3.4.5 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取,Zookeeper 的安装非 ...
- Linux(C/C++)下的文件操作open、fopen与freopen via Boblim
Linux(C/C++)下的文件操作open.fopen与freopen open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. li ...