first push!
This commit is contained in:
101
Assets/Shatalmic/Example/iBeaconExample/iBeaconExampleScript.cs
Normal file
101
Assets/Shatalmic/Example/iBeaconExample/iBeaconExampleScript.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
|
||||
public class iBeaconExampleScript : MonoBehaviour
|
||||
{
|
||||
public GameObject iBeaconItemPrefab;
|
||||
|
||||
private float _timeout = 0f;
|
||||
private float _startScanTimeout = 10f;
|
||||
private float _startScanDelay = 0.5f;
|
||||
private bool _startScan = true;
|
||||
private Dictionary<string, iBeaconItemScript> _iBeaconItems;
|
||||
|
||||
// Use this for initialization
|
||||
void Start ()
|
||||
{
|
||||
_iBeaconItems = new Dictionary<string, iBeaconItemScript> ();
|
||||
|
||||
BluetoothLEHardwareInterface.Initialize (true, false, () => {
|
||||
|
||||
_timeout = _startScanDelay;
|
||||
|
||||
BluetoothLEHardwareInterface.BluetoothScanMode (BluetoothLEHardwareInterface.ScanMode.LowLatency);
|
||||
BluetoothLEHardwareInterface.BluetoothConnectionPriority (BluetoothLEHardwareInterface.ConnectionPriority.High);
|
||||
},
|
||||
(error) => {
|
||||
|
||||
BluetoothLEHardwareInterface.Log ("Error: " + error);
|
||||
|
||||
if (error.Contains ("Bluetooth LE Not Enabled"))
|
||||
BluetoothLEHardwareInterface.BluetoothEnable (true);
|
||||
});
|
||||
}
|
||||
|
||||
public float Distance (float signalPower, float rssi, float nValue)
|
||||
{
|
||||
return (float)Math.Pow (10, ((signalPower - rssi) / (10 * nValue)));
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update ()
|
||||
{
|
||||
if (_timeout > 0f)
|
||||
{
|
||||
_timeout -= Time.deltaTime;
|
||||
if (_timeout <= 0f)
|
||||
{
|
||||
if (_startScan)
|
||||
{
|
||||
_startScan = false;
|
||||
_timeout = _startScanTimeout;
|
||||
|
||||
// scanning for iBeacon devices requires that you know the Proximity UUID and provide an Identifier
|
||||
BluetoothLEHardwareInterface.ScanForBeacons (new string[] { "01020304-0506-0708-0910-111213141516:Pit01" }, (iBeaconData) => {
|
||||
|
||||
if (!_iBeaconItems.ContainsKey (iBeaconData.UUID))
|
||||
{
|
||||
BluetoothLEHardwareInterface.Log ("item new: " + iBeaconData.UUID);
|
||||
var newItem = Instantiate (iBeaconItemPrefab);
|
||||
if (newItem != null)
|
||||
{
|
||||
BluetoothLEHardwareInterface.Log ("item created: " + iBeaconData.UUID);
|
||||
newItem.transform.SetParent (transform);
|
||||
newItem.transform.localScale = new Vector3 (1f, 1f, 1f);
|
||||
|
||||
var iBeaconItem = newItem.GetComponent<iBeaconItemScript> ();
|
||||
if (iBeaconItem != null)
|
||||
_iBeaconItems[iBeaconData.UUID] = iBeaconItem;
|
||||
}
|
||||
}
|
||||
|
||||
if (_iBeaconItems.ContainsKey (iBeaconData.UUID))
|
||||
{
|
||||
var iBeaconItem = _iBeaconItems[iBeaconData.UUID];
|
||||
iBeaconItem.TextUUID.text = iBeaconData.UUID;
|
||||
iBeaconItem.TextRSSIValue.text = iBeaconData.RSSI.ToString ();
|
||||
|
||||
// Android returns the signal power or measured power, iOS hides this and there is no way to get it
|
||||
iBeaconItem.TextAndroidSignalPower.text = iBeaconData.AndroidSignalPower.ToString ();
|
||||
|
||||
// iOS returns an enum of unknown, far, near, immediate, Android does not return this
|
||||
iBeaconItem.TextiOSProximity.text = iBeaconData.iOSProximity.ToString ();
|
||||
|
||||
// we can only calculate a distance if we have the signal power which iOS does not provide
|
||||
if (iBeaconData.AndroidSignalPower != 0)
|
||||
iBeaconItem.TextDistance.text = Distance (iBeaconData.AndroidSignalPower, iBeaconData.RSSI, 2.5f).ToString ();
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
BluetoothLEHardwareInterface.StopScan ();
|
||||
_startScan = true;
|
||||
_timeout = _startScanDelay;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user