【问题标题】:How to Check if an Paired Bluetooth device is a Printer or a Scanner (Android)如何检查配对的蓝牙设备是打印机还是扫描仪 (Android)
【发布时间】:2014-12-04 19:11:26
【问题描述】:

希望能帮到我 我正在开发一个 Android 应用程序,需要连接蓝牙设备,如扫描仪和打印机,目前我可以列出所有已配对的设备,但我想知道配对的设备是打印机、扫描仪、手机等。

有什么方法可以知道配对的蓝牙设备的种类?

【问题讨论】:

    标签: java android bluetooth


    【解决方案1】:

    接受的答案过于笼统,因为 UUID 0001101-0000-1000-8000-00805F9B34FB 断言设备具有串行端口功能,而许多非打印机设备具有这种 UUID。

    您应该评估完整的 CoD,在此 link 您可以为您需要识别的服务提取准确的位掩码,对于打印机来说是:

    0b000001000000011010000000

    有了这个,你可以在完整的设备 CoD 上做一个掩码:

    private static boolean isAPrinter(BluetoothDevice device){
        int printerMask = 0b000001000000011010000000;
        int fullCod = device.getBluetoothClass().hashCode();
        Log.d(TAG, "FULL COD: " + fullCod);
        Log.d(TAG, "MASK RESULT " + (fullCod & printerMask));
        return (fullCod & printerMask) == printerMask;
    }
    

    【讨论】:

      【解决方案2】:

      我有一个想法,可能对你有帮助。

      for (BluetoothDevice device : pairedDevices)
      {
          String deviceBTMajorClass = getBTMajorDeviceClass(device.getBluetoothClass().getMajorDeviceClass());
          if (D) Log.d(TAG, "deviceBTMajorClass"+deviceBTMajorClass);
          //btArrayAdapter.add(deviceBTName + "\n"+ deviceBTMajorClass);
          data.add(device.getName() + "\n" + device.getAddress());
      }
      
      private String getBTMajorDeviceClass(int major) {
          switch (major) {
              case BluetoothClass.Device.Major.AUDIO_VIDEO:
                  return "AUDIO_VIDEO";
              case BluetoothClass.Device.Major.COMPUTER:
                  return "COMPUTER";
              case BluetoothClass.Device.Major.HEALTH:
                  return "HEALTH";
              case BluetoothClass.Device.Major.IMAGING:
                  return "IMAGING";
              case BluetoothClass.Device.Major.MISC:
                  return "MISC";
              case BluetoothClass.Device.Major.NETWORKING:
                  return "NETWORKING";
              case BluetoothClass.Device.Major.PERIPHERAL:
                  return "PERIPHERAL";
              case BluetoothClass.Device.Major.PHONE:
                  return "PHONE";
              case BluetoothClass.Device.Major.TOY:
                  return "TOY";
              case BluetoothClass.Device.Major.UNCATEGORIZED:
                  return "UNCATEGORIZED";
              case BluetoothClass.Device.Major.WEARABLE:
                  return "AUDIO_VIDEO";`enter code here`
              default:
                  return "unknown!";
          }
      }
      

      【讨论】:

        【解决方案3】:

        总之,

        是的,你可以。你 可以通过使用设备的UUID 来做到这一点。如果您知道设备的 UUID,您可以从报告的 UUID 中匹配它们,并知道哪个配对设备是什么。

        类似这样的:

        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
        
        Method getUuidsMethod = BluetoothAdapter.class.getDeclaredMethod("getUuids", null);
        
        ParcelUuid[] uuids = (ParcelUuid[]) getUuidsMethod.invoke(adapter, null);
        

        现在只需将检索到的 UUID 与已知的设备 UUID(在线或盒子上)进行比较。

        如果它们匹配,您就会知道它是什么设备。

        注意:最常见的 UUID(扫描仪、打印机、鼠标)具有通用 UUID 0001101-0000-1000-8000-00805F9B34FB

        了解getUUID() 方法、paracable 方法、Method java 类,最后是Java.util.UUID.

        【讨论】:

        • 谢谢,我找到了另一种方法,但它会很有用
        • 好吧,因为我只想过滤与打印机配对的设备,我使用设备的 BluetoothClass,所以我使用 1536(成像)和 1280(外围)的所有设备过滤 getMajorDeviceClass() ,所以它解决了我的问题,但感谢您的回答,也许以后会帮助我
        • 明白了。它不是特定于应用程序的。
        • UUIDS 永远不会改变。它是特定于硬件的,这就是它是通用标识符的原因。另外,更改它会带来安全风险,因此会违反蓝牙协议。
        • @MaxPinto 那么解决方案是什么?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多