ALTEBeacon传递字符串仅显示前两位字符问题排查求助
解决AltBeacon传递字符串仅显示前两个字符的问题
嗨,我来帮你搞定这个问题!你遇到的字符串只显示前两个字符的情况,本质是AltBeacon的标准字段长度限制在搞鬼~
问题根源
AltBeacon的核心ID字段(Id1/Id2/Id3)都有严格的长度限制:
Id1是16字节的UUID,用来标识大的分组Id2是2字节(16位整数),最多只能存2个ASCII字符Id3是4字节(32位整数),最多存4个ASCII字符
你应该是把字符串直接塞进了Id2这类短字段里,所以"Paulo"的前两个字节"Pa"被保留,后面的"ulo"直接被截断了。
正确解决方案:用厂商自定义字段传递长字符串
要传递任意长度的字符串,应该用AltBeacon的厂商自定义数据字段,这个字段没有严格的长度限制(只要符合BLE广播包的总长度上限,一般能存几十字节)。
修改你的代码如下:
if (Build.VERSION.SDK_INT >= 21) { device.setText("supported"); String stringToTransmit = "Paulo"; byte[] stringToTransmitAsAsciiBytes = stringToTransmit.getBytes(StandardCharsets.US_ASCII); // 构建Beacon实例,用厂商字段存字符串 Beacon beacon = new Beacon.Builder() .setId1("你的UUID") // 替换成你自己的标准UUID(比如"2f234454-cf6d-4a0f-adf2-f4911ba9ffa6") .setId2("1") // 可选,填1-65535之间的数值字符串即可 .setId3("1") // 可选,填1-4294967295之间的数值字符串即可 .setManufacturer(0x0118) // AltBeacon标准的厂商代码 .setManufacturerData(stringToTransmitAsAsciiBytes) // 把字符串字节数组放到自定义字段 .build(); // 启动广播 BeaconTransmitter transmitter = new BeaconTransmitter(context, new AltBeaconParser()); transmitter.startAdvertising(beacon); }
接收端如何获取完整字符串
在接收端的回调里,通过getManufacturerData()拿到字节数组,再转成字符串即可:
@Override public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { for (Beacon beacon : beacons) { byte[] manufacturerData = beacon.getManufacturerData(); if (manufacturerData != null && manufacturerData.length > 0) { String receivedString = new String(manufacturerData, StandardCharsets.US_ASCII); // 这里就能拿到完整的"Paulo"了 Log.d("BeaconDemo", "收到的字符串:" + receivedString); } } }
额外提醒
如果一定要用ID字段传递内容,只能把字符串拆分到Id2+Id3里(最多存6个ASCII字符),但这不是AltBeacon的设计初衷,厂商自定义字段才是用来传递自定义数据的正确方式哦~
内容的提问来源于stack exchange,提问作者Paulo Pérez
相关产品推荐
相关产品推荐

