zoukankan      html  css  js  c++  java
  • 小程序蓝牙BLE——自动连接设备(手环)

    了解小程序蓝牙API:

    /** 
        *蓝牙API: 
        * 1.初始化蓝牙(判断蓝牙是否可用);openBluetoothAdapter
        * 2.获取蓝牙设备状态(蓝牙是否打开);getBluetoothAdapterState
        * 3.监控蓝牙打开/关闭的动作;onBluetoothAdapterStateChange
        * 4.开始搜索周围是否有设备;startBluetoothDevicesDiscovery
        * 5.获取周围设备列表;getBluetoothDevices
        * 6.停止搜索周围设备,减少消耗资源;stopBluetoothDevicesDiscovery
        * 7.过滤目标设备;
        * 8.是否已经连接蓝牙设备:
        *           a.获取已经连接的蓝牙设备;getConnectedBluetoothDevices
        *           b.创建新的低功耗蓝牙设备连接deviceId;createBLEConnection
        * 9.获取设备的信息
        *           a.获取蓝牙设备的服务码;getBLEDeviceServices
        *           b.获取蓝牙设备的特征值;getBLEDeviceCharacteristics
        *           c.获取蓝牙设备的write和notify服务;readBLECharacteristicValue
        * 10.向蓝牙设备写入指令;writeBLECharacteristicValue
        * 11.只有,开启蓝牙设备的notify提醒功能;notifyBLECharacteristicValueChange
        * 12.才能,监听接受蓝牙设备返回的数据;onBLECharacteristicValueChange
        * 13.断开低功耗的蓝牙连接;closeBLEConnection
        * 14.关闭蓝牙,释放资源:closeBluetoothAdapter
        * 
        * */
    

     编程逻辑步骤:

    /**
         * 第一部分:蓝牙设配器
         * 1.微信小程序:是否支持
         * 2.手机蓝牙:是否可用;
         * 3.手机蓝牙:是否开启
         * 4.监听开启手机蓝牙状态的事件
         * 
         */ 
    
    
     /**
         * 第二部分:开启搜索、过滤、连接、关闭搜索
         * 1.搜索设备;
         * 2.获取设备列表;
         * 3.连接设备,成功后关闭实时搜索;
         *
         * */
    
     /**
         * 第三部分:服务值、特征、write和notify服务
         * 1.获取服务值;
         * 2.特征;
         * 3.write和notify服务
         * 
         * */
    
     /**
         * 第四部分:向蓝牙写入指令、监控接受数据
         * 1.写入指令;
         *     对应命令转为16进制的形式
         *      START   = [83, 84, 65, 82, 84]+时间戳
         *      STOP    = [83, 84, 79, 80]
         *      REQDATA = [82, 69, 81, 68, 65, 84, 65]
         *      AUTO_ACC= [   ...]    
         * 2.监控接收数据;
         * 
         * */
    
     /**
         * 第五部分:断开连接
         * 1.断开蓝牙;
         * 2.清楚缓存
         * */
    

     断开后、自动连接(半成熟):

     wx.onBluetoothAdapterStateChange();//监听蓝牙适配器状态变化事件,判断连接状态;

     wx.getConnectedBluetoothDevices();//是否有已连接设备,否根据安卓deviceId||苹果uuid唯一识别符重新: wx.getBLEDeviceServices()-->....-->wx.createBLEConnection() 重新自动连接;

    附录:蓝牙设备的硬件的知识点:

    硬件字节

    ArrayBuffer:类型化数组,JavaScript操作二进制数据的一个接口。 WebGL,指浏览器与显卡之间的通信接口,为了满足JavaScript与显卡之间大量的、实时的数据交换,它们之间的数据通信必须是二进制的,而不能是传统的文本格式。 比如,以文本格式传递一个32位整数,两端的JavaScript脚本与显卡都要进行格式转化,将非常耗时。这时要是存在一种机制,可以像C语言那样,直接操作字节,然后将4个字节的32位整数,以二进制形式原封不动地送入显卡,脚本的性能就会大幅提升。 类型化数组(Typed Array)就是在这种背景下诞生的。它很像C语言的数组,允许开发者以数组下标的形式,直接操作内存。有了类型化数组以后,JavaScript的二进制数据处理功能增强了很多,接口之间完全可以用二进制数据通信。

    ArrayBuffer作为内存区域,可以存放多种类型的数据。不同数据有不同的存储方式,这就叫做“视图”。目前,JavaScript提供以下类型的视图:

    Int8Array:8位有符号整数,长度1个字节。

    Uint8Array:8位无符号整数,长度1个字节。

    Int16Array:16位有符号整数,长度2个字节。

    Uint16Array:16位无符号整数,长度2个字节。

    Int32Array:32位有符号整数,长度4个字节。

    Uint32Array:32位无符号整数,长度4个字节。

    Float32Array:32位浮点数,长度4个字节。

    Float64Array:64位浮点数,长度8个字节。

    parseInt(s, 16)//十六进制字符串转字节数组

    str.toString(16)//字节数组转十六进制字符串

    float:浮点数
    unsigned:无符号
    int :向下取整
    char:字符

    ArrayBuffer:类型化数组

    客户端要产生一个唯一的标识符:deviceId、MAC地址、AndroidId:

    AndroidId:

      获取AndroidId是不需要权限的但是AndroidId是可能变的,AndroidId是在用户第一次激活这个设备时产生的所以当用户重置手机时AndroidId会产生变化,理论上这个AndroidId是可以接受的毕竟重置手机这个事发生也不会太频繁;

    MAC地址:

      可以使用WIFI的MAC地址来作为标识符,感觉现阶段这种方式比较可靠总结如下:Mac地址是唯一的,直接产生在硬件上基本上不会变更;

    DeviceId:

      区别设备唯一设备ID。

     其他:

    1、profile 

      profile可以理解为一种规范,一个标准的通信协议,它存在于从机中。蓝牙组织规定了一些标准的profile,例如 HID OVER GATT ,防丢器 ,心率计等。每个profile中会包含多个service,每个service代表从机的一种能力。蓝牙设备可以包括多个Profile,一个Profile中有多个Service,

    2、service服务

      service可以理解为一个服务,在ble从机中,通过有多个服务,例如电量信息服务、系统信息服务等,每个service中又包含多个characteristic特征值。每个具体的characteristic特征值才是ble通信的主题。比如当前的电量是80%,所以会通过电量的characteristic特征值存在从机的profile里,这样主机就可以通过这个characteristic来读取80%这个数据;一个Service中有多个Characteristic,

    3、characteristic特征

      characteristic特征值,例如:read、notify、write等特征…;ble主从机的通信均是通过characteristic的read、write来实现,可以 理解为一个标签,通过这个标签可以获取或者写入想要的内容。

    4、UUID

      UUID,统一识别码,我们刚才提到的service和characteristic,都需要一个唯一的uuid来标识

      每个从机都会有一个叫做profile的东西存在,不管是上面的自定义的simpleprofile,还是标准的防丢器profile,他们都是由一些列service组成,然后每个service又包含了多个characteristic,主机和从机之间的通信,均是通过characteristic来实现。

      实际产品中,每个蓝牙4.0的设备都是通过服务和特征来展示自己的,服务和特征都是用UUID来唯一标识的。一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征。特征是与外界交互的最小单位。蓝牙设备硬件厂商通常都会提供他们的设备里面各个服务(service)和特征(characteristics)的功能,比如哪些是用来交互(读写),哪些可获取模块信息(只读)等。比如说,一台蓝牙4.0设备,用特征A来描述自己的出厂信息,用特征B来与收发数据等。

    参考:

    蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)
    实战分享,教你蓝牙在小程序中的应用

  • 相关阅读:
    使用IDEA工具配置和运行vue项目(详细其中的坑)
    VSCode打开已有vuejs项目
    vue中遇到的问题:Error: Cannot find module 'chalk'
    Qt源码分析之信号和槽机制(QMetaObject是一个内部struct)
    “ping”命令的原理就是向对方主机发送UDP数据包,HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”
    程序员保值的4个秘密(要当语言和框架方面的专家,高难技术,业务,算法,产品意识与思维(把细节做好))
    C++ 多线程阻塞 (多线程同步)(MsgWaitForMultipleObjects)(连着消息一起控制,牛)
    兴趣与坚持:程序员从初级到中级10个秘诀(要学另一门语言,学会搜索,找到真正令你着迷的东西,不能为工资、要真正享受工作)
    Spring MVC 数据回显
    内存问题检测神器:Valgrind
  • 原文地址:https://www.cnblogs.com/yancongyang/p/9724037.html
Copyright © 2011-2022 走看看