当前位置: 首页 > 知识库问答 >
问题:

Android系统,如何正确扫描和过滤UUID

江永安
2023-03-14

我正在Android上使用BluetoothLe(最小API: 21)。目前过滤服务uuid的过程有效,但不完全如预期的那样。下面是用于设置基本扫描仪参数的代码段,这是目前有效的。基于Ble的其他工作领域,(iOS,嵌入式硬件)很明显,有能力仅根据其16位UUID分配来过滤Ble设备。这让我想到Android...我意识到android对Ble及其相当细分的设备生态系统有一个相当艰难的开始,但我不明白android如何/为什么不能像其他平台一样遵循与UUID类似的路径。由于所有来自蓝牙SIG的UUID都是16位标识符,只有UUID_BASE(00000000-0000-1000-8000-00805F9B34FB)的定义。

...
// devices UUID service
ParcelUuid parcelUuid = new ParcelUuid(UUID.fromString("1F0E0D0C-0B0A-0909-0807-060504030201"));
// devices UUID service mask
ParcelUuid parcelUuidMask = new ParcelUuid(UUID.fromString("00000D0C-0000-0000-0000-000000000000"));

// Filters and Settings
scanFilter = new ScanFilter.Builder().setServiceUuid(parcelUuid, parcelUuidMask).build();
scanFilterList.add(scanFilter);
scanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).build();

// Scanning Started
mBluetoothLeScanner.startScan(scanFilterList, scanSettings, scanCallback);
...

综上所述,我有两个嵌入式硬件设备,它们广播各自的两个UUID服务,这两个服务彼此非常相似,但也不尽相同。下面是这些UUID,在所有帐户中,只有MSB(最重要的字节)是它们之间的区别。此外,设备名称也不同。

Device One:
Service 1 - 1F0E0D0C-0B0A-0909-0807-060504030201
Service 2 - 2F0E0D0C-0B0A-0909-0807-060504030201

Device Two:
Service 1 - EF0E0D0C-0B0A-0909-0807-060504030201
Service 2 - FF0E0D0C-0B0A-0909-0807-060504030201

Common Identifier amongst the UUID's:
0x0D0C

从前面提供的代码段来看,setServiceUuid方法中使用的ParcelUuid似乎需要精确匹配,以便扫描仪甚至返回设备,尽管需要匹配掩码。那么,您是如何向驱动程序/硬件发出请求,仅通过16位标识符而不是完整的128位标识符进行过滤的??因为我在上面介绍的模型中使用了两个不同的设备,每个设备的服务UUID都不同于其他设备,因此无法扫描并返回所需或预期的所有设备。

我觉得我遇到的问题是双重的,但需要解决,因为我似乎在任何地方都找不到答案。我到处搜索了所有论坛帖子,堆叠了涉及这个主题的问题/答案,但似乎没有一个弹出我正在寻找的内容。我不确定我对在android上过滤的理解是否有错误,android是否缺少功能,或者无法在提供的android类中找到此类功能。我对如何在软件中完成这个“功能”有一些想法,但它会相当难看、耗时且耗电。一个这样的例子是公开扫描并手动过滤。但是我认为在扫描设备时,应该有一个支持128位和16位UUID过滤的功能。

谁能帮我弄清楚这件事吗????

另外,我为这篇帖子的篇幅感到抱歉。。。

共有3个答案

孙翰墨
2023-03-14

您应该根据MAC地址过滤BLE,它们过滤起来很有魅力,也许如果您找到了UUID过滤的解决方案,请分享。

鱼旺
2023-03-14

我不确定你到底想过滤什么,但如果你只是想应用过滤器????0D0C-??-??-??-??-????????????,您应该将PARCELUID设置为00000 d0c-0000-0000-0000-000000000000,并将PARCELUIDMASK设置为0000FFFF-0000-0000-0000-000000000000。

司徒运锋
2023-03-14
filter:  1F0E0D0C-0B0A-0909-0807-060504030201
mask:    0000FFFF-0000-0000-0000-000000000000

结果是包含任何具有“0D0C”的设备。您可能需要一个比这更相似的“更紧”的过滤器。

 类似资料:
  • 我正在为课堂做作业。由于某种原因,程序完全跳过了用户应该键入变量的部分。我想不出任何理由为什么它会以这种方式运行,因为我的其余代码位于部分之后(它要求诸如和类型之类的东西)工作正常且有序。

  • 我必须创建一个java类,我可以从标准控制台读取一些命令。这就像模拟网格中的运动。我很难完全创建我想要的东西。假设我有这样的命令: 从X、Y、方向开始 步子 “X”和“Y”是矩阵6x6的坐标。“方向”可以是“上”、“下”、“左”、“右”。如果我写“步骤”,我会做一步。 程序应该丢弃STEP命令,直到有效的START命令被执行。之后,我可以使用STEP或另一个有效的START命令,它将使用新的坐标将

  • 把这部分的log摘取出来. 以org.nutz.resource下的log为准 2015-03-30 10:49:49,383 org.nutz.resource.Scans.<init>(Scans.java:484) DEBUG - Locations for Scans: [JarResourceLocation [jarPath=D:\nutzbook\apache-tomcat-8.0.

  • 我必须构建一个Android应用程序,用于读取一种设备上的信息,该设备仅在过滤时在扫描时显示(一般扫描不会显示它)。该设备类似于信标,因此它仅通告数据,这些数据在通告上具有我想要的信息(它不可连接)。制造商给我的过滤器是原始数据。即: 0x02010612435542 我不能按名称过滤它,因为设备不会宣传它的名称。我也不能通过来完成,因为应用程序以前不会知道设备的地址(这将是许多此类设备)。 nr

  • 有办法通过android扫描开放的网络端口吗?例如,在阻止我通过某些端口发送UDP数据包的防火墙后面。那么,有没有一种方法可以扫描哪些端口没有被防火墙阻止接入互联网呢?也许是一个终端应用程序或以编程的方式?

  • 我是AWS和Dynamo的新手。我正在使用React.js前端和AWS(Gateway API、Lambda、Dynamo)后端进行我的项目。这是我的应用位置: https://www.alphaux.com 单击“获取提示”后,我收到服务器响应。如果我单击一个关键字-这些关键字将添加到请求的GET参数列表中,如:topic=blah 以下是我的问题的详细信息: 在我的Lambda中:…const