2014-09-25 119 views
0

我已将https://github.com/AltBeacon/android-beacon-library的2.0-beta6版本集成到我的Android应用程序中。打开调试后,我看到我的Roximity iBeacons被看到,但由于字节意外而被信标解析器拒绝。例外设置(示例)使用Android Beacon Library的iBeacon解析器布局

在参考应用有以下注意事项:

// By default the AndroidBeaconLibrary will only find AltBeacons. If you wish to make it 
    // find a different type of beacon, you must specify the byte layout for that beacon's 
    // advertisement with a line like below. The example shows how to find a beacon with the 
    // same byte layout as AltBeacon but with a beaconTypeCode of 0xaabb 
    // 
    // beaconManager.getBeaconParsers().add(new BeaconParser(). 
    //  setBeaconLayout("m:2-3=aabb,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25")); 
    // 
    // In order to find out the proper BeaconLayout definition for other kinds of beacons, do 
    // a Google search for "setBeaconLayout" (including the quotes in your search.) 

我创造了我认为是正确的格式的字符串(在执法机关对我的测试应用足够好),并试图以非常以下设置防守代码:

 List<BeaconParser> beaconParsers = beaconManager.getBeaconParsers(); 
     if (beaconParsers != null) { 
      // We can add a new parser 
      String roximityBeaconParser = this.getRoximityBeaconParserString(); 
      BeaconParser beaconParser = new BeaconParser(); 
      Log.e("iBeacon", "About to set BeaconLayout with " + roximityBeaconParser); 
      try { 
       beaconParser.setBeaconLayout(roximityBeaconParser); 
       beaconParsers.add(beaconParser); 
      } catch (BeaconLayoutException e) { 
       e.printStackTrace(); 
      } 
     } 

我自己的字符串导致了错误,所以我改变了我的函数来获取解析器串简单的例子,从注复制:

private String getRoximityBeaconParserString() { 
    String result = "m:2-3:beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"; 

    return result; 
} 

的代码,尝试设置解析器串线导致BeaconLayoutException:

beaconParser.setBeaconLayout(roximityBeaconParser); 

的异常堆栈跟踪没有有用的信息,说什么是错的字符串。

我在做什么错?

回答

2

好吧,算了一下。我从解析器函数的注释中复制了这个例子,它有一个冒号而不是一个平等的字符 - 具有讽刺意味的是,解析器函数的注释是错误的。因此

m:2-3:beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25 

是错误的,而

m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25 

是正确的。区别在于“m:2-3”字符后面的“=”字符。

仅供参考,解析代码在The Parsing Source Code发现有以下模式:

private static final Pattern I_PATTERN = Pattern.compile("i\\:(\\d+)\\-(\\d+)(l?)"); 
private static final Pattern M_PATTERN = Pattern.compile("m\\:(\\d+)-(\\d+)\\=([0-9A-F-a-f]+)"); 
private static final Pattern D_PATTERN = Pattern.compile("d\\:(\\d+)\\-(\\d+)([bl]?)"); 
private static final Pattern P_PATTERN = Pattern.compile("p\\:(\\d+)\\-(\\d+)"); 

这是该字符串对分析。

从文档中不清楚的是,解析函数需要一个(单个)电源(“p”)元素,需要一个(单个)匹配(“m”)元素以及至少一个标识符(“i “)元素有效。否则会引发异常。

由于我们无法看到/调试到解析器方法,我最终将顶级方法复制到我的类(以及它所依赖的初始化变量),然后调用函数的本地副本来找出为什么它在抱怨。最大的问题是,如果有一个术语(逗号分隔值之一)与模式不完全匹配,那么会抛出一个通用的“无法解析这个术语”的异常,这并不容易调试。因此,我复制了该函数并调用它来查看抛出的内容和原因。

+0

感谢您排除故障,并为此感到遗憾。在GitHub中打开一个针对开源库的问题? – davidgyoung 2014-09-26 17:47:43

+0

@davidgyoung当然 - 我会尽力在这个周末完成。如果我不那么唠叨我,万一我忘了。在缺少术语时出现的异常消息(复制/粘贴错误)中也存在错误 - 有两个“您需要一个术语”消息。我会把所有这些放在我的缺陷报告中。伟大的图书馆,目前专注于为什么我现在没有收到通知解析器识别我的iBeacon。知道源代码在github上的位置使得这一点变得如此简单。 – Colin 2014-09-26 17:54:39