小程序连接蓝牙(保证能用)

一、小程序蓝牙连接api文档地址

https://developers.weixin.qq.com/miniprogram/dev/api/

在这里插入图片描述

二、蓝牙设备ID、服务ID、特征值ID解释

在这里插入图片描述
蓝牙有一个唯一的设备ID,这个设备ID下面有多个服务ID,每个服务ID下面有多个特征值ID,每个特征值ID有相应的读、写、监听等权限。

小程序和蓝牙连接进行通信,主要是1给蓝牙发送数据 2接收蓝牙发过来的数据,调用了那么多的小程序api,就是为了获取有发送权限write,接收权限notify的特征值ID

三、蓝牙连接步骤说明

流程对应代码方法执行的操作
1getUserSetting检测蓝牙是否授权
2initBlue初始化蓝牙设备
3findBlue开始搜索蓝牙设备
4getBlue获取搜索到的设备ID
5connetBlue连接蓝牙设备、关闭蓝牙搜索(省电)、监听蓝牙设备(断开后自动重连)
6getServiceId获取蓝牙服务ID
7getCharacteId获取蓝牙特征值ID
8startNotice开始监听蓝牙数据
9sendOrder给蓝牙发送数据
10onLoad接收蓝牙数据执行业务逻辑
11onUnload离开页面断开蓝牙连接、取消蓝牙监听(省电)

四、小程序源代码

