123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- const uuid3 = '0C76801A-62EB-45E5-96A8-37C8882ABB2B'
- const serviceId = 'D0611E78-BBB4-4591-A5F8-487910AE4366'
- const characteristicId = '8667556C-9A37-4C91-84ED-54EE27D90049'
- // 上面需要配置主机的 serviceId 和 characteristicId
- // ArrayBuffer转16进制字符串示例
- // function ab2hex(buffer) {
- // const hexArr = Array.prototype.map.call(
- // new Uint8Array(buffer),
- // function (bit) {
- // return ('00' + bit.toString(16)).slice(-2)
- // }
- // )
- // return hexArr.join('')
- // }
- function inArray(arr, key, val) {
- for (let i = 0; i < arr.length; i++) {
- if (arr[i][key] === val) {
- return i
- }
- }
- return -1
- }
- // slave/slave.js
- Page({
- onShareAppMessage() {
- return {
- title: '蓝牙',
- path: 'packageAPI/pages/device/slave/slave'
- }
- },
- data: {
- theme: 'light',
- connects: [],
- servers: []
- },
- onLoad() {
- this.setData({
- theme: wx.getSystemInfoSync().theme || 'light'
- })
- if (wx.onThemeChange) {
- wx.onThemeChange(({theme}) => {
- this.setData({theme})
- })
- }
- wx.onBLEPeripheralConnectionStateChanged(res => {
- console.log('connect')
- const connects = this.data.connects
- const idx = inArray(connects, 'deviceId', res.deviceId)
- if (idx >= 0) {
- connects[idx] = res
- } else {
- connects.push(res)
- }
- this.setData({connects})
- })
- },
- openBluetoothAdapter() {
- // 初始化蓝牙模块
- wx.openBluetoothAdapter({
- mode: 'peripheral',
- success: (res) => {
- console.log('openBluetoothAdapter success', res)
- this.createBLEPeripheralServer()
- },
- fail: (res) => {
- console.log(res)
- wx.showToast({
- title: `创建失败 错误码: ${res.errCode}`,
- icon: 'none'
- })
- if (res.errCode === 10001) {
- wx.onBluetoothAdapterStateChange(function (res) {
- console.log('onBluetoothAdapterStateChange', res)
- if (res.available) {
- this.createBLEPeripheralServer()
- }
- })
- }
- }
- })
- },
- createBLEPeripheralServer() {
- //
- wx.createBLEPeripheralServer().then(res => {
- console.log('createBLEPeripheralServer', res)
- this.data.servers.push(res.server)
- this.server = res.server
- this.setData({
- serverId: this.server.serverId
- })
- wx.showToast({
- title: '创建 server ',
- })
- this.server.onCharacteristicReadRequest(res => {
- const {serviceId, characteristicId, callbackId} = res
- const buffer = new ArrayBuffer(1)
- const dataView = new DataView(buffer)
- const newValue = Math.ceil(Math.random() * 10)
- dataView.setUint8(0, newValue)
- console.log('onCharacteristicReadRequest', res, newValue)
- this.server.writeCharacteristicValue({
- serviceId,
- characteristicId,
- value: buffer,
- needNotify: true,
- callbackId
- })
- })
- // 监听收到数据
- this.server.onCharacteristicWriteRequest(res => {
- console.log('onCharacteristicWriteRequest', res)
- const {
- serviceId, characteristicId, value, callbackId
- } = res
- wx.showToast({
- title: '收到主机数据'
- })
- this.server.writeCharacteristicValue({
- serviceId,
- characteristicId,
- value,
- needNotify: true,
- callbackId
- })
- })
- return res
- }).catch(() => {})
- },
- closeServer() {
- if (this.server) {
- this.server.close()
- wx.showToast({
- title: '关闭 server',
- })
- }
- },
- chaneMode() {
- wx.navigateBack()
- },
- onConfirm(e) {
- console.log('onConfirm')
- const n = e.detail.value * 1
- const buffer = new ArrayBuffer(1)
- const dataView = new DataView(buffer)
- dataView.setUint8(0, n)
- if (!this.server) {
- wx.showModal({
- title: '请先创建server',
- })
- return
- }
- this.server.writeCharacteristicValue({
- serviceId,
- characteristicId,
- value: buffer,
- needNotify: true
- })
- wx.showModal({
- title: '写入成功',
- content: '请在主机查看'
- })
- },
- showInput() {
- this.setData({
- input: !this.data.input
- })
- },
- addService() {
- const buffer = new ArrayBuffer(1)
- const dataView = new DataView(buffer)
- dataView.setUint8(0, 2)
- const descriptorBuffer = new ArrayBuffer(1)
- const dataView2 = new DataView(descriptorBuffer)
- dataView2.setInt8(0, 3)
- const service = {
- uuid: serviceId,
- characteristics: [{
- uuid: characteristicId,
- properties: {
- write: true,
- read: true,
- notify: true,
- indicate: true
- },
- permission: {
- readable: true,
- writeable: true,
- readEncryptionRequired: true,
- writeEncryptionRequired: true
- },
- value: buffer,
- descriptors: [{
- uuid: uuid3,
- permission: {
- write: true,
- read: true
- },
- value: descriptorBuffer
- }]
- }]
- }
- if (!this.server) {
- wx.showModal({
- title: '请先创建server',
- })
- return
- }
- this.server.addService({
- service
- }).then(res => {
- console.log('add Service', res)
- wx.showToast({
- title: '创建服务',
- })
- return res
- }, (rej) => {
- console.log(rej)
- if (rej.errCode === 10001) {
- wx.showToast({
- title: '请打开蓝牙',
- })
- } else {
- wx.showModal({
- title: '创建失败',
- content: `错误码: ${rej.errCode}`
- })
- }
- }).catch(() => {})
- },
- removeService() {
- if (!this.server) return
- this.server.removeService({
- serviceId
- }).then(res => {
- wx.showToast({
- title: '关闭服务',
- })
- console.log('removeService', res)
- return res
- }).catch(() => {})
- },
- startAdvertising() {
- if (!this.server) {
- wx.showModal({
- title: '请先创建server',
- })
- return
- }
- const buffer = new ArrayBuffer(1)
- const dataView = new DataView(buffer)
- dataView.setInt8(0, 4)
- this.server.startAdvertising({
- advertiseRequest: {
- connectable: true,
- deviceName: 'sanford',
- serviceUuids: [serviceId],
- manufacturerData: [{
- manufacturerId: 'sanfordsun-pc0',
- manufacturerSpecificData: buffer
- }]
- },
- powerLevel: 'medium'
- }).then(res => {
- console.log('startAdvertising', res)
- wx.showToast({
- title: '开启广播',
- })
- return res
- }).catch(() => {})
- },
- stopAdvertising() {
- if (!this.server) {
- wx.showModal({
- title: '请先创建server',
- })
- return
- }
- this.server.stopAdvertising()
- wx.showToast({
- title: '关闭广播',
- })
- },
- closeBluetoothAdapter() {
- wx.showToast({
- title: '结束流程',
- })
- wx.closeBluetoothAdapter()
- },
- onUnload() {
- this.data.servers.forEach(() => {
- // server.close()
- })
- },
- })
|