連接藍牙
- 前言
- 詳解
- 小程式鏈接藍牙流程圖
- 需要的資料
- api
- openBluetoothAdapter:打開藍牙配接器
- getBluetoothAdapterState:查看藍牙配接器狀態
- startBluetoothDevicesDiscovery:開始搜索藍牙設備
- getBluetoothDevices:獲取所有已發現的所有藍牙設備
- createBLEConnection:連接藍牙設備
- stopBluetoothDevicesDiscovery:停止掃描設備
- getBLEDeviceServices:獲取連接設備的service服務
- getBLEDeviceCharacteristics:獲取連接設備具有讀寫功能服務的所有特征值
- notifyBLECharacteristicValueChange:啟動藍牙設備特征值變化
- onBLECharacteristicValueChange:監聽藍牙特征值變化
- writeBLECharacteristicValue:向藍牙寫入資料
- closeBluetoothAdapter:關閉藍牙
- 字串與16進制的轉換
- 16進制轉字串
- 字串轉16進制
- 封裝版
- 步驟一
- 步驟二
- 步驟三
- 步驟四
- 步驟五
前言
- 我是在給我們實驗室小程式添加開鎖功能的時候用到的藍牙,做完之后我來總結一下,
- 如果你是想要學習微信小程式的藍牙api,你可以看詳解部分
- 如果你是單純的想用一下的話,你就去看封裝版部分,其中有詳細的使用步驟
- 還有一點要注意:小程式只支持藍牙4.0的協議,不支持2.0的協議,我之前用的hc-06藍牙模塊它是給2.0的協議,小程式一直找不到,換成hc-08的藍牙模塊就能找到了
詳解
小程式呼叫藍牙需要一步一步使用很多api,我會給你們把每個api的作用給講清楚,我學的時候看了b站的視頻,質量并不是很高,但也可以看一下
小程式鏈接藍牙流程圖