/**获取已授权列表*/
        getUserSetting() {
            console.log("获取已授权列表")
            var that = this;
            wx.getSetting({
                success(res) {
                    var authSetting = res.authSetting
                    console.log(res.authSetting)
                    if (!res.authSetting['scope.bluetooth']) {
                        //授权获取蓝牙权限
                        wx.authorize({
                            scope: 'scope.bluetooth',
                            success() {
                                console.log("成功获取蓝牙权限")
                                that.initBlue()
                            },
                            fail() {
                                console.log("蓝牙权限获取失败")
                            }
                        })
                    } else {
                        that.initBlue()
                    }
                },
                fail(f) {
                    console.log(f)
                }
            })
        },

        /**初始化蓝牙设备*/
        initBlue() {
            console.log("初始化蓝牙")
            var that = this;
            wx.openBluetoothAdapter({
                success: function (res) {
                    that.findBlue()
                },
                fail: function (res) {
                    console.log("e", "请开启蓝牙定位")
                }
            })
        },

        /**开始搜索蓝牙设备*/
        findBlue() {
            var that = this
            wx.startBluetoothDevicesDiscovery({
                allowDuplicatesKey: true,
                interval: 0,
                powerLevel: 'high',
                success: function (res) {
                    console.log("开始搜索蓝牙设备", res)
                    //加个延时,避免获取数据为空
                    setTimeout(() => {
                        that.getBlue()
                    }, 300)
                }
            })
        },

        /**获取搜索到的设备信息*/
        getBlue() {
            var that = this
            wx.getBluetoothDevices({
                success: function (res) {
                    var blueToothList = []
                    for (var i = 0; i < res.devices.length; i++) {
                        if (res.devices[i].name != "未知设备") {
                            console.log("遍历已知蓝牙设备" + i, res.devices[i].deviceId, res.devices[i].name, res.devices[i].RSSI)
                        }
                    }
                },
                fail: function () {
                    console.log("搜索蓝牙设备失败")
                }
            })
        },

        /**获取到设备之后连接蓝牙设备*/
        connetBlue() {
            setTimeout(() => {
                //getBlue里面获取的deviceId
                var deviceId = this.data.deviceId
                var that = this;
                wx.createBLEConnection({
                    deviceId: deviceId,//设备id
                    success: function (res) {
                        console.log("连接蓝牙成功!")
                        wx.stopBluetoothDevicesDiscovery({
                            success: function () {
                                console.log('连接蓝牙成功之后关闭蓝牙搜索,避免耗电');
                            }
                        })
                        //获取蓝牙服务ID
                        that.getServiceId()
                        //连接成功,开始监听蓝牙连接状态,断开后重连
                        that.onStateChange()
                    },
                    fail: function (f) {

                    }
                })
            }, 200)
        },

        /**开始监听蓝牙连接状态*/
        onStateChange() {
            wx.onBLEConnectionStateChange(this.stateChangeFun)
        },

        /**蓝牙状态监听方法*/
        stateChangeFun(res) {
            // 该方法回调中可以用于处理连接意外断开等异常情况
            var connectStatus = res.connected
            if (connectStatus == false) {
                console.log('蓝牙断开重连', `device ${res.deviceId} state has changed, connected: ${res.connected}`)
                this.reconnectBlue()
            }
        },

        /**蓝牙重连*/
        reconnectBlue() {
            var deviceId = this.data.deviceId
            var that = this;
            wx.createBLEConnection({
                deviceId: deviceId,
                success() {
                    console.log("蓝牙重连成功!")
                },
                fail() {
                    that.reconnectBlue()
                }
            })
        },

        /**蓝牙设备的服务uuid*/
        getServiceId() {
            var that = this
            wx.getBLEDeviceServices({
                deviceId: that.data.deviceId,
                success: function (res) {
                    console.log("蓝牙服务信息", res)
                    //[0]这个服务ID下面的特征值ID有notify和write为true的,每个设备不一样,根据你的设备来,可能是[0]也可能是[1]或者其他的
                    var model = res.services[0]
                    that.setData({
                        servicesId: model.uuid,
                    })
                    that.getCharacteId()
                }
            })
        },

        /**查看蓝牙特征值*/
        getCharacteId() {
            var that = this
            wx.getBLEDeviceCharacteristics({
                deviceId: that.data.deviceId,
                serviceId: that.data.servicesId,
                success: function (res) {
                    console.log("蓝牙特征值", res)
                    var model = ""
                    for (var i = 0; i < res.characteristics.length; i++) {
                        model = res.characteristics[i]
                        //接收蓝牙发送过来的数据需要这个uuid
                        if (model.properties.notify == true) {
                            that.setData({ notifyId: model.uuid })
                        }
                        //给蓝牙发送数据需要这个uuid
                        if (model.properties.write == true) {
                            that.setData({ writeId: model.uuid })
                        }
                    }
                    that.startNotice(that.data.notifyId)
                }
            })
        },

        /**监听蓝牙数据*/
        startNotice(uuid) {
            var that = this;
            wx.notifyBLECharacteristicValueChange({
                state: true, // 启用 notify 功能
                deviceId: that.data.deviceId,
                serviceId: that.data.servicesId,
                characteristicId: uuid,
                success: function (res) {

                },
                fail: function (fail) {
                    console.log("蓝牙监听失败!")
                }
            })
        },

        /**发送数据*/
        sendOrder(write) {
            let buffer = this.string2buffer(write);
            let pos = 0;
            let bytes = buffer.byteLength;
            var that = this
            //因为微信小程序使用蓝牙发送数据限制20字节内的原因,需要对超过20字节的数据拆包进行发送
            while (bytes > 0) {
                let tmpBuffer;
                if (bytes > 20) {
                    tmpBuffer = buffer.slice(pos, pos + 20);
                    pos += 20;
                    bytes -= 20;
                } else {
                    tmpBuffer = buffer.slice(pos, pos + bytes);
                    pos += bytes;
                    bytes -= bytes;
                }
                wx.writeBLECharacteristicValue({
                    deviceId: that.data.deviceId,
                    serviceId: that.data.servicesId,
                    characteristicId: that.data.writeId,
                    value: tmpBuffer,
                    success: (res) => {
                        console.log("写入成功", res)
                    },
                    fail: (f) => {
                        console.log("写入失败")
                    }
                })
            }
        },

        /**将16进制转化为ArrayBuffer*/
        string2buffer() {
            return new Uint8Array(str.match(/[\da-f]{2}/gi).map(function (h) {
                return parseInt(h, 16)
            })).buffer
        },

        /**将ArrayBuffer转换成字符串*/
        ab2hex() {
            var hexArr = Array.prototype.map.call(
                new Uint8Array(buffer),
                function (bit) {
                    return ('00' + bit.toString(16)).slice(-2)
                }
            )
            return hexArr.join('');
        },

        /**生命周期函数--监听页面加载*/
        onLoad(options) {
            wx.onBLECharacteristicValueChange(function (res) {
                // 此时可以拿到蓝牙设备返回来的数据是一个ArrayBuffer类型数据,所以需要通过一个方法转换成字符串
                var data = this.ab2hex(res.value)
                //下面写你接收到数据之后的业务逻辑代码
            })
        },

        /**生命周期函数--监听页面隐藏*/
        onUnload() {
            //关闭蓝牙连接状态监听、蓝牙连接,避免耗电
            this.offStateChange()
            this.closeBlue()
        }
  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
