更新记录
v1.0.2025.02.10(2025-02-20)
1、增加A2DP相关接口。 2、增加手机与手机之间通过经典蓝牙通信的服务端接口。 3、修复Android12某些监听不回调的bug。 4、优化Uniapp Demo,更加直观。
v1.0.2023.09.09(2023-09-11)
1、增加同时连接多个蓝牙的功能。 2、可注册和注销连接状态回调监听 3、可注册和注销数据回调监听 4、可查询某参数下连接状态。 5、可一键断开所有连接。
v1.0.2023.09.01(2023-09-04)
1、增加蓝牙搜索后,设备类型(经典、BLE) 2、修复其他bug。
查看更多平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:4.4 - 12.0 | armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 | × |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
前言
XM-Bluetooth2是一款在Android中使用经典蓝牙的插件,因为iOS的经典蓝牙API需要通过MFI,且网上基本没有相关的资料,故暂时不支持iOS。目前较为完美的支持Android,可同时连接多个蓝牙设备,接收和发送数据。需要帮助,请联系作者,QQ:1804945430(备注来源)。
使用前必读(很重要)
蓝牙分为经典蓝牙和低功耗蓝牙(BLE),经典蓝牙是较早的技术,早于BLE蓝牙,优点是数据传输量较大,速度很快,但使用复杂,大部分时候需要先配对使用,且功耗较高,目前多用于大数据传输时使用,如设备OTA。而低功耗蓝牙(BLE)则不需要配对,设备广播时就能携带一些信息,不需要配对即可连接,更加灵活。设备有单模(仅支持经典蓝牙或仅支持低功耗蓝牙)、双模(既支持经典蓝牙又支持低功耗蓝牙)。使用时请一定要判别【回调的数据里有typeDesc,LE表示低功耗,DUAL表示双模、CLASSIC表示经典、UNKNOWN表示未知】。
BLE插件在这
https://ext.dcloud.net.cn/plugin?id=13870
不会使用插件看这里哦
https://blog.csdn.net/dashenid/article/details/129725810
使用说明
使用时,先仔细看上面的描述,再导入HBuilderX的Demo进行验证使用使用。有不懂的地方随时问我。
<template>
<div>
<button type="primary" @click="hasPermission">检查是否有蓝牙权限</button>
<button type="primary" @click="isSupport">检查设备是否支持蓝牙</button>
<button type="primary" @click="isOpen">判断蓝牙是否打开</button>
<button type="primary" @click="openBT">打开蓝牙</button>
<button type="primary" @click="closeBT">关闭蓝牙</button>
<button type="primary" @click="listBondedBT">获取已配对列表</button>
<button type="primary" @click="searchBT">查找蓝牙设备</button>
<button type="primary" @click="stopSearch">停止查找蓝牙</button>
<button type="primary" @click="connect">连接蓝牙</button>
<button type="primary" @click="sendBytes">发送字节数组</button>
<button type="primary" @click="sendHexStr">发送十六进制字符串</button>
<button type="primary" @click="sendGBKStr">发送GBK字符</button>
<button type="primary" @click="isConnected">连接状态</button>
<button type="primary" @click="pairBT">配对</button>
<text>2023-09-09更新</text>
<button type="primary" @click="createBond">新配对</button>
<button type="primary" @click="removeBond">取消配对</button>
<button type="primary" @click="disconnectAll">断开所有连接</button>
<button type="primary" @click="checkConnect">检查连接</button>
<button type="primary" @click="registerReceivedCallback">注册数据接收回调</button>
<button type="primary" @click="unRegisterReceivedCallback">注销数据接收回调</button>
<button type="primary" @click="registerConnectStatusChangeCallback">注册连接状态回调</button>
<button type="primary" @click="unRegisterConnectStatusChangeCallback">注销连接状态回调</button>
<button type="primary" @click="sendData">发送数据(整合版)</button>
<text>2023-09-25更新</text>
<button type="primary" @click="startServer">开启服务(手机与手机之间连接发送消息,被连接端)</button>
<button type="primary" @click="stopServer">停止</button>
<text>2025-02-07更新</text>
<button type="primary" @click="registerGlobeEventListener">设置全局监听事件(蓝牙开关,A2DP连接等)</button>
<button type="primary" @click="unregisterGlobeEventListener">反注册全局监听事件</button>
<button type="primary" @click="isA2dpConnected">A2DP是否已连接</button>
<button type="primary" @click="listA2dpBT">获取A2DP已连接列表</button>
<button type="primary" @click="connectA2dp">连接A2DP设备</button>
<button type="primary" @click="disconnectA2dp">断开连接A2DP设备</button>
</div>
</template>
<script>
// 获取 module
var blueModule = uni.requireNativePlugin("XM-Bluetooth2Module")
const modal = uni.requireNativePlugin('modal');
export default {
onLoad() {
},
onShow: function() {
console.log('Page Show')
},
onHide: function() {
console.log('Page Hide')
},
methods: {
hasPermission() {
blueModule.hasPermission((ret) => {
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
});
},
isSupport() {
blueModule.isSupport((ret) => {
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
});
},
isOpen() {
blueModule.isOpen((ret) => {
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
});
},
openBT() {
blueModule.openBT((ret) => {
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
});
},
closeBT() {
blueModule.closeBT((ret) => {
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
});
},
listBondedBT() {
blueModule.listBondedBT((ret) => {
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
});
},
searchBT() {
blueModule.searchBT((ret) => {
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
});
},
stopSearch() {
blueModule.stopSearch();
},
//连接
connect() {
blueModule.connect({
MACAddress: 'DC:73:85:0B:E0:B9',
uuid: '00001101-0000-1000-8000-00805f9b34fb',
sleepTime: 50 //接收对面设备发来的信息刷新间隔
}, (result) => {
//连接结果
console.log(result)
modal.toast({
message: result,
duration: 1.5
});
}, (data) => {
//接收的数据回调
console.log(data)
modal.toast({
//发送操作结果
message: data,
duration: 1.5
});
})
},
//断开连接
disConnect() {
blueModule.disconnect({
MACAddress: 'DC:73:85:0B:E0:B9',
uuid: '00001101-0000-1000-8000-00805f9b34fb',
sleepTime: 50 //接收对面设备发来的信息刷新间隔
}, (result) => {
//连接结果
console.log(result)
modal.toast({
message: result,
duration: 1.5
});
});
},
//写入数据
sendBytes() {
blueModule.sendBytes([0x00, 0xff, 0xee], (result) => {
//结果
console.log(result)
modal.toast({
message: result,
duration: 1.5
});
});
},
sendGBKStr() {
var ret = blueModule.sendGBKStr('我是gbk', (result) => {
//结果
console.log(result)
modal.toast({
message: result,
duration: 1.5
});
});
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
},
sendHexStr() {
var ret = blueModule.sendHexStr('FFFF', (result) => {
//结果
console.log(result)
modal.toast({
message: result,
duration: 1.5
});
});
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
},
sendUtf8Str() {
var ret = blueModule.sendUtf8Str('我是utf-8', (result) => {
//结果
console.log(result)
modal.toast({
message: result,
duration: 1.5
});
});
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
},
pairBT() {
blueModule.pairBT({
mac: ''
}, (ret) => {
console.log(ret);
modal.toast({
message: ret,
duration: 1.5
});
});
},
isConnected() {
var ret = blueModule.isConnected();
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
},
createBond() {
blueModule.createBond({
mac: ''
}, (ret) => {
console.log(ret);
modal.toast({
message: ret,
duration: 1.5
});
});
},
removeBond() {
blueModule.removeBond({
mac: ''
}, (ret) => {
console.log(ret);
modal.toast({
message: ret,
duration: 1.5
});
});
},
disconnectAll() {
blueModule.disconnectAll((ret) => {
console.log(ret);
modal.toast({
message: ret,
duration: 1.5
});
});
},
checkConnect() {
blueModule.checkConnect({
mac: '',
uuid: ''
}, (ret) => {
console.log(ret);
modal.toast({
message: ret,
duration: 1.5
});
});
},
registerReceivedCallback() {
blueModule.registerReceivedCallback((ret) => {
console.log(ret);
modal.toast({
message: ret,
duration: 1.5
});
});
},
unRegisterReceivedCallback() {
blueModule.unRegisterReceivedCallback();
},
registerConnectStatusChangeCallback() {
blueModule.registerConnectStatusChangeCallback((ret) => {
console.log(ret);
modal.toast({
message: ret,
duration: 1.5
});
});
},
unRegisterConnectStatusChangeCallback() {
blueModule.unRegisterConnectStatusChangeCallback();
},
sendData() {
blueModule.sendData({
mac: '',
uuid: '',
bytes: [0xFF, 0xF0],//优先级第一
hexStr: 'FFF0',//优先级第二
utf8: '你好',//优先级第三
gbk: '你好',//优先级第四
ascii: 'abcd'//优先级第五
}, (ret) => {
console.log(ret);
modal.toast({
message: ret,
duration: 1.5
});
});
},
//开启服务
startServer() {
blueModule.startServer({
uuid: '00001101-0000-1000-8000-00805f9b34fb'
}, (result) => {
//连接结果
console.log(result)
modal.toast({
message: result,
duration: 1.5
});
}, (data) => {
//接收的数据回调
console.log(data)
modal.toast({
//发送操作结果
message: data,
duration: 1.5
});
})
},
stopServer() {
blueModule.stopServer((ret) => {
//停止服务结果
console.log(ret)
modal.toast({
message: ret,
duration: 1.5
});
});
},
registerGlobeEventListener() {
blueModule.registerGlobeEventListener((ret) => {
//停止服务结果
console.log(ret)
modal.toast({
message: ret,
duration: 1.5
});
});
},
unregisterGlobeEventListener() {
blueModule.unregisterGlobeEventListener((ret) => {
//停止服务结果
console.log(ret)
modal.toast({
message: ret,
duration: 1.5
});
});
},
isA2dpConnected() {
var ret = blueModule.isA2dpConnected();
console.log(ret)
modal.toast({
//发送操作结果
message: ret,
duration: 1.5
});
},
listA2dpBT() {
blueModule.listA2dpBT((ret) => {
//停止服务结果
console.log(ret)
modal.toast({
message: ret,
duration: 1.5
});
});
},
connectA2dp() {
blueModule.connectA2dp({
MACAddress: '50:1B:6A:11:A4:43'
}, (result) => {
//连接结果
console.log(result)
modal.toast({
message: result,
duration: 1.5
});
}, (data) => {
//接收的数据回调
console.log(data)
modal.toast({
//发送操作结果
message: data,
duration: 1.5
});
})
},
disconnectA2dp() {
blueModule.disconnectA2dp({
MACAddress: '50:1B:6A:11:A4:43'
},(ret) => {
//停止服务结果
console.log(ret)
modal.toast({
message: ret,
duration: 1.5
});
});
}
}
}
</script>