Merge remote-tracking branch 'origin/dev_mobile_ble' into dev_mobile
# Conflicts: # Assets/Plugins/Android/AndroidManifest.xml # Assets/Plugins/Android/AndroidManifest.xml.meta # Assets/Plugins/iOS.meta # Assets/Scripts/App.cs # Assets/Scripts/Devices/MainDeviceAdapter.cs # Assets/Scripts/Scenes/LoginController.cs # Assets/Scripts/Scenes/Ride/Scripts/PlayerController.cs
This commit is contained in:
commit
f155b2b627
60 files changed
+4602
-65
No files matched your search
@@ -1,17 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
|
||||
<application>
|
||||
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" >
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools" android:installLocation="preferExternal">
|
||||
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
|
||||
<application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:isGame="true">
|
||||
<activity android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:hardwareAccelerated="false" android:name="com.unity3d.player.UnityPlayerActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
|
||||
<data android:scheme="powerfunx" android:host="app" />
|
||||
</intent-filter>
|
||||
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
|
||||
<uses-permission android:name="android.permission.BLUETOOTH"/>
|
||||
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>
|
||||
</manifest>
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 506e447c8b55f0449ae2b5b5ed37dd99
|
||||
guid: 4abd69b18c4ab45ec976851430122248
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,32 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f158ceee465c745bc89002ae57bc033e
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Android: Android
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,391 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class BluetoothDeviceScript : MonoBehaviour
|
||||
{
|
||||
#if UNITY_IOS
|
||||
public Dictionary<string, string> BLEStandardUUIDs = new Dictionary<string, string>();
|
||||
#endif
|
||||
|
||||
public List<string> DiscoveredDeviceList;
|
||||
|
||||
public Action InitializedAction { get; set; }
|
||||
public Action DeinitializedAction;
|
||||
public Action<string> ErrorAction;
|
||||
public Action<string> ServiceAddedAction;
|
||||
public Action<int> BleStatusChangedAction;
|
||||
public Action StartedAdvertisingAction;
|
||||
public Action StoppedAdvertisingAction;
|
||||
public Action<string, string> DiscoveredPeripheralAction;
|
||||
public Action<string, string, int, string[]> DiscoveredPeripheralWithAdvertisingInfoAction;
|
||||
public Action<BluetoothLEHardwareInterface.iBeaconData> DiscoveredBeaconAction;
|
||||
public Action<string, string> RetrievedConnectedPeripheralAction;
|
||||
public Action<string, byte[]> PeripheralReceivedWriteDataAction;
|
||||
public Action<string> ConnectedPeripheralAction;
|
||||
public Action<string> ConnectedDisconnectPeripheralAction;
|
||||
public Action<string> DisconnectedPeripheralAction;
|
||||
public Action<string, string> DiscoveredServiceAction;
|
||||
public Action<string, string, string> DiscoveredCharacteristicAction;
|
||||
public Action<string> DidWriteCharacteristicAction;
|
||||
public Dictionary<string, Dictionary<string, Action<string>>> DidUpdateNotificationStateForCharacteristicAction;
|
||||
public Dictionary<string, Dictionary<string, Action<string, string>>> DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction;
|
||||
public Dictionary<string, Dictionary<string, Action<string, byte[]>>> DidUpdateCharacteristicValueAction;
|
||||
public Dictionary<string, Dictionary<string, Action<string, string, byte[]>>> DidUpdateCharacteristicValueWithDeviceAddressAction;
|
||||
public Action<string, int> RequestMtuAction;
|
||||
|
||||
// Use this for initialization
|
||||
void Start ()
|
||||
{
|
||||
DiscoveredDeviceList = new List<string> ();
|
||||
DidUpdateNotificationStateForCharacteristicAction = new Dictionary<string, Dictionary<string, Action<string>>> ();
|
||||
DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction = new Dictionary<string, Dictionary<string, Action<string, string>>> ();
|
||||
DidUpdateCharacteristicValueAction = new Dictionary<string, Dictionary<string, Action<string, byte[]>>> ();
|
||||
DidUpdateCharacteristicValueWithDeviceAddressAction = new Dictionary<string, Dictionary<string, Action<string, string, byte[]>>> ();
|
||||
|
||||
#if UNITY_IOS
|
||||
BLEStandardUUIDs["Heart Rate Measurement"] = "00002A37-0000-1000-8000-00805F9B34FB";
|
||||
#endif
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update ()
|
||||
{
|
||||
}
|
||||
|
||||
const string deviceInitializedString = "Initialized";
|
||||
const string deviceDeInitializedString = "DeInitialized";
|
||||
const string deviceErrorString = "Error";
|
||||
const string deviceServiceAdded = "ServiceAdded";
|
||||
const string deviceStartedAdvertising = "StartedAdvertising";
|
||||
const string deviceStoppedAdvertising = "StoppedAdvertising";
|
||||
const string deviceDiscoveredPeripheral = "DiscoveredPeripheral";
|
||||
const string deviceDiscoveredBeacon = "DiscoveredBeacon";
|
||||
const string deviceRetrievedConnectedPeripheral = "RetrievedConnectedPeripheral";
|
||||
const string devicePeripheralReceivedWriteData = "PeripheralReceivedWriteData";
|
||||
const string deviceConnectedPeripheral = "ConnectedPeripheral";
|
||||
const string deviceDisconnectedPeripheral = "DisconnectedPeripheral";
|
||||
const string deviceDiscoveredService = "DiscoveredService";
|
||||
const string deviceDiscoveredCharacteristic = "DiscoveredCharacteristic";
|
||||
const string deviceDidWriteCharacteristic = "DidWriteCharacteristic";
|
||||
const string deviceDidUpdateNotificationStateForCharacteristic = "DidUpdateNotificationStateForCharacteristic";
|
||||
const string deviceDidUpdateValueForCharacteristic = "DidUpdateValueForCharacteristic";
|
||||
const string deviceLog = "Log";
|
||||
const string deviceRequestMtu = "MtuChanged";
|
||||
const string bleStatusChanged = "BleStatusChanged";
|
||||
|
||||
public void OnBluetoothMessage (string message)
|
||||
{
|
||||
if (message != null)
|
||||
{
|
||||
char[] delim = new char[] { '~' };
|
||||
string[] parts = message.Split (delim);
|
||||
if (parts[0].Equals("DeviceStateChanged"))
|
||||
{
|
||||
//throw new Exception("test");
|
||||
}
|
||||
if (parts[0].Equals(bleStatusChanged))
|
||||
{
|
||||
if (BleStatusChangedAction != null)
|
||||
{
|
||||
BleStatusChangedAction(int.Parse(parts[1]));
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < parts.Length; ++i)
|
||||
BluetoothLEHardwareInterface.Log(string.Format("Part: {0} - {1}", i, parts[i]));
|
||||
|
||||
if (message.Length >= deviceInitializedString.Length && message.Substring (0, deviceInitializedString.Length) == deviceInitializedString)
|
||||
{
|
||||
if (InitializedAction != null)
|
||||
InitializedAction ();
|
||||
}
|
||||
else if (message.Length >= deviceLog.Length && message.Substring (0, deviceLog.Length) == deviceLog)
|
||||
{
|
||||
BluetoothLEHardwareInterface.Log (parts[1]);
|
||||
}
|
||||
else if (message.Length >= deviceDeInitializedString.Length && message.Substring (0, deviceDeInitializedString.Length) == deviceDeInitializedString)
|
||||
{
|
||||
BluetoothLEHardwareInterface.FinishDeInitialize ();
|
||||
|
||||
if (DeinitializedAction != null)
|
||||
DeinitializedAction ();
|
||||
}
|
||||
else if (message.Length >= deviceErrorString.Length && message.Substring (0, deviceErrorString.Length) == deviceErrorString)
|
||||
{
|
||||
string error = "";
|
||||
|
||||
if (parts.Length >= 2)
|
||||
error = parts[1];
|
||||
|
||||
if (ErrorAction != null)
|
||||
ErrorAction (error);
|
||||
}
|
||||
else if (message.Length >= deviceServiceAdded.Length && message.Substring (0, deviceServiceAdded.Length) == deviceServiceAdded)
|
||||
{
|
||||
if (parts.Length >= 2)
|
||||
{
|
||||
if (ServiceAddedAction != null)
|
||||
ServiceAddedAction (parts[1]);
|
||||
}
|
||||
}
|
||||
else if (message.Length >= deviceStartedAdvertising.Length && message.Substring (0, deviceStartedAdvertising.Length) == deviceStartedAdvertising)
|
||||
{
|
||||
BluetoothLEHardwareInterface.Log ("Started Advertising");
|
||||
|
||||
if (StartedAdvertisingAction != null)
|
||||
StartedAdvertisingAction ();
|
||||
}
|
||||
else if (message.Length >= deviceStoppedAdvertising.Length && message.Substring (0, deviceStoppedAdvertising.Length) == deviceStoppedAdvertising)
|
||||
{
|
||||
BluetoothLEHardwareInterface.Log ("Stopped Advertising");
|
||||
|
||||
if (StoppedAdvertisingAction != null)
|
||||
StoppedAdvertisingAction ();
|
||||
}
|
||||
else if (message.Length >= deviceDiscoveredPeripheral.Length && message.Substring (0, deviceDiscoveredPeripheral.Length) == deviceDiscoveredPeripheral)
|
||||
{
|
||||
if (parts.Length >= 3)
|
||||
{
|
||||
// the first callback will only get called the first time this device is seen
|
||||
// this is because it gets added to the a list in the DiscoveredDeviceList
|
||||
// after that only the second callback will get called and only if there is
|
||||
// advertising data available
|
||||
if (!DiscoveredDeviceList.Contains (parts[1] + "|" + parts[2]))
|
||||
{
|
||||
DiscoveredDeviceList.Add (parts[1] + "|" + parts[2]);
|
||||
|
||||
if (DiscoveredPeripheralAction != null)
|
||||
DiscoveredPeripheralAction (parts[1], parts[2]);
|
||||
}
|
||||
|
||||
if (parts.Length >= 5 && DiscoveredPeripheralWithAdvertisingInfoAction != null)
|
||||
{
|
||||
// get the rssi from the 4th value
|
||||
int rssi = 0;
|
||||
if (!int.TryParse (parts[3], out rssi))
|
||||
rssi = 0;
|
||||
List<string> uuidList = new List<string>();
|
||||
if (parts[4].Contains(","))
|
||||
{
|
||||
string[] s = parts[4].Split(',');
|
||||
foreach (var o in s)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(o))
|
||||
{
|
||||
uuidList.Add(o);
|
||||
}
|
||||
}
|
||||
}
|
||||
//// parse the base 64 encoded data that is the 5th value
|
||||
//byte[] bytes = System.Convert.FromBase64String (parts[4]);
|
||||
|
||||
DiscoveredPeripheralWithAdvertisingInfoAction (parts[1], parts[2], rssi, uuidList.ToArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (message.Length >= deviceDiscoveredBeacon.Length && message.Substring (0, deviceDiscoveredBeacon.Length) == deviceDiscoveredBeacon)
|
||||
{
|
||||
if (parts.Length >= 7)
|
||||
{
|
||||
var iBeaconData = new BluetoothLEHardwareInterface.iBeaconData ();
|
||||
|
||||
iBeaconData.UUID = parts[1];
|
||||
if (!int.TryParse (parts[2], out iBeaconData.Major))
|
||||
iBeaconData.Major = 0;
|
||||
if (!int.TryParse (parts[3], out iBeaconData.Minor))
|
||||
iBeaconData.Minor = 0;
|
||||
if (!int.TryParse (parts[4], out iBeaconData.RSSI))
|
||||
iBeaconData.RSSI = 0;
|
||||
if (!int.TryParse (parts[5], out iBeaconData.AndroidSignalPower))
|
||||
iBeaconData.AndroidSignalPower = 0;
|
||||
int iOSProximity = 0;
|
||||
if (!int.TryParse (parts[6], out iOSProximity))
|
||||
iOSProximity = 0;
|
||||
iBeaconData.iOSProximity = (BluetoothLEHardwareInterface.iOSProximity)iOSProximity;
|
||||
|
||||
if (DiscoveredBeaconAction != null)
|
||||
DiscoveredBeaconAction (iBeaconData);
|
||||
}
|
||||
}
|
||||
else if (message.Length >= deviceRetrievedConnectedPeripheral.Length && message.Substring (0, deviceRetrievedConnectedPeripheral.Length) == deviceRetrievedConnectedPeripheral)
|
||||
{
|
||||
if (parts.Length >= 3)
|
||||
{
|
||||
DiscoveredDeviceList.Add (parts[1]);
|
||||
|
||||
if (RetrievedConnectedPeripheralAction != null)
|
||||
RetrievedConnectedPeripheralAction (parts[1], parts[2]);
|
||||
}
|
||||
}
|
||||
else if (message.Length >= devicePeripheralReceivedWriteData.Length && message.Substring (0, devicePeripheralReceivedWriteData.Length) == devicePeripheralReceivedWriteData)
|
||||
{
|
||||
if (parts.Length >= 3)
|
||||
OnPeripheralData (parts[1], parts[2]);
|
||||
}
|
||||
else if (message.Length >= deviceConnectedPeripheral.Length && message.Substring (0, deviceConnectedPeripheral.Length) == deviceConnectedPeripheral)
|
||||
{
|
||||
if (parts.Length >= 2 && ConnectedPeripheralAction != null)
|
||||
ConnectedPeripheralAction (parts[1]);
|
||||
}
|
||||
else if (message.Length >= deviceDisconnectedPeripheral.Length && message.Substring (0, deviceDisconnectedPeripheral.Length) == deviceDisconnectedPeripheral)
|
||||
{
|
||||
if (parts.Length >= 2)
|
||||
{
|
||||
if (ConnectedDisconnectPeripheralAction != null)
|
||||
ConnectedDisconnectPeripheralAction (parts[1]);
|
||||
|
||||
if (DisconnectedPeripheralAction != null)
|
||||
DisconnectedPeripheralAction (parts[1]);
|
||||
}
|
||||
}
|
||||
else if (message.Length >= deviceDiscoveredService.Length && message.Substring (0, deviceDiscoveredService.Length) == deviceDiscoveredService)
|
||||
{
|
||||
if (parts.Length >= 3 && DiscoveredServiceAction != null)
|
||||
DiscoveredServiceAction (parts[1], parts[2]);
|
||||
}
|
||||
else if (message.Length >= deviceDiscoveredCharacteristic.Length && message.Substring (0, deviceDiscoveredCharacteristic.Length) == deviceDiscoveredCharacteristic)
|
||||
{
|
||||
if (parts.Length >= 4 && DiscoveredCharacteristicAction != null)
|
||||
DiscoveredCharacteristicAction (parts[1], parts[2], parts[3]);
|
||||
}
|
||||
else if (message.Length >= deviceDidWriteCharacteristic.Length && message.Substring (0, deviceDidWriteCharacteristic.Length) == deviceDidWriteCharacteristic)
|
||||
{
|
||||
if (parts.Length >= 2 && DidWriteCharacteristicAction != null)
|
||||
DidWriteCharacteristicAction (parts[1]);
|
||||
}
|
||||
else if (message.Length >= deviceDidUpdateNotificationStateForCharacteristic.Length && message.Substring (0, deviceDidUpdateNotificationStateForCharacteristic.Length) == deviceDidUpdateNotificationStateForCharacteristic)
|
||||
{
|
||||
if (parts.Length >= 3)
|
||||
{
|
||||
if (DidUpdateNotificationStateForCharacteristicAction != null && DidUpdateNotificationStateForCharacteristicAction.ContainsKey (parts[1]))
|
||||
{
|
||||
var characteristicAction = DidUpdateNotificationStateForCharacteristicAction[parts[1]];
|
||||
if (characteristicAction != null && characteristicAction.ContainsKey (parts[2]))
|
||||
{
|
||||
var action = characteristicAction[parts[2]];
|
||||
if (action != null)
|
||||
action (parts[2]);
|
||||
}
|
||||
}
|
||||
|
||||
if (DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction != null && DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction.ContainsKey (parts[1]))
|
||||
{
|
||||
var characteristicAction = DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction[parts[1]];
|
||||
if (characteristicAction != null && characteristicAction.ContainsKey (parts[2]))
|
||||
{
|
||||
var action = characteristicAction[parts[2]];
|
||||
if (action != null)
|
||||
action (parts[1], parts[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (message.Length >= deviceDidUpdateValueForCharacteristic.Length && message.Substring (0, deviceDidUpdateValueForCharacteristic.Length) == deviceDidUpdateValueForCharacteristic)
|
||||
{
|
||||
if (parts.Length >= 4)
|
||||
OnBluetoothData (parts[1], parts[2], parts[3]);
|
||||
}
|
||||
else if (message.Length >= deviceRequestMtu.Length && message.Substring(0, deviceRequestMtu.Length) == deviceRequestMtu)
|
||||
{
|
||||
if (parts.Length >= 3)
|
||||
{
|
||||
if (RequestMtuAction != null)
|
||||
{
|
||||
int mtu = 0;
|
||||
if (int.TryParse(parts[2], out mtu))
|
||||
RequestMtuAction(parts[1], mtu);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void OnBluetoothData (string base64Data)
|
||||
{
|
||||
OnBluetoothData ("", "", base64Data);
|
||||
}
|
||||
|
||||
public void OnBluetoothData (string deviceAddress, string characteristic, string base64Data)
|
||||
{
|
||||
if (base64Data != null)
|
||||
{
|
||||
byte[] bytes = System.Convert.FromBase64String (base64Data);
|
||||
if (bytes.Length > 0)
|
||||
{
|
||||
deviceAddress = deviceAddress.ToUpper ();
|
||||
characteristic = characteristic.ToUpper ();
|
||||
|
||||
#if UNITY_IOS
|
||||
if (BLEStandardUUIDs.ContainsKey(characteristic))
|
||||
characteristic = BLEStandardUUIDs[characteristic];
|
||||
#endif
|
||||
|
||||
BluetoothLEHardwareInterface.Log ("Device: " + deviceAddress + " Characteristic Received: " + characteristic);
|
||||
|
||||
string byteString = "";
|
||||
foreach (byte b in bytes)
|
||||
byteString += string.Format ("{0:X2}", b);
|
||||
|
||||
BluetoothLEHardwareInterface.Log (byteString);
|
||||
|
||||
if (DidUpdateCharacteristicValueAction != null && DidUpdateCharacteristicValueAction.ContainsKey (deviceAddress))
|
||||
{
|
||||
var characteristicAction = DidUpdateCharacteristicValueAction[deviceAddress];
|
||||
#if UNITY_ANDROID
|
||||
characteristic = characteristic.ToLower ();
|
||||
#endif
|
||||
if (characteristicAction != null && characteristicAction.ContainsKey (characteristic))
|
||||
{
|
||||
var action = characteristicAction[characteristic];
|
||||
if (action != null)
|
||||
action (characteristic, bytes);
|
||||
}
|
||||
}
|
||||
|
||||
if (DidUpdateCharacteristicValueWithDeviceAddressAction != null && DidUpdateCharacteristicValueWithDeviceAddressAction.ContainsKey (deviceAddress))
|
||||
{
|
||||
var characteristicAction = DidUpdateCharacteristicValueWithDeviceAddressAction[deviceAddress];
|
||||
#if UNITY_ANDROID
|
||||
characteristic = characteristic.ToLower ();
|
||||
#endif
|
||||
if (characteristicAction != null && characteristicAction.ContainsKey (characteristic))
|
||||
{
|
||||
var action = characteristicAction[characteristic];
|
||||
if (action != null)
|
||||
action (deviceAddress, characteristic, bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void OnPeripheralData (string characteristic, string base64Data)
|
||||
{
|
||||
if (base64Data != null)
|
||||
{
|
||||
byte[] bytes = System.Convert.FromBase64String (base64Data);
|
||||
if (bytes.Length > 0)
|
||||
{
|
||||
BluetoothLEHardwareInterface.Log ("Peripheral Received: " + characteristic);
|
||||
|
||||
string byteString = "";
|
||||
foreach (byte b in bytes)
|
||||
byteString += string.Format ("{0:X2}", b);
|
||||
|
||||
BluetoothLEHardwareInterface.Log (byteString);
|
||||
|
||||
if (PeripheralReceivedWriteDataAction != null)
|
||||
PeripheralReceivedWriteDataAction (characteristic, bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_IOS
|
||||
private void IncludeCoreLocationFramework()
|
||||
{
|
||||
// this method is here because Unity now only includes CoreLocation
|
||||
// if there are methods in the .cs code that access it
|
||||
Input.location.Stop ();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b188ba3ac565e48f58fc50dd5db4818d
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
@@ -0,0 +1,999 @@
|
||||
#define EXPERIMENTAL_MACOS_EDITOR
|
||||
/*
|
||||
|
||||
This build includes an experimental implementation for the macOS editor of Unity
|
||||
It is experiemental because of the way that the Unity editor hangs on to plugin
|
||||
instances after leaving play mode. This causes this plugin to not free up its
|
||||
resources and therefore can cause crashes in the Unity editor on macOS.
|
||||
|
||||
Since Unity does not give plugins or apps a chance to do anything when the user
|
||||
hits the play / stop button in the Editor there isn't a chance for the app to
|
||||
deinitialize this plugin.
|
||||
|
||||
What I have found in my own use of this is that if you put a button on your app
|
||||
somewhere that you can press before hitting the stop button in the editor and
|
||||
then in that button handler call this plugin's Deinitialize method it seems to
|
||||
minimize how often the editor crashes.
|
||||
|
||||
WARNING: using the macOS editor can cause the editor to crash an loose your work
|
||||
and settings. Save often. You have been warned, so please don't contact me if
|
||||
you have lost work becausee of this problem. This is experimental only. Use at
|
||||
your own risk.
|
||||
|
||||
*/
|
||||
|
||||
using UnityEngine;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Collections.Generic;
|
||||
|
||||
#if UNITY_2018_3_OR_NEWER
|
||||
#if UNITY_ANDROID
|
||||
using UnityEngine.Android;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
public class BluetoothLEHardwareInterface
|
||||
{
|
||||
public enum CBCharacteristicProperties
|
||||
{
|
||||
CBCharacteristicPropertyBroadcast = 0x01,
|
||||
CBCharacteristicPropertyRead = 0x02,
|
||||
CBCharacteristicPropertyWriteWithoutResponse = 0x04,
|
||||
CBCharacteristicPropertyWrite = 0x08,
|
||||
CBCharacteristicPropertyNotify = 0x10,
|
||||
CBCharacteristicPropertyIndicate = 0x20,
|
||||
CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40,
|
||||
CBCharacteristicPropertyExtendedProperties = 0x80,
|
||||
CBCharacteristicPropertyNotifyEncryptionRequired = 0x100,
|
||||
CBCharacteristicPropertyIndicateEncryptionRequired = 0x200,
|
||||
};
|
||||
|
||||
public enum ScanMode
|
||||
{
|
||||
LowPower = 0,
|
||||
Balanced = 1,
|
||||
LowLatency = 2
|
||||
}
|
||||
|
||||
public enum ConnectionPriority
|
||||
{
|
||||
LowPower = 0,
|
||||
Balanced = 1,
|
||||
High = 2,
|
||||
}
|
||||
|
||||
public enum iOSProximity
|
||||
{
|
||||
Unknown = 0,
|
||||
Immediate = 1,
|
||||
Near = 2,
|
||||
Far = 3,
|
||||
}
|
||||
|
||||
public struct iBeaconData
|
||||
{
|
||||
public string UUID;
|
||||
public int Major;
|
||||
public int Minor;
|
||||
public int RSSI;
|
||||
public int AndroidSignalPower;
|
||||
public iOSProximity iOSProximity;
|
||||
}
|
||||
|
||||
#if UNITY_ANDROID
|
||||
public enum CBAttributePermissions
|
||||
{
|
||||
CBAttributePermissionsReadable = 0x01,
|
||||
CBAttributePermissionsWriteable = 0x10,
|
||||
CBAttributePermissionsReadEncryptionRequired = 0x02,
|
||||
CBAttributePermissionsWriteEncryptionRequired = 0x20,
|
||||
};
|
||||
#else
|
||||
public enum CBAttributePermissions
|
||||
{
|
||||
CBAttributePermissionsReadable = 0x01,
|
||||
CBAttributePermissionsWriteable = 0x02,
|
||||
CBAttributePermissionsReadEncryptionRequired = 0x04,
|
||||
CBAttributePermissionsWriteEncryptionRequired = 0x08,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
|
||||
public delegate void UnitySendMessageCallbackDelegate (IntPtr objectName, IntPtr commandName, IntPtr commandData);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void ConnectUnitySendMessageCallback ([MarshalAs (UnmanagedType.FunctionPtr)]UnitySendMessageCallbackDelegate callbackMethod);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLELog (string message);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLEInitialize ([MarshalAs (UnmanagedType.Bool)]bool asCentral, [MarshalAs (UnmanagedType.Bool)]bool asPeripheral);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLEDeInitialize ();
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLEPauseMessages (bool isPaused);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLEScanForPeripheralsWithServices (string serviceUUIDsString, bool allowDuplicates, bool rssiOnly, bool clearPeripheralList);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLERetrieveListOfPeripheralsWithServices (string serviceUUIDsString);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLEStopScan ();
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLEConnectToPeripheral (string name);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLEDisconnectAll ();
|
||||
|
||||
[DllImport("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLERequestMtu (string name, int mtu);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLEDisconnectPeripheral (string name);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLEReadCharacteristic (string name, string service, string characteristic);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLEWriteCharacteristic (string name, string service, string characteristic, byte[] data, int length, bool withResponse);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLESubscribeCharacteristic (string name, string service, string characteristic);
|
||||
|
||||
[DllImport ("BluetoothLEOSX")]
|
||||
private static extern void OSXBluetoothLEUnSubscribeCharacteristic (string name, string service, string characteristic);
|
||||
|
||||
#endif
|
||||
|
||||
#if UNITY_IOS || UNITY_TVOS
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLELog (string message);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEInitialize (bool asCentral, bool asPeripheral);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEDeInitialize ();
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEPauseMessages (bool isPaused);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEScanForPeripheralsWithServices (string serviceUUIDsString, bool allowDuplicates, bool rssiOnly, bool clearPeripheralList);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLERetrieveListOfPeripheralsWithServices (string serviceUUIDsString);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEStopScan ();
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEConnectToPeripheral (string name);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEDisconnectPeripheral (string name);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEReadCharacteristic (string name, string service, string characteristic);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEWriteCharacteristic (string name, string service, string characteristic, byte[] data, int length, bool withResponse);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLESubscribeCharacteristic (string name, string service, string characteristic);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEUnSubscribeCharacteristic (string name, string service, string characteristic);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEDisconnectAll ();
|
||||
|
||||
#if !UNITY_TVOS
|
||||
[DllImport("__Internal")]
|
||||
private static extern void _iOSBluetoothLERequestMtu(string name, int mtu);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEScanForBeacons (string proximityUUIDsString);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEStopBeaconScan ();
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEPeripheralName (string newName);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLECreateService (string uuid, bool primary);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLERemoveService (string uuid);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLERemoveServices ();
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLECreateCharacteristic (string uuid, int properties, int permissions, byte[] data, int length);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLERemoveCharacteristic (string uuid);
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLERemoveCharacteristics ();
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEStartAdvertising ();
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEStopAdvertising ();
|
||||
|
||||
[DllImport ("__Internal")]
|
||||
private static extern void _iOSBluetoothLEUpdateCharacteristicValue (string uuid, byte[] data, int length);
|
||||
#endif
|
||||
#elif UNITY_ANDROID
|
||||
static AndroidJavaObject _android = null;
|
||||
#endif
|
||||
|
||||
|
||||
private static BluetoothDeviceScript bluetoothDeviceScript;
|
||||
|
||||
public static void Log (string message)
|
||||
{
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
Debug.Log(message);
|
||||
#else
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLELog (message);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android == null)
|
||||
{
|
||||
AndroidJavaClass javaClass = new AndroidJavaClass ("com.shatalmic.unityandroidbluetoothlelib.UnityBluetoothLE");
|
||||
_android = javaClass.CallStatic<AndroidJavaObject> ("getInstance");
|
||||
}
|
||||
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothLog", message);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static BluetoothDeviceScript Initialize (bool asCentral, bool asPeripheral, Action action, Action<string> errorAction, Action<int> statusAction)
|
||||
{
|
||||
bluetoothDeviceScript = null;
|
||||
|
||||
#if UNITY_2018_3_OR_NEWER
|
||||
#if UNITY_ANDROID
|
||||
if (!Permission.HasUserAuthorizedPermission (Permission.FineLocation))
|
||||
Permission.RequestUserPermission (Permission.FineLocation);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
GameObject bluetoothLEReceiver = GameObject.Find("BluetoothLEReceiver");
|
||||
if (bluetoothLEReceiver == null)
|
||||
bluetoothLEReceiver = new GameObject ("BluetoothLEReceiver");
|
||||
|
||||
if (bluetoothLEReceiver != null)
|
||||
{
|
||||
bluetoothDeviceScript = bluetoothLEReceiver.GetComponent<BluetoothDeviceScript> ();
|
||||
if (bluetoothDeviceScript == null)
|
||||
bluetoothDeviceScript = bluetoothLEReceiver.AddComponent<BluetoothDeviceScript> ();
|
||||
|
||||
if (bluetoothDeviceScript != null)
|
||||
{
|
||||
bluetoothDeviceScript.BleStatusChangedAction = statusAction;
|
||||
bluetoothDeviceScript.InitializedAction = action;
|
||||
bluetoothDeviceScript.ErrorAction = errorAction;
|
||||
}
|
||||
}
|
||||
|
||||
GameObject.DontDestroyOnLoad (bluetoothLEReceiver);
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
ConnectUnitySendMessageCallback ((objectName, commandName, commandData) => {
|
||||
string name = Marshal.PtrToStringAuto (objectName);
|
||||
string command = Marshal.PtrToStringAuto (commandName);
|
||||
string data = Marshal.PtrToStringAuto (commandData);
|
||||
|
||||
GameObject foundObject = GameObject.Find (name);
|
||||
if (foundObject != null)
|
||||
foundObject.SendMessage (command, data);
|
||||
});
|
||||
|
||||
BluetoothLEHardwareInterface.OSXBluetoothLEInitialize (asCentral, asPeripheral);
|
||||
#else
|
||||
if (Application.isEditor)
|
||||
{
|
||||
if (bluetoothDeviceScript != null)
|
||||
bluetoothDeviceScript.SendMessage ("OnBluetoothMessage", "Initialized");
|
||||
}
|
||||
else
|
||||
{
|
||||
#if UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLEInitialize (asCentral, asPeripheral);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android == null)
|
||||
{
|
||||
AndroidJavaClass javaClass = new AndroidJavaClass ("com.shatalmic.unityandroidbluetoothlelib.UnityBluetoothLE");
|
||||
_android = javaClass.CallStatic<AndroidJavaObject> ("getInstance");
|
||||
}
|
||||
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothInitialize", asCentral, asPeripheral);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
return bluetoothDeviceScript;
|
||||
}
|
||||
|
||||
public static void DeInitialize (Action action)
|
||||
{
|
||||
if (bluetoothDeviceScript != null)
|
||||
bluetoothDeviceScript.DeinitializedAction = action;
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
BluetoothLEHardwareInterface.OSXBluetoothLEDeInitialize ();
|
||||
#else
|
||||
if (Application.isEditor)
|
||||
{
|
||||
if (bluetoothDeviceScript != null)
|
||||
bluetoothDeviceScript.SendMessage ("OnBluetoothMessage", "DeInitialized");
|
||||
}
|
||||
else
|
||||
{
|
||||
#if UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLEDeInitialize ();
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothDeInitialize");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void FinishDeInitialize ()
|
||||
{
|
||||
GameObject bluetoothLEReceiver = GameObject.Find("BluetoothLEReceiver");
|
||||
if (bluetoothLEReceiver != null)
|
||||
GameObject.Destroy(bluetoothLEReceiver);
|
||||
}
|
||||
|
||||
public static void BluetoothEnable (bool enable)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS || UNITY_TVOS
|
||||
//_iOSBluetoothLELog (message);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothEnable", enable);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void BluetoothScanMode (ScanMode scanMode)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS || UNITY_TVOS
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothScanMode", (int)scanMode);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void BluetoothConnectionPriority (ConnectionPriority connectionPriority)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS || UNITY_TVOS
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothConnectionPriority", (int)connectionPriority);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void PauseMessages (bool isPaused)
|
||||
{
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLEPauseMessages (isPaused);
|
||||
#else
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLEPauseMessages (isPaused);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothPause", isPaused);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// scanning for beacons requires that you know the Proximity UUID
|
||||
public static void ScanForBeacons (string[] proximityUUIDs, Action<iBeaconData> actionBeaconResponse)
|
||||
{
|
||||
if (proximityUUIDs != null && proximityUUIDs.Length >= 0)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
if (bluetoothDeviceScript != null)
|
||||
bluetoothDeviceScript.DiscoveredBeaconAction = actionBeaconResponse;
|
||||
|
||||
string proximityUUIDsString = null;
|
||||
|
||||
if (proximityUUIDs != null && proximityUUIDs.Length > 0)
|
||||
{
|
||||
proximityUUIDsString = "";
|
||||
|
||||
foreach (string proximityUUID in proximityUUIDs)
|
||||
proximityUUIDsString += proximityUUID + "|";
|
||||
|
||||
proximityUUIDsString = proximityUUIDsString.Substring (0, proximityUUIDsString.Length - 1);
|
||||
}
|
||||
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLEScanForBeacons (proximityUUIDsString);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothScanForBeacons", proximityUUIDsString);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void RequestMtu(string name, int mtu, Action<string, int> action)
|
||||
{
|
||||
if (bluetoothDeviceScript != null)
|
||||
{
|
||||
bluetoothDeviceScript.RequestMtuAction = action;
|
||||
}
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
if (mtu > 184)
|
||||
mtu = 184;
|
||||
OSXBluetoothLERequestMtu(name, mtu);
|
||||
#elif UNITY_IOS || UNITY_TVOS
|
||||
if (mtu > 180)
|
||||
mtu = 180;
|
||||
_iOSBluetoothLERequestMtu (name, mtu);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
{
|
||||
_android.Call ("androidBluetoothRequestMtu", name, mtu);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void ScanForPeripheralsWithServices (string[] serviceUUIDs, Action<string, string> action = null, Action<string, string, int, string[]> actionAdvertisingInfo = null, bool rssiOnly = false, bool clearPeripheralList = true, int recordType = 0xFF)
|
||||
{
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#endif
|
||||
if (bluetoothDeviceScript != null)
|
||||
{
|
||||
bluetoothDeviceScript.DiscoveredPeripheralAction = action;
|
||||
bluetoothDeviceScript.DiscoveredPeripheralWithAdvertisingInfoAction = actionAdvertisingInfo;
|
||||
|
||||
if (bluetoothDeviceScript.DiscoveredDeviceList != null)
|
||||
bluetoothDeviceScript.DiscoveredDeviceList.Clear ();
|
||||
}
|
||||
|
||||
string serviceUUIDsString = null;
|
||||
|
||||
if (serviceUUIDs != null && serviceUUIDs.Length > 0)
|
||||
{
|
||||
serviceUUIDsString = "";
|
||||
|
||||
foreach (string serviceUUID in serviceUUIDs)
|
||||
serviceUUIDsString += serviceUUID + "|";
|
||||
|
||||
serviceUUIDsString = serviceUUIDsString.Substring (0, serviceUUIDsString.Length - 1);
|
||||
}
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLEScanForPeripheralsWithServices (serviceUUIDsString, (actionAdvertisingInfo != null), rssiOnly, clearPeripheralList);
|
||||
#elif UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLEScanForPeripheralsWithServices (serviceUUIDsString, (actionAdvertisingInfo != null), rssiOnly, clearPeripheralList);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
{
|
||||
if (serviceUUIDsString == null)
|
||||
serviceUUIDsString = "";
|
||||
|
||||
_android.Call ("androidBluetoothScanForPeripheralsWithServices", serviceUUIDsString, rssiOnly, recordType);
|
||||
}
|
||||
#endif
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void RetrieveListOfPeripheralsWithServices (string[] serviceUUIDs, Action<string, string> action)
|
||||
{
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#endif
|
||||
if (bluetoothDeviceScript != null)
|
||||
{
|
||||
bluetoothDeviceScript.RetrievedConnectedPeripheralAction = action;
|
||||
|
||||
if (bluetoothDeviceScript.DiscoveredDeviceList != null)
|
||||
bluetoothDeviceScript.DiscoveredDeviceList.Clear ();
|
||||
}
|
||||
|
||||
string serviceUUIDsString = serviceUUIDs.Length > 0 ? "" : null;
|
||||
|
||||
foreach (string serviceUUID in serviceUUIDs)
|
||||
serviceUUIDsString += serviceUUID + "|";
|
||||
|
||||
// strip the last delimeter
|
||||
serviceUUIDsString = serviceUUIDsString.Substring (0, serviceUUIDsString.Length - 1);
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLERetrieveListOfPeripheralsWithServices (serviceUUIDsString);
|
||||
#elif UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLERetrieveListOfPeripheralsWithServices (serviceUUIDsString);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothRetrieveListOfPeripheralsWithServices", serviceUUIDsString);
|
||||
#endif
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void StopScan ()
|
||||
{
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLEStopScan ();
|
||||
#else
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLEStopScan ();
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothStopScan");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void StopBeaconScan ()
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLEStopBeaconScan ();
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothStopBeaconScan");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void DisconnectAll ()
|
||||
{
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLEDisconnectAll ();
|
||||
#else
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLEDisconnectAll ();
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothDisconnectAll");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void ConnectToPeripheral (string name, Action<string> connectAction, Action<string, string> serviceAction, Action<string, string, string> characteristicAction, Action<string> disconnectAction = null)
|
||||
{
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#endif
|
||||
if (bluetoothDeviceScript != null)
|
||||
{
|
||||
bluetoothDeviceScript.ConnectedPeripheralAction = connectAction;
|
||||
bluetoothDeviceScript.DiscoveredServiceAction = serviceAction;
|
||||
bluetoothDeviceScript.DiscoveredCharacteristicAction = characteristicAction;
|
||||
bluetoothDeviceScript.ConnectedDisconnectPeripheralAction = disconnectAction;
|
||||
}
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLEConnectToPeripheral (name);
|
||||
#elif UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLEConnectToPeripheral (name);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothConnectToPeripheral", name);
|
||||
#endif
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void DisconnectPeripheral (string name, Action<string> action)
|
||||
{
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#endif
|
||||
if (bluetoothDeviceScript != null)
|
||||
bluetoothDeviceScript.DisconnectedPeripheralAction = action;
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLEDisconnectPeripheral (name);
|
||||
#elif UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLEDisconnectPeripheral (name);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidBluetoothDisconnectPeripheral", name);
|
||||
#endif
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void ReadCharacteristic (string name, string service, string characteristic, Action<string, byte[]> action)
|
||||
{
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#endif
|
||||
if (bluetoothDeviceScript != null)
|
||||
{
|
||||
if (!bluetoothDeviceScript.DidUpdateCharacteristicValueAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateCharacteristicValueAction[name] = new Dictionary<string, Action<string, byte[]>>();
|
||||
|
||||
#if UNITY_IOS || UNITY_TVOS || (EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX))
|
||||
bluetoothDeviceScript.DidUpdateCharacteristicValueAction [name] [characteristic] = action;
|
||||
#elif UNITY_ANDROID
|
||||
bluetoothDeviceScript.DidUpdateCharacteristicValueAction [name] [FullUUID (characteristic).ToLower ()] = action;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLEReadCharacteristic (name, service, characteristic);
|
||||
#elif UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLEReadCharacteristic (name, service, characteristic);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidReadCharacteristic", name, service, characteristic);
|
||||
#endif
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void WriteCharacteristic (string name, string service, string characteristic, byte[] data, int length, bool withResponse, Action<string> action)
|
||||
{
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#endif
|
||||
if (bluetoothDeviceScript != null)
|
||||
bluetoothDeviceScript.DidWriteCharacteristicAction = action;
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLEWriteCharacteristic(name, service, characteristic, data, length, withResponse);
|
||||
#elif UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLEWriteCharacteristic (name, service, characteristic, data, length, withResponse);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidWriteCharacteristic", name, service, characteristic, data, length, withResponse);
|
||||
#endif
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void SubscribeCharacteristic (string name, string service, string characteristic, Action<string> notificationAction, Action<string, byte[]> action)
|
||||
{
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#endif
|
||||
if (bluetoothDeviceScript != null)
|
||||
{
|
||||
name = name.ToUpper ();
|
||||
service = service.ToUpper ();
|
||||
characteristic = characteristic.ToUpper ();
|
||||
|
||||
#if UNITY_IOS || UNITY_TVOS || (EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX))
|
||||
if (!bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction [name] = new Dictionary<string, Action<string>> ();
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction [name] [characteristic] = notificationAction;
|
||||
|
||||
if (!bluetoothDeviceScript.DidUpdateCharacteristicValueAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateCharacteristicValueAction [name] = new Dictionary<string, Action<string, byte[]>> ();
|
||||
bluetoothDeviceScript.DidUpdateCharacteristicValueAction [name] [characteristic] = action;
|
||||
#elif UNITY_ANDROID
|
||||
if (!bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction [name] = new Dictionary<string, Action<string>> ();
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction [name] [FullUUID (characteristic).ToLower ()] = notificationAction;
|
||||
|
||||
if (!bluetoothDeviceScript.DidUpdateCharacteristicValueAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateCharacteristicValueAction [name] = new Dictionary<string, Action<string, byte[]>> ();
|
||||
bluetoothDeviceScript.DidUpdateCharacteristicValueAction [name] [FullUUID (characteristic).ToLower ()] = action;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLESubscribeCharacteristic (name, service, characteristic);
|
||||
#elif UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLESubscribeCharacteristic (name, service, characteristic);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidSubscribeCharacteristic", name, service, characteristic);
|
||||
#endif
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void SubscribeCharacteristicWithDeviceAddress (string name, string service, string characteristic, Action<string, string> notificationAction, Action<string, string, byte[]> action)
|
||||
{
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#endif
|
||||
if (bluetoothDeviceScript != null)
|
||||
{
|
||||
name = name.ToUpper ();
|
||||
service = service.ToUpper ();
|
||||
characteristic = characteristic.ToUpper ();
|
||||
|
||||
#if UNITY_IOS || UNITY_TVOS || (EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX))
|
||||
if (!bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction[name] = new Dictionary<string, Action<string, string>>();
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction[name][characteristic] = notificationAction;
|
||||
|
||||
if (!bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction[name] = new Dictionary<string, Action<string>>();
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction[name][characteristic] = null;
|
||||
|
||||
if (!bluetoothDeviceScript.DidUpdateCharacteristicValueWithDeviceAddressAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateCharacteristicValueWithDeviceAddressAction[name] = new Dictionary<string, Action<string, string, byte[]>>();
|
||||
bluetoothDeviceScript.DidUpdateCharacteristicValueWithDeviceAddressAction[name][characteristic] = action;
|
||||
#elif UNITY_ANDROID
|
||||
if (!bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction[name] = new Dictionary<string, Action<string, string>>();
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction[name][FullUUID (characteristic).ToLower ()] = notificationAction;
|
||||
|
||||
if (!bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction.ContainsKey(name))
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction[name] = new Dictionary<string, Action<string>>();
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction[name][FullUUID (characteristic).ToLower ()] = null;
|
||||
|
||||
if (!bluetoothDeviceScript.DidUpdateCharacteristicValueWithDeviceAddressAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateCharacteristicValueWithDeviceAddressAction[name] = new Dictionary<string, Action<string, string, byte[]>>();
|
||||
bluetoothDeviceScript.DidUpdateCharacteristicValueWithDeviceAddressAction[name][FullUUID (characteristic).ToLower ()] = action;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLESubscribeCharacteristic (name, service, characteristic);
|
||||
#elif UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLESubscribeCharacteristic (name, service, characteristic);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidSubscribeCharacteristic", name, service, characteristic);
|
||||
#endif
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void UnSubscribeCharacteristic (string name, string service, string characteristic, Action<string> action)
|
||||
{
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#endif
|
||||
if (bluetoothDeviceScript != null)
|
||||
{
|
||||
name = name.ToUpper ();
|
||||
service = service.ToUpper ();
|
||||
characteristic = characteristic.ToUpper ();
|
||||
|
||||
#if UNITY_IOS || UNITY_TVOS || (EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX))
|
||||
if (!bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction[name] = new Dictionary<string, Action<string, string>>();
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction[name][characteristic] = null;
|
||||
|
||||
if (!bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction[name] = new Dictionary<string, Action<string>> ();
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction[name][characteristic] = action;
|
||||
#elif UNITY_ANDROID
|
||||
if (!bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction[name] = new Dictionary<string, Action<string, string>>();
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicWithDeviceAddressAction[name][FullUUID (characteristic).ToLower ()] = null;
|
||||
|
||||
if (!bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction.ContainsKey (name))
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction[name] = new Dictionary<string, Action<string>> ();
|
||||
bluetoothDeviceScript.DidUpdateNotificationStateForCharacteristicAction[name][FullUUID (characteristic).ToLower ()] = action;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)
|
||||
OSXBluetoothLEUnSubscribeCharacteristic (name, service, characteristic);
|
||||
#elif UNITY_IOS || UNITY_TVOS
|
||||
_iOSBluetoothLEUnSubscribeCharacteristic (name, service, characteristic);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidUnsubscribeCharacteristic", name, service, characteristic);
|
||||
#endif
|
||||
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void PeripheralName (string newName)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLEPeripheralName (newName);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidPeripheralName", newName);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void CreateService (string uuid, bool primary, Action<string> action)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
if (bluetoothDeviceScript != null)
|
||||
bluetoothDeviceScript.ServiceAddedAction = action;
|
||||
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLECreateService (uuid, primary);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidCreateService", uuid, primary);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveService (string uuid)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLERemoveService (uuid);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidRemoveService", uuid);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveServices ()
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLERemoveServices ();
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidRemoveServices");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void CreateCharacteristic (string uuid, CBCharacteristicProperties properties, CBAttributePermissions permissions, byte[] data, int length, Action<string, byte[]> action)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
if (bluetoothDeviceScript != null)
|
||||
bluetoothDeviceScript.PeripheralReceivedWriteDataAction = action;
|
||||
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLECreateCharacteristic (uuid, (int)properties, (int)permissions, data, length);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidCreateCharacteristic", uuid, (int)properties, (int)permissions, data, length);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveCharacteristic (string uuid)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
if (bluetoothDeviceScript != null)
|
||||
bluetoothDeviceScript.PeripheralReceivedWriteDataAction = null;
|
||||
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLERemoveCharacteristic (uuid);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidRemoveCharacteristic", uuid);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveCharacteristics ()
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLERemoveCharacteristics ();
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidRemoveCharacteristics");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void StartAdvertising (Action action)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
if (bluetoothDeviceScript != null)
|
||||
bluetoothDeviceScript.StartedAdvertisingAction = action;
|
||||
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLEStartAdvertising ();
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidStartAdvertising");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void StopAdvertising (Action action)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
if (bluetoothDeviceScript != null)
|
||||
bluetoothDeviceScript.StoppedAdvertisingAction = action;
|
||||
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLEStopAdvertising ();
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidStopAdvertising");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void UpdateCharacteristicValue (string uuid, byte[] data, int length)
|
||||
{
|
||||
if (!Application.isEditor)
|
||||
{
|
||||
#if UNITY_IOS
|
||||
_iOSBluetoothLEUpdateCharacteristicValue (uuid, data, length);
|
||||
#elif UNITY_ANDROID
|
||||
if (_android != null)
|
||||
_android.Call ("androidUpdateCharacteristicValue", uuid, data, length);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static string FullUUID (string uuid)
|
||||
{
|
||||
if (uuid.Length == 4)
|
||||
return "0000" + uuid + "-0000-1000-8000-00805F9B34FB";
|
||||
return uuid;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b8496a9b1a1df40af9ada2311d1d6d09
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
@@ -0,0 +1,43 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5383f7d08256547f6b36ee834b840062
|
||||
folderAsset: yes
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Standalone: OSXIntel
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Standalone: OSXIntel64
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Standalone: OSXUniversal
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 34c7c97d38c834839be439bcf96a0267
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>BuildMachineOSBuild</key>
|
||||
<string>19F101</string>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>BluetoothLEOSX</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.shatalmic.BluetoothLEOSX</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>BluetoothLEOSX</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleSupportedPlatforms</key>
|
||||
<array>
|
||||
<string>MacOSX</string>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>DTCompiler</key>
|
||||
<string>com.apple.compilers.llvm.clang.1_0</string>
|
||||
<key>DTPlatformBuild</key>
|
||||
<string>11E608c</string>
|
||||
<key>DTPlatformVersion</key>
|
||||
<string>GM</string>
|
||||
<key>DTSDKBuild</key>
|
||||
<string>19E258</string>
|
||||
<key>DTSDKName</key>
|
||||
<string>macosx10.15</string>
|
||||
<key>DTXcode</key>
|
||||
<string>1150</string>
|
||||
<key>DTXcodeBuild</key>
|
||||
<string>11E608c</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>10.11</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2016 Shatalmic. All rights reserved.</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8e7811284d1734fc2ba4b29fccd3ccf7
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4e9d68945c9234df3b7855f4e1006f0f
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1a83baeb98e0141f587d978b89ecd37d
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 673293518de2c4fbf913749ebdb36dd1
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,115 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>files</key>
|
||||
<dict/>
|
||||
<key>files2</key>
|
||||
<dict/>
|
||||
<key>rules</key>
|
||||
<dict>
|
||||
<key>^Resources/</key>
|
||||
<true/>
|
||||
<key>^Resources/.*\.lproj/</key>
|
||||
<dict>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1000</real>
|
||||
</dict>
|
||||
<key>^Resources/.*\.lproj/locversion.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1100</real>
|
||||
</dict>
|
||||
<key>^Resources/Base\.lproj/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>1010</real>
|
||||
</dict>
|
||||
<key>^version.plist$</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>rules2</key>
|
||||
<dict>
|
||||
<key>.*\.dSYM($|/)</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>11</real>
|
||||
</dict>
|
||||
<key>^(.*/)?\.DS_Store$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>2000</real>
|
||||
</dict>
|
||||
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
|
||||
<dict>
|
||||
<key>nested</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>10</real>
|
||||
</dict>
|
||||
<key>^.*</key>
|
||||
<true/>
|
||||
<key>^Info\.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^PkgInfo$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^Resources/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^Resources/.*\.lproj/</key>
|
||||
<dict>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1000</real>
|
||||
</dict>
|
||||
<key>^Resources/.*\.lproj/locversion.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1100</real>
|
||||
</dict>
|
||||
<key>^Resources/Base\.lproj/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>1010</real>
|
||||
</dict>
|
||||
<key>^[^/]+$</key>
|
||||
<dict>
|
||||
<key>nested</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>10</real>
|
||||
</dict>
|
||||
<key>^embedded\.provisionprofile$</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^version\.plist$</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2b362acd4e35f4bb380341cd3df2b9c0
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7cce98d172bfd2f4fa235200a8c37ffd
|
||||
guid: 8d3303514acc04853a1fbd8393630e00
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,107 @@
|
||||
//
|
||||
// UnityBluetoothLE.h
|
||||
// Unity-iPhone
|
||||
//
|
||||
// Created by Tony Pitman on 03/05/2014.
|
||||
//
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <CoreBluetooth/CoreBluetooth.h>
|
||||
|
||||
#if !TARGET_OS_TV
|
||||
#import <CoreLocation/CoreLocation.h>
|
||||
|
||||
@interface UnityBluetoothLE : NSObject <CBCentralManagerDelegate, CBPeripheralManagerDelegate, CBPeripheralDelegate, CLLocationManagerDelegate>
|
||||
#else
|
||||
@interface UnityBluetoothLE : NSObject <CBCentralManagerDelegate, CBPeripheralManagerDelegate, CBPeripheralDelegate>
|
||||
#endif
|
||||
|
||||
{
|
||||
CBCentralManager *_centralManager;
|
||||
#if !TARGET_OS_TV
|
||||
CLLocationManager *_locationManager;
|
||||
#endif
|
||||
NSMutableDictionary *_peripherals;
|
||||
|
||||
#if !TARGET_OS_TV
|
||||
CBPeripheralManager *_peripheralManager;
|
||||
|
||||
NSString *_peripheralName;
|
||||
|
||||
NSMutableDictionary *_services;
|
||||
NSMutableDictionary *_characteristics;
|
||||
#endif
|
||||
|
||||
NSMutableArray *_backgroundMessages;
|
||||
BOOL _isPaused;
|
||||
BOOL _alreadyNotified;
|
||||
BOOL _isInitializing;
|
||||
BOOL _rssiOnly;
|
||||
int _recordType;
|
||||
|
||||
long _mtu;
|
||||
|
||||
unsigned char *_writeCharacteristicBytes;
|
||||
long _writeCharacteristicLength;
|
||||
long _writeCharacteristicPosition;
|
||||
long _writeCharacteristicBytesToWrite;
|
||||
CBCharacteristicWriteType _writeCharacteristicWithResponse;
|
||||
int _writeCharacteristicRetries;
|
||||
}
|
||||
|
||||
@property (atomic, strong) NSMutableDictionary *_peripherals;
|
||||
@property (atomic) BOOL _rssiOnly;
|
||||
|
||||
- (void)initialize:(BOOL)asCentral asPeripheral:(BOOL)asPeripheral;
|
||||
- (void)deInitialize;
|
||||
- (void)scanForPeripheralsWithServices:(NSArray *)serviceUUIDs options:(NSDictionary *)options clearPeripheralList:(BOOL)clearPeripheralList recordType:(int)recordType;
|
||||
- (void)stopScan;
|
||||
- (void)retrieveListOfPeripheralsWithServices:(NSArray *)serviceUUIDs;
|
||||
- (void)connectToPeripheral:(NSString *)name;
|
||||
- (void)disconnectPeripheral:(NSString *)name;
|
||||
- (CBCharacteristic *)getCharacteristic:(NSString *)name service:(NSString *)serviceString characteristic:(NSString *)characteristicString;
|
||||
- (void)readCharacteristic:(NSString *)name service:(NSString *)serviceString characteristic:(NSString *)characteristicString;
|
||||
- (void)writeCharacteristic:(NSString *)name service:(NSString *)serviceString characteristic:(NSString *)characteristicString data:(NSData *)data withResponse:(BOOL)withResponse;
|
||||
- (void)subscribeCharacteristic:(NSString *)name service:(NSString *)serviceString characteristic:(NSString *)characteristicString;
|
||||
- (void)unsubscribeCharacteristic:(NSString *)name service:(NSString *)serviceString characteristic:(NSString *)characteristicString;
|
||||
- (void)writeCharactersticBytesReset;
|
||||
- (void)writeCharactersticBytes:(CBPeripheral *)peripheral characteristic:(CBCharacteristic *)characteristic data:(NSData *)data withResponse:(CBCharacteristicWriteType)withResponse;
|
||||
- (void)writeNextPacket:(CBPeripheral *)peripheral characteristic:(CBCharacteristic *)characteristic;
|
||||
|
||||
#if !TARGET_OS_TV
|
||||
- (void)requestMtu:(NSString *)name mtu:(int)mtu;
|
||||
- (void)scanForBeacons:(NSArray<CLBeaconRegion *> *)beaconRegions;
|
||||
- (void)stopBeaconScan;
|
||||
|
||||
- (void)peripheralName:(NSString *)newName;
|
||||
- (void)createService:(NSString *)uuid primary:(BOOL)primary;
|
||||
- (void)removeService:(NSString *)uuid;
|
||||
- (void)removeServices;
|
||||
- (void)createCharacteristic:(NSString *)uuid properties:(CBCharacteristicProperties)properties permissions:(CBAttributePermissions)permissions value:(NSData *)value;
|
||||
- (void)removeCharacteristic:(NSString *)uuid;
|
||||
- (void)removeCharacteristics;
|
||||
- (void)startAdvertising;
|
||||
- (void)stopAdvertising;
|
||||
- (void)updateCharacteristicValue:(NSString *)uuid value:(NSData *)value;
|
||||
#endif
|
||||
|
||||
- (void)pauseMessages:(BOOL)isPaused;
|
||||
- (void)sendUnityMessage:(BOOL)isString message:(NSString *)message;
|
||||
|
||||
+ (NSString *) base64StringFromData:(NSData *)data length:(int)length;
|
||||
|
||||
@end
|
||||
|
||||
@interface UnityMessage : NSObject
|
||||
|
||||
{
|
||||
BOOL _isString;
|
||||
NSString *_message;
|
||||
}
|
||||
|
||||
- (void)initialize:(BOOL)isString message:(NSString *)message;
|
||||
- (void)deInitialize;
|
||||
- (void)sendUnityMessage;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,95 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 89fad22a839074ac08f9f7ffc9dbce4e
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
'': Linux
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: x86
|
||||
- first:
|
||||
'': OSXIntel
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
'': OSXIntel64
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Android: Android
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
DefaultValueInitialized: true
|
||||
OS: AnyOS
|
||||
- first:
|
||||
Facebook: Win
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Facebook: Win64
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Standalone: Linux64
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Standalone: Win
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Standalone: Win64
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
iPhone: iOS
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
CompileFlags:
|
||||
FrameworkDependencies:
|
||||
- first:
|
||||
tvOS: tvOS
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,124 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6a40ca1fe2b7a48e5b257178dfdca41e
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
: Any
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
Exclude Android: 1
|
||||
Exclude Editor: 1
|
||||
Exclude Linux: 1
|
||||
Exclude Linux64: 1
|
||||
Exclude LinuxUniversal: 1
|
||||
Exclude OSXUniversal: 1
|
||||
Exclude Win: 1
|
||||
Exclude Win64: 1
|
||||
Exclude iOS: 0
|
||||
- first:
|
||||
: Linux
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: x86
|
||||
- first:
|
||||
: OSXIntel
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
: OSXIntel64
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Android: Android
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: ARMv7
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
DefaultValueInitialized: true
|
||||
OS: AnyOS
|
||||
- first:
|
||||
Facebook: Win
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Facebook: Win64
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Standalone: Linux
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: x86
|
||||
- first:
|
||||
Standalone: Linux64
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Standalone: OSXUniversal
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Standalone: Win
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
Standalone: Win64
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
- first:
|
||||
iPhone: iOS
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
AddToEmbeddedBinaries: false
|
||||
CompileFlags: -fno-objc-arc
|
||||
FrameworkDependencies: CoreBluetooth;
|
||||
- first:
|
||||
tvOS: tvOS
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
CompileFlags: -fno-objc-arc
|
||||
FrameworkDependencies: CoreBluetooth;
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in new issue
Block a user