需要的資料
deviceId:"00:00:00:00:00:00",//藍牙設備id,每個藍牙都不一樣,可以先用手機手動連一下,手機上會有id,要我們寫
serviceUUIDSamll:'FFE0',//藍牙可用服務id,用于查詢我們要尋找的服務,我們買藍牙模塊時候檔案里或者他的官網上會有,要我們寫
serviceUUID:'',//藍牙服務id全名,用作引數呼叫小程式api, serviceId程式會自動獲取
notifyCharacteristicId:'',//該服務的notify特征值,自動獲取
writeCharacteristicId:'',//該服務的write特征值,自動獲取
msg:"這是你要給藍牙發送的資料"//要給藍牙發送的資料,這個我們要手動寫
api
openBluetoothAdapter:打開藍牙配接器
打開藍牙配接器,成功表明手機藍牙已打開,
這是判斷手機是否打開藍牙功能
openBluetoothAdapter(){
var that=this;
wx.openBluetoothAdapter({
success: function (res) {
console.log("藍牙已打開")
},
fail: function(res){
console.log("藍牙未打開")
}
})
},
getBluetoothAdapterState:查看藍牙配接器狀態
查看藍牙配接器狀態,只要打開藍牙一般都會成功回傳
getBluetoothAdapterState(){
var that=this;
wx.getBluetoothAdapterState({
success: (result) => {
console.log("藍牙狀態:\n"+result.errMsg)
},
fail: (res) => {
console.log("藍牙狀態:\n"+res.errMsg)
}
})
},
startBluetoothDevicesDiscovery:開始搜索藍牙設備
小程式開始搜索藍牙設備,如果你不關閉他,他會一直搜索,后面會有關閉的api
startBluetoothDevicesDiscovery(){
var that=this;
wx.startBluetoothDevicesDiscovery({
success: (res) => {
//列印除錯日志
console.log("搜索設備回傳"+JSON.stringify(res))
},
fail: (res) => {
console.log("搜索設備失敗")
}
})
},
getBluetoothDevices:獲取所有已發現的所有藍牙設備
獲取所有已發現的所有藍牙設備,之前都是一些準備作業,我們在這里判斷是否搜索到我們想要的藍牙,如果我們發現了我們的藍牙,我們就可以連接藍牙設備,然后停止掃描設備,
getBluetoothDevices :function(){
var that=this;
wx.getBluetoothDevices({
success: (res) => {
res.devices.forEach((device,i)=>{
if(device.deviceId==that.data.deviceId){
console.log("物聯網設備已找到")
return;
}
})
}
})
},
createBLEConnection:連接藍牙設備
連接我們的藍牙設備,需要我們藍牙的id,這個id我們在data中提前寫上
createBLEConnection: function(){
var that =this;
wx.createBLEConnection({
deviceId: that.data.deviceId,
success: function(res){
console.log('連接設備回傳:'+res.errMsg);
},
fail:function(res){
console.log("呼叫失敗")
}
})
},
stopBluetoothDevicesDiscovery:停止掃描設備
我們連接到藍牙,就可以停止掃描藍牙了
stopBluetoothDevicesDiscovery(){
var that =this;
wx.stopBluetoothDevicesDiscovery({
success: (res) => {
console.log("停止掃描設備")
},
})
},
getBLEDeviceServices:獲取連接設備的service服務
獲取已連接藍牙的所有服務,需要藍牙的deviceId
一個藍牙有許多服務,但是只有某些服務是我們需要用的,我們可以從藍牙協議檔案上查看我們所需要服務的id,通過id來獲取該服務
getBLEDeviceServices(){
var that =this;
wx.getBLEDeviceServices({
deviceId: that.data.deviceId,
success:(res)=>{
for(var i=0;i<res.services.length;i++){
//把服務id放到陣列中
if(res.services[i].uuid.toUpperCase().indexOf(that.data.serviceUUIDSamll)!=-1){
console.log("服務已找到")
that.setData({
serviceUUID:res.services[i].uuid
})
}
}
}
})
},
getBLEDeviceCharacteristics:獲取連接設備具有讀寫功能服務的所有特征值
獲取連接設備具有讀寫功能服務的所有特征值,需要deviceId和服務的id:serviceId
每個服務都有許多特征值,我們獲取我們所需要的特征值
getBLEDeviceCharacteristics(){
var that=this;
wx.getBLEDeviceCharacteristics({
deviceId: that.data.deviceId,
serviceId: that.data.serviceUUID,
success: (res) => {
//獲取特征值
console.log("-----------------------")
for(var i=0;i<res.characteristics.length;i++){
//把特征值id輸出到控制臺
console.log("獲取到的特征值id:"+res.characteristics[i].uuid)
if(res.characteristics[i].properties.notify){
console.log("開啟notify的characteristicId:"+res.characteristics[i].uuid);
this.setData({
notifyCharacteristicId:res.characteristics[i].uuid
})
}
//res.characteristics[i].properties.write
if(res.characteristics[i].properties.write){
console.log("開啟write的characteristicId:"+res.characteristics[i].uuid);
this.setData({
writeCharacteristicId:res.characteristics[i].uuid
})
}
if(res.characteristics[i].properties.read){
console.log("開啟read的characteristicId:"+res.characteristics[i].uuid);
}
}
//把資料寫道data中
that.setData({
characteristics:res.characteristics
})
},
fail: (res) => {},
complete: (res) => {},
})
}
notifyBLECharacteristicValueChange:啟動藍牙設備特征值變化
啟動藍牙設備特征值變化
notifyBLECharacteristicValueChange(){
var that=this;
wx.notifyBLECharacteristicValueChange({
characteristicId: that.data.notifyCharacteristicId,
deviceId: that.data.deviceId,
serviceId: that.data.serviceUUID,
state: true,
success:(res)=>{
console.log("notifyBLECharacteristicValueChange success:"+res.errMsg)
that.setData({
info:"成功"
})
},
fail:(res)=>{
console.log("notifyBLECharacteristicValueChange fail:"+res.errMsg)
that.setData({
info:"失敗"
})
},
})
},
onBLECharacteristicValueChange:監聽藍牙特征值變化
監聽藍牙特征值變化:見名知意,獲取藍牙特征值的改變
onBLECharacteristicValueChange(){
var that=this;
wx.onBLECharacteristicValueChange((res) => {
//console.log(“接收到的資料:”+that.ab2hex(res.value))
console.log(“接收到的資料:”+res.value)
})
},
writeBLECharacteristicValue:向藍牙寫入資料
向藍牙寫入資料,
writeBLECharacteristicValue(){
var that =this;
// let buffer =new ArrayBuffer(1);
// let dataView=new DataView(buffer)
// dataView.setUint8(1,1)
let buffer = that.stringToBytes(that.data.msg);
console.log("開始發送指令")
//寫入資料
wx.writeBLECharacteristicValue({
characteristicId: that.data.writeCharacteristicId,
deviceId: that.data.deviceId,
serviceId: that.data.serviceUUID,
value: buffer,
success:function(res){
console.log("回傳資訊:"+res.errMsg)
}
})
},
closeBluetoothAdapter:關閉藍牙
我們使用完藍牙后要及時關閉,不然其他人就連不上了
closeBluetoothAdapter(){
wx.closeBluetoothAdapter({
success: (res) => {
console.log("已關閉藍牙");
},
fail:(res)=>{
console.log("藍牙未能關閉");
}
})
},
字串與16進制的轉換
藍牙需要16進制的資料,并且他傳給小程式的也是16進制資料,小程式輸入輸出用的都是字串,所以接收資料時我們要把16進制轉成字串,發送資料時,我們需要把字串轉成16進制
16進制轉字串
ab2hex(buffer){
var hexArr =Array.prototype.map.call(
new Uint16Array(buffer),
function(bit){
return ('00'+bit.toString(16).slice(-2))
}
)
return hexArr.join('');
},
字串轉16進制
stringToBytes(str) {
var array = new Uint8Array(str.length);
for (var i = 0, l = str.length; i < l; i++) {
array[i] = str.charCodeAt(i);
}
console.log(array);
return array.buffer;
}
封裝版
這是封裝版,由于連續調一堆api會有回呼地獄,我用promise來把api存起來
步驟一
在我們小程式專案根目錄創建一個檔案夾,里面是一個js檔案