是一款专业的 Mac 虚拟机,可在 Windows 与 Mac OS 应用程序之间随意拖放文件并直接从 Mac dock 启动 Windows 程序,能够在 Mac 上以最便捷、快速、高效的方式运行 Windows! 是功能强大灵活度高的虚拟化方案,无论您是需要运行无 Mac 版本的 Windows 程序,还是需要从 PC 切换到 Mac 并需要传输数据, 都能满足您的需求。 适用于 OS X、Windows 10、8.1 和 7、Google Chrome™、Linux 和 Unix,以及 macOS Server。不再需要在 PC 或 Mac 之间进行选择。更适合最新 Windows 10 更新和新版 macOS Mojave (10.)(包括深色模式),提供数十种工具供用户使用, 13 提升了性能,清理驱动器、保护私人文件、下载视频、制作 GIF 等。针对 macOS High Sierra 和 Windows 10 Fall Creators Update 进行了优化。 功能简介: 便捷安全向导:便捷的虚拟机安装向导可直接通过系统镜像包及U盘来安装系统,且能自动查找操作系统无需担心Mac上是否有光驱,也可手动选择媒介类型范围。并保证Mac上和Windows虚拟机中所有一切程序的安全。 多虚拟机支持:Windows、Linux、Chrome OS、Mac OS、Android OS等。 其Linux虚拟机整合可实现共享应用程序、共享配置文件和自动更新 虚拟机管理工具:通过图形模式查看虚拟机使用的 Mac 处理器与内存来监控 Mac 资源。 设备共享:进一步集成整合Windows与Mac,无缝共享Windows与Mac之间的蓝牙设备,Mac废纸篓与Windows回收站整合,只需要管理一个。 超强的安全稳定性:完美的整体性能与超强的稳定性:电池寿命更长、显卡可达 1GB、通过Intel AES-NI加速虚拟机加密,所有的Windows程序都会进行安全加密。 手势共用:Mac和Windows深度整合,可以使用Mac的查字典手势在Windows中查字典。 Safari中引用IE按钮:当网页在 Safari 中运行不好时,点击一下”IE“图标就可以从Safari切换到Internet Explorer中显示该网页。 Outlook:轻松地从桌面拖放文件到Dock图标用以在Windows的Outlook中作为新邮件的附件。 新增功能: 全面支持最新的macOS Sierra系统:这个版本的应用将全面支持最新的macOS Sierra系统,让用户可以在第一时间里享受虚拟机软件的应用,所以已经升级mac操作系统的用户,这个版本更适合。 一键式工具:为了使日常任务尽可能的简化,13作出了这样一套工具,无需复杂的操作只需点击按钮就会弹出一个工具集,可进行:截屏、录音、防睡眠等操作,提高了用户操作的便利性。 性能提升:与之前的版本相比较,访问共享文件夹的速度提高了25%,挂起速度提升60%,拍快照的速度提升25%,电池的续航时间延长10% 以上,这些提升使虚拟机运行更加流畅。 可通过Acronis True Image进行快速增量备份:一年期的Acronis True Image免费订阅,其中包含多达500 GB的云备份存储容量和快速增量备份,这可以让用户能够更好地存储文件,且不会影响系统空间大小。 安全性提高:在Mac和Windows上轻松快速地存档文件,并对文件进行密码保护。 macOS Sierra系统优化存储插件:集成即将问世的macOS Sierra存储优化功能。你可以在本机查看控制虚拟机 VM存储。 支持将密码存储在Mac密钥链中:你可以在本机mac密钥链中存储并管理你所有密码,其中包括:Windows、Internet Explorer 和 Microsoft Edge,这样会更加方便使用。 Office 365无缝集成:无缝集成可以实现在本地 Windows Office 应用程序中打开 Safari 中的 Word、Excel 或 PowerPoint文档。 “请勿打扰”模式:通过临时禁用所有干扰(包括应用程序和OS通知)并防止您的Mac进入休眠状态来提高你的使用效率。 Finder 中的 EXE 文件图标:现在 Windows EXE 文件图标显示在 Finder 中。 计划 Windows 更新:计划您想要进行 Windows 更新的时间,并避免烦人的通知和 Windows 意外重启。 Retina支持:Retina 显示屏支持智能调整大小,各个显示屏具备独立的屏幕分辨率,可以帮助 mac Retina 显示屏连接额外的外部显示器。 随时可用:您可以随时准备使用 。
如何安全使用智能手机全文共2页,当前为第1页。如何安全使用智能手机全文共2页,当前为第1页。如何安全使用智能手机 如何安全使用智能手机全文共2页,当前为第1页。 如何安全使用智能手机全文共2页,当前为第1页。 如何安全使用智能手机 安全是生命的唯一保证。我们要永远把"安全"二字铭记在自己的心中!下面和小编一起来看如何安全使用智能手机,希望有所帮助! 一、如何安全的使用智能手机 1、为手机设置访问密码是保护手机安全的.第一道防线,以防智能手机丢失时,犯罪分子可能会获得通讯录、文件等重要信息并加以利用。 2、不要轻易打开陌生人通过手机发送的链接和文件;为手机设置锁屏密码,并将手机随身携带。 3、在QQ、微信等应用程序中关闭地理定位功能,并仅在需要时开启蓝牙;经常为手机数据做备份;安装安全防护软件,并经常对手机系统进行扫描。 4、到权威网站下载手机应用软件,并在安装时谨慎选择相关权限;不要试图破解自己的手机,以保证应用程序的安全性。 二、如何保护手机支付安全 1、利用手机中的各种安全保护功能,为手机、SIM卡设置密码并安装安全软件,减少手机中的本地分享,对程序执行权限加以限制。 2、谨慎下载应用,尽量从正规网站下载手机应用程序和升级包,对手机中的Web站点提高警惕。 3、禁用Wi-Fi自动连接到网络功能,使用公共Wi-Fi有可能被盗用资料;下载软件或游戏时,应详细阅读授权内容,防止将木马带到手机中。 4、勿见二维码就刷。 三、防范骚扰电话、诈骗、垃圾短信 1、克服"贪利"思想,不要轻信,谨防上当;接到培训通知、以银行信用卡中心名义声称银行卡升级、招工、婚介类等信息时,要多做调查。 2、不要轻易将自己或家人的身份、通讯信息等家庭、个人资料给如何安全使用智能手机全文共2页,当前为第2页。如何安全使用智能手机全文共2页,当前为第2页。他人,对涉及亲人和朋友求助、借钱等内容的短信和电话,要仔细核对;不要轻信涉及加害、举报等内容的陌生短信或电话,既不要理睬,更不要为"消灾"将钱款汇入犯罪分子指定的账户。 如何安全使用智能手机全文共2页,当前为第2页。 如何安全使用智能手机全文共2页,当前为第2页。 3、对于广告"推销"特殊器材、违禁品的短信和电话,应不予理睬并及时清除,不要汇款购买。 4、到银行自动取款机(ATM机)存取遇到银行卡被堵、被吞等意外情况,应认真识别自动取款机"提示"的真伪,不要轻信。 如何安全使用智能手机
设计注意事项: 1 、 L5/C23/C25 开关电源电路,布局时尽量靠近 SW 引脚,走线尽量短和宽,不要有过孔。 L5 请使用绕线电感或功率叠层电感 10uH ,阻抗尽量小一些,额定电流大于 120mA ,内阻小于 0.5R 。 2 、 PGND 不分地,就近大面积连接到数字地; FMVSS 不分地,就近接数字 GND 。 3 、 DAC 模拟部分走线应尽量远离开关电源部分,远离 GND 走线。 4 、 PR1 , PR2 , PR3 为唤醒 IO ,高低电平都可以唤醒。按键开关机唤醒请使用 PR2 口低电平 唤醒,因 PR2 长按有复位功能 ( 低电平复位有效 ) ,可解决特殊情况死机不开机问题。 5 、主控所有电源的退耦电容必须靠近芯片放置,退耦电容的回路地必须最短回到该电源地 6 、主控不断电,最低待机功耗大概 4uA 以下,对于有更低待机功耗要求的客户 , 请使用 MOS 管软开关机电路,电路请参考附件。 7 、为保证产品的安全可靠性,电池必须使用带保护板的电池。 8 、对 FM 要求比较高的客户,请预留 FM 放大电路, FM 放大电路请参考附图。 FM 匹配电路和放大电路铺 GND 数字地,必须保证铺地的完整性, FM 信号线铺地间距至少 0.6MM 以上 FM 设计调试请参阅 9 、 PWM 口最多可支持到 6 路,用于带频谱灯的立体声蓝牙耳机。 10 、 USBDP 、 USBDM 请预留测试点,以备开发升级程序用。 11 、充电请使用充电 IC ,并预留限流电阻位到主控 LDOIN 脚。
### 回答1: 小程序通过蓝牙发送JSON的过程如下: 首先,小程序需要获取用户的授权,以使用蓝牙功能。这可以通过调用小程序的`wx.authorize`方法来实现。用户在授权之后,小程序将能够访问蓝牙设备的功能。 接下来,小程序需要搜索并连接到目标蓝牙设备。可以通过调用小程序的`wx.startBluetoothDevicesDiscovery`方法来搜索周围的蓝牙设备。一旦找到目标设备,可以通过调用`wx.createBLEConnection`方法来与该设备建立连接连接成功后,小程序可以使用`wx.writeBLECharacteristicValue`方法向蓝牙设备发送数据。可以将JSON数据转换为字符串,并将其作为参数传递给该方法。该方法将数据发送到蓝牙设备上的指定特征值。 蓝牙设备接收到数据后,可以进行相应的处理。如果设备期望通过蓝牙发送响应,可以将响应数据写入到特定的特征值中,然后小程序可以使用`wx.onBLECharacteristicValueChange`监听该特征值,以获取设备的响应数据。 最后,当小程序不再需要与蓝牙设备通信时,可以调用`wx.closeBLEConnection`方法来断开与设备的连接。 总而言之,小程序通过蓝牙发送JSON的过程包括授权、搜索设备、建立连接、发送数据、接收响应和断开连接等步骤。通过调用相应的小程序API,可以轻松实现与蓝牙设备的通信。 ### 回答2: 小程序作为一种轻量级的应用程序,可以通过内置的蓝牙功能向外部设备发送JSON数据。 首先,小程序需要先获取设备的蓝牙权限,并确保设备的蓝牙功能是可用的。然后,通过小程序提供的API接口,可以搜索并连接到目标蓝牙设备。 在成功连接到目标设备后,小程序可以使用蓝牙模块提供的方法,如writeBLECharacteristicValue发送JSON数据。首先,需要将JSON数据转换为字节数组,可以使用JSON.stringify将JSON对象转换为字符串,再使用TextEncoder将字符串转换为字节数组。 然后,使用writeBLECharacteristicValue方法向蓝牙设备发送转换后的字节数组。该方法需要传入三个参数,即蓝牙设备的deviceId、serviceId和写入数据的characteristicId。 发送数据后,可以通过监听蓝牙模块的onBLECharacteristicValueChange事件来获取设备返回的数据。当接收到数据时,会触发该事件,并通过事件回调函数的参数传回接收到的数据。 需要注意的是,在发送和接收数据之前,需要保证蓝牙连接处于打开和已连接状态。同时,还需要处理异常情况,如设备连接失败、写入数据失败等,可以通过监听蓝牙模块的相关事件来进行处理。 综上所述,小程序可以利用内置的蓝牙功能,通过发送JSON数据的方式与外部设备进行通信。通过获取权限、连接设备、发送数据和接收数据等步骤,可以实现小程序蓝牙设备发送JSON的功能。 ### 回答3: 小程序蓝牙发送JSON可以通过以下步骤实现。 首先,小程序需要通过wx.openBluetoothAdapter()方法打开蓝牙适配器,以便能够与蓝牙设备进行通信。 然后,使用wx.startBluetoothDevicesDiscovery()方法开始搜索附近的蓝牙设备,并在搜索到设备后,使用设备的deviceId和name等信息进行蓝牙连接连接成功后,使用wx.onBLEConnectionStateChange()方法监听蓝牙连接状态变化,并通过wx.createBLEConnection()方法与蓝牙设备建立连接连接成功后,使用wx.writeBLECharacteristicValue()方法向蓝牙设备发送数据。在发送之前,需要将需要发送的JSON转换为二进制数据,可以使用wx.setBLEMTU()设置BLE通道的数据传输最大字节数,以提高传输效率。 发送数据之后,通过wx.onBLECharacteristicValueChange()方法监听蓝牙设备的返回数据,并通过wx.readBLECharacteristicValue()方法来读取设备返回的数据。 最后,断开蓝牙连接可以使用wx.closeBLEConnection()方法,关闭蓝牙适配器可以使用wx.closeBluetoothAdapter()方法。 通过以上步骤,小程序就可以成功向蓝牙设备发送JSON数据了。需要注意的是,不同的蓝牙设备可能有不同的通信协议和数据格式,需要根据具体情况进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值