From 5f3e93410a1deea3471a3d9689cbb8473d3d9475 Mon Sep 17 00:00:00 2001 From: Jong Chern Date: Thu, 20 Jan 2022 21:48:36 +0800 Subject: [PATCH 1/2] minor --- .../PasskeyConfigurationApp/MainPage.xaml.cs | 23 +++-- .../ShimmerBLEAPI/Models/ProdConfigPayload.cs | 90 +++++++++++++++++-- 2 files changed, 100 insertions(+), 13 deletions(-) diff --git a/ShimmerBLE/PasskeyConfigurationApp/PasskeyConfigurationApp/MainPage.xaml.cs b/ShimmerBLE/PasskeyConfigurationApp/PasskeyConfigurationApp/MainPage.xaml.cs index ce1deb97..e2a994db 100644 --- a/ShimmerBLE/PasskeyConfigurationApp/PasskeyConfigurationApp/MainPage.xaml.cs +++ b/ShimmerBLE/PasskeyConfigurationApp/PasskeyConfigurationApp/MainPage.xaml.cs @@ -148,9 +148,7 @@ public async void WritePasskeyConfigurationButton() if (isSetToClinicalTrial.IsChecked) { - prodConfig.SetPasskey(""); - prodConfig.SetPasskeyID(""); - prodConfig.SetAdvertisingNamePrefix(""); + prodConfig.EnableClinicalTrialPasskey(); Array.Copy(prodConfig.GetPayload(), 3, prodConfigByteArray, 0, 55); await device.ExecuteRequest(RequestType.WriteProductionConfig, prodConfigByteArray); } @@ -181,10 +179,21 @@ public async void WritePasskeyConfigurationButton() await DisplayAlert("Error!", errorString, "OK"); return; } - - prodConfig.SetPasskey(passkey.Text); - prodConfig.SetPasskeyID(passkeyId.Text); - prodConfig.SetAdvertisingNamePrefix(deviceAdvertisingNamePrefix.Text); + try + { + if (String.IsNullOrEmpty(passkey.Text)) + { + prodConfig.EnableNoPasskey(deviceAdvertisingNamePrefix.Text, passkeyId.Text); + } + else + { + prodConfig.EnableDefaultPasskey(deviceAdvertisingNamePrefix.Text, passkeyId.Text); + } + } catch (Exception ex) + { + await DisplayAlert("Error!", ex.Message, "OK"); + } + Array.Copy(prodConfig.GetPayload(), 3, prodConfigByteArray, 0, 55); await device.ExecuteRequest(RequestType.WriteProductionConfig, prodConfigByteArray); } diff --git a/ShimmerBLE/ShimmerBLEAPI/Models/ProdConfigPayload.cs b/ShimmerBLE/ShimmerBLEAPI/Models/ProdConfigPayload.cs index 4c34cc32..6bc34101 100644 --- a/ShimmerBLE/ShimmerBLEAPI/Models/ProdConfigPayload.cs +++ b/ShimmerBLE/ShimmerBLEAPI/Models/ProdConfigPayload.cs @@ -35,7 +35,47 @@ public ProdConfigPayload() } - public void SetPasskeyID(string passkeyId) + public void EnableClinicalTrialPasskey() + { + try + { + SetAdvertisingNamePrefix(""); + SetPasskey(""); + SetPasskeyID(""); + } catch (Exception ex) + { + throw ex; + } + } + + public void EnableNoPasskey(string advertisingName, string passkeyID) + { + try + { + SetAdvertisingNamePrefix(advertisingName); + SetPasskey(""); + SetPasskeyID(passkeyID); + } + catch (Exception ex) + { + throw ex; + } + } + + public void EnableDefaultPasskey(string advertisingName, string passkeyID) + { + try + { + SetAdvertisingNamePrefix(advertisingName); + SetPasskey("123456"); + SetPasskeyID(passkeyID); + } catch (Exception ex) + { + throw ex; + } +} + + protected void SetPasskeyID(string passkeyId) { byte[] payloadArray = GetPayload(); if (string.IsNullOrEmpty(passkeyId)) @@ -48,6 +88,10 @@ public void SetPasskeyID(string passkeyId) else if (passkeyId.Length == 2) { byte[] passkeyIdArray = Encoding.UTF8.GetBytes(passkeyId); + if (HasAnFF(passkeyIdArray)) + { + throw new Exception("Passkey ID has a byte value of 0xFF which is not permitted"); + } for (int i = 0; i < passkeyIdArray.Length; i++) { payloadArray[i + 18] = passkeyIdArray[i]; @@ -56,7 +100,7 @@ public void SetPasskeyID(string passkeyId) Payload = BitConverter.ToString(payloadArray); } - public void SetPasskey(string passkey) + protected void SetPasskey(string passkey) { byte[] payloadArray = GetPayload(); if (string.IsNullOrEmpty(passkey)) @@ -68,6 +112,11 @@ public void SetPasskey(string passkey) } else if (passkey.Length == 6) { + if (!int.TryParse(passkey, out _)) + { + throw new Exception("Passkey Must Be Numeric Values"); + } + byte[] passkeyArray = Encoding.UTF8.GetBytes(passkey); for (int i = 0; i < passkeyArray.Length; i++) { @@ -75,9 +124,10 @@ public void SetPasskey(string passkey) } } Payload = BitConverter.ToString(payloadArray); + } - public void SetAdvertisingNamePrefix(string advertisingNamePrefix) + protected void SetAdvertisingNamePrefix(string advertisingNamePrefix) { byte[] payloadArray = GetPayload(); if (string.IsNullOrEmpty(advertisingNamePrefix)) @@ -90,6 +140,10 @@ public void SetAdvertisingNamePrefix(string advertisingNamePrefix) else if (advertisingNamePrefix.Length <= 32) { byte[] advertisingNamePrefixByteArray = Encoding.UTF8.GetBytes(advertisingNamePrefix); + if (HasAnFF(advertisingNamePrefixByteArray)) + { + throw new Exception("Advertising name has a byte value of 0xFF which is not permitted"); + } for (int i = 0; i < advertisingNamePrefixByteArray.Length; i++) { payloadArray[i + 26] = advertisingNamePrefixByteArray[i]; @@ -103,6 +157,30 @@ public void SetAdvertisingNamePrefix(string advertisingNamePrefix) Payload = BitConverter.ToString(payloadArray); } + protected bool IsAllFFs(byte[] byteArray) + { + foreach (byte b in byteArray) + { + if (b != 0xFF) + { + return false; + } + } + return true; + } + + protected bool HasAnFF(byte[] byteArray) + { + foreach (byte b in byteArray) + { + if (b == 0xFF) + { + return true; + } + } + return false; + } + public new bool ProcessPayload(byte[] response) { try @@ -144,7 +222,7 @@ public void SetAdvertisingNamePrefix(string advertisingNamePrefix) REV_HW_INTERNAL = BitConverter.ToUInt16(hwInternalArray, 0); byte[] passkeyIdArray = reader.ReadBytes(2); - if (passkeyIdArray[0] == 0xFF) + if (IsAllFFs(passkeyIdArray)) { PasskeyID = ""; } @@ -154,7 +232,7 @@ public void SetAdvertisingNamePrefix(string advertisingNamePrefix) } byte[] passkeyArray = reader.ReadBytes(6); - if (passkeyArray[0] == 0xFF || passkeyArray[0] == 0x00) + if (IsAllFFs(passkeyArray) || passkeyArray[0] == 0x00) { Passkey = ""; } @@ -164,7 +242,7 @@ public void SetAdvertisingNamePrefix(string advertisingNamePrefix) } byte[] advertisingNamePrefixArrayOriginal = reader.ReadBytes(32); - if (advertisingNamePrefixArrayOriginal[0] == 0xFF) + if (IsAllFFs(advertisingNamePrefixArrayOriginal)) { AdvertisingNamePrefix = ""; } From 027711b1d5bec58ba20d370e5c7b8dfaec8f8a25 Mon Sep 17 00:00:00 2001 From: Jong Chern Date: Thu, 20 Jan 2022 22:03:33 +0800 Subject: [PATCH 2/2] update --- ShimmerBLE/ShimmerBLEAPI/Models/ProdConfigPayload.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ShimmerBLE/ShimmerBLEAPI/Models/ProdConfigPayload.cs b/ShimmerBLE/ShimmerBLEAPI/Models/ProdConfigPayload.cs index 6bc34101..4d9f21d0 100644 --- a/ShimmerBLE/ShimmerBLEAPI/Models/ProdConfigPayload.cs +++ b/ShimmerBLE/ShimmerBLEAPI/Models/ProdConfigPayload.cs @@ -52,6 +52,10 @@ public void EnableNoPasskey(string advertisingName, string passkeyID) { try { + if (advertisingName.Equals("Verisense")) + { + advertisingName = ""; + } SetAdvertisingNamePrefix(advertisingName); SetPasskey(""); SetPasskeyID(passkeyID); @@ -66,6 +70,10 @@ public void EnableDefaultPasskey(string advertisingName, string passkeyID) { try { + if (advertisingName.Equals("Verisense")) + { + advertisingName = ""; + } SetAdvertisingNamePrefix(advertisingName); SetPasskey("123456"); SetPasskeyID(passkeyID); @@ -244,7 +252,7 @@ protected bool HasAnFF(byte[] byteArray) byte[] advertisingNamePrefixArrayOriginal = reader.ReadBytes(32); if (IsAllFFs(advertisingNamePrefixArrayOriginal)) { - AdvertisingNamePrefix = ""; + AdvertisingNamePrefix = "Verisense"; } else {