js檔案中的代碼是
//1.打開藍牙配接器
export const openBluetoothAdapter=()=>{
return new Promise((resolve,reject)=>{
wx.openBluetoothAdapter({
success: (result) => {
resolve(result);
},
fail: (err)=>{
reject(err);
wx.showToast({
title: '請打開藍牙',
icon: 'none'
})
}
})
})
}
//2.查看藍牙配接器狀態
export const getBluetoothAdapterState=()=>{
return new Promise((resolve,reject)=>{
wx.getBluetoothAdapterState({
success: (result) => {
resolve(result);
},
fail: (err)=>{
wx.showToast({
title: '請打開藍牙',
icon: 'none'
})
reject(err);
}
})
})
}
//3.搜索設備
export const startBluetoothDevicesDiscovery=()=>{
return new Promise((resolve,reject)=>{
wx.startBluetoothDevicesDiscovery({
success: (result) => {
resolve(result);
},
fail: (err)=>{
wx.showToast({
title: '搜索設備失敗',
icon: 'none'
})
reject(err);
}
})
})
}
//4.獲取藍牙設備資訊
export const getBluetoothDevices=()=>{
return new Promise((resolve,reject)=>{
wx.getBluetoothDevices({
success: (result) => {
resolve(result);
},
fail: (err)=>{
wx.showToast({
title: '未獲取到設備資訊',
icon: 'none'
})
reject(err);
}
})
})
}
//5.連接設備
export const createBLEConnection=(deviceId)=>{
return new Promise((resolve,reject)=>{
wx.createBLEConnection({
deviceId:deviceId,
success: (result) => {
resolve(result);
},
fail: (err)=>{
wx.showToast({
title: '未連接到藍牙,可能是設備沒通電',
icon: 'none'
})
reject(err);
}
})
})
}
//6.停止掃描設備
export const stopBluetoothDevicesDiscovery=()=>{
return new Promise((resolve,reject)=>{
wx.stopBluetoothDevicesDiscovery({
success: (result) => {
resolve(result);
},
fail: (err)=>{
reject(err);
}
})
})
}
//7.獲取連接設備的service服務
export const getBLEDeviceServices=(deviceId)=>{
return new Promise((resolve,reject)=>{
wx.getBLEDeviceServices({
deviceId:deviceId,
success: (result) => {
console.log("成功")
resolve(result);
},
fail: (err)=>{
wx.showToast({
title: '未能獲取服務',
})
reject(err);
}
})
})
}
//8.獲取連接設備具有讀寫功能服務的所有特征值
export const getBLEDeviceCharacteristics=(deviceId,serviceId)=>{
return new Promise((resolve,reject)=>{
wx.getBLEDeviceCharacteristics({
deviceId:deviceId,
serviceId:serviceId,
success: (result) => {
resolve(result);
},
fail: (err)=>{
reject(err);
}
})
})
}
//9.啟動藍牙設備特征值變化
export const notifyBLECharacteristicValueChange=(deviceId,serviceId,notifyCharacteristicId)=>{
return new Promise((resolve,reject)=>{
wx.notifyBLECharacteristicValueChange({
deviceId:deviceId,
serviceId:serviceId,
characteristicId:notifyCharacteristicId,
state:true,
success: (result) => {
resolve(result);
},
fail: (err)=>{
reject(err);
}
})
})
}
//10.接受藍牙發送的資料
export const onBLECharacteristicValueChange=()=>{
return new Promise((resolve,reject)=>{
wx.onBLECharacteristicValueChange({
success: (result) => {
resolve(result);
},
fail: (err)=>{
reject(err);
}
})
})
}
//11.向藍牙寫入資料
export const writeBLECharacteristicValue=(deviceId,serviceId,writeCharacteristicId,value)=>{
return new Promise((resolve,reject)=>{
wx.writeBLECharacteristicValue({
deviceId:deviceId,
serviceId:serviceId,
characteristicId:writeCharacteristicId,
value:value,
success: (result) => {
wx.showToast({
title: '已成功發送資料,藍牙已打開',
})
resolve(result);
},
fail: (err)=>{
reject(err);
}
})
})
}
//12.關閉藍牙
export const closeBluetoothAdapter=()=>{
return new Promise((resolve,reject)=>{
wx.closeBluetoothAdapter({
success: (result) => {
resolve(result);
},
fail: (err)=>{
wx.showToast({
title: '資料發送成功,但未關閉藍牙,請手動關閉',
icon:'none'
})
reject(err);
}
})
})
}
步驟二
在我們需要連接藍牙的頁面的js檔案中引入上面的js檔案,寫在檔案最上面
注意:我引入時用的相對路徑
import{openBluetoothAdapter,getBluetoothAdapterState,startBluetoothDevicesDiscovery,getBluetoothDevices,createBLEConnection,stopBluetoothDevicesDiscovery,getBLEDeviceServices,getBLEDeviceCharacteristics,notifyBLECharacteristicValueChange,onBLECharacteristicValueChange,writeBLECharacteristicValue,closeBluetoothAdapter} from "../../request/lanya.js";
步驟三
在我們需要連接藍牙的頁面的js檔案的data里,加上必要的資料
//藍牙相關資訊
deviceId:"00:00:00:00:00:00",//藍牙設備id,每個藍牙都不一樣
serviceUUIDSamll:'FFE0',//藍牙可用服務id,用于查詢我們要尋找的服務
serviceId:'',//藍牙服務id全名,用作引數呼叫小程式api
notifyCharacteristicId:'',//該服務的notify特征值
writeCharacteristicId:'',//該服務的write特征值
msg:"1"//要給藍牙發送的資料
步驟四
在我們需要連接藍牙的頁面的js檔案中,添加上三個方法
//向藍牙發送資料
async sendMsg(){
var that=this;
//1.打開藍牙配接器
var res=await openBluetoothAdapter();
console.log("已藍牙配接器")
//2.查看藍牙配接器狀態
res=await getBluetoothAdapterState();
console.log("已查看藍牙配接器狀態")
//3.搜索設備
res =await startBluetoothDevicesDiscovery();
console.log("已搜索設備")
//4.獲取藍牙設備資訊,停一秒再獲取
res =await getBluetoothDevices();
console.log("已獲取藍牙設備資訊")
//5.連接設備
res =await createBLEConnection(that.data.deviceId);
console.log("已連接設備")
//6.停止掃描設備
res =await stopBluetoothDevicesDiscovery();
console.log("已停止掃描設備")
//7.獲取連接設備的service服務
res =await getBLEDeviceServices(that.data.deviceId);
for(let i=0;i<res.services.length;i++){
//把服務id放到陣列中
if(res.services[i].uuid.toUpperCase().indexOf(that.data.serviceUUIDSamll)!=-1){
console.log("服務已找到")
that.setData({
serviceId:res.services[i].uuid
})
break;
}
}
console.log("已獲取連接設備的service服務")
//8.獲取連接設備具有讀寫功能服務的所有特征值
res =await getBLEDeviceCharacteristics(that.data.deviceId,that.data.serviceId);
for(var i=0;i<res.characteristics.length;i++){
//把特征值id輸出到控制臺
console.log("獲取到的特征值id:"+res.characteristics[i].uuid)
if(res.characteristics[i].properties.notify){
console.log("開啟notify的characteristicId:"+res.characteristics[i].uuid);
this.setData({
notifyCharacteristicId:res.characteristics[i].uuid
})
}
//res.characteristics[i].properties.write
if(res.characteristics[i].properties.write){
console.log("開啟write的characteristicId:"+res.characteristics[i].uuid);
this.setData({
writeCharacteristicId:res.characteristics[i].uuid
})
}
}
console.log("已獲取連接設備具有讀寫功能服務的所有特征值")
//9.啟動藍牙設備特征值變化
res =await notifyBLECharacteristicValueChange(that.data.deviceId,that.data.serviceId,that.data.notifyCharacteristicId);
console.log("已啟動藍牙特征值變化")
//10.向藍牙寫入資料
let buffer = that.stringToBytes(that.data.msg);
res =await writeBLECharacteristicValue(that.data.deviceId,that.data.serviceId,that.data.writeCharacteristicId,buffer);
console.log("已發送資料");
//11.關閉藍牙
res =await closeBluetoothAdapter();
},
//byte轉字串
ab2hex(buffer){
var hexArr =Array.prototype.map.call(
new Uint16Array(buffer),
function(bit){
return ('00'+bit.toString(16).slice(-2))
}
)
return hexArr.join('');
},
// 字串轉byte
stringToBytes(str) {
var array = new Uint8Array(str.length);
for (var i = 0, l = str.length; i < l; i++) {
array[i] = str.charCodeAt(i);
}
console.log(array);
return array.buffer;
}
步驟五
當你想要連接藍牙并發送資料的時候,你只需要在data中填寫好相關資料,然后直接呼叫sendMsg方法即可
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279881.html
標籤:其他
下一篇:認識物聯網
