This example uses the BLE2 library to continuously scan for BLE devices, looking for iBeacons.
It never connects to any device. It parses the advertising data and calculates the distance based on the RSSI level (it is pretty inaccurate).
The important code is in the Starter service module.
It starts scanning with the AllowDuplicates parameter set to true.
Whenever a device is found, the data is parsed and it raises a StateChanged event:
			
				B4X:
			
		
		
		Sub Manager_DeviceFound (Name As String, Id As String, AdvertisingData As Map, RSSI As Double)
   Dim key As Int = -1 'type is important. Must be Int.
   If AdvertisingData.ContainsKey(key) Then
     Dim b() As Byte = AdvertisingData.Get(key)
     If b.Length > 4 And b(0) = 0x4c And b(1) = 0 And b(2) = 0x02 And b(3) = 0x15 Then
       Dim beacon As Beacon
       beacon.Initialize
       Dim raf As RandomAccessFile
       raf.Initialize3(b, False)
       Dim hex As String = bc.HexFromBytes(b)
       beacon.uuid = hex.SubString2(8, 40) 'bytes 4 - 19
       beacon.uniqueid = hex.SubString2(8, 48) 'this also includes the major and minor parts
       beacon.major = raf.ReadShort(20)
       beacon.minor = raf.ReadShort(22)
       Dim tx As Byte = raf.ReadSignedByte(24)
       beacon.distance = CalculateDistance(tx, RSSI)
       beacon.time = DateTime.Now
       beacons.Put(beacon.uniqueid, beacon)
       CallSub(Main, "StateChanged")
     End If
   End If
End Sub
	In the Activity code, we go over the beacons and create or update CLV items.
Beacons that were not updated in the last 30 seconds are removed.
The example depends on ByteConverter library.
It is recommended to use the BeaconParser class instead of the code above: https://www.b4x.com/android/forum/t...iscover-ibeacons-and-eddystone-beacons.61127/
Attachments
			
				Last edited: