Android 蓝牙开发与 12/S 系统适配

  • 蓝牙通信方式
    1. 经典蓝牙(Bluetooth Classic)通信:
      • 经典蓝牙通信通常用于在较短的距离内传输大量数据,例如音频流、文件传输等。
      • 在 Android 中,你可以使用 BluetoothAdapter 和 BluetoothSocket 类来建立经典蓝牙连接,并进行数据传输。
      • 经典蓝牙通信通常需要进行配对和授权,以确保通信的安全性。
    2. 蓝牙低功耗(Bluetooth Low Energy,BLE)通信:
      • BLE 通信适用于低功耗设备和周期性数据传输场景,例如健康监测、传感器数据采集等。
      • 在 Android 中,BLE 通信通常使用 BluetoothLeScanner 和 BluetoothGatt 类来实现。
      • BLE 通信不需要配对,通常以连接为基础,并且支持广播、订阅通知等特性。

权限适配参考

https://juejin.cn/post/7320169878644031488

https://www.cnblogs.com/fly263/p/16715525.html

https://blog.csdn.net/qq_17189617/article/details/135291784

流写数据

https://cloud.tencent.com.cn/developer/article/2310635

https://www.jb51.net/article/263206.htm

复制代码
  * 客户端设置
    * 单击事件
    * */
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String s = arrayAdapter.getItem(position);
        String address = s.substring(s.indexOf(":") + 1).trim();//获取蓝牙IP
  
        try {
            if (bluetoothAdapter.isDiscovering()) {
                bluetoothAdapter.cancelDiscovery();//若当前蓝牙被使用,则关闭重新启用
            }
            try {
                if (device == null) {//若未连接,则获得远程设备
                    device = bluetoothAdapter.getRemoteDevice(address);
                }
                if (clientSocket == null) {
                    clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
                    clientSocket.connect();//连接蓝牙
                    os = clientSocket.getOutputStream();//客户端向服务端输出文本
  
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (os != null) {
                os.write("发送信息到其他设备".getBytes("utf-8"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

https://www.cnblogs.com/Free-Thinker/p/11507349.html

读写特征判断

  • 判断服务是否有读或者写权限 用或运算

    复制代码
      				// 获取特征的 UUID
                      val characteristicUUID = characteristic.uuid
                      // 检查特征的属性
                      val properties = characteristic.properties
                      // 判断特征是否可读写
                      if (properties and (BluetoothGattCharacteristic.PROPERTY_READ or BluetoothGattCharacteristic.PROPERTY_WRITE) > 0) {
                          // 特征可读写,打印其 UUID
                          LogUtils.e("Characteristic UUID", characteristicUUID.toString())
                      } 
  • 判断服务是否有 读写 通知权限 这边用与运算

    复制代码
       @SuppressLint("MissingPermission")
      fun findGattService(gatt: BluetoothGatt?): BluetoothGattService? {
          var service: BluetoothGattService? = null
    
          if (gatt != null) {
              LogUtils.e("findGattService 当前设备:           ${gatt.device.name}")
              val bgsList = gatt.services
              label@ for (gattService in bgsList) {
                  val uuid = gattService!!.uuid.toString()
                  if (gattService.type == BluetoothGattService.SERVICE_TYPE_PRIMARY) {
    
                  }
                  LogUtils.e(" gattService服务UUID            $uuid               ${gattService.type}       ")
                  for (characteristic in gattService.characteristics) {
                      // 获取特征的 UUID
                      val characteristicUUID = characteristic.uuid
                      // 检查特征的属性
                      val properties = characteristic.properties
                      // 判断特征是否可读写
                      if (properties and (BluetoothGattCharacteristic.PROPERTY_READ or BluetoothGattCharacteristic.PROPERTY_WRITE) > 0) {
                          // 特征可读写,打印其 UUID
                          LogUtils.e("Characteristic UUID", characteristicUUID.toString())
                      }
    
    
                      var isRead = (characteristic.properties and BluetoothGattCharacteristic.PROPERTY_READ) > 0
                      var isWrite = (characteristic.properties and BluetoothGattCharacteristic.PROPERTY_WRITE) > 0
                      var isNotify = (characteristic.properties and BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0
                      if (isRead) {
                          UUID_RECEIVE_CHARACTERISTIC = characteristic.uuid.toString()
                          LogUtils.e("写特征  $UUID_RECEIVE_CHARACTERISTIC")
                      }
                      if (isWrite) {
                          UUID_SEND_CHARACTERISTIC = characteristic.uuid.toString()
                          LogUtils.e("读特征  $UUID_SEND_CHARACTERISTIC")
                      }
                      if (isNotify) {
                          CLIENT_CHARACTERISTIC_CONFIG = characteristic.uuid.toString()
                          LogUtils.e("通知特征  $CLIENT_CHARACTERISTIC_CONFIG")
                      }
                      if (isWrite and isWrite and isNotify) {
                          UUID_GATT_SERVICE = gattService.uuid.toString()
                          service = gattService
                          break@label
                      }
                  }
              }
          }
          return service
      }

    特征判断参考

    https://blog.51cto.com/u_16213401/9599749

相关推荐
雨白7 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹8 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空10 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭11 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日12 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安12 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑12 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟16 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡17 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi0017 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体