diff --git a/CHANGELOG.md b/CHANGELOG.md index 042a1d6a2..e97d24656 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,202 +1,3 @@ ## Changelog -- **3.1.4**: - - Bugfix: Possible crash fixed when IVI was 1 and IV Index 0 (#358). - - Bugfix: Multiple `self` weakened (#356). - - Allowing groups to be null when importing (#348, #357). - -- **3.1.3**: - - Improvement: Migration to Xcode 12.5. - * Improvement: CryptoSwift updated from 1.3.8 to 1.4.0 (https://github.com/krzyzanowskim/CryptoSwift/releases/tag/1.4.0). - * Bugfix: Two threading issues fixed (#350 with #351 and #352 with #353). - * Bugfix: Refreshing Last Modified date after importing new mesh network configuration (https://github.com/NordicSemiconductor/IOS-nRF-Mesh-Library/commit/f60f3b25111bae1b1dcc1b5ffcf62e2a09615cf7). - -- **3.1.2**: - - Bugfix: Fixed DevicePropertyCharacteristic.pressure with missing resolution when converting to Data (#344). - - Bugfix: Fixed calculating message sequence when Seq > 8191 (#345). -- **3.1.1**: - - Bugfix: `SegmentedAccessMessage` overflow crash (#339). - - Bugfix: Validation failure if database contains 10m publish resolution (#338). - -- **3.1.0**: - - Sensor messages + simple UI for reading sensor values (#327). - - Light LC messages (#328). - -- **3.0.2**: - - Bugfix: Fixed issues with importing a JSON file exported with an older version of the app (#321). - -- **3.0.1**: - - Scene support. - - Heartbeat support. - - Key Refresh Procedure support. - - Partial export. - - UI improvements. - - JSON schema modified. - - Bugs fixed. - - For more see #295 and #323. - -- **2.2.3**: - - A connected Proxy Node, if known, can now we obtained from the `ProxyFilter`. - - Displaying Proxy Node name on Proxy screen in the sample app. - - New icons in the sample app. - - Improvement: `ProxyFilterDelegate` methods will be called on the delegate queue specified in the `MeshNetworkManager`. - - Several bugs fixed. - -- **2.2.2**: - - Fixed handling IV Index update. - - Added a flag to enable IV Index Test Mode. - - New method to get next available address from given offset. - - 2 methods added to get and set Element's sequence number. Use on your own risk. - - A Disconnect button added in the sample app, available with Automatic Connection disabled. - - Improvement: Migration to Swift 5.2 and Xcode 11.4. - - Improvement: macOs added to podspec (#240). - - Improvement: Discovering new proxy connection improved. - - Bugfix: Fixed overwriting primary element's name. - - Bugfix: Thread synchronization in `ProxyFilter` and `BaseGattBearer`. - -- **2.2.1**: - - API related to "compatible models" removed, as the client and server models do not need to have model IDs differing by 1 (#225). - -- **2.2.0**: - - Scene messages added. - - Lightness, CTL and HSL messages added. - - Improved switching from provisioning to node configuration. - - Support for Proxies with proxy filter capacity limited to 1. - - Bugfix: Several potential crashes fixed, including #208. - - Spelling: Targeting -> targeting. - -- **2.1.0**: - - Option to select connected proxy manually (disable Automatic Connection on Proxy screen). - - An example Simple OnOff client vendor model added. - - Bugfix: Race condition on Access and Upper Transport Layer fixed (#179). - - Bugfix: Editing keys possible only when new one is created (#188). - - Improvement: Clarification of Relay documentation (#168). - - Improvement: Compatibility with Xcode 10.x (#180). - -- **2.0.0**: - - A complete rewrite of the sample app and underlying mesh library. The API is not backwards compatible with the old version. - - The old database will be automatically migrated to the new format when calling `manager.load()`. - -- **1.0.4**: - - Adds ability to control GenericOnOff parameters, `TransitionDelay` and `TransitionTime` (some testing needed). - - Adds ability to control GenericLevel models, additionally `TransitionDelay` and `TransitionTime` (some testing needed). - - Bugfix: Fixed an issue causing the provisioning to halt at 91% intermittently due to block acknowledgements not working as it should, a 2-second delay is restored to workaround this. - -- **1.0.1**: - - Adds minor improvements to the copy on some UI components within the application. - - Bugfix: Performance improvement due to removing an intended 2-second delay when switching between Composition Data Get state and AppKeyAdd state due to an earlier bug. - - Bugfix: fixed an issue with block acknowledgements that caused longer messages that needs multiple acknowledgement to fail. - - Bugfix: fixed an issue in the GenericOnOff control view, this bug caused loss of control over the node when it's added then removed from a subscription group. - - Bugfix: fixed an issue that caused the navigation bar not to reflect the scanner state when directly tapping the `Add Node` button instead of using the tab bar button. - -- **1.0**: - - Adds a better approach for GenericOnOffSet messages to be sent to all subscribed addresses on the target element. If no subscriptions are present, messages will be sent to the element's unicast. - - Adds an element unicast address within the node view to allow easier configuration. - - Adds Application Version and build numbers in the settings view. - - Adds a more descriptive title depending on OOB type in the user input view. - - Fixes some typos and misplaced text in the bundled application. - - Bugfix: Fixed a crash when the input OOB length won't fit within an UIn16 value. - - Bugfix: Input and Output OOB actions where wrongly parsed as Octets instead of bit fields, causing a crash when a node supports more than one action type. - - Bugfix: Fixed a bug causing Output OOB action types that are not Numeric OOB to never trigger due to a legacy check that's no longer required. - -- **0.4**: - - Adds GenericOnOffServer control. - - Adds UI improvement in Element view, now subscription,publication and both states are shown on the cell. - - Adds UI improvement for GenericOnOff control to disable the feature if an AppKey is not bound to the model. - - Bugfix: Access messages no longer use DeviceKey and DeviceNonce in cases where AppKey should be used. - - Bugfix: Sequence number's first octet was not calculated properly, causing it to always be 0x00. - - Bugfix: Fixed Typo in scanner view "Discovery" -> "Discover". - -- **0.3**: - - TestFlight Release. - - First App Store Release. - - Adds ability to reset/remove a node. - - Adds ability to remove subscription addresses for a model. - - Adds ability to parse node identity packets to allow connecting to a specific node (Cryptographically safe). - - Adds ability to parse network identity packets to allow reconnecting to the same node (Cryptographically safe). - - Adds MeshManager class that manages the proxy node, network state and related mesh network data through API calls. - - Adds ability to abort node provisioning. - - Adds Improved provisioning view with progressbar indication. - - Bugfix: AppKeyIndex values above 1 caused a failure to bind models to app keys due to a hardcoded value. - - Bugfix: NetKeyIndex and AppKeyIndex values were swapped in the AppKeyStatus message. - - Bugfix: Mesh connection button was too slow and sometimes malfunctioned. - - Bugfix: Scanner views were sometimes untapabble and scrolling was erratic when nodes advertise with low intervals. - - Bugfix: Main network view crashed intermittently after the network has been reset. - - Bugfix: Some input views where parsing freetext as hex, causing a crash. - - Input views can now robustly handle hex input format starting with `0x`. - - Subscription address types are now shown beside the subscription address. - - Empty scanner views will now have an empty state to avoid blank screens. - - Provisioning logs moved to a separate view. - - An improved UI and interaction across all views. - -- **0.2**: - - TestFlight Release. - - Bundled sample firmwares for Light Server and Light client to ease the testing process. - - Minor fixes for copy in the model configuration view, Detail labels where left blank, now they show more information on what happens on selection. - - Added empty scanner view (Not yet implemented in UI). - - Added mesh save when mesh state is reset to fix the crash caused by mesh state not being present on main network view. - - Reset network text will now be red to alert the user of destructive action. - - Settings view copy improvements: capitalization fixes and better naming of rows. - - CBUUID log in the provisioner will now show the hex value instead of data size. - - Title on a provisioner will use the friendly name instead of BLE name. - - Display node name and unicast in the node's cell title label. - - Fixed a bug causing node friendly name to be forced into a hex value. - - Fixed a bug causing node friendly name not to be stored and used. - - Minor tweak to the node cell UI. - - Shortened company name/company id label text. - - removed 0x from placeholder input to avoid confusion. - - Fixed Bug causing key binding, pub/sub addresses to overlap on models with same identifier. - - Minor refactor to the composition element model to allow storing model related data within the element instead of the root object. - - Added activity indicator in the provisioning view to emphasise the progress, it stops at completion or any failures. - - Minor cleanup in log messages during node identity verification, all lowercase. - - Used CBUUID as a node identifier to avoid duplication and to avoid the mistake of using advertisement data as it's not a node identifier. - - Minor log fixes to avoid double logging of disconnection, etc.. - - Disconnecting of current proxy when provisioning a new node, this is to avoid having multiple proxies connected simultaneously. - - Removed commented out code line. - - Node Identity validation. - - Added node identity advertisement parsing when reconnecting to a node to configure after provisioning. - - Added ability to overwrite the unicast address in case the user doesn't want to use the automatically incremented space. - - Added automatic unicast address incrementing in mesh state struct. - - unicast will automatically increment according to number of elements coming from the composition data of a provisioned node. - - This allows simply tapping provision button instead of having to type in the address manually. - - Minor tweak to tint settings. - - Color improvements on Node cells. - - Renamed Display name to nRF Mesh. - - Updated LaunchScreen Storyboard. - - Added missing image assets. - - Added 1-second delay after provisioning succeeds to allow the user to see the message. - - Provisioning view will set the main tab to the network view instead of the scanner view before popping to root view, to give a better context. - - Renamed Product Vendor Identifier to Product Version as it was incorrect. - - Updated Composition status struct and NodeEntry struct to reflect the VendorId->ProductVersion change. - - Added an improved settings' icon. - - Fixed a broken icon in the node configuration view. - - Added Settings icon to settings tab bar item instead of the list icon. - - Added an improved icon to the add tab bar. - - Added option to reset the mesh database, this is a destructive/non-reversible action and regenerate new NetKey and mesh state. - - Added Mesh rejoin functionality to connect to a proxy node. - - Reconnection to Proxy node functional, also displaying advertisement data on the scanner view with RSSI. - - Enabled Mesh disconnection form the main view. - - WIP: Added proxy scanning mode. - - Added Reconnect button on the main network view when there's a configured network, but no connected proxy node. - - Display SIG model identifiers as subtitle even if they're parsed into a human readable string. - - Created an improved scanner node item cell. - - Display RSSI values (Will grey out when RSSI is not available, displaying the last known RSSI. - - Display Provisioning advertisement data when present. - - Added a network icon to cells. - - Extracted status code alerts to clean up code duplication. - - Added hex parsing validation to address value inputs. - - Fixed Default TTL Configuration message implementation. - - Default TTL status message is now implemented and callbacks are forwarded to it's designated delegate. - - Added subscription lists support for the Example application's UI. - - Added Subscription Add message operation, Subscription status operation and dependencies. - - iOS10 data compatibility and Segmentation / Acknowledgement messages bugs resolved. - - Fixes related to segmentation and reassembly, This fixes the acknowledgement messages failing when they're longer than MTU size and are not segmented. - - This also adds Default TTL Get message support (Not accessible currently, but functional). - - Fixes a bug that caused an invalid state when a segmented message arrives over only one segment I.E: SegN=0x00 and SegO=0x00 causing the ack timer to have an unknown state. - - Re-enabled app key state switch after composition data is received. - - Copy Data objects to preserve 0 indices on iOS versions <= 10. - - Added GATT Bearer SAR checks to assure that segments that are out of order are dropped. - - An added segment caching to assure that incomind lower transport segments are not appended to the current segment being Reassembled upon retransmission. - -- **0.1**: - - Initial release. +For change log see [Releases](https://github.com/NordicSemiconductor/IOS-nRF-Mesh-Library/releases). diff --git a/Example/Podfile.lock b/Example/Podfile.lock index df93714f3..9c74dc026 100755 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,6 +1,6 @@ PODS: - CryptoSwift (1.4.0) - - nRFMeshProvision (3.1.4): + - nRFMeshProvision (3.1.5): - CryptoSwift (= 1.4.0) DEPENDENCIES: @@ -16,8 +16,8 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: CryptoSwift: 7cc902df1784de3b389a387756c7d710f197730c - nRFMeshProvision: 4b3e185fd13b077c997aadca6f54806f5c577cd7 + nRFMeshProvision: 8d93e5827501f166f1511c89a5540a610844ccf2 PODFILE CHECKSUM: 69a81463322ef34ca0a20b98e90da2701d94e4ec -COCOAPODS: 1.10.1 +COCOAPODS: 1.10.2 diff --git a/Example/Pods/Local Podspecs/nRFMeshProvision.podspec.json b/Example/Pods/Local Podspecs/nRFMeshProvision.podspec.json index 08a14c105..cbe94c686 100755 --- a/Example/Pods/Local Podspecs/nRFMeshProvision.podspec.json +++ b/Example/Pods/Local Podspecs/nRFMeshProvision.podspec.json @@ -1,8 +1,8 @@ { "name": "nRFMeshProvision", - "version": "3.1.4", + "version": "3.1.5", "summary": "A Bluetooth Mesh library", - "description": "nRF Mesh is a Bluetooth Mesh compliant library that has many features such as provisioning, configuration and control of Bluetooth Mesh compliant nodes.", + "description": "nRF Mesh is a Bluetooth mesh compliant library supporting features such as provisioning, configuration and control of Bluetooth mesh nodes.", "homepage": "https://github.com/NordicSemiconductor/IOS-nRF-Mesh-Library", "license": { "type": "BSD-3-Clause", @@ -13,7 +13,7 @@ }, "source": { "git": "https://github.com/NordicSemiconductor/IOS-nRF-Mesh-Library.git", - "tag": "3.1.4" + "tag": "3.1.5" }, "social_media_url": "https://twitter.com/nordictweets", "platforms": { @@ -26,7 +26,9 @@ "5.0", "5.1", "5.2", - "5.3" + "5.3", + "5.4", + "5.5" ], "source_files": "nRFMeshProvision/Classes/**/*", "dependencies": { @@ -35,5 +37,5 @@ ] }, "frameworks": "CoreBluetooth", - "swift_version": "5.3" + "swift_version": "5.5" } diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index df93714f3..9c74dc026 100755 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,6 +1,6 @@ PODS: - CryptoSwift (1.4.0) - - nRFMeshProvision (3.1.4): + - nRFMeshProvision (3.1.5): - CryptoSwift (= 1.4.0) DEPENDENCIES: @@ -16,8 +16,8 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: CryptoSwift: 7cc902df1784de3b389a387756c7d710f197730c - nRFMeshProvision: 4b3e185fd13b077c997aadca6f54806f5c577cd7 + nRFMeshProvision: 8d93e5827501f166f1511c89a5540a610844ccf2 PODFILE CHECKSUM: 69a81463322ef34ca0a20b98e90da2701d94e4ec -COCOAPODS: 1.10.1 +COCOAPODS: 1.10.2 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 2616350ca..bcaabb450 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -1876,7 +1876,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1100; - LastUpgradeCheck = 1250; + LastUpgradeCheck = 1310; }; buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; @@ -2452,11 +2452,10 @@ }; name = Release; }; - 119859653F1B910D730619DB115698A3 /* Release */ = { + 2372535C0AB9DD3B1EBC74E87BF12294 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 73F4C6A0E5FCBC427875F5C39371DEF5 /* nRFMeshProvision.release.xcconfig */; + baseConfigurationReference = 1FC18BAB53A0C8A42EC449181449498A /* CryptoSwift.release.xcconfig */; buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -2465,15 +2464,14 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/nRFMeshProvision/nRFMeshProvision-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/nRFMeshProvision/nRFMeshProvision-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/CryptoSwift/CryptoSwift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CryptoSwift/CryptoSwift-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/nRFMeshProvision/nRFMeshProvision.modulemap"; - PRODUCT_MODULE_NAME = nRFMeshProvision; - PRODUCT_NAME = nRFMeshProvision; + MODULEMAP_FILE = "Target Support Files/CryptoSwift/CryptoSwift.modulemap"; + PRODUCT_MODULE_NAME = CryptoSwift; + PRODUCT_NAME = CryptoSwift; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -2485,10 +2483,11 @@ }; name = Release; }; - 2372535C0AB9DD3B1EBC74E87BF12294 /* Release */ = { + 2461BFC62EA129FFA322B4F83394D79D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1FC18BAB53A0C8A42EC449181449498A /* CryptoSwift.release.xcconfig */; + baseConfigurationReference = 42C87A2C10D519B82B447334DB11C13D /* nRFMeshProvision.debug.xcconfig */; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -2497,24 +2496,24 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/CryptoSwift/CryptoSwift-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/CryptoSwift/CryptoSwift-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/nRFMeshProvision/nRFMeshProvision-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/nRFMeshProvision/nRFMeshProvision-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/CryptoSwift/CryptoSwift.modulemap"; - PRODUCT_MODULE_NAME = CryptoSwift; - PRODUCT_NAME = CryptoSwift; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/nRFMeshProvision/nRFMeshProvision.modulemap"; + PRODUCT_MODULE_NAME = nRFMeshProvision; + PRODUCT_NAME = nRFMeshProvision; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.3; + SWIFT_VERSION = 5.5; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; 3490AB06E9C42B9FD2F056F5C1248A3B /* Release */ = { isa = XCBuildConfiguration; @@ -2644,38 +2643,6 @@ }; name = Release; }; - A4EDC716340C7AD665D74A8CDBC60E33 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 42C87A2C10D519B82B447334DB11C13D /* nRFMeshProvision.debug.xcconfig */; - buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/nRFMeshProvision/nRFMeshProvision-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/nRFMeshProvision/nRFMeshProvision-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/nRFMeshProvision/nRFMeshProvision.modulemap"; - PRODUCT_MODULE_NAME = nRFMeshProvision; - PRODUCT_NAME = nRFMeshProvision; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.3; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; B72E2E98F019EF31127C5DB983A65863 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = A421192576A8E503AE97BBA464BDB881 /* Pods-nRFMeshProvision_Example.debug.xcconfig */; @@ -2805,14 +2772,47 @@ }; name = Debug; }; + F1B176F8C2F959F474231C3BEDD223FC /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 73F4C6A0E5FCBC427875F5C39371DEF5 /* nRFMeshProvision.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/nRFMeshProvision/nRFMeshProvision-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/nRFMeshProvision/nRFMeshProvision-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/nRFMeshProvision/nRFMeshProvision.modulemap"; + PRODUCT_MODULE_NAME = nRFMeshProvision; + PRODUCT_NAME = nRFMeshProvision; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.5; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 18AA6E810253E026EE68BD1D97B2F9D0 /* Build configuration list for PBXNativeTarget "nRFMeshProvision" */ = { isa = XCConfigurationList; buildConfigurations = ( - A4EDC716340C7AD665D74A8CDBC60E33 /* Debug */, - 119859653F1B910D730619DB115698A3 /* Release */, + 2461BFC62EA129FFA322B4F83394D79D /* Debug */, + F1B176F8C2F959F474231C3BEDD223FC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example/Pods/Target Support Files/nRFMeshProvision/nRFMeshProvision-Info.plist b/Example/Pods/Target Support Files/nRFMeshProvision/nRFMeshProvision-Info.plist index 36f2c7e22..c1aea25c2 100644 --- a/Example/Pods/Target Support Files/nRFMeshProvision/nRFMeshProvision-Info.plist +++ b/Example/Pods/Target Support Files/nRFMeshProvision/nRFMeshProvision-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.1.4 + 3.1.5 CFBundleSignature ???? CFBundleVersion diff --git a/Example/nRFMeshProvision.xcodeproj/project.pbxproj b/Example/nRFMeshProvision.xcodeproj/project.pbxproj index 09ff80c4b..55a064303 100644 --- a/Example/nRFMeshProvision.xcodeproj/project.pbxproj +++ b/Example/nRFMeshProvision.xcodeproj/project.pbxproj @@ -838,7 +838,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 1250; + LastUpgradeCheck = 1310; ORGANIZATIONNAME = CocoaPods; TargetAttributes = { 607FACCF1AFB9204008FA782 = { diff --git a/Example/nRFMeshProvision.xcodeproj/xcshareddata/xcschemes/nRFMeshProvision_Example.xcscheme b/Example/nRFMeshProvision.xcodeproj/xcshareddata/xcschemes/nRFMeshProvision_Example.xcscheme index beb376570..948a93c11 100644 --- a/Example/nRFMeshProvision.xcodeproj/xcshareddata/xcschemes/nRFMeshProvision_Example.xcscheme +++ b/Example/nRFMeshProvision.xcodeproj/xcshareddata/xcschemes/nRFMeshProvision_Example.xcscheme @@ -1,6 +1,6 @@ Bluetooth mesh specifications may be found [here](https://www.bluetooth.com/specifications/specs/?status=active&show_latest_version=0&show_latest_version=1&keyword=mesh&filter=). -> Bluetooth Mesh specification may be found here: https://www.bluetooth.com/specifications/mesh-specifications/ +The library is compatible with +- **Bluetooth Mesh Profile 1.0.1**, +- **Mesh Model 1.0.1**, +- **Mesh Device Properties 2**. -The library is compatible with version 1.0.1 of the Bluetooth Mesh Profile Specification. +The mesh network configuration (JSON) is compatible with +- **Mesh Configuration Database Profile 1.0**. -This is the second version of the nRF Mesh Provision library for iOS. All features are tested against nRF Mesh SDK and Zephyr based mesh devices. +All features are tested against *nRF5 SDK for Mesh* and *nRF Connect SDK* based mesh devices. -> The version 1.x and 2.x of this library are no longer maintained. Please migrate to 3.x to get new features and bug fixes. For changes and migration details see [#295](https://github.com/NordicSemiconductor/IOS-nRF-Mesh-Library/pull/295). +> The version 1.x and 2.x of this library are no longer maintained. Please migrate to 3.x to get new features and bug fixes. +For changes and migration details see [#295](https://github.com/NordicSemiconductor/IOS-nRF-Mesh-Library/pull/295). ## Sample app -The sample application demonstrates how to use the library. It may also be used to configure your Mesh network. Use `pod try` to install and set up the sample app when using CocoaPods. +The sample application demonstrates how to use the library. It may also be used to configure your Mesh network. +Use `pod try` to install and set up the sample app when using CocoaPods. The app and the library are released under BSD-3 license. Feel free to modify them as you want. The app is available on App Store: https://apps.apple.com/us/app/nrf-mesh/id1380726771 ## Supported features -1. Provisioning with all features that available in Bluetooth Mesh Profile 1.0.1, including OOB Public Key and all types of OOB. -2. Managing Provisioners, Network Keys, Application Keys, resetting network, etc. -3. All network layers are working. -4. Parsing Secure Network beacons. -5. Adding, removing and refreshing Network and Application Keys to Nodes. -6. Binging and unbinding Application Keys to Models. -7. Setting and clearing publication to a Model. -8. Setting and removing subscriptions to a Model. -9. Groups, including those with Virtual Addresses. -10. UI for controlling groups (Generic OnOff and Generic Level (delta) are supported). -12. Handling Configuration Server messages sent by other Provisioner. -13. Generic OnOff and Vendor model have dedicated controls in sample app. -14. Proxy Filter. -15. IV Index update (handling updates received in Secure Network beacons). -16. Heartbeats (both as client and server). -17. Scenes (both as client and server). -18. Partial export (allows to export only part of the network, for example for a Guest). -19. [Key Refresh Procedure](https://github.com/NordicSemiconductor/IOS-nRF-Mesh-Library/pull/314) (using *ConfigKeyRefreshPhaseSet* messages, not Secure Network beacon) +The library supports great majority of features from Bluetooth Mesh 1.0.1 specification: + +1. Provisioning with all features available in Bluetooth Mesh Profile 1.0.1, including OOB Public Key + and all types of OOB, using GATT bearer. +2. Configuration, including managing keys, publications, subscription, and hearbeats (both as client and server). +3. Support for client and server models. +4. Groups, including those with virtual labels. +5. Scenes (both as client and server). +6. Managing proxy filter. +7. IV Index update (handled by Secure Network beacons). +8. [Key Refresh Procedure](https://github.com/NordicSemiconductor/IOS-nRF-Mesh-Library/pull/314) + (using *ConfigKeyRefreshPhaseSet* messages, not Secure Network beacon). +9. Hearbeats (both as client and server). +10. Exporting network state with format compatible to + [Configuration Database Profile 1.0](https://www.bluetooth.com/specifications/specs/mesh-configuration-database-profile-1-0/), + including partial export. +11. Option to use own transport layer with default GATT Bearer implementation available. + +Most of the features are demonstrated in the sample app nRF Mesh: + +1. Provisioning with all available features. +2. Configuration of local and remote nodes. +3. Managing network (provisioners, network and application keys, scenes), resetting and exporting configuration. +4. Managing groups, including those with virtual labels. +5. Sending group messages. +6. UI for local models, which include: + - Generic OnOff Client and Server, + - Generic Level Client and Server, + - Simple OnOff vendor model by Nordic. +7. Support for some server models: + - Generic OnOff, + - Generic Level, + - Vendor models. +8. Scenes, both as client and server. +9. Automatic connection to nearby nodes and automatic proxy filter management. ## NOT (yet) supported features -1. Many SIG defined models, except from supported ones. -2. IV Index update (initiation). -3. Health server messages. -4. Remote Provisioning. +The following features are not (yet) supported: + +1. The rest of models defined by Bluetooth SIG - PRs are welcome! +2. IV Index update (initiation) - not a top priority, as other nodes may initiate the update. +3. Health server messages - in our TODO list. +4. Remote provisioning - in our TODO list. +5. Device Firmware Update (DFU) - in our TODO list. ## Documentation @@ -62,7 +88,7 @@ The documentation for this library may be found [here](Documentation/README.md). ## Optional -* nrf52832 or nrf52840 based Development Kit(s) to test the sample firmwares on. +* nrf5 based Development Kit(s) to test the sample firmwares. ## Feedback @@ -70,4 +96,4 @@ Any feedback is more than welcome. Please, test the app, test the library and ch ## License -BSD 3-Clause License +BSD 3-Clause License. diff --git a/nRFMeshProvision.podspec b/nRFMeshProvision.podspec index 528821104..fcbe6ea10 100755 --- a/nRFMeshProvision.podspec +++ b/nRFMeshProvision.podspec @@ -9,10 +9,10 @@ Pod::Spec.new do |s| s.name = 'nRFMeshProvision' - s.version = '3.1.4' + s.version = '3.1.5' s.summary = 'A Bluetooth Mesh library' s.description = <<-DESC - nRF Mesh is a Bluetooth Mesh compliant library that has many features such as provisioning, configuration and control of Bluetooth Mesh compliant nodes. + nRF Mesh is a Bluetooth mesh compliant library supporting features such as provisioning, configuration and control of Bluetooth mesh nodes. DESC s.homepage = 'https://github.com/NordicSemiconductor/IOS-nRF-Mesh-Library' s.license = { :type => 'BSD-3-Clause', :file => 'LICENSE' } @@ -22,7 +22,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = '10.0' s.osx.deployment_target = '10.15' s.static_framework = true - s.swift_versions = ['4.2', '5.0', '5.1', '5.2', '5.3'] + s.swift_versions = ['4.2', '5.0', '5.1', '5.2', '5.3', '5.4', '5.5'] s.source_files = 'nRFMeshProvision/Classes/**/*' s.dependency 'CryptoSwift', '= 1.4.0' s.frameworks = 'CoreBluetooth' diff --git a/nRFMeshProvision/Classes/Bearer/GATT/ProxyProtocolHandler.swift b/nRFMeshProvision/Classes/Bearer/GATT/ProxyProtocolHandler.swift index c7ac5b322..fcc734931 100644 --- a/nRFMeshProvision/Classes/Bearer/GATT/ProxyProtocolHandler.swift +++ b/nRFMeshProvision/Classes/Bearer/GATT/ProxyProtocolHandler.swift @@ -67,6 +67,10 @@ public class ProxyProtocolHandler { private var buffer: Data? private var bufferType: PduType? + public init() { + // Empty public init. + } + /// Segments the given data with given message type to 1+ messages /// where all but the last one are of the MTU size and the last one /// is MTU size or smaller. diff --git a/nRFMeshProvision/Classes/Layers/Access Layer/AccessLayer.swift b/nRFMeshProvision/Classes/Layers/Access Layer/AccessLayer.swift index 00553f29b..af325cf26 100644 --- a/nRFMeshProvision/Classes/Layers/Access Layer/AccessLayer.swift +++ b/nRFMeshProvision/Classes/Layers/Access Layer/AccessLayer.swift @@ -170,7 +170,8 @@ internal class AccessLayer { let index = mutex.sync(execute: { reliableMessageContexts.firstIndex(where: { $0.source == upperTransportPdu.destination && - $0.request.responseOpCode == accessPdu.opCode + $0.request.responseOpCode == accessPdu.opCode && + $0.destination == upperTransportPdu.source }) }) { mutex.sync { @@ -594,12 +595,14 @@ private extension AccessLayer { let ack = AcknowledgmentContext(for: request, sentFrom: pdu.source, to: pdu.destination.address, - repeatAfter: initialDelay, repeatBlock: { + repeatAfter: initialDelay, repeatBlock: { [weak self] in + guard let self = self else { return } if !self.networkManager.upperTransportLayer.isReceivingResponse(from: pdu.destination.address) { self.logger?.d(.access, "Resending \(pdu)") self.networkManager.upperTransportLayer.send(pdu, withTtl: initialTtl, using: keySet) } - }, timeout: timeout, timeoutBlock: { + }, timeout: timeout, timeoutBlock: { [weak self] in + guard let self = self else { return } self.logger?.w(.access, "Response to \(pdu) not received (timeout)") let category: LogCategory = request is AcknowledgedConfigMessage ? .foundationModel : .model self.logger?.w(category, "\(request) sent from: \(pdu.source.hex), to: \(pdu.destination.hex) timed out") diff --git a/nRFMeshProvision/Classes/Layers/MessageHandle.swift b/nRFMeshProvision/Classes/Layers/MessageHandle.swift index 32c643942..10b854ce8 100644 --- a/nRFMeshProvision/Classes/Layers/MessageHandle.swift +++ b/nRFMeshProvision/Classes/Layers/MessageHandle.swift @@ -41,10 +41,11 @@ import Foundation /// The handle contains information about the message that was sent: /// its opcode, source and destination addresses. public struct MessageHandle { - let opCode: UInt32 - let source: Address - let destination: Address weak var manager: MeshNetworkManager? + + public let opCode: UInt32 + public let source: Address + public let destination: Address init(for message: MeshMessage, sentFrom source: Address, to destination: Address, diff --git a/nRFMeshProvision/Classes/Utils/MeshLoggerDelegate.swift b/nRFMeshProvision/Classes/Utils/MeshLoggerDelegate.swift index 4d677d848..bc61f6262 100644 --- a/nRFMeshProvision/Classes/Utils/MeshLoggerDelegate.swift +++ b/nRFMeshProvision/Classes/Utils/MeshLoggerDelegate.swift @@ -90,32 +90,32 @@ public protocol LoggerDelegate: AnyObject { internal extension LoggerDelegate { - func d(_ category: LogCategory, _ message: String) { - log(message: message, ofCategory: category, withLevel: .debug) + func d(_ category: LogCategory, _ message: @autoclosure () -> String) { + log(message: message(), ofCategory: category, withLevel: .debug) } - func v(_ category: LogCategory, _ message: String) { - log(message: message, ofCategory: category, withLevel: .verbose) + func v(_ category: LogCategory, _ message: @autoclosure () -> String) { + log(message: message(), ofCategory: category, withLevel: .verbose) } - func i(_ category: LogCategory, _ message: String) { - log(message: message, ofCategory: category, withLevel: .info) + func i(_ category: LogCategory, _ message: @autoclosure () -> String) { + log(message: message(), ofCategory: category, withLevel: .info) } - func a(_ category: LogCategory, _ message: String) { - log(message: message, ofCategory: category, withLevel: .application) + func a(_ category: LogCategory, _ message: @autoclosure () -> String) { + log(message: message(), ofCategory: category, withLevel: .application) } - func w(_ category: LogCategory, _ message: String) { - log(message: message, ofCategory: category, withLevel: .warning) + func w(_ category: LogCategory, _ message: @autoclosure () -> String) { + log(message: message(), ofCategory: category, withLevel: .warning) } func w(_ category: LogCategory, _ error: Error) { log(message: error.localizedDescription, ofCategory: category, withLevel: .warning) } - func e(_ category: LogCategory, _ message: String) { - log(message: message, ofCategory: category, withLevel: .error) + func e(_ category: LogCategory, _ message: @autoclosure () -> String) { + log(message: message(), ofCategory: category, withLevel: .error) } func e(_ category: LogCategory, _ error: Error) {