Browse Source

First version

tags/v1.4.5_20211215
iot_user 5 years ago
commit
21271b9ca6
100 changed files with 9316 additions and 0 deletions
  1. 779
    0
      AILinkBleSDKDemo.xcodeproj/project.pbxproj
  2. 7
    0
      AILinkBleSDKDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  3. 8
    0
      AILinkBleSDKDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  4. BIN
      AILinkBleSDKDemo.xcodeproj/project.xcworkspace/xcuserdata/iot_user.xcuserdatad/UserInterfaceState.xcuserstate
  5. 14
    0
      AILinkBleSDKDemo.xcodeproj/xcuserdata/iot_user.xcuserdatad/xcschemes/xcschememanagement.plist
  6. BIN
      AILinkBleSDKDemo/AILinkBleSDK.framework/AILinkBleSDK
  7. 62
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBabyScaleBleHeader.h
  8. 24
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBabyScaleBleHeightModel.h
  9. 57
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBabyScaleBleManager.h
  10. 24
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBabyScaleBleWeightModel.h
  11. 18
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBabyScaleDeviceModel.h
  12. 34
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBlePublicTool.h
  13. 48
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBleWifiDetailModel.h
  14. 25
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBloodBleDataModel.h
  15. 117
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBloodBleManager.h
  16. 58
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBloodBleSDKHeader.h
  17. 598
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBluetoothManager.h
  18. 137
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBodyFatScaleBleHeader.h
  19. 138
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBodyFatScaleBleManager.h
  20. 32
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBodyFatScaleBleUserModel.h
  21. 50
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBodyFatScaleBleWeightModel.h
  22. 20
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBodyFatScaleDeviceModel.h
  23. 87
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELForeHeadBleManager.h
  24. 24
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELForeheadBleDataModel.h
  25. 30
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELForeheadHeader.h
  26. 28
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELHeightGaugeBleDataModel.h
  27. 67
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELHeightGaugeBleManager.h
  28. 24
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELHeightGaugeHeader.h
  29. 81
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELPeripheralModel.h
  30. 85
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELRemoteControlBleHeader.h
  31. 40
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELRemoteControlBleManager.h
  32. 17
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELRemoteControlDeviceModel.h
  33. 318
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELSDKHeader.h
  34. 82
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELThermometerBleManager.h
  35. 24
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELThermometerBleModel.h
  36. 17
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELThermometerDeviceModel.h
  37. 60
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELUnitConvertTool.h
  38. 55
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELWheelMonitorBleHeader.h
  39. 116
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELWheelMonitorBleManager.h
  40. 42
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELWheelMonitorBleModel.h
  41. BIN
      AILinkBleSDKDemo/AILinkBleSDK.framework/Info.plist
  42. BIN
      AILinkBleSDKDemo/AILinkBleSDK.framework/_CodeSignature/CodeDirectory
  43. BIN
      AILinkBleSDKDemo/AILinkBleSDK.framework/_CodeSignature/CodeRequirements
  44. BIN
      AILinkBleSDKDemo/AILinkBleSDK.framework/_CodeSignature/CodeRequirements-1
  45. 612
    0
      AILinkBleSDKDemo/AILinkBleSDK.framework/_CodeSignature/CodeResources
  46. BIN
      AILinkBleSDKDemo/AILinkBleSDK.framework/_CodeSignature/CodeSignature
  47. 17
    0
      AILinkBleSDKDemo/AiLinkSuper/AiLinkSuperViewController.h
  48. 96
    0
      AILinkBleSDKDemo/AiLinkSuper/AiLinkSuperViewController.m
  49. 19
    0
      AILinkBleSDKDemo/AiLinkSuper/AilinkSuperConnectViewController.h
  50. 236
    0
      AILinkBleSDKDemo/AiLinkSuper/AilinkSuperConnectViewController.m
  51. 15
    0
      AILinkBleSDKDemo/AppDelegate.h
  52. 43
    0
      AILinkBleSDKDemo/AppDelegate.m
  53. 98
    0
      AILinkBleSDKDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
  54. 6
    0
      AILinkBleSDKDemo/Assets.xcassets/Contents.json
  55. 17
    0
      AILinkBleSDKDemo/BabyScale/BabyScaleConnectViewController.h
  56. 303
    0
      AILinkBleSDKDemo/BabyScale/BabyScaleConnectViewController.m
  57. 17
    0
      AILinkBleSDKDemo/BabyScale/BabyScaleViewController.h
  58. 89
    0
      AILinkBleSDKDemo/BabyScale/BabyScaleViewController.m
  59. 25
    0
      AILinkBleSDKDemo/Base.lproj/LaunchScreen.storyboard
  60. 17
    0
      AILinkBleSDKDemo/BloodPressure/BloodConnectViewController.h
  61. 312
    0
      AILinkBleSDKDemo/BloodPressure/BloodConnectViewController.m
  62. 17
    0
      AILinkBleSDKDemo/BloodPressure/BloodScanViewController.h
  63. 89
    0
      AILinkBleSDKDemo/BloodPressure/BloodScanViewController.m
  64. 17
    0
      AILinkBleSDKDemo/BodyFatScale/BodyFatScaleConnectViewController.h
  65. 676
    0
      AILinkBleSDKDemo/BodyFatScale/BodyFatScaleConnectViewController.m
  66. 17
    0
      AILinkBleSDKDemo/BodyFatScale/BodyFatScaleScanViewController.h
  67. 87
    0
      AILinkBleSDKDemo/BodyFatScale/BodyFatScaleScanViewController.m
  68. 17
    0
      AILinkBleSDKDemo/BodyFatScale/WiFiSetupViewController.h
  69. 32
    0
      AILinkBleSDKDemo/BodyFatScale/WiFiSetupViewController.m
  70. 17
    0
      AILinkBleSDKDemo/Forehead/ForeheadConnectViewController.h
  71. 277
    0
      AILinkBleSDKDemo/Forehead/ForeheadConnectViewController.m
  72. 17
    0
      AILinkBleSDKDemo/Forehead/ForeheadScanViewController.h
  73. 89
    0
      AILinkBleSDKDemo/Forehead/ForeheadScanViewController.m
  74. 17
    0
      AILinkBleSDKDemo/HeightGuage/HeightGuageConnectViewController.h
  75. 256
    0
      AILinkBleSDKDemo/HeightGuage/HeightGuageConnectViewController.m
  76. 17
    0
      AILinkBleSDKDemo/HeightGuage/HeightGuageScanViewController.h
  77. 89
    0
      AILinkBleSDKDemo/HeightGuage/HeightGuageScanViewController.m
  78. 66
    0
      AILinkBleSDKDemo/Info.plist
  79. 18
    0
      AILinkBleSDKDemo/Inherit/InheritConnectViewController.h
  80. 252
    0
      AILinkBleSDKDemo/Inherit/InheritConnectViewController.m
  81. 17
    0
      AILinkBleSDKDemo/Inherit/InheritScanViewController.h
  82. 91
    0
      AILinkBleSDKDemo/Inherit/InheritScanViewController.m
  83. 38
    0
      AILinkBleSDKDemo/Inherit/SubBleManager.h
  84. 87
    0
      AILinkBleSDKDemo/Inherit/SubBleManager.m
  85. 47
    0
      AILinkBleSDKDemo/Main.storyboard
  86. 19
    0
      AILinkBleSDKDemo/Masonry/LICENSE
  87. 26
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASCompositeConstraint.h
  88. 183
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASCompositeConstraint.m
  89. 66
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASConstraint+Private.h
  90. 272
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASConstraint.h
  91. 301
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASConstraint.m
  92. 146
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASConstraintMaker.h
  93. 273
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASConstraintMaker.m
  94. 22
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASLayoutConstraint.h
  95. 13
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASLayoutConstraint.m
  96. 136
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASUtilities.h
  97. 49
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASViewAttribute.h
  98. 46
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASViewAttribute.m
  99. 48
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASViewConstraint.h
  100. 0
    0
      AILinkBleSDKDemo/Masonry/Masonry/MASViewConstraint.m

+ 779
- 0
AILinkBleSDKDemo.xcodeproj/project.pbxproj View File

@@ -0,0 +1,779 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {

/* Begin PBXBuildFile section */
E622E260243F1CA5003C319D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E25F243F1CA5003C319D /* AppDelegate.m */; };
E622E263243F1CA5003C319D /* SceneDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E262243F1CA5003C319D /* SceneDelegate.m */; };
E622E26B243F1CA6003C319D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E622E26A243F1CA6003C319D /* Assets.xcassets */; };
E622E26E243F1CA6003C319D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E622E26C243F1CA6003C319D /* LaunchScreen.storyboard */; };
E622E271243F1CA6003C319D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E270243F1CA6003C319D /* main.m */; };
E622E27B243F1CA6003C319D /* AILinkBleSDKDemoUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E27A243F1CA6003C319D /* AILinkBleSDKDemoUITests.m */; };
E622E287243F1D41003C319D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E622E286243F1D40003C319D /* Main.storyboard */; };
E622E2DE243F1D4A003C319D /* HeightGuageScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E289243F1D49003C319D /* HeightGuageScanViewController.m */; };
E622E2DF243F1D4A003C319D /* HeightGuageConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E28C243F1D49003C319D /* HeightGuageConnectViewController.m */; };
E622E2E0243F1D4A003C319D /* SubBleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E28E243F1D4A003C319D /* SubBleManager.m */; };
E622E2E1243F1D4A003C319D /* InheritConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E290243F1D4A003C319D /* InheritConnectViewController.m */; };
E622E2E2243F1D4A003C319D /* InheritScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E291243F1D4A003C319D /* InheritScanViewController.m */; };
E622E2E3243F1D4A003C319D /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = E622E295243F1D4A003C319D /* LICENSE */; };
E622E2E4243F1D4A003C319D /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E298243F1D4A003C319D /* NSLayoutConstraint+MASDebugAdditions.m */; };
E622E2E5243F1D4A003C319D /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2A1243F1D4A003C319D /* ViewController+MASAdditions.m */; };
E622E2E6243F1D4A003C319D /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2A5243F1D4A003C319D /* MASCompositeConstraint.m */; };
E622E2E7243F1D4A003C319D /* MASConstraintMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2A6243F1D4A003C319D /* MASConstraintMaker.m */; };
E622E2E8243F1D4A003C319D /* MASLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2A7243F1D4A003C319D /* MASLayoutConstraint.m */; };
E622E2E9243F1D4A003C319D /* NSArray+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2A8243F1D4A003C319D /* NSArray+MASAdditions.m */; };
E622E2EA243F1D4A003C319D /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2A9243F1D4A003C319D /* View+MASAdditions.m */; };
E622E2EB243F1D4A003C319D /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2AC243F1D4A003C319D /* MASConstraint.m */; };
E622E2EC243F1D4A003C319D /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2AE243F1D4A003C319D /* MASViewConstraint.m */; };
E622E2ED243F1D4A003C319D /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2AF243F1D4A003C319D /* MASViewAttribute.m */; };
E622E2EE243F1D4A003C319D /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = E622E2B0243F1D4A003C319D /* README.md */; };
E622E2EF243F1D4A003C319D /* BloodConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2B3243F1D4A003C319D /* BloodConnectViewController.m */; };
E622E2F0243F1D4A003C319D /* BloodScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2B4243F1D4A003C319D /* BloodScanViewController.m */; };
E622E2F2243F1D4A003C319D /* AilinkSuperConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2B8243F1D4A003C319D /* AilinkSuperConnectViewController.m */; };
E622E2F3243F1D4A003C319D /* AiLinkSuperViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2BB243F1D4A003C319D /* AiLinkSuperViewController.m */; };
E622E2F4243F1D4A003C319D /* ForeheadConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2BD243F1D4A003C319D /* ForeheadConnectViewController.m */; };
E622E2F5243F1D4A003C319D /* ForeheadScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2C0243F1D4A003C319D /* ForeheadScanViewController.m */; };
E622E2F6243F1D4A003C319D /* WheelMonitorConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2C3243F1D4A003C319D /* WheelMonitorConnectViewController.m */; };
E622E2F7243F1D4A003C319D /* WheelMonitorScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2C5243F1D4A003C319D /* WheelMonitorScanViewController.m */; };
E622E2F8243F1D4A003C319D /* RemoteControlConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2CA243F1D4A003C319D /* RemoteControlConnectViewController.m */; };
E622E2F9243F1D4A003C319D /* RemoteControlScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2CB243F1D4A003C319D /* RemoteControlScanViewController.m */; };
E622E2FA243F1D4A003C319D /* BabyScaleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2CD243F1D4A003C319D /* BabyScaleViewController.m */; };
E622E2FB243F1D4A003C319D /* BabyScaleConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2D0243F1D4A003C319D /* BabyScaleConnectViewController.m */; };
E622E2FC243F1D4A003C319D /* BodyFatScaleScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2D2243F1D4A003C319D /* BodyFatScaleScanViewController.m */; };
E622E2FD243F1D4A003C319D /* WiFiSetupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2D3243F1D4A003C319D /* WiFiSetupViewController.m */; };
E622E2FE243F1D4A003C319D /* BodyFatScaleConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2D4243F1D4A003C319D /* BodyFatScaleConnectViewController.m */; };
E622E2FF243F1D4A003C319D /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2D8243F1D4A003C319D /* ViewController.m */; };
E622E300243F1D4A003C319D /* ThermometerScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2DA243F1D4A003C319D /* ThermometerScanViewController.m */; };
E622E301243F1D4A003C319D /* ThermometerConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E622E2DD243F1D4A003C319D /* ThermometerConnectViewController.m */; };
E64A7EEA24404B1400D22B84 /* AILinkBleSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E64A7EE924404B1400D22B84 /* AILinkBleSDK.framework */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
E622E277243F1CA6003C319D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = E622E253243F1CA5003C319D /* Project object */;
proxyType = 1;
remoteGlobalIDString = E622E25A243F1CA5003C319D;
remoteInfo = AILinkBleSDKDemo;
};
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
E622E25B243F1CA5003C319D /* AILinkBleSDKDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AILinkBleSDKDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
E622E25E243F1CA5003C319D /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
E622E25F243F1CA5003C319D /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
E622E261243F1CA5003C319D /* SceneDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneDelegate.h; sourceTree = "<group>"; };
E622E262243F1CA5003C319D /* SceneDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SceneDelegate.m; sourceTree = "<group>"; };
E622E26A243F1CA6003C319D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
E622E26D243F1CA6003C319D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
E622E26F243F1CA6003C319D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E622E270243F1CA6003C319D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
E622E276243F1CA6003C319D /* AILinkBleSDKDemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AILinkBleSDKDemoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
E622E27A243F1CA6003C319D /* AILinkBleSDKDemoUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AILinkBleSDKDemoUITests.m; sourceTree = "<group>"; };
E622E27C243F1CA6003C319D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E622E286243F1D40003C319D /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
E622E289243F1D49003C319D /* HeightGuageScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HeightGuageScanViewController.m; sourceTree = "<group>"; };
E622E28A243F1D49003C319D /* HeightGuageConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeightGuageConnectViewController.h; sourceTree = "<group>"; };
E622E28B243F1D49003C319D /* HeightGuageScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeightGuageScanViewController.h; sourceTree = "<group>"; };
E622E28C243F1D49003C319D /* HeightGuageConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HeightGuageConnectViewController.m; sourceTree = "<group>"; };
E622E28E243F1D4A003C319D /* SubBleManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SubBleManager.m; sourceTree = "<group>"; };
E622E28F243F1D4A003C319D /* InheritScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InheritScanViewController.h; sourceTree = "<group>"; };
E622E290243F1D4A003C319D /* InheritConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InheritConnectViewController.m; sourceTree = "<group>"; };
E622E291243F1D4A003C319D /* InheritScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InheritScanViewController.m; sourceTree = "<group>"; };
E622E292243F1D4A003C319D /* SubBleManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SubBleManager.h; sourceTree = "<group>"; };
E622E293243F1D4A003C319D /* InheritConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InheritConnectViewController.h; sourceTree = "<group>"; };
E622E295243F1D4A003C319D /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
E622E297243F1D4A003C319D /* MASCompositeConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASCompositeConstraint.h; sourceTree = "<group>"; };
E622E298243F1D4A003C319D /* NSLayoutConstraint+MASDebugAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSLayoutConstraint+MASDebugAdditions.m"; sourceTree = "<group>"; };
E622E299243F1D4A003C319D /* MASConstraint+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MASConstraint+Private.h"; sourceTree = "<group>"; };
E622E29A243F1D4A003C319D /* MASLayoutConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASLayoutConstraint.h; sourceTree = "<group>"; };
E622E29B243F1D4A003C319D /* NSArray+MASShorthandAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+MASShorthandAdditions.h"; sourceTree = "<group>"; };
E622E29C243F1D4A003C319D /* MASConstraintMaker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASConstraintMaker.h; sourceTree = "<group>"; };
E622E29D243F1D4A003C319D /* View+MASAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "View+MASAdditions.h"; sourceTree = "<group>"; };
E622E29E243F1D4A003C319D /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+MASAdditions.h"; sourceTree = "<group>"; };
E622E29F243F1D4A003C319D /* MASUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASUtilities.h; sourceTree = "<group>"; };
E622E2A0243F1D4A003C319D /* MASViewAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASViewAttribute.h; sourceTree = "<group>"; };
E622E2A1243F1D4A003C319D /* ViewController+MASAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ViewController+MASAdditions.m"; sourceTree = "<group>"; };
E622E2A2243F1D4A003C319D /* MASViewConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASViewConstraint.h; sourceTree = "<group>"; };
E622E2A3243F1D4A003C319D /* MASConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASConstraint.h; sourceTree = "<group>"; };
E622E2A4243F1D4A003C319D /* NSLayoutConstraint+MASDebugAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSLayoutConstraint+MASDebugAdditions.h"; sourceTree = "<group>"; };
E622E2A5243F1D4A003C319D /* MASCompositeConstraint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASCompositeConstraint.m; sourceTree = "<group>"; };
E622E2A6243F1D4A003C319D /* MASConstraintMaker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASConstraintMaker.m; sourceTree = "<group>"; };
E622E2A7243F1D4A003C319D /* MASLayoutConstraint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASLayoutConstraint.m; sourceTree = "<group>"; };
E622E2A8243F1D4A003C319D /* NSArray+MASAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+MASAdditions.m"; sourceTree = "<group>"; };
E622E2A9243F1D4A003C319D /* View+MASAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "View+MASAdditions.m"; sourceTree = "<group>"; };
E622E2AA243F1D4A003C319D /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "View+MASShorthandAdditions.h"; sourceTree = "<group>"; };
E622E2AB243F1D4A003C319D /* Masonry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Masonry.h; sourceTree = "<group>"; };
E622E2AC243F1D4A003C319D /* MASConstraint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASConstraint.m; sourceTree = "<group>"; };
E622E2AD243F1D4A003C319D /* ViewController+MASAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ViewController+MASAdditions.h"; sourceTree = "<group>"; };
E622E2AE243F1D4A003C319D /* MASViewConstraint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASViewConstraint.m; sourceTree = "<group>"; };
E622E2AF243F1D4A003C319D /* MASViewAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASViewAttribute.m; sourceTree = "<group>"; };
E622E2B0243F1D4A003C319D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
E622E2B2243F1D4A003C319D /* BloodScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BloodScanViewController.h; sourceTree = "<group>"; };
E622E2B3243F1D4A003C319D /* BloodConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BloodConnectViewController.m; sourceTree = "<group>"; };
E622E2B4243F1D4A003C319D /* BloodScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BloodScanViewController.m; sourceTree = "<group>"; };
E622E2B5243F1D4A003C319D /* BloodConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BloodConnectViewController.h; sourceTree = "<group>"; };
E622E2B8243F1D4A003C319D /* AilinkSuperConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AilinkSuperConnectViewController.m; sourceTree = "<group>"; };
E622E2B9243F1D4A003C319D /* AiLinkSuperViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AiLinkSuperViewController.h; sourceTree = "<group>"; };
E622E2BA243F1D4A003C319D /* AilinkSuperConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AilinkSuperConnectViewController.h; sourceTree = "<group>"; };
E622E2BB243F1D4A003C319D /* AiLinkSuperViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AiLinkSuperViewController.m; sourceTree = "<group>"; };
E622E2BD243F1D4A003C319D /* ForeheadConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ForeheadConnectViewController.m; sourceTree = "<group>"; };
E622E2BE243F1D4A003C319D /* ForeheadScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ForeheadScanViewController.h; sourceTree = "<group>"; };
E622E2BF243F1D4A003C319D /* ForeheadConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ForeheadConnectViewController.h; sourceTree = "<group>"; };
E622E2C0243F1D4A003C319D /* ForeheadScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ForeheadScanViewController.m; sourceTree = "<group>"; };
E622E2C1243F1D4A003C319D /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
E622E2C3243F1D4A003C319D /* WheelMonitorConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WheelMonitorConnectViewController.m; sourceTree = "<group>"; };
E622E2C4243F1D4A003C319D /* WheelMonitorScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WheelMonitorScanViewController.h; sourceTree = "<group>"; };
E622E2C5243F1D4A003C319D /* WheelMonitorScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WheelMonitorScanViewController.m; sourceTree = "<group>"; };
E622E2C6243F1D4A003C319D /* WheelMonitorConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WheelMonitorConnectViewController.h; sourceTree = "<group>"; };
E622E2C8243F1D4A003C319D /* RemoteControlScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteControlScanViewController.h; sourceTree = "<group>"; };
E622E2C9243F1D4A003C319D /* RemoteControlConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteControlConnectViewController.h; sourceTree = "<group>"; };
E622E2CA243F1D4A003C319D /* RemoteControlConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RemoteControlConnectViewController.m; sourceTree = "<group>"; };
E622E2CB243F1D4A003C319D /* RemoteControlScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RemoteControlScanViewController.m; sourceTree = "<group>"; };
E622E2CD243F1D4A003C319D /* BabyScaleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BabyScaleViewController.m; sourceTree = "<group>"; };
E622E2CE243F1D4A003C319D /* BabyScaleConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BabyScaleConnectViewController.h; sourceTree = "<group>"; };
E622E2CF243F1D4A003C319D /* BabyScaleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BabyScaleViewController.h; sourceTree = "<group>"; };
E622E2D0243F1D4A003C319D /* BabyScaleConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BabyScaleConnectViewController.m; sourceTree = "<group>"; };
E622E2D2243F1D4A003C319D /* BodyFatScaleScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BodyFatScaleScanViewController.m; sourceTree = "<group>"; };
E622E2D3243F1D4A003C319D /* WiFiSetupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WiFiSetupViewController.m; sourceTree = "<group>"; };
E622E2D4243F1D4A003C319D /* BodyFatScaleConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BodyFatScaleConnectViewController.m; sourceTree = "<group>"; };
E622E2D5243F1D4A003C319D /* WiFiSetupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WiFiSetupViewController.h; sourceTree = "<group>"; };
E622E2D6243F1D4A003C319D /* BodyFatScaleScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BodyFatScaleScanViewController.h; sourceTree = "<group>"; };
E622E2D7243F1D4A003C319D /* BodyFatScaleConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BodyFatScaleConnectViewController.h; sourceTree = "<group>"; };
E622E2D8243F1D4A003C319D /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
E622E2DA243F1D4A003C319D /* ThermometerScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThermometerScanViewController.m; sourceTree = "<group>"; };
E622E2DB243F1D4A003C319D /* ThermometerConnectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThermometerConnectViewController.h; sourceTree = "<group>"; };
E622E2DC243F1D4A003C319D /* ThermometerScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThermometerScanViewController.h; sourceTree = "<group>"; };
E622E2DD243F1D4A003C319D /* ThermometerConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThermometerConnectViewController.m; sourceTree = "<group>"; };
E64A7EE924404B1400D22B84 /* AILinkBleSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AILinkBleSDK.framework; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
E622E258243F1CA5003C319D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E64A7EEA24404B1400D22B84 /* AILinkBleSDK.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
E622E273243F1CA6003C319D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
E622E252243F1CA5003C319D = {
isa = PBXGroup;
children = (
E622E25D243F1CA5003C319D /* AILinkBleSDKDemo */,
E622E279243F1CA6003C319D /* AILinkBleSDKDemoUITests */,
E622E25C243F1CA5003C319D /* Products */,
);
sourceTree = "<group>";
};
E622E25C243F1CA5003C319D /* Products */ = {
isa = PBXGroup;
children = (
E622E25B243F1CA5003C319D /* AILinkBleSDKDemo.app */,
E622E276243F1CA6003C319D /* AILinkBleSDKDemoUITests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
E622E25D243F1CA5003C319D /* AILinkBleSDKDemo */ = {
isa = PBXGroup;
children = (
E64A7EE924404B1400D22B84 /* AILinkBleSDK.framework */,
E622E2B7243F1D4A003C319D /* AiLinkSuper */,
E622E2CC243F1D4A003C319D /* BabyScale */,
E622E2B1243F1D4A003C319D /* BloodPressure */,
E622E2D1243F1D4A003C319D /* BodyFatScale */,
E622E2BC243F1D4A003C319D /* Forehead */,
E622E288243F1D49003C319D /* HeightGuage */,
E622E28D243F1D4A003C319D /* Inherit */,
E622E294243F1D4A003C319D /* Masonry */,
E622E2C7243F1D4A003C319D /* RemoteControl */,
E622E2D9243F1D4A003C319D /* Thermometer */,
E622E2C2243F1D4A003C319D /* WheelMonitor */,
E622E25E243F1CA5003C319D /* AppDelegate.h */,
E622E25F243F1CA5003C319D /* AppDelegate.m */,
E622E261243F1CA5003C319D /* SceneDelegate.h */,
E622E262243F1CA5003C319D /* SceneDelegate.m */,
E622E2C1243F1D4A003C319D /* ViewController.h */,
E622E2D8243F1D4A003C319D /* ViewController.m */,
E622E286243F1D40003C319D /* Main.storyboard */,
E622E26A243F1CA6003C319D /* Assets.xcassets */,
E622E26C243F1CA6003C319D /* LaunchScreen.storyboard */,
E622E26F243F1CA6003C319D /* Info.plist */,
E622E270243F1CA6003C319D /* main.m */,
);
path = AILinkBleSDKDemo;
sourceTree = "<group>";
};
E622E279243F1CA6003C319D /* AILinkBleSDKDemoUITests */ = {
isa = PBXGroup;
children = (
E622E27A243F1CA6003C319D /* AILinkBleSDKDemoUITests.m */,
E622E27C243F1CA6003C319D /* Info.plist */,
);
path = AILinkBleSDKDemoUITests;
sourceTree = "<group>";
};
E622E288243F1D49003C319D /* HeightGuage */ = {
isa = PBXGroup;
children = (
E622E289243F1D49003C319D /* HeightGuageScanViewController.m */,
E622E28A243F1D49003C319D /* HeightGuageConnectViewController.h */,
E622E28B243F1D49003C319D /* HeightGuageScanViewController.h */,
E622E28C243F1D49003C319D /* HeightGuageConnectViewController.m */,
);
path = HeightGuage;
sourceTree = "<group>";
};
E622E28D243F1D4A003C319D /* Inherit */ = {
isa = PBXGroup;
children = (
E622E28E243F1D4A003C319D /* SubBleManager.m */,
E622E28F243F1D4A003C319D /* InheritScanViewController.h */,
E622E290243F1D4A003C319D /* InheritConnectViewController.m */,
E622E291243F1D4A003C319D /* InheritScanViewController.m */,
E622E292243F1D4A003C319D /* SubBleManager.h */,
E622E293243F1D4A003C319D /* InheritConnectViewController.h */,
);
path = Inherit;
sourceTree = "<group>";
};
E622E294243F1D4A003C319D /* Masonry */ = {
isa = PBXGroup;
children = (
E622E295243F1D4A003C319D /* LICENSE */,
E622E296243F1D4A003C319D /* Masonry */,
E622E2B0243F1D4A003C319D /* README.md */,
);
path = Masonry;
sourceTree = "<group>";
};
E622E296243F1D4A003C319D /* Masonry */ = {
isa = PBXGroup;
children = (
E622E297243F1D4A003C319D /* MASCompositeConstraint.h */,
E622E298243F1D4A003C319D /* NSLayoutConstraint+MASDebugAdditions.m */,
E622E299243F1D4A003C319D /* MASConstraint+Private.h */,
E622E29A243F1D4A003C319D /* MASLayoutConstraint.h */,
E622E29B243F1D4A003C319D /* NSArray+MASShorthandAdditions.h */,
E622E29C243F1D4A003C319D /* MASConstraintMaker.h */,
E622E29D243F1D4A003C319D /* View+MASAdditions.h */,
E622E29E243F1D4A003C319D /* NSArray+MASAdditions.h */,
E622E29F243F1D4A003C319D /* MASUtilities.h */,
E622E2A0243F1D4A003C319D /* MASViewAttribute.h */,
E622E2A1243F1D4A003C319D /* ViewController+MASAdditions.m */,
E622E2A2243F1D4A003C319D /* MASViewConstraint.h */,
E622E2A3243F1D4A003C319D /* MASConstraint.h */,
E622E2A4243F1D4A003C319D /* NSLayoutConstraint+MASDebugAdditions.h */,
E622E2A5243F1D4A003C319D /* MASCompositeConstraint.m */,
E622E2A6243F1D4A003C319D /* MASConstraintMaker.m */,
E622E2A7243F1D4A003C319D /* MASLayoutConstraint.m */,
E622E2A8243F1D4A003C319D /* NSArray+MASAdditions.m */,
E622E2A9243F1D4A003C319D /* View+MASAdditions.m */,
E622E2AA243F1D4A003C319D /* View+MASShorthandAdditions.h */,
E622E2AB243F1D4A003C319D /* Masonry.h */,
E622E2AC243F1D4A003C319D /* MASConstraint.m */,
E622E2AD243F1D4A003C319D /* ViewController+MASAdditions.h */,
E622E2AE243F1D4A003C319D /* MASViewConstraint.m */,
E622E2AF243F1D4A003C319D /* MASViewAttribute.m */,
);
path = Masonry;
sourceTree = "<group>";
};
E622E2B1243F1D4A003C319D /* BloodPressure */ = {
isa = PBXGroup;
children = (
E622E2B2243F1D4A003C319D /* BloodScanViewController.h */,
E622E2B3243F1D4A003C319D /* BloodConnectViewController.m */,
E622E2B4243F1D4A003C319D /* BloodScanViewController.m */,
E622E2B5243F1D4A003C319D /* BloodConnectViewController.h */,
);
path = BloodPressure;
sourceTree = "<group>";
};
E622E2B7243F1D4A003C319D /* AiLinkSuper */ = {
isa = PBXGroup;
children = (
E622E2B8243F1D4A003C319D /* AilinkSuperConnectViewController.m */,
E622E2B9243F1D4A003C319D /* AiLinkSuperViewController.h */,
E622E2BA243F1D4A003C319D /* AilinkSuperConnectViewController.h */,
E622E2BB243F1D4A003C319D /* AiLinkSuperViewController.m */,
);
path = AiLinkSuper;
sourceTree = "<group>";
};
E622E2BC243F1D4A003C319D /* Forehead */ = {
isa = PBXGroup;
children = (
E622E2BD243F1D4A003C319D /* ForeheadConnectViewController.m */,
E622E2BE243F1D4A003C319D /* ForeheadScanViewController.h */,
E622E2BF243F1D4A003C319D /* ForeheadConnectViewController.h */,
E622E2C0243F1D4A003C319D /* ForeheadScanViewController.m */,
);
path = Forehead;
sourceTree = "<group>";
};
E622E2C2243F1D4A003C319D /* WheelMonitor */ = {
isa = PBXGroup;
children = (
E622E2C3243F1D4A003C319D /* WheelMonitorConnectViewController.m */,
E622E2C4243F1D4A003C319D /* WheelMonitorScanViewController.h */,
E622E2C5243F1D4A003C319D /* WheelMonitorScanViewController.m */,
E622E2C6243F1D4A003C319D /* WheelMonitorConnectViewController.h */,
);
path = WheelMonitor;
sourceTree = "<group>";
};
E622E2C7243F1D4A003C319D /* RemoteControl */ = {
isa = PBXGroup;
children = (
E622E2C8243F1D4A003C319D /* RemoteControlScanViewController.h */,
E622E2C9243F1D4A003C319D /* RemoteControlConnectViewController.h */,
E622E2CA243F1D4A003C319D /* RemoteControlConnectViewController.m */,
E622E2CB243F1D4A003C319D /* RemoteControlScanViewController.m */,
);
path = RemoteControl;
sourceTree = "<group>";
};
E622E2CC243F1D4A003C319D /* BabyScale */ = {
isa = PBXGroup;
children = (
E622E2CD243F1D4A003C319D /* BabyScaleViewController.m */,
E622E2CE243F1D4A003C319D /* BabyScaleConnectViewController.h */,
E622E2CF243F1D4A003C319D /* BabyScaleViewController.h */,
E622E2D0243F1D4A003C319D /* BabyScaleConnectViewController.m */,
);
path = BabyScale;
sourceTree = "<group>";
};
E622E2D1243F1D4A003C319D /* BodyFatScale */ = {
isa = PBXGroup;
children = (
E622E2D2243F1D4A003C319D /* BodyFatScaleScanViewController.m */,
E622E2D3243F1D4A003C319D /* WiFiSetupViewController.m */,
E622E2D4243F1D4A003C319D /* BodyFatScaleConnectViewController.m */,
E622E2D5243F1D4A003C319D /* WiFiSetupViewController.h */,
E622E2D6243F1D4A003C319D /* BodyFatScaleScanViewController.h */,
E622E2D7243F1D4A003C319D /* BodyFatScaleConnectViewController.h */,
);
path = BodyFatScale;
sourceTree = "<group>";
};
E622E2D9243F1D4A003C319D /* Thermometer */ = {
isa = PBXGroup;
children = (
E622E2DA243F1D4A003C319D /* ThermometerScanViewController.m */,
E622E2DB243F1D4A003C319D /* ThermometerConnectViewController.h */,
E622E2DC243F1D4A003C319D /* ThermometerScanViewController.h */,
E622E2DD243F1D4A003C319D /* ThermometerConnectViewController.m */,
);
path = Thermometer;
sourceTree = "<group>";
};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
E622E25A243F1CA5003C319D /* AILinkBleSDKDemo */ = {
isa = PBXNativeTarget;
buildConfigurationList = E622E27F243F1CA6003C319D /* Build configuration list for PBXNativeTarget "AILinkBleSDKDemo" */;
buildPhases = (
E622E257243F1CA5003C319D /* Sources */,
E622E258243F1CA5003C319D /* Frameworks */,
E622E259243F1CA5003C319D /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = AILinkBleSDKDemo;
productName = AILinkBleSDKDemo;
productReference = E622E25B243F1CA5003C319D /* AILinkBleSDKDemo.app */;
productType = "com.apple.product-type.application";
};
E622E275243F1CA6003C319D /* AILinkBleSDKDemoUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = E622E282243F1CA6003C319D /* Build configuration list for PBXNativeTarget "AILinkBleSDKDemoUITests" */;
buildPhases = (
E622E272243F1CA6003C319D /* Sources */,
E622E273243F1CA6003C319D /* Frameworks */,
E622E274243F1CA6003C319D /* Resources */,
);
buildRules = (
);
dependencies = (
E622E278243F1CA6003C319D /* PBXTargetDependency */,
);
name = AILinkBleSDKDemoUITests;
productName = AILinkBleSDKDemoUITests;
productReference = E622E276243F1CA6003C319D /* AILinkBleSDKDemoUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
E622E253243F1CA5003C319D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1130;
ORGANIZATIONNAME = IOT;
TargetAttributes = {
E622E25A243F1CA5003C319D = {
CreatedOnToolsVersion = 11.3.1;
};
E622E275243F1CA6003C319D = {
CreatedOnToolsVersion = 11.3.1;
TestTargetID = E622E25A243F1CA5003C319D;
};
};
};
buildConfigurationList = E622E256243F1CA5003C319D /* Build configuration list for PBXProject "AILinkBleSDKDemo" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = E622E252243F1CA5003C319D;
productRefGroup = E622E25C243F1CA5003C319D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
E622E25A243F1CA5003C319D /* AILinkBleSDKDemo */,
E622E275243F1CA6003C319D /* AILinkBleSDKDemoUITests */,
);
};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
E622E259243F1CA5003C319D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E622E287243F1D41003C319D /* Main.storyboard in Resources */,
E622E26E243F1CA6003C319D /* LaunchScreen.storyboard in Resources */,
E622E2EE243F1D4A003C319D /* README.md in Resources */,
E622E2E3243F1D4A003C319D /* LICENSE in Resources */,
E622E26B243F1CA6003C319D /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
E622E274243F1CA6003C319D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
E622E257243F1CA5003C319D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E622E2FF243F1D4A003C319D /* ViewController.m in Sources */,
E622E2EF243F1D4A003C319D /* BloodConnectViewController.m in Sources */,
E622E2F6243F1D4A003C319D /* WheelMonitorConnectViewController.m in Sources */,
E622E2EB243F1D4A003C319D /* MASConstraint.m in Sources */,
E622E2E9243F1D4A003C319D /* NSArray+MASAdditions.m in Sources */,
E622E2FA243F1D4A003C319D /* BabyScaleViewController.m in Sources */,
E622E301243F1D4A003C319D /* ThermometerConnectViewController.m in Sources */,
E622E2F8243F1D4A003C319D /* RemoteControlConnectViewController.m in Sources */,
E622E2FE243F1D4A003C319D /* BodyFatScaleConnectViewController.m in Sources */,
E622E2DF243F1D4A003C319D /* HeightGuageConnectViewController.m in Sources */,
E622E2DE243F1D4A003C319D /* HeightGuageScanViewController.m in Sources */,
E622E2FC243F1D4A003C319D /* BodyFatScaleScanViewController.m in Sources */,
E622E2E4243F1D4A003C319D /* NSLayoutConstraint+MASDebugAdditions.m in Sources */,
E622E2ED243F1D4A003C319D /* MASViewAttribute.m in Sources */,
E622E2E1243F1D4A003C319D /* InheritConnectViewController.m in Sources */,
E622E2F4243F1D4A003C319D /* ForeheadConnectViewController.m in Sources */,
E622E2EC243F1D4A003C319D /* MASViewConstraint.m in Sources */,
E622E2E0243F1D4A003C319D /* SubBleManager.m in Sources */,
E622E2E7243F1D4A003C319D /* MASConstraintMaker.m in Sources */,
E622E2E8243F1D4A003C319D /* MASLayoutConstraint.m in Sources */,
E622E300243F1D4A003C319D /* ThermometerScanViewController.m in Sources */,
E622E2F9243F1D4A003C319D /* RemoteControlScanViewController.m in Sources */,
E622E2F3243F1D4A003C319D /* AiLinkSuperViewController.m in Sources */,
E622E2FD243F1D4A003C319D /* WiFiSetupViewController.m in Sources */,
E622E2FB243F1D4A003C319D /* BabyScaleConnectViewController.m in Sources */,
E622E2EA243F1D4A003C319D /* View+MASAdditions.m in Sources */,
E622E2F2243F1D4A003C319D /* AilinkSuperConnectViewController.m in Sources */,
E622E2E6243F1D4A003C319D /* MASCompositeConstraint.m in Sources */,
E622E2F7243F1D4A003C319D /* WheelMonitorScanViewController.m in Sources */,
E622E2F5243F1D4A003C319D /* ForeheadScanViewController.m in Sources */,
E622E260243F1CA5003C319D /* AppDelegate.m in Sources */,
E622E2E5243F1D4A003C319D /* ViewController+MASAdditions.m in Sources */,
E622E2F0243F1D4A003C319D /* BloodScanViewController.m in Sources */,
E622E2E2243F1D4A003C319D /* InheritScanViewController.m in Sources */,
E622E271243F1CA6003C319D /* main.m in Sources */,
E622E263243F1CA5003C319D /* SceneDelegate.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
E622E272243F1CA6003C319D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E622E27B243F1CA6003C319D /* AILinkBleSDKDemoUITests.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
E622E278243F1CA6003C319D /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = E622E25A243F1CA5003C319D /* AILinkBleSDKDemo */;
targetProxy = E622E277243F1CA6003C319D /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */

/* Begin PBXVariantGroup section */
E622E26C243F1CA6003C319D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
E622E26D243F1CA6003C319D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
E622E27D243F1CA6003C319D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
name = Debug;
};
E622E27E243F1CA6003C319D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
E622E280243F1CA6003C319D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = YEU77XR292;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/AILinkBleSDKDemo",
);
INFOPLIST_FILE = AILinkBleSDKDemo/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.pingwang.AILinkBleSDKDemo;
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
E622E281243F1CA6003C319D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = YEU77XR292;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/AILinkBleSDKDemo",
);
INFOPLIST_FILE = AILinkBleSDKDemo/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.pingwang.AILinkBleSDKDemo;
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
E622E283243F1CA6003C319D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = YEU77XR292;
INFOPLIST_FILE = AILinkBleSDKDemoUITests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.pingwang.AILinkBleSDKDemoUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = AILinkBleSDKDemo;
};
name = Debug;
};
E622E284243F1CA6003C319D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = YEU77XR292;
INFOPLIST_FILE = AILinkBleSDKDemoUITests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.pingwang.AILinkBleSDKDemoUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = AILinkBleSDKDemo;
};
name = Release;
};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
E622E256243F1CA5003C319D /* Build configuration list for PBXProject "AILinkBleSDKDemo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E622E27D243F1CA6003C319D /* Debug */,
E622E27E243F1CA6003C319D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
E622E27F243F1CA6003C319D /* Build configuration list for PBXNativeTarget "AILinkBleSDKDemo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E622E280243F1CA6003C319D /* Debug */,
E622E281243F1CA6003C319D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
E622E282243F1CA6003C319D /* Build configuration list for PBXNativeTarget "AILinkBleSDKDemoUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E622E283243F1CA6003C319D /* Debug */,
E622E284243F1CA6003C319D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = E622E253243F1CA5003C319D /* Project object */;
}

+ 7
- 0
AILinkBleSDKDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:AILinkBleSDKDemo.xcodeproj">
</FileRef>
</Workspace>

+ 8
- 0
AILinkBleSDKDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist View File

@@ -0,0 +1,8 @@
<?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>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

BIN
AILinkBleSDKDemo.xcodeproj/project.xcworkspace/xcuserdata/iot_user.xcuserdatad/UserInterfaceState.xcuserstate View File


+ 14
- 0
AILinkBleSDKDemo.xcodeproj/xcuserdata/iot_user.xcuserdatad/xcschemes/xcschememanagement.plist View File

@@ -0,0 +1,14 @@
<?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>SchemeUserState</key>
<dict>
<key>AILinkBleSDKDemo.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>

BIN
AILinkBleSDKDemo/AILinkBleSDK.framework/AILinkBleSDK View File


+ 62
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBabyScaleBleHeader.h View File

@@ -0,0 +1,62 @@
//
// ELBabyScaleBleHeader.h
// Elink
//
// Created by iot_user on 2019/9/16.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#ifndef ELBabyScaleBleHeader_h
#define ELBabyScaleBleHeader_h

//Baby scale transparent data type(婴儿秤透传数据类型)
typedef NS_ENUM(NSUInteger, BabyScaleBleDataType) {
/**Weight stability data( 体重稳定数据) */
BabyScaleBleDataType_WeightStableData = 0x01 ,
/** Weight real-time data(体重实时数据) */
BabyScaleBleDataType_WeightRealtimeData = 0x02 ,
/** Length data(身长数据) */
BabyScaleBleDataType_Height = 0x03 ,
/** App delivery unit settings(app下发单位设置 )*/
BabyScaleBleDataType_AppSendUnit = 0x81 ,
/** MCU reply setting result(MCU回复设置结果) */
BabyScaleBleDataType_BackSendUnit = 0x82 ,
/** App sends control class instructions(app发送控制类指令 )*/
BabyScaleBleDataType_AppSendCtrl = 0x83 ,
/** MCU reply control result(MCU回复控制结果) */
BabyScaleBleDataType_BackSendCtrl = 0x84 ,
/** he device sends an error code.(设备上发错误码) */
BabyScaleBleDataType_DeviceBackErrorCode = 0xFF,
};


typedef NS_ENUM(NSInteger ,BabyScaleResultType) {
/** Successful setup(设置成功) */
BabyScaleResultType_Succeed = 0 ,
/** Setup failed(设置失败) */
BabyScaleResultType_Failure ,
/** Does not support settings(不支持设置) */
BabyScaleResultType_Unsupported ,
};

typedef NS_ENUM(NSInteger ,BabyScaleDeviceErrorCode) {
/** overweight(超重) */
BabyScaleDeviceErrorCode_Overweight = 0 ,
/** Unstable weight during weighing 0(称重为0 期间,重量不稳定) */
BabyScaleDeviceErrorCode_Unstable ,
/** Weighing to 0 failed(称重为 0 失败 )*/
BabyScaleDeviceErrorCode_Failure ,
};

typedef NS_ENUM(NSUInteger, HoldDataType) {
HoldDataTypeKeep = 0x00,
HoldDataTypeCancel = 0x01,
HoldDataTypeUnkonwn
};

#endif /* ELBabyScaleBleHeader_h */

+ 24
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBabyScaleBleHeightModel.h View File

@@ -0,0 +1,24 @@
//
// ELBabyScaleBleHeightModel.h
// Elink
//
// Created by iot_user on 2019/4/23.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ELSDKHeader.h"

NS_ASSUME_NONNULL_BEGIN

@interface ELBabyScaleBleHeightModel : NSObject

@property (nonatomic, assign) NSUInteger height; //height(身高)
@property (nonatomic, assign) ELDeviceHeightUnit unit;
@property (nonatomic, copy) NSString *unitStr;
@property (nonatomic, assign) NSInteger heightPoint;//Decimal offset position(小数点偏移位置)


@end

NS_ASSUME_NONNULL_END

+ 57
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBabyScaleBleManager.h View File

@@ -0,0 +1,57 @@
//
// ELBabyScaleBleManager.h
// Elink
//
// Created by iot_user on 2019/4/19.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import "ELBluetoothManager.h"
#import "ELBabyScaleDeviceModel.h"
#import "ELBabyScaleBleWeightModel.h"
#import "ELBabyScaleBleHeightModel.h"
#import "ELBabyScaleBleHeader.h"

@protocol BabyScaleBleDelegate <NSObject>
@optional
//Callback Bluetooth status(回调蓝牙状态)
- (void)babyScaleManagerUpdateState:(ELBluetoothState)state;
//Callback to all baby scale equipment(回调所有婴儿秤设备)
- (void)babyScaleManagerScanDevices:(NSArray<ELBabyScaleDeviceModel *> *_Nullable)babyScaleDevices;
//Callback weight data(回调体重数据)
- (void)babyScaleManagerReceiveWeightModel:(ELBabyScaleBleWeightModel *_Nonnull)model;
//Callback height data(回调身高数据)
- (void)babyScaleManagerHeightModel:(ELBabyScaleBleHeightModel *_Nonnull)model;

/** Return the result of the unit setting(返回单位设置的结果) */
- (void)babyScaleBackSetUnitResults:(BabyScaleResultType )result;

/** Callback peeling (zeroing) and locking results(回调去皮(归零)和锁定结果)
* type : 0 peeled, 1 locked(0去皮,1锁定)
*/
- (void)babyScaleBackCtrlType:(NSInteger )type Results:(BabyScaleResultType )result;

/** The device sends an error code.(设备上发错误码) */
- (void)babyScaleBackDeviceErrorCode:(BabyScaleDeviceErrorCode )code;

@end


NS_ASSUME_NONNULL_BEGIN

@interface ELBabyScaleBleManager : ELBluetoothManager



//Baby scale Bluetooth manager agent(婴儿秤蓝牙管理者代理)
@property (nonatomic, weak) id<BabyScaleBleDelegate> babyScaleDelegate;

+(ELBabyScaleBleManager *)shareManager;
//MARK:Hold YES is locked, NO is peeled (return to zero)(hold YES为锁定,NO去皮(归零))
-(void)changeHold:(BOOL)hold;
//MARK:Height and weight unit switching(身高和体重单位切换)
-(void)changeHeightUnit:(ELDeviceHeightUnit)heightUnit AndWeightUnit:(ELDeviceWeightUnit)weightUnit;

@end

NS_ASSUME_NONNULL_END

+ 24
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBabyScaleBleWeightModel.h View File

@@ -0,0 +1,24 @@
//
// ELBabyScaleBleWeightModel.h
// Elink
//
// Created by iot_user on 2019/4/23.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ELSDKHeader.h"

NS_ASSUME_NONNULL_BEGIN

@interface ELBabyScaleBleWeightModel : NSObject

@property (nonatomic, assign) ELDeviceWeightUnit unit;//unit(单位)
@property (nonatomic, assign) int weight;//weight(重量)
@property (nonatomic, assign) BOOL dataType;//Stable mark: 0 real-time weight, 1 stable weight(稳定标志:0 实时重量,1 稳定重量)
@property (nonatomic, copy) NSString *unitStr;
@property (nonatomic, assign) NSInteger weightPoint;//Decimal offset position(小数点偏移位置)

@end

NS_ASSUME_NONNULL_END

+ 18
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBabyScaleDeviceModel.h View File

@@ -0,0 +1,18 @@
//
// ELBleBabyScalePeripheralModel.h
// Elink
//
// Created by iot_user on 2019/4/19.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import "ELPeripheralModel.h"


NS_ASSUME_NONNULL_BEGIN

@interface ELBabyScaleDeviceModel : ELPeripheralModel

@end

NS_ASSUME_NONNULL_END

+ 34
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBlePublicTool.h View File

@@ -0,0 +1,34 @@
//
// ELBlePublicTool.h
// Elink
//
// Created by iot_user on 2019/5/10.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface ELBlePublicTool : NSObject
//MARK:Keep decimal places, support for retaining 7 significant digits(保留小数位,支持保留7位有效数字)
+(NSString *)retainPointValue:(double)value withPoint:(NSUInteger)point;
/**
Turn time into time (将时间转成时间截)
@param timeString time
@param formatter format
@return Time cut(时间截)
*/
+ (NSInteger)getTimeStampWithTimeString:(NSString *)timeString AndFormatter:(NSString *)formatter;

/**
Determine if the WiFi password is legal(判断WiFi密码是否合法)

@param password wifi password (8 ~ 56 characters)(wifi密码(8~56个字符))
@return yes: legal, NO: illegal(yes:合法,NO:不合法)
*/
+(BOOL)legalBleWifiPassword:(NSString *)password;
@end

NS_ASSUME_NONNULL_END

+ 48
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBleWifiDetailModel.h View File

@@ -0,0 +1,48 @@
//
// ELBleWifiDetailModel.h
// Elink
//
// Created by iot_user on 2019/12/30.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSUInteger, ELBleWifiSecureType) {
ELBleWifiSecureTypeOpen = 0,
ELBleWifiSecureTypeWEP = 1,
ELBleWifiSecureTypeWPA_PSK = 2,
ELBleWifiSecureTypeWPA2_PSK = 3,
ELBleWifiSecureTypeWPA_WPA_2_PSK = 4,
ELBleWifiSecureTypeWPA2_ENTERPRISE = 5,
};

typedef NS_ENUM(NSUInteger, ELBleWifiUseState) {
ELBleWifiUseStateUnknown = 0, //Strange wifi(陌生wifi)
ELBleWifiUseStateSaved = 1, //Wifi with saved password(保存过的密码的wifi)
ELBleWifiUseStateConnected = 2, //Currently connected wifi(目前连接着的wifi)
};



NS_ASSUME_NONNULL_BEGIN

@interface ELBleWifiDetailModel : NSObject<NSCopying>
//wifi number(wifi编号)
@property (nonatomic, assign) int wifiNumber;
//wifi name(wifi 名字)
@property (nonatomic, copy) NSString *wifiName;
//wifi MAC address (little endian)(wifi MAC地址(小端序))
@property (nonatomic, copy) NSData *macData;
//Signal strength(信号强度)
@property (nonatomic, assign) int wifiRssi;
//Security type(安全类型)
@property (nonatomic, assign) ELBleWifiSecureType secureType;
//wifi status(wifi状态)
@property (nonatomic, assign) ELBleWifiUseState wifiState;



@end

NS_ASSUME_NONNULL_END

+ 25
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBloodBleDataModel.h View File

@@ -0,0 +1,25 @@
//
// ELBloodBleDataModel.h
// Elink
//
// Created by iot_user on 2019/5/11.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ELBloodBleSDKHeader.h"

NS_ASSUME_NONNULL_BEGIN

@interface ELBloodBleDataModel : NSObject

@property (nonatomic, copy) NSString *dia;//Diastolic blood pressure(舒张压)
@property (nonatomic, copy) NSString *sys; //Systolic blood pressure(收缩压)
@property (nonatomic, assign) int heartRate; //Heart rate(心率)
@property (nonatomic, assign) ELDeviceBloodPressureUnit unit;//单位
@property (nonatomic, assign) int point; //小数点
@property (nonatomic, assign) NSInteger createTime;//时间

@end

NS_ASSUME_NONNULL_END

+ 117
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBloodBleManager.h View File

@@ -0,0 +1,117 @@
//
// ELBloodBleManager.h
// Elink
//
// Created by iot_user on 2019/5/11.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import "ELBluetoothManager.h"
#import "ELBloodBleSDKHeader.h"
#import "ELBloodBleDataModel.h"



typedef NS_ENUM(NSUInteger, ELBloodBleDataType) {
ELBloodBleDataTypeStableData = 0x01, //Stable data(稳定数据)
ELBloodBleDataTypeRealTimeData = 0x02, //Real-time data(实时数据)
ELBloodBleDataTypeSetUnit = 0x81, //App release unit settings(app 下发单位设置)
ELBloodBleDataTypeSetUnitResult = 0x82, //Unit setting result(单位设置结果)
ELBloodBleDataTypeInteraction = 0x83, //Interactive command(交互指令)
ELBloodBleDataTypeSetSwitchVoice = 0x85, //Send voice alarm settings(下发语音报警设置)
ELBloodBleDataTypeSwitchVoiceResult = 0x86, //Send voice alarm setting result(下发语音报警设置结果)
ELBloodBleDataTypeFailCode = 0xFF, //Report error code(上报错误码)
};



@protocol ELBloodBleManagerDelegate <NSObject>

@optional
/**
Callback Bluetooth status(回调蓝牙状态)
@param state Bluetooth status(蓝牙状态)
*/
-(void)bloodBleManagerUpdateBleState:(ELBluetoothState)state;

/**
Callback scanned device(回调扫描到的设备)
@param devices 设备
*/
-(void)bloodBleManagerScanDevices:(NSArray<ELPeripheralModel *> *_Nullable)devices;

/**
Call back real-time, stable data(回调实时、稳定数据)

@param model 数据
@param type 类型
*/
-(void)bloodBleManagerReceiceTestData:(ELBloodBleDataModel *_Nonnull)model type:(ELBloodBleDataModelType)type;

/**
Set unit callback(设置单位回调)
@param type 结果
*/
-(void)bloodBleManagerReceiveSetUnitResult:(ELSetBluetoothResponseType)type;

/**
Set the interaction type(设置交互类型)
@param type 结果
*/
-(void)bloodBleManagerReceiveInteractionType:(ELBloodInteractionType)type;


/**
Error code sent on the device(设备上发错误码)
@param code error code(错误码)
*/
-(void)bloodBleManagerReceiveFailCode:(ELBloodFailCode)code;

/**
Send voice alarm setting result(下发语音报警设置结果)

@param type 操作类型
@param result 结果
*/
-(void)bloodBleManagerReceiveSetSwitchVoiceOperationType:(ELBloodBleSwitchVoiceType)type result:(ELSetBluetoothResponseType)result;
@end


NS_ASSUME_NONNULL_BEGIN

@interface ELBloodBleManager : ELBluetoothManager

@property (nonatomic, weak) id<ELBloodBleManagerDelegate> bloodDelegate;


+(instancetype)shareManager;


//Set unit(设置单位)
-(void)changeUnit:(ELDeviceBloodPressureUnit)unit;

/**
Interact with Bluetooth(与蓝牙交互)

@param type 类型
ELBloodInteractionTypeStartTest = 0, //Start measurement(开始测量)
ELBloodInteractionTypeStopTest = 1, //Stop testing(停止测试)
ELBloodInteractionTypeBoot = 2, //Boot(开机)
ELBloodInteractionTypeShutdown = 3, //Shut down(关机)
*/
-(void)sendInteractiveInstructions:(ELBloodInteractionType)type;

/**
Send voice alarm settings(下发语音报警设置)

@param type operation type
*/
-(void)sendSwitchVoice:(ELBloodBleSwitchVoiceType)type;
@end

NS_ASSUME_NONNULL_END

+ 58
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBloodBleSDKHeader.h View File

@@ -0,0 +1,58 @@
//
// ELBloodBleSDKHeader.h
// Elink
//
// Created by iot_user on 2019/5/11.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#ifndef ELBloodBleSDKHeader_h
#define ELBloodBleSDKHeader_h
#import "ELSDKHeader.h"

#define BloodUnitDic @{\
@(ELBloodUnitType_mmhg):BloodUnit_mmhg,\
@(ELBloodUnitType_kPa):BloodUnit_kPa\
}

#define BloodUnit_mmhg AiLinkBloodUnit_mmHgStr
#define BloodUnit_kPa AiLinkBloodUnit_kPaStr

#define kPa_To_mmHg(kPa) kPa*7.5006168270417
#define mmHg_To_kPa(mmHg) mmHg/7.5006168270417

//type of data(数据类型)
typedef NS_ENUM(NSUInteger, ELBloodBleDataModelType) {
ELBloodBleDataModelTypeStable, //Stable data(稳定数据)
ELBloodBleDataModelTypeRealTime, //Real-time data(实时数据)
};
//error code(错误码)
typedef NS_ENUM(NSUInteger, ELBloodFailCode) {
ELBloodFailCodeUnfoundDia = 0, //High voltage not found(未找到高压)
ELBloodFailCodeCantInflating = 1, //Unable to pressurize normally, please check whether the cuff is inserted, or re-insert the cuff trachea(无法正常加压,请检查是否插入袖带,或者重新插拔袖带气管)
ELBloodFailCodePowerLow = 2, //Low battery(电量低)
ELBloodFailCodeSignalError = 3, //Abnormal sensor signal(传感器信号异常)
ELBloodFailCodeMeasureError = 4, //Abnormal measurement results(测量结果异常)
ELBloodFailCodeWristbandError = 5, //Wrist strap is too tight or the airway is blocked(腕带过紧或气路堵塞)
ELBloodFailCodeHaveInterence = 6, //Serious pressure interference during measurement(测量中压力干扰严重)
ELBloodFailCodeOverStressed = 7, //Overpressure 290(压力超 290)
ELBloodFailCodeDataError = 8, //Abnormal calibration data or abnormal storage IC(标定数据异常或存储 IC 异常)
};



//Interactive command(交互指令)
typedef NS_ENUM(NSUInteger, ELBloodInteractionType) {
ELBloodInteractionTypeStartTest = 0, //Start measurement(开始测量)
ELBloodInteractionTypeStopTest = 1, //Stop testing(停止测试)
ELBloodInteractionTypeBoot = 2, //Boot(开机)
ELBloodInteractionTypeShutdown = 3, //Shut down(关机)
};

typedef NS_ENUM(NSUInteger, ELBloodBleSwitchVoiceType) {
ELBloodBleSwitchVoiceTypeOn = 0x00, //turn on(打开)
ELBloodBleSwitchVoiceTypeOff = 0x01, //shut down(关闭)
};


#endif /* ELBloodBleSDKHeader_h */

+ 598
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBluetoothManager.h View File

@@ -0,0 +1,598 @@
//
// ELBluetoothManager.h
// Elink
//
// Created by iot_user on 2019/4/22.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ELPeripheralModel.h"
#import "ELSDKHeader.h"
#import "ELBlePublicTool.h"
#import "ELBleWifiDetailModel.h"


//MARK:Bluetooth Wifi protocol(蓝牙Wifi协议)
@protocol ElBleWifiDelegate <NSObject>

@optional

/**
Callback Wifi details(回调Wifi详情)

@param model 模型
*/
-(void)bleWifiReceiveWifiDetailModel:(ELBleWifiDetailModel *_Nonnull)model;

/**
Scan nearby wifi results(扫描附近wifi结果)

@param count Number of nearby wifi(附近wifi数量)
*/
-(void)bleWifiReceiveScanedWifiCount:(int)count;

/**
Callback Wifi MAC address(回调Wifi MAC地址)

@param macData mac
*/
-(void)bleWifiReceiveWifiMacData:(NSData *_Nullable)macData;

/**
Callback WIFI password(回调WIFI密码)

@param pwd password(密码)
*/
-(void)bleWifiReceiveWifiPwd:(NSString *_Nonnull)pwd;

/**
Get DTIM interval (unit: ms)(获取DTIM间隔(单位:ms))

@param interval Interval (unit: ms)(间隔(单位:ms))
*/
-(void)bleWifiReceiveWifiDTIMInterval:(NSInteger)interval;

/**
Returns the visited URL(返回访问的url)

@param url url
*/
-(void)bleWifiReceiveWifiAccessURL:(NSString *_Nonnull)url;

/**
Call back wifi port number(回调wifi的端口号)

@param port 端口号
*/
-(void)bleWifiReceiveWifiPort:(int)port;

/**
Set or query the callback of the instruction execution result(设置指令蓝牙WIFI响应回调方法)
只支持蓝牙Wifi部分枚举
@param type Type of setting (设置的类型)
@param result Set result(设置的结果)
*/
-(void)bleWifiReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result;

/**
获取会话码

@param code 会话码(为0时表示不存在)
*/
-(void)bleWifiReceiveWifiSNCode:(int)code;

@end

//MARK:蓝牙通用协议
@protocol ELBluetoothManagerDelegate <NSObject>
@optional

//Callback Bluetooth status(回调蓝牙状态)
-(void)bluetoothManagerUpdateBleState:(ELBluetoothState)state;
//Callback to scanned device(回调扫描到的设备)
-(void)bluetoothManagerScanedPeripherals:(NSArray<ELPeripheralModel *> *_Nonnull)peripherals;
//Special devices that can be bound in the callback, such as door locks(回调中扫描到的可以绑定的特殊设备,如门锁)
-(void)bluetoothManagerScanedCanBindSpecialPeripherals:(NSArray<ELPeripheralModel *> *_Nonnull)peripherals;
//Callback decrypted transparent data (A7 decrypted payload data)(回调解密后的数据(A7解密后payload数据))
-(void)bluetoothManagerReceiveData:(NSData *_Nonnull)data deviceType:(ELSupportDeviceType)type;

/**
回调透传数据

@param data 透传数据(此数据不能以A6或A7开头)
*/
-(void)bluetoothManagerReceivePassData:(NSData *_Nullable)data;


#pragma mark ============ A6 Set or query the callback of the instruction execution result(设置或查询指令执行结果的回调) ==============
/**
Set or query the callback of the instruction execution result(设置指令蓝牙响应回调方法(握手指令除外))

@param type Type of setting (设置的类型)
@param result Set result(设置的结果)
*/
-(void)bluetoothManagerReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result;

/**
Query module status callback(查询模块状态的回调)

@param stateStrct 结构体
*/
-(void)bluetoothManagerReceiveMCUConnectedState:(struct ELMCUStateStruct)stateStrct;

/**
Query the callback of the communication mode(查询通信模式的回调)

@param type communication mode(通信模式)
*/
-(void)bluetoothManagerReceiveCommunicationMode:(ELCommunicationModeType)type;

/**
Query the callback of automatic sleep time(查询自动睡眠时间的回调)

@param sleetStrct Automatic sleep time(自动睡眠时间)
*/
-(void)bluetoothManagerReceiveAutoSleepTime:(struct ELAutoSleepTimeStruct)sleetStrct;

/**
Query master-slave mode callback(查询主从模式回调)

@param mode 模式
0:Slave mode(从机模式)
1:Host mode(主机模式)
*/
-(void)bluetoothManagerReceiveMCUMode:(int)mode;

/**
Query the callback of UUID information(查询UUID信息的回调)

@param uuid ELUUIDStruct
*/
-(void)bluetoothManagerReceiveUUID:(struct ELUUIDStruct)uuid;

/**
Query the callback of the MAC address size endian(查询MAC地址大小端序的回调)

@param type 类型
0:Little endian(小端序)
1:Big endian (大端序)
*/
-(void)bluetoothManagerReceiveMacAddressType:(int)type;

/**
Query the callback of the Bluetooth serial port baud rate(查询蓝牙串口波特率的回调)

@param rate Serial port baud rate(串口波特率)
0:9600
1:19200
2:38400
3:57600
4:115200
5:921600
*/
-(void)bluetoothManagerReceiveSerialPostBaudRate:(int)rate;

/**
Query the callback of Bluetooth transmit power(查询蓝牙发射功率的回调)

@param dbm Transmit power(发射功率)
*/
-(void)bluetoothManagerReceiveTransmittingPower:(int)dbm;

/**
Query the callback of the Bluetooth connection interval(查询蓝牙连接间隔的回调)

@param intervalStrct connection interval
*/
-(void)bluetoothManagerReceiveConnectInterval:(struct ELConnectIntervalStruct)intervalStrct;

/**
Query the callback of the Bluetooth name(查询蓝牙名称的回调)

@param name Bluetooth name(蓝牙名称)
*/
-(void)bluetoothManagerReceiceName:(NSString *_Nullable)name;

/**
Query the callback of the Bluetooth broadcast interval(查询蓝牙广播间隔的回调)

@param interval broadcast interval(广播间隔)
*/
-(void)bluetoothManagerReceiveBroadcastInterval:(int)interval;

/**
Query the callback of the Bluetooth MAC address(查询蓝牙MAC地址的回调)

@param macAddress MAC
*/
-(void)bluetoothManagerReceiveMACAddress:(NSString *_Nonnull)macAddress;

/**
Query the callback of the software and hardware version number of the BM module(查询BM模块软硬件版本号的回调)

@param bmVersion BM module software and hardware version number(BM模块软硬件版本号)
*/
-(void)bluetoothManagerReceiveBMVersion:(NSString *_Nonnull)bmVersion;

/**
Query the callback of the MCU software and hardware version number(查询MCU软硬件版本号的回调)
@param mcuVersion Callback of MCU software and hardware version number(MCU软硬件版本号的回调)
*/
-(void)bluetoothManagerReceiveMCUVersion:(NSString *_Nonnull)mcuVersion;

/**
Query the callback of Bluetooth time(查询蓝牙时间的回调)

@param date yyyy-MM-dd HH:mm:ss
@param effective Time is invalid(时间有无效)
0:effective(系统时间无效)
1:invalid(系统时间有效)
*/
-(void)bluetoothManagerReceiveBluetoothDate:(NSString * _Nonnull)date effective:(BOOL)effective;

/**
Query CID, VID, PID callback(查询CID,VID,PID的回调)

@param did CID,VID,PID
*/
-(void)bluetoothManagerReceiveDID:(struct ELDIDStruct)did;

/**
Query the callback of the battery status(查询电池状态的回调)

@param battery Structure of battery charge status and charge percentage(电池充电状态和电量百分比的结构体)
*/
-(void)bluetoothManagerReceiveBattery:(struct ELBatteryStruct)battery;

/**
* Query the callback of the device support unit(查询设备支持单位的回调)
*/
- (void)bluetoothManagerBackDeviceSupportUnitWithWeight:(NSArray<NSNumber *> *_Nullable)weightArray
Height:(NSArray<NSNumber *> *_Nullable)heightArray
Temperature:(NSArray<NSNumber *> *_Nullable)temperatureArray
BloodPressure:(NSArray<NSNumber *> *_Nullable)bloodPressureArray
Pressure:(NSArray<NSNumber *> *_Nullable)pressureArray;


/**
Set the result of the decoding key(设置解码密钥的结果)

@param result 结果
*/
-(void)bluetoothManagerReceiveSetKeyResult:(BOOL)result;


@end



NS_ASSUME_NONNULL_BEGIN

@interface ELBluetoothManager : NSObject

@property (nonatomic, assign, readonly) BOOL isOn;
//Bluetooth status(蓝牙状态)
@property (nonatomic, assign, readonly) ELBluetoothState state;
//version number(版本号)
@property (nonatomic, copy, readonly) NSString *bmVersion;
/**
Save the model corresponding to the currently connected device
保存当前连接的设备对应的模型
*/
@property (nonatomic, strong, readonly) ELPeripheralModel *peripheralModel;
//Bluetooth proxy(蓝牙代理)
@property (nonatomic, weak) id<ELBluetoothManagerDelegate> delegate;
//Bluetooth wifi proxy(蓝牙wifi代理)
@property (nonatomic, weak) id<ElBleWifiDelegate> bleWifiDelegate;

//设置appkey和secret
+(void)setAppKey:(NSString *)key appSecret:(NSString *)secret;

//
+(__kindof ELBluetoothManager * _Nonnull)shareManager;

/**
Get the SDK version number
获取SDK版本号
*/
-(NSString *)sdkVersion;

//Start scanning(开始扫描)
-(void)startScan;
//Stop scanning(停止扫描)
-(void)stopScan;
//Connecting device(连接设备)
-(void)connectPeripheral:(ELPeripheralModel *)peripheralModel;
//Disconnect device(断开设备)
-(void)disconnectPeripheral;

#pragma mark ============ 发送指令的3种方法 ==============
/**
Shortcut method to send A6 data to BLE(发送A6数据给BLE的快捷方法)
@param data The stitched payload part(拼接好的payload部分)
*/
-(void)sendCmdToMCUWithA6PayloadData:(NSData *)data;
/**
Shortcut method of sending A7 data to MCU(发送A7数据给MCU的快捷方法)
@param data The stitched payload part(拼接好的payload部分)
@param type Equipment type(设备类型)
*/
-(void)sendCmdToMCUWithA7PayloadData:(NSData *)data deviceType:(ELSupportDeviceType)type;

/**
General method of sending data (support data transparent transmission)(发送数据通用方法(支持数据透传))

@param data 数据
*/
-(void)sendData:(NSData *)data;

#pragma mark ============ Please rewrite the following methods in the subclass(请在子类重写以下方法) BEGIN==============

-(void)bluetoothUpdateState:(ELBluetoothState)state;

-(void)bluetoothScanPeripherals:(NSArray *)peripherals;


/**
Callback decrypted A7 transparent data (payload part), type device type( 回调解密后的A7透传数据(payload部分),type设备类型)
*/
-(void)bluetoothReceiveData:(NSData *)playload deviceType:(ELSupportDeviceType)type;

/**
The special A6 data will only be received by the supported devices, and the complete A6 data (A6 is not encrypted) is passed to the subclass resolution.
特殊的A6数据,只有支持的设备才会收到,将完整A6数据(A6不加密)传给子类解析
ELSupportDeviceType support:
ELSupportDeviceTypeBodyFatScale
ELSupportDeviceTypeSmartLock
*/
-(void)bluetoothBackA6Data:(NSData *)data withClassId:(ELSupportDeviceType)type;

/**
Callback to scan special devices that can be bound, such as door locks(回调扫描到的可以绑定的特殊设备,如门锁)
*/
-(void)bluetoothScanCanBindSpecialPeripherals:(NSArray *)peripherals;

/**
Callback device basic information(回调设备基本信息)

@param data Device basic information payload data (length is 16 bytes)(设备基本信息payload数据(长度为16个byte))
*/
-(void)bluetoothReceiveBasicInfoPayloadData:(NSData *)data;

#pragma mark ============ Please rewrite the following methods in the subclass(子类重写方法) END==============



#pragma mark ============ A6 Set or query instructions(设置或查询指令) ==============

/**
Get Bluetooth information(获取蓝牙信息)

@param type ELInetGetCmdType (ELInetGetCmdTypeGetHandshake除外)
*/
-(void)getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdType)type;

/**
Set the Bluetooth name(设置蓝牙名称)

@param name Name, less than 14 bytes(名称,小于14个byte)
*/
-(void)setBluetoothName:(NSString * _Nonnull)name;

/**
Set the broadcast interval(设置广播间隔时间)

@param interval 20~2000
*/
-(void)setBroadcastInterval:(int)interval;


/**
Set the connection interval 10(设置连接间隔)

@param interval The interval range is 20~2000ms.(interval范围是20~2000ms)
@param timeout The timeout range is 1000~6000ms(timeout范围是1000~6000ms)
@param latency The latency range is 0~4(latency范围是0〜4)
*/
-(void)setConnectedInterval:(int)interval timeout:(int)timeout Latency:(int)latency;

/**
Set the transmit power(设置发射功率)

@param power The range of power is 0~10(power的范围是0~10)
*/
-(void)setTransmittingPower:(int)power;

/**
Set the serial port baud rate(设置串口波特率)

@param rate The range of rate is 0~5(rate的范围是0~5)
0:9600
1:19200
2:38400
3:57600
4:115200
5:921600
*/
-(void)setSerialPortbaudRate:(int)rate;

/**
Set the MCU software and hardware version number(设置MCU软硬件版本号)

@param hardware 硬件
@param software 软件
如果是:S1.1,S11.1,S111.1, .....
请传:11,111,1111, ....
@param type Manufacturer's own definition(厂家自己定义)
@param year 年
@param month 月
@param day 日
*/
-(void)setMCUVersion:(unsigned int)hardware software:(unsigned int)software mcuType:(unsigned int)type year:(unsigned int)year month:(unsigned int)month day:(unsigned int)day;

/**
Set the big endian or little endian of the Mac address in the broadcast manufacturer's custom data.(设置广播厂家自定义数据中Mac地址的大端序或小端序)

@param type type
0:Little endian (default)(小端序 (默认))
1:Big endian(大端序)
*/
-(void)setSetMACAddressType:(int)type;

/**
Set up the module's service and feature services(设置模块的服务和特征服务)

@param serverUUIDData server
@param charateristicUUIDData charateristic
@param type UUID length:
0 : 16 bytes(default)
1:2 bytes
*/
-(void)setBluetoothServerUUID:(NSData *)serverUUIDData charateristicUUID:(NSData *)charateristicUUIDData UUIDType:(int)type;

/**
Set the master-slave mode of the module(设置模块的主从模式)

@param type Value:
0:Slave mode (default)(从机模式(默认))
1:Host mode(主机模式)
*/
-(void)setMCUModel:(int)type;

/**
Set the module's automatic sleep time without connection(设置模块无连接的自动休眠时间)

@param open Automatic sleep flag(自动睡眠标志位):
0:Do not turn on automatic sleep(不开启自动休眠)
1:Turn on auto sleep, the module is not connected(开启自动休眠,模块没有连接)
@param time Automatic sleep time (ms)(自动睡眠时间(ms))
@param radio Whether to enable low frequency broadcast after sleep: (unit: ms)(睡眠后是否开启低频广播:(单位:ms))
0:Not open(不开启)
1:Open(开启)
@param interval 低频广播间隔时间,20~2000ms
*/
-(void)setAutoSleepTimeIsOpen:(BOOL)open autoSleepTime:(unsigned int)time isRadio:(BOOL)radio radioInterval:(int)interval;

/**
Set to sleep(设置进入睡眠)

@param radio Whether to enable low frequency broadcast after sleep: (in ms)(睡眠后是否开启低频广播:(单位 ms))
0:Not open(不开启)
1:Open(开启)
@param interval 低频广播间隔时间,20~2000ms
*/
-(void)setGotoSleepIsRadio:(BOOL)radio interval:(int)interval;

/**
Set module wake up(设置模块唤醒)
*/
-(void)setMCUWakeUp;

/**
Set the current time of the system(设置系统当前时间)
@param enable
NO: In addition to the ability to turn off the time function, you can save part of the current (default)(除能,关闭时间功能,可省部分电流(默认))
YES:Enable, turn on the timer function timer(使能,开启计时功能定时器)
*/
-(void)setMCUNowDateWithEnable:(BOOL)enable;

/**
Setting CID, VID, PID(设置CID、VID、PID)

@param setC Whether to set the CID(是否设置CID)
@param setV Whether to set the VID(是否设置VID)
@param setP Whether to set the PID(是否设置PID)
@param cid Product Type ID: Less than 65536(产品类型ID:小于65536)
@param vid Manufacturer ID: less than 65536(厂家ID:小于65536)
@param pid Product ID: Less than 65536(产品ID:小于65536)
*/
-(void)setC_V_P_IDWithIsSetCID:(BOOL)setC isSetVID:(BOOL)setV isSetPID:(BOOL)setP CID:(unsigned int)cid VID:(unsigned int)vid PID:(unsigned int)pid;

/**
Set module communication mode
设置模块通信模式

@param mode communication mode(通信模式)
*/
-(void)setCommunicationMode:(ELCommunicationModeType)mode;

/**
Set module restart
设置模块重启
*/
-(void)setMCURestart;

/**
Set factory reset
设置恢复出厂设置
*/
-(void)setFactoryDataReset;

/**
Set the Bluetooth connection status(设置蓝牙连接状态)

@param disconnect Active disconnect flag(主动断开连接标志位)
1:Disconnect immediately(立刻断开连接)
0:Not disconnected(不断开连接)
*/
-(void)setDisconnected:(BOOL)disconnect;

/**
Send decoding key(发送解码密钥)

@param data The length of the decoding key is 19, the first 16 are keys, and the last 3 are random texts. You need to save this value on the app and MCU to generate a one-time password. (解码密钥的长度为19,前16个为密钥,后3个为随机文,需要在app端和MCU端保存这个值,用于生成一次性密码)
*/
- (void)setKeyWithData:(NSData *)data;



#pragma mark ============ Bluetooth WIFI calling method(蓝牙WIFI调用方法) ==============

/**
WIFI initiate connection and disconnect(WIFI 发起连接、断开连接)

@param connect YES: initiate connection NO: disconnect(YES:发起连接 NO:断开连接)
*/
-(void)bleWifiSetupWifiConnect:(BOOL)connect;

/**
Set WIFI access URL(设置WIFI访问URL)
@param url url(Not more than 56chars(不超过56chars))
*/
-(void)bleWifiSetWifiURL:(NSString *)url;

/**
Set Wifi access port number(设置Wifi访问端口号)
@param port 端口号
*/
-(void)bleWifiSetPort:(int)port;

/**
Set DTIM interval(设置DTIM间隔)

@param interval 间隔
*/
-(void)bleWifiSetDTIMInterval:(int)interval;

/**
Set WIFI password(设置WIFI密码)
@param pwd WIFI password (8 ~ 56 chars)(WIFI密码(8~56 个chars))
*/
-(void)bleWifiSetWifiPwd:(NSString *)pwd;

/**
Set up connected WIFI(设置连接的WIFI)

@param macData wifi MAC (little endian)(wifi的MAC(小端序))
*/
-(void)bleWifiSetConnectWifiMac:(NSData *)macData;

@end
NS_ASSUME_NONNULL_END


+ 137
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBodyFatScaleBleHeader.h View File

@@ -0,0 +1,137 @@
//
// ELBodyFatScaleBleHeader.h
// Elink
//
// Created by iot_user on 2019/7/18.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#ifndef ELBodyFatScaleBleHeader_h
#define ELBodyFatScaleBleHeader_h

#import "ELSDKHeader.h"

//A6 Byte[2]=2B Byte[3]为A6二级指令(1~7) BLE <-> APP
typedef NS_ENUM(NSInteger , ELBodyFatScaleBleDataA6SubType) {
/** 0x2B01 app下发离线用户列表 */
ELBodyFatScaleBleDataA6SubType_AppSendUpdateOfflineUserList = 0x01 ,
/** 0x2B02 app结束发送离线用户列表 */
ELBodyFatScaleBleDataA6SubType_AppFinishUpdateOfflineUserList = 0x02 ,
/** 0x2B03 app更新离线用户列表中单人信息 */
ELBodyFatScaleBleDataA6SubType_AppSendUpdateSingleOfflineUser = 0x03 ,
/** 2B01~2B03操作的结果回调》2B0400/02:更新列表成功/失败 2B0401/03:更新单个成功/失败 */
ELBodyFatScaleBleDataA6SubType_BleBackUpdateOfflineUserResult = 0x04 ,
/** 0x2B05 app请求历史记录及Ble回复都是用2B05》2B0500:无历史记录 2B0501:开始发送历史记录 2B0502:结束发送历史记录 */
ELBodyFatScaleBleDataA6SubType_AppSendAndBleBackHistory = 0x05 ,
/** ble发给app有体脂数据的历史记录 */
ELBodyFatScaleBleDataA6SubType_BleBackHistoryWithMCUAlgorithm = 0x06 ,
/** ble发给app无体脂数据的历史记录,app需要根据vip/pid确定使用哪种算法来计算8项体脂数据 */
ELBodyFatScaleBleDataA6SubType_BleBackHistoryWithAppAlgorithm = 0x07
};


//A7 Byte[4]为指令类型(1~8) MCU <-> APP
typedef NS_ENUM(NSInteger , ELBodyFatScaleBleDataType) {
/** MCU发送实时体重 */
ELBodyFatScaleBleDataType_MCUBackRealtimeWeight = 0x01 ,
/** MCU发送稳定体重 */
ELBodyFatScaleBleDataType_MCUBackStableWeight = 0x02 ,
/** MCU发送温度 */
ELBodyFatScaleBleDataType_MCUBackTemperature = 0x03 ,
/** MCU:阻抗测量中 */
ELBodyFatScaleBleDataType_MCUBackAdcMeasuring = 0x04 ,
/** MCU:阻抗测量成功 */
ELBodyFatScaleBleDataType_MCUBackAdcMeasureSuccess = 0x05 ,
/** MCU:阻抗测量失败 */
ELBodyFatScaleBleDataType_MCUBackAdcMeasureFailed = 0x06 ,
/** MCU:阻抗测量成功并使用App算法(VID/PID决定算法) */
ELBodyFatScaleBleDataType_MCUBackAdcMeasureSuccessWithAppAlgorithm = 0x07 ,
/** 开始称重前app下发当前称重用户的信息给MCU,以便进行体脂计算 */
ELBodyFatScaleBleDataType_SyncCurrentUserInfo = 0x08 , //2B0802 APP下发当前用户 2B0803/04 MCU回复下发当前用户成功/失败
/** MCU发送体脂数据给App */
ELBodyFatScaleBleDataType_MCUBackBodyFatData = 0x09 ,
/** MCU发送体脂数据给App,发送完毕(一次完整测量结束) */
ELBodyFatScaleBleDataType_MCUBackBodyFatDataOver = 0x0A ,
/** MCU->APP:心率测量中 */
ELBodyFatScaleBleDataType_MCUBackHeartRateMeasuring = 0x0B ,
/** MCU->APP:心率测量成功 */
ELBodyFatScaleBleDataType_MCUBackHeartRateMeasureSuccess = 0x0C ,
/** MCU->APP:心率测量失败 */
ELBodyFatScaleBleDataType_MCUBackHeartRateMeasureFailed = 0x0D ,

/** App发送指令切换单位 */
ELBodyFatScaleBleDataType_AppSendUnit = 0x81 ,
/** MCU发送体脂数据给App,发送完毕(一次完整测量结束) */
ELBodyFatScaleBleDataType_MCUBackSendUnitResult = 0x82 ,
/** 设备上发错误码 */
ELBodyFatScaleBleDataType_MCUBackErrorCode = 0xFF ,
};


//MCU请求App用户信息状态
typedef NS_ENUM(NSUInteger, BodyFatScaleMCURequestUserInfoStatus) {
BodyFatScaleMCURequestUserInfoStatus_Get = 0x01, //MCU requests App user information(MCU请求App用户信息)
BodyFatScaleMCURequestUserInfoStatus_Success = 0x03, //请求成功
BodyFatScaleMCURequestUserInfoStatus_Fail = 0x04, //失败
};

//Impedance measurement status(阻抗测量状态)
typedef NS_ENUM(NSUInteger, BodyFatScaleMeasureStatus) {
BodyFatScaleMeasureStatus_Unstable = 0,
BodyFatScaleMeasureStatus_Stable,
BodyFatScaleMeasureStatus_Complete,
BodyFatScaleMeasureStatus_Failed,
};

//Impedance measurement status (intentionally consistent with A7 command enumeration)(阻抗测量状态(故意和A7指令枚举保持一致))
typedef NS_ENUM(NSUInteger, BodyFatScaleAdcMeasureStatus) {
BodyFatScaleAdcMeasureStatus_Testing = 0x04,//测阻抗中
BodyFatScaleAdcMeasureStatus_Success = 0x05,//测阻抗成功
BodyFatScaleAdcMeasureStatus_Fail = 0x06,//测阻抗失败
BodyFatScaleAdcMeasureStatus_SuccessCustom = 0x07,//The impedance measurement is successful, and the APP algorithm is used. The APP will identify the corresponding algorithm according to VID and PID(测阻抗成功,并使用 APP 算法,APP 会根据 VID,PID 来识 别对应算法)
};

//Heart rate measurement status (intentionally consistent with A7 command enumeration)(心率测量状态(故意和A7指令枚举保持一致))
typedef NS_ENUM(NSUInteger, BodyFatScaleHeartRateMeasureStatus) {
BodyFatScaleHeartRateMeasureStatus_Testing = 0x0B,//测心率中
BodyFatScaleHeartRateMeasureStatus_Success = 0x0C,//测心率成功
BodyFatScaleHeartRateMeasureStatus_Fail = 0x0D,//测心率失败
};


//Send success or failure callback for offline user list(发送离线用户列表的成功或失败回调)
typedef NS_ENUM(NSUInteger, BodyFatScaleUpdateRecordStatus) {
BodyFatScaleUpdateRecordStatus_AllSuccess = 0x00,//Successfully updated list(更新列表成功)
BodyFatScaleUpdateRecordStatus_OneSuccess = 0x01,//Successfully update individual users(更新个人用户成功)
BodyFatScaleUpdateRecordStatus_AllFail = 0x02,//Update list failed(更新列表失败)
BodyFatScaleUpdateRecordStatus_OneFail = 0x03,//Failed to update individual user(更新个人用户失败)
};
//Request offline history callback(请求离线历史记录回调)
typedef NS_ENUM(NSUInteger, BodyFatScaleSendHistoryDataStatus) {
BodyFatScaleSendHistoryDataStatus_No = 0x00,//无历史记录
BodyFatScaleSendHistoryDataStatus_Begin = 0x01,//开始发送历史记录
BodyFatScaleSendHistoryDataStatus_End = 0x02,//结束发送历史记录
};

//Character(角色)
typedef NS_ENUM(NSUInteger, BodyFatScaleRole) {
BodyFatScaleRole_Ordinary = 0x00,//Ordinary(普通人)
BodyFatScaleRole_Athlete = 0x01,//Athlete(运动员)
BodyFatScaleRole_AthletePro = 0x02,//AthletePro(专业运动员)
BodyFatScaleRole_Pregnancy = 0x03,//Pregnancy(孕妇)
};


#endif /* ELBodyFatScaleBleHeader_h */

+ 138
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBodyFatScaleBleManager.h View File

@@ -0,0 +1,138 @@
//
// ELScaleBleManager.h
// Elink
//
// Created by 王庭 on 2019/5/28.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import "ELBluetoothManager.h"
#import "ELBodyFatScaleBleHeader.h"

@class ELBodyFatScaleBleUserModel,ELBodyFatScaleBleWeightModel,ELBodyFatScaleDeviceModel;
NS_ASSUME_NONNULL_BEGIN

@protocol ELBodyFatScaleBleDelegate <NSObject>

@optional

/** Callback Bluetooth status(回调蓝牙状态) */
- (void)bodyFatScaleManagerUpdateState:(ELBluetoothState )state;

/**Callback all body fat scales detected( 回调扫描到的所有体脂秤 )*/
- (void)bodyFatScaleManagerScanDevices:(NSArray<ELBodyFatScaleDeviceModel *> *)scaleDevices;
//MARK:回调A7指令数据

/**
Callback to set unit result(回调设置单位结果)

@param result 结果
*/
- (void)bodyFatScaleManagerCallBackSetUnitResult:(ELSetBluetoothResponseType)result;

/**
MCU requests user information( MCU 请求用户信息)

@param status 请求状态
*/
- (void)bodyFatScaleManagerMCURequestAppUserInfoType:(BodyFatScaleMCURequestUserInfoStatus)status;


/**
Return weight and body fat model(返回重量及体脂model)
*/
-(void)bodyFatScaleManagerCallBackWeight:(ELBodyFatScaleBleWeightModel *)weightModel state:(BodyFatScaleMeasureStatus)status;


/**
Return temperature (unit: ° C)(返回温度(单位:°C))

@param temp 温度(单位:°C)
*/
-(void)bodyFatScaleManagerCallBackTemp:(NSString *)temp;

/**
Back to impedance measurement(返回阻抗测量)

@param status 阻抗测量状态
@param adc 阻抗
*/
-(void)bodyFatScaleManagerCallBackAdcMeasureStatus:(BodyFatScaleAdcMeasureStatus)status adcValue:(NSInteger)adc;

/**
Callback heart rate measurement(回调心率测量)
@param status 心率测量状态
@param heartRate 心率
*/
-(void)bodyFatScaleManagerCallBackHeartRateMeasureStatus:(BodyFatScaleHeartRateMeasureStatus)status heartRateValue:(NSInteger)heartRate;

/**
Return error code(返回错误码)

@param code 错误码
1:超重
*/
-(void)bodyFatScaleManagerCallBackErrorCode:(NSInteger)code;
//MARK:回调A6指令数据

/**
Send success or failure callback for offline user list(发送离线用户列表的成功或失败回调)

@param status 状态
*/
-(void)bodyFatScaleManagerCallBackUpdateRecordStatus:(BodyFatScaleUpdateRecordStatus)status;

/**
Request callback for offline history(请求离线历史记录的回调)

@param status 状态
*/
-(void)bodyFatScaleManagerCallBackSendHistoryDataStatus:(BodyFatScaleSendHistoryDataStatus)status;

/**
APP algorithm-offline history data(APP 算法-离线历史记录数据)

@param user 用户信息
*/
-(void)bodyFatScaleManagerCallBackBleUserHistoryDataCustomADCModel:(ELBodyFatScaleBleUserModel *)user bodyDataModel:(ELBodyFatScaleBleWeightModel *)bodyModel;

/**
MCU algorithm-offline history data(MCU 算法-离线历史记录数据)

@param user 用户信息
@param bodyModel 体脂数据
*/
-(void)bodyFatScaleManagerCallBackBleUserHistoryDataModel:(ELBodyFatScaleBleUserModel *)user bodyDataModel:(ELBodyFatScaleBleWeightModel *)bodyModel;

@end



@interface ELBodyFatScaleBleManager : ELBluetoothManager


@property (nonatomic,weak) id<ELBodyFatScaleBleDelegate> bodyFatScaleDelegate;

+ (ELBodyFatScaleBleManager *)shareManager;


#pragma mark ============ 下发A7指令 ==============

- (void)changeBodyFatScaleUnit:(ELDeviceWeightUnit)unit;

- (void)sendCurrentUserToBle:(ELBodyFatScaleBleUserModel *)usr;


#pragma mark ============ 下发A6指令 ==============

-(void)sendOfflineUserListToBle:(NSArray <ELBodyFatScaleBleUserModel *> *)userListArr;

-(void)updateSingleUserInOfflineUserList:(ELBodyFatScaleBleUserModel *)usr;

-(void)sendCmd_RequestHistory;


@end

NS_ASSUME_NONNULL_END

+ 32
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBodyFatScaleBleUserModel.h View File

@@ -0,0 +1,32 @@
//
// ELBodyFatScaleBleUserModel.h
// Elink
//
// Created by iot_user on 2019/7/18.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ELBodyFatScaleBleHeader.h"

NS_ASSUME_NONNULL_BEGIN


/**
APP下发当前用户或者用户列表前需要将appUser转换为如下bleUser
*/
@interface ELBodyFatScaleBleUserModel : NSObject

@property (nonatomic, assign) NSUInteger createTime;
@property (nonatomic, assign) NSUInteger usrID;
@property (nonatomic, assign) BodyFatScaleRole role; //角色
@property (nonatomic, assign) ELBluetoothUserSex sex; //性别
@property (nonatomic, assign) NSUInteger age; //Age 28 (only counts for the whole year)(年龄28(只算整年))
@property (nonatomic, assign) NSUInteger height; //Height 170 (Unit fixed to death: cm, accuracy 1)(身高170(单位定死:cm,精度1))
@property (nonatomic, assign) NSUInteger weight; //Weight 562 (Unit fixed death: kg, accuracy 0.1) 120lb-》 54.4lkg-》 545(体重562(单位定死:kg,精度0.1) 120lb-》54.4lkg-》545)

@property (nonatomic, assign) NSUInteger adc;//Impedance 1230 (accuracy is 1Ω)(阻抗1230(精度为 1Ω))

@end

NS_ASSUME_NONNULL_END

+ 50
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBodyFatScaleBleWeightModel.h View File

@@ -0,0 +1,50 @@
//
// ELBodyFatScaleBodyDataModel.h
// Elink
//
// Created by iot_user on 2019/7/18.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/**
Raw data received from ble: all integers(从ble接收的原始数据:都是整数)
*/
@interface ELBodyFatScaleBleWeightModel : NSObject

@property (nonatomic, assign) NSUInteger weight;
@property (nonatomic, assign) NSUInteger weightUnit;
@property (nonatomic, assign) NSUInteger weightPoint;
///Body fat rate, need / 10(体脂率,需要/10)
@property (nonatomic, assign) NSUInteger bfr;
///Subcutaneous fat rate, need / 10(皮下脂肪率,需要/10)
@property (nonatomic, assign) NSUInteger sfr;
///Visceral fat rate with an accuracy of 1(内脏脂肪率,精度为1)
@property (nonatomic, assign) NSUInteger uvi;
///Muscle rate, need / 10(肌肉率,需要/10)
@property (nonatomic, assign) NSUInteger rom;
///Basal metabolic rate with an accuracy of 1(基础代谢率,精度为1)
@property (nonatomic, assign) NSUInteger bmr;
///Bone quality, need / 10(骨骼质量,需要/10)
@property (nonatomic, assign) NSUInteger bm;
///Water content, need / 10(水含量,需要/10)
@property (nonatomic, assign) NSUInteger vwc;
///Body age with an accuracy of 1(身体年龄,精度为1)
@property (nonatomic, assign) NSUInteger bodyAge;
///Protein rate, need / 10(蛋白率,需要/10)
@property (nonatomic, assign) NSUInteger pp;
///Creation time with an accuracy of 1(创建时间,精度为1)
@property (nonatomic, assign) NSUInteger createTime;
///Impedance, accuracy is 1(阻抗,精度为1)
@property (nonatomic, assign) NSUInteger adc;
///Heart rate with an accuracy of 1(心率,精度为1)
@property (nonatomic, assign) NSUInteger heartRate;
///Algorithm ID(算法ID)
@property (nonatomic, assign) NSUInteger algNum;

@end

NS_ASSUME_NONNULL_END

+ 20
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELBodyFatScaleDeviceModel.h View File

@@ -0,0 +1,20 @@
//
// ELScaleDeviceModel.h
// Elink
//
// Created by 王庭 on 2019/5/28.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import "ELPeripheralModel.h"

NS_ASSUME_NONNULL_BEGIN

/**
蓝牙扫描出来的模型
*/
@interface ELBodyFatScaleDeviceModel : ELPeripheralModel

@end

NS_ASSUME_NONNULL_END

+ 87
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELForeHeadBleManager.h View File

@@ -0,0 +1,87 @@
//
// ELForeHeadBleManager.h
// Elink
//
// Created by iot_user on 2019/4/18.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import "ELBluetoothManager.h"
#import "ELForeheadBleDataModel.h"
#import "ELForeheadHeader.h"

typedef NS_ENUM(NSUInteger, ForeheadBleDataType) {
ForeheadBleDataType_ForeheadStabilityData = 0x01, //Forehead temperature stability data sign(额头温度稳定数据标志)
ForeheadBleDataType_ForeheadDynamicData = 0x02, //Forehead temperature real-time data sign(额头温度实时数据标志)
ForeheadBleDataType_EarStabilityData = 0x03, //Ear temperature stability data sign(耳朵温度稳定数据标志)
ForeheadBleDataType_EarDynamicData = 0x04, //Ear temperature real-time data sign(耳朵温度实时数据标志)
ForeheadBleDataType_EnvironmentStabilityData = 0x05, //Ambient temperature stable data sign(环境温度稳定数据标志)
ForeheadBleDataType_EnvironmentDynamicData = 0x06, //Ambient temperature real-time data sign(环境温度实时数据标志)
ForeheadBleDataType_SubstatanceStabilityData = 0x07, //Object temperature stable data sign(物体温度稳定数据标志)
ForeheadBleDataType_SubstatanceDynamicData = 0x08, //Object temperature real-time data sign(物体温度实时数据标志)
ForeheadBleDataTypeAppSendUnit = 0x81, //App release unit settings(app下发单位设置)
ForeheadBleDataTypeSetUnitResult = 0x82, //Unit setting result(单位设置结果)
ForeheadBleDataTypeFailCode = 0xFF, //Report an error message(上报错误信息)
};


@protocol ELForeheadBleManagerDelegate <NSObject>
@optional

/**
Callback Bluetooth status(回调蓝牙状态)

@param state 蓝牙状态
*/
-(void)foreheadBleManagerUpdateBleState:(ELBluetoothState)state;

/**
Callback scanned device(回调扫描到的设备)

@param devices 额温枪设备
*/
-(void)foreheadBleManagerScanDevices:(NSArray<ELPeripheralModel *> *_Nullable)devices;

/**
Callback temperature(回调温度)

@param model ELForeheadBleDataModel
*/
-(void)foreheadBleManagerReceiveTemperature:(ELForeheadBleDataModel *_Nonnull)model dataType:(ForeheadBleDataType)dataType;

/**
Set unit callback( 设置单位回调)

@param type 结果
*/
-(void)foreheadBleManagerReceiveSetUnitResult:(ELSetBluetoothResponseType)type;

/**
Error code sent on the device(设备上发错误码)

@param code 错误码
*/
-(void)foreheadBleManagerReceiveFailCode:(ForeheadFailCode)code;
@end


NS_ASSUME_NONNULL_BEGIN

@interface ELForeHeadBleManager : ELBluetoothManager

@property (nonatomic, weak) id<ELForeheadBleManagerDelegate> foreheadDelegate;


+(instancetype)shareManager;


/**
Edit unit(修改单位)

@param unit 单位
*/
-(void)changeUnit:(ELDeviceTemperatureUnit)unit;

@end

NS_ASSUME_NONNULL_END

+ 24
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELForeheadBleDataModel.h View File

@@ -0,0 +1,24 @@
//
// ELForeheadBleDataModel.h
// Elink
//
// Created by iot_user on 2019/5/10.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ELForeheadHeader.h"

NS_ASSUME_NONNULL_BEGIN

@interface ELForeheadBleDataModel : NSObject

@property (nonatomic, assign) NSString * temperature;//温度
@property (nonatomic, assign) ELDeviceTemperatureUnit unit;//单位
@property (nonatomic, assign) NSInteger point;//小数点
@property (nonatomic, assign) NSInteger createTime;//时间


@end

NS_ASSUME_NONNULL_END

+ 30
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELForeheadHeader.h View File

@@ -0,0 +1,30 @@
//
// ELForeheadHeader.h
// Elink
//
// Created by iot_user on 2019/5/10.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#ifndef ELForeheadHeader_h
#define ELForeheadHeader_h

#import "ELSDKHeader.h"

//单位
#define ForeheadUnit_CStr AiLinkBleTempUnit_CStr
#define ForeheadUnit_FStr AiLinkBleTempUnit_FStr

#define ForeheadUnitDic @{@(ForeheadUnitType_C):ForeheadUnit_CStr,@(ForeheadUnitType_F):ForeheadUnit_FStr}
//
#define C_TO_F(C) (C*1.8+32) //F = C*1.8 + 32
#define CFMultiple 1.8
#define F_TO_C(F) ((F-32)/1.8) //F = C*1.8 + 32

//异常
typedef NS_ENUM(NSUInteger, ForeheadFailCode) {
ForeheadFailCodeTemperatureTooHigh = 0, //Temperature is too high(温度过高)
ForeheadFailCodeTemperatureTooLow = 1, //The temperature is too low(温度过低)
};

#endif /* ELForeheadHeader_h */

+ 28
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELHeightGaugeBleDataModel.h View File

@@ -0,0 +1,28 @@
//
// ELHeightGaugeBleDataModel.h
// Elink
//
// Created by iot_user on 2019/5/10.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "ELHeightGaugeHeader.h"
#import "ELSDKHeader.h"

NS_ASSUME_NONNULL_BEGIN

@interface ELHeightGaugeBleDataModel : NSObject


@property (nonatomic, assign) NSUInteger height; //ble raw data
@property (nonatomic, assign) NSUInteger heightPoint; //decimal
@property (nonatomic, assign) ELDeviceHeightUnit heightUnit;//单位

@property (nonatomic, assign) NSInteger createTime;//时间


@end

NS_ASSUME_NONNULL_END

+ 67
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELHeightGaugeBleManager.h View File

@@ -0,0 +1,67 @@
//
// ELForeHeadBleManager.h
// Elink
//
// Created by iot_user on 2019/4/18.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import "ELBluetoothManager.h"
#import "ELHeightGaugeBleDataModel.h"
#import "ELHeightGaugeHeader.h"


typedef NS_ENUM(NSUInteger, HeightGaugeBleDataType) {
HeightGaugeBleDataTypeStabilityData = 0x01, //stable temperature
HeightGaugeBleDataTypeAppSendUnit = 0x81, //set unit
HeightGaugeBleDataTypeSetUnitResult = 0x82, //result of set unit
HeightGaugeBleDataTypeFailCode = 0xFF, //error code
};


@protocol ELHeightGaugeBleManagerDelegate <NSObject>
@optional

/**
call back ble status
*/
-(void)heightGaugeBleManagerUpdateBleState:(ELBluetoothState)state;

/**
call back ble scan devices model
*/
-(void)heightGaugeBleManagerScanDevices:(NSArray<ELPeripheralModel *> *_Nullable)devices;

/**
call back ELHeightGaugeBleDataModel
*/
-(void)heightGaugeBleManagerReceiceTestData:(ELHeightGaugeBleDataModel *_Nonnull)model;

/**
call back the result of set unit
*/
-(void)heightGaugeBleManagerReceiveSetUnitResult:(ELSetBluetoothResponseType)type;

/**
call back fail code
*/
-(void)heightGaugeBleManagerReceiveFailCode:(ELHeightGaugeFailCode)code;
@end


NS_ASSUME_NONNULL_BEGIN

@interface ELHeightGaugeBleManager : ELBluetoothManager


@property (nonatomic, weak) id<ELHeightGaugeBleManagerDelegate> heightGaugeDelegate;


+(instancetype)shareManager;


-(void)changeUnit:(ELDeviceHeightUnit)unit;

@end

NS_ASSUME_NONNULL_END

+ 24
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELHeightGaugeHeader.h View File

@@ -0,0 +1,24 @@
//
// ELHeightGaugeHeader.h
// Elink
//
// Created by iot_user on 2019/5/10.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#ifndef ELHeightGaugeHeader_h
#define ELHeightGaugeHeader_h

//单位
//typedef NS_ENUM(NSUInteger, ELHeightGaugeUnitType) {
// ELHeightGaugeUnitType_cm = 0,
// ELHeightGaugeUnitType_inch = 1,
// ELHeightGaugeUnitType_ft_in = 2, //feet-inch
//};

//abnormal(异常)
typedef NS_ENUM(NSUInteger, ELHeightGaugeFailCode) {
ELHeightGaugeFailCodeMeasureFailed = 0, //Measurement failed(测量失败)
};

#endif /* ELHeightGaugeHeader_h */

+ 81
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELPeripheralModel.h View File

@@ -0,0 +1,81 @@
//
// ELPeripheralModel.h
// Elink
//
// Created by iot_user on 2019/4/22.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreBluetooth/CoreBluetooth.h>
#import "ELSDKHeader.h"



NS_ASSUME_NONNULL_BEGIN

/**
Bluetooth peripheral out model(蓝牙扫描出来的外设模型)
*/
@interface ELPeripheralModel : NSObject
/**
CID
*/
@property (nonatomic, assign) ELSupportDeviceType deviceType;

/**
VID
*/
@property (nonatomic, assign) NSInteger vendorID;

/**
PID
*/
@property (nonatomic, assign) NSInteger productID;
@property (nonatomic, copy) NSString *deviceName;
@property (nonatomic, copy) NSString *macAddress;

@property (nonatomic, assign) NSInteger rssi;
@property (nonatomic, strong) CBPeripheral *peripheral;

/**
6 bytes: small endian(6个byte:小端序)
*/
@property (nonatomic, copy) NSData *macData;

/**
2 bytes
*/
@property (nonatomic, copy) NSData *deviceTypeData;



/** Device with unit: support unit string
     Unitless equipment
        Smart Door Lock: Supported unlock type
有单位的设备:支持单位字符串
无单位的设备
智能门锁:支持的开锁类型
*/
@property (nonatomic, copy) NSString *supportUnit;

/** Device version numbe(设备版本号) */
@property (nonatomic, copy) NSString *version;

/**
Screening equipment(筛选设备)

@param peripherals All devices scanned by the parent class(父类扫描到的所有设备)
@param type Equipment type(设备类型)
@return Array of corresponding devices(对应设备的数组)
*/
+(NSArray<ELPeripheralModel *> *)getDevicesWithPeripherals:(NSArray<__kindof ELPeripheralModel *> *)peripherals supportDeviceType:(ELSupportDeviceType)type;

//MARK:Screen multiple devices(筛选多个设备)
+(NSArray<ELPeripheralModel *> *)getDevicesWithPeripherals:(NSArray<__kindof ELPeripheralModel *> *)peripherals supportDeviceTypes:(NSArray<NSNumber *> *)types;

//Descending order(降序)
-(NSComparisonResult)compareRSSI:(ELPeripheralModel *)model;
@end

NS_ASSUME_NONNULL_END

+ 85
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELRemoteControlBleHeader.h View File

@@ -0,0 +1,85 @@
//
// ELRemoteControlBleHeader.h
// Elink
//
// Created by iot_user on 2019/8/22.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#ifndef ELRemoteControlBleHeader_h
#define ELRemoteControlBleHeader_h
/** 遥控器按钮类型 */
typedef NS_ENUM(NSInteger ,RemoteControlType) {
/** K */
RemoteControlType_K_0_05 = 0 ,
/** 字母0.1 到 1.2 */
RemoteControlType_Letter_0_1 ,//1
RemoteControlType_Letter_0_2 ,
RemoteControlType_Letter_0_5 ,
RemoteControlType_Letter_0_8 ,
RemoteControlType_Letter_1_2 ,
/** 时钟图形 */
RemoteControlType_Clock ,
/** 对称的方块 */
RemoteControlType_SymmetryBox ,
RemoteControlType_E_0_1 ,
RemoteControlType_E_0_3 ,
RemoteControlType_E_0_6 ,
RemoteControlType_E_1_0 ,
/** 数字0.1到1.0 */
RemoteControlType_Number_0_1 ,
RemoteControlType_Number_0_3 ,
RemoteControlType_Number_0_6 ,
RemoteControlType_Number_1_0 ,
/** 动植物0.1到0.7 */
RemoteControlType_Pattern_0_1 ,//16
RemoteControlType_Pattern_0_2 ,
RemoteControlType_Pattern_0_4 ,
RemoteControlType_Pattern_0_7 ,
/** 黑色的散点 */
RemoteControlType_BlackDots ,
/** 多个圆弧 */
RemoteControlType_CircularArc ,
/** 3956 */
RemoteControlType_3956 ,
/** 上下为空的方块 */
RemoteControlType_UpDownEmpty ,
/** 左右为空的方块 */
RemoteControlType_LeftRightEmpty ,
/** 黑色的点 */
RemoteControlType_BlockDot ,
/** 空心的准星 */
RemoteControlType_HollowSightBead ,
/** 准星 */
RemoteControlType_SightBead ,
RemoteControlType_UpProgram ,
RemoteControlType_DownProgram ,
RemoteControlType_8_3 ,//30
RemoteControlType_8_4 ,
/** 显示水平 */
RemoteControlType_HorizontalLine ,
/** 显示垂直 */
RemoteControlType_VerticalLine ,
/** 显示单个 */
RemoteControlType_Point ,
RemoteControlType_Reset ,
RemoteControlType_Light ,
RemoteControlType_Right ,
RemoteControlType_Mute ,//38
/** 上下左右 */
RemoteControlType_TouchTop ,
RemoteControlType_TouchLeft ,
RemoteControlType_TouchRight ,
RemoteControlType_TouchBottom ,
};

#endif /* ELRemoteControlBleHeader_h */

+ 40
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELRemoteControlBleManager.h View File

@@ -0,0 +1,40 @@
//
// ELRemoteControlBleManager.h
// Elink
//
// Created by 王庭 on 2019/7/2.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ELRemoteControlBleHeader.h"
#import "ELBluetoothManager.h"
#import "ELRemoteControlDeviceModel.h"


NS_ASSUME_NONNULL_BEGIN

@protocol ELRemoteControlBleDelegate <NSObject>

@optional
/** 回调蓝牙状态 */
- (void)remoteControlManagerUpdateState:(ELBluetoothState )state;

/** 回调所有遥控器设备 */
- (void)remoteControlManagerScanDevices:(NSArray<ELRemoteControlDeviceModel *> *)deviceList;

@end


@interface ELRemoteControlBleManager : ELBluetoothManager

@property (nonatomic,weak) id <ELRemoteControlBleDelegate> remoteControlDelegate;

+ (ELRemoteControlBleManager *)shareManager;

/** APP下发控制命令 */
- (void)sendRemoreControlData:(RemoteControlType )type;

@end

NS_ASSUME_NONNULL_END

+ 17
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELRemoteControlDeviceModel.h View File

@@ -0,0 +1,17 @@
//
// ELRemoteControlDeviceModel.h
// Elink
//
// Created by 王庭 on 2019/7/2.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import "ELPeripheralModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface ELRemoteControlDeviceModel : ELPeripheralModel

@end

NS_ASSUME_NONNULL_END

+ 318
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELSDKHeader.h View File

@@ -0,0 +1,318 @@
//
// ELSDKHeader.h
// AILinkSDKDemo
//
// Created by iot_user on 2019/5/10.
// Copyright © 2019 IOT. All rights reserved.
//

#ifndef ELSDKHeader_h
#define ELSDKHeader_h


//Bluetooth command type(蓝牙指令类型)
typedef NS_ENUM(NSUInteger, ELInetBleDataType) {
ELInetBleDataPackHead_A6 = 0xA6,
ELInetBleDataPackTail_6A = 0x6A,
ELInetBleDataPackHead_A7 = 0xA7,
ELInetBleDataPackTail_7A = 0x7A,
};

//The type of instruction acquired by Inet(Inet获取的指令类型)
typedef NS_ENUM(NSUInteger, ELInetGetCmdType) {
ELInetGetCmdTypeGetName = 0x02, //-Get the Bluetooth name(获取蓝牙名称)
ELInetGetCmdTypeGetBroadcastInterval = 0x06, //-Get broadcast interval (unit: ms)(获取广播间隔时间(单位:ms))
ELInetGetCmdTypeGetConnectedInterval = 0x08, //-Get Bluetooth connection interval(获取蓝牙连接间隔)
ELInetGetCmdTypeGetTransmittingPower = 0x0A, //-Get Bluetooth transmit power(获取蓝牙发射功率)
ELInetGetCmdTypeGetSerialPortbaudRate = 0x0C, //-Get the serial port baud rate(获取串口波特率)
ELInetGetCmdTypeGetMACAddress = 0x0D, //-Read MAC address value(读取MAC地址值)
ELInetGetCmdTypeGetBMVersion = 0x0E, //-Read the BM module software and hardware version number(读取BM模块软硬件版本号)
ELInetGetCmdTypeGetMCUVersion = 0x10, //-Obtain the MCU software and hardware version number(获取MCU软硬件版本号)
ELInetGetCmdTypeGetMACAddressType = 0x12, //-Get the big endian or little endian of the Mac address in the broadcast manufacturer's custom data(获取广播厂家自定义数据中Mac地址的大端序或小端序)
ELInetGetCmdTypeGetUUID = 0x14, //-Get service and feature UUID(获取服务和特征UUID)
ELInetGetCmdTypeGetMCUMode = 0x16, //-Get master-slave mode(获取主从模式)
ELInetGetCmdTypeGetAutoSleepTime = 0x18, //-Get automatic sleep time value(获取自动睡眠时间值)
ELInetGetCmdTypeGetMCUDate = 0x1C, //-Get the current time of the system(获取系统当前时间)
ELInetGetCmdTypeGetC_V_P_ID = 0x1E, //-Read CID, VID, PID(读取CID、VID、PID)
ELInetGetCmdTypeGetCommunicationMode = 0x20, //-Get module communication mode(获取模块通信模式)
ELInetGetCmdTypeGetConnectState = 0x26, //-Get Bluetooth and WiFi connection status(获取蓝牙和WiFi连接状态)
ELInetGetCmdTypeGetBatteryState = 0x28, //-Get MCU battery status(获取MCU电池状态)
ELInetGetCmdTypeGetHandshake = 0x24, //-Encrypted handshake data returned by Bluetooth(蓝牙返回的加密的握手数据)
ELInetGetCmdTypeGetBodyFatScaleA6Data = 0x2B, //-Body fat scale 0x2B stands for A6 protocol (see the second level instructions for details)(体脂秤0x2B代表A6协议(具体见二级指令))
ELInetGetCmdTypeReadDeviceSupportUnit = 0x2C, //-APP reads the MCU end unit instruction(APP读取MCU端单位指令)
ELInetGetCmdTypeGetSendKeyState = 0x31, //-APP reads the result of sending the decoding key(APP读取下发解码秘钥的结果)
ELInetGetCmdTypeGetSmartLockA6Data = 0x34, //-Door lock 0x34 represents the A6 protocol (see the second level command for details)(门锁0x34代表A6协议(具体见二级指令))
ELInetGetCmdTypeGetBasicInfoData = 0x36, //Obtain basic device information data(获取设备基本信息数据)
#pragma mark ============ 蓝牙Wifi ==============
ELInetGetCmdTypeBleWifiGetNearbyWifi = 0x80, //Get nearby Wifi(获取附近Wifi)
ELInetGetCmdTypeBleWifiReceiveWifiName = 0x81, //Reply to wifi name(回复wifi名字)
ELInetGetCmdTypeBleWifiReceiveWifiMac = 0x82, //Reply to wifi mac(回复wifi mac)
ELInetGetCmdTypeBleWifiReceiveScanResult = 0x83, //Reply to scan Wifi result(回复扫描Wifi结果)
ELInetGetCmdTypeBleWifiGetWifiMac = 0x85, //Get Wifi Mac address(获取Wifi的Mac地址)
ELInetGetCmdTypeBleWifiGetWifiPwd = 0x87, //Get Wifi password(获取Wifi密码)
ELInetGetCmdTypeBleWifiGetDTIMInterval = 0x8A, //Get DTIM interval(获取DTIM间隔)
ELInetGetCmdTypeBleWifiGetURL = 0x8C, //Get visited sites(获取访问的网站)
ELInetGetCmdTypeBleWifiGetPort = 0x8E, //Get access port number(获取访问的端口号)
ELInetGetCmdTypeBleWifiGetSNNumber = 0x93, //Get SN number (session code)(获取SN号(会话码))
};
//Instruction type set by Inet(Inet设置的指令类型)
typedef NS_ENUM(NSUInteger, ELInetSetCmdType) {
ELInetSetCmdTypeSetName = 0x01, //Set the broadcast name(设置广播名称)
ELInetSetCmdTypeSetBroadcastInterval = 0x05, //Set the broadcast interval(设置广播间隔时间)
ELInetSetCmdTypeSetConnectedInterval = 0x07, //Set the connection interval(设置连接间隔)
ELInetSetCmdTypeSetTransmittingPower = 0x09, //Set the transmit power(设置发射功率)
ELInetSetCmdTypeSetSerialPortbaudRate = 0x0B, //Set the serial port baud rate(设置串口波特率)
ELInetSetCmdTypeSetMCUVersion = 0x0F, //Set the MCU software and hardware version number(设置MCU软硬件版本号)
ELInetSetCmdTypeSetMACAddressType = 0x11, //Set the big endian or little endian of the Mac address in the broadcast manufacturer's custom data.(设置广播厂家自定义数据中Mac地址的大端序或小端序)
ELInetSetCmdTypeSetUUID = 0x13, //Set the module's service and feature UUID(设置模块的服务和特征UUID)
ELInetSetCmdTypeSetMCUMode = 0x15, //Set the master-slave mode of the module(设置模块的主从模式)
ELInetSetCmdTypeSetAutoSleepTime = 0x17, //Set the module's automatic sleep time without connection(设置模块无连接的自动休眠时间)
ELInetSetCmdTypeSetGotoSleep = 0x19, //Set to sleep(设置进入睡眠)
ELInetSetCmdTypeSetMCUWakeUp = 0x1A, //Set module wake up(设置模块唤醒)
ELInetSetCmdTypeSetMCUNowDate = 0x1B, //Set the current time of the system(设置系统当前时间)
ELInetSetCmdTypeSetC_V_P_ID = 0x1D, //Set CID, VID, PID(设置CID、VID、PID)
ELInetSetCmdTypeSetCommunicationMode = 0x1F, //Set module serial port mode, I2C mode, SPI mode(设置模块串口模式、I2C模式、SPI模式)
ELInetSetCmdTypeSetMCURestart = 0x21, //Set module restart(设置模块重启)
ELInetSetCmdTypeSetFactoryDataReset = 0x22, //Set factory reset(设置恢复出厂设置)
ELInetSetCmdTypeSetConnectState = 0x25, //Set the Bluetooth connection status(设置蓝牙连接状态)
ELInetSetCmdTypeSetHandshake = 0x23, //Encrypted handshake data returned by Bluetooth(蓝牙返回的加密的握手数据)
ELInetSetCmdTypeSetKey = 0x31, //APP sends the decoding key(APP下发解码秘钥)
ELInetSetCmdTypeSetSmartLockA6Data = 0x34, //Door lock 0x34 represents the A6 protocol (see the second level command for details)(门锁0x34代表A6协议(具体见二级指令))
#pragma mark ============ 蓝牙Wifi ==============
ELInetSetCmdTypeBleWifiSetWifiMac = 0x84, //设置WIFI Mac地址
ELInetSetCmdTypeBleWifiSetWifiPwd = 0x86, //设置WIFI 密码
ELInetSetCmdTypeBleWifiSetConnectWifi = 0x88, //设置设备连接WIFI
ELInetSetCmdTypeBleWifiSetDTIMInterval = 0x89, //设置DTIM间隔
ELInetSetCmdTypeBleWifiSetWifiURL = 0x8B, //设置访问的URL
ELInetSetCmdTypeBleWifiSetWifiPort = 0x8D, //设置端口号
};
//Response to Bluetooth after device(给蓝牙进行设备后的响应)
typedef NS_ENUM(NSUInteger, ELSetBluetoothResponseType) {
ELSetBluetoothResponseTypeSuccess =0 , //success(成功)
ELSetBluetoothResponseTypeFailure =1 , //failure(失败)
ELSetBluetoothResponseTypeNoSupport =2 , //not support(不支持)
};

//Device types supported by Elink: Please communicate with the hardware to set(Elink支持的设备类型:请与硬件沟通后设置)
typedef NS_ENUM(NSUInteger, ELSupportDeviceType) {
ELSupportDeviceTypeUnkonwn = 0x0000 , //unknown(未知)
ELSupportDeviceTypeBlood = 0x0001 , //sphygmomanometer(血压计)
ELSupportDeviceTypeForehead = 0x0002 , //Temperature gun(额温枪)
ELSupportDeviceTypeThermometer = 0x0003 , //thermometer(体温计)
ELSupportDeviceTypeBabyScale = 0x0004 , //Baby scale(婴儿秤)
ELSupportDeviceTypeHeightGauge = 0x0005 , //Height meter(身高仪)
ELSupportDeviceTypeSmartLock = 0x000B , //Smart door lock(智能门锁)
ELSupportDeviceTypeRemoteControl = 0x000C , //Internal projection vision tester(内投影视力检查仪)
ELSupportDeviceTypeWheelMonitor = 0x000D , //TPMS(胎压转接板)
ELSupportDeviceTypeBodyFatScale = 0x000E , //Body fat scale(体脂秤)
ELSupportDeviceTypeSmatLockRemote = 0x0010 , //Smart door lock remote control(智能门锁遥控器)
ELSupportDeviceTypeBLE_WIFIScale = 0x0011 , //Ble and wifi Scale(蓝牙Wifi体脂秤)
};
//Communication mode(通信模式)
typedef NS_ENUM(NSInteger, ELCommunicationModeType) {
ELCommunicationModeTypeSerialPort = 0, //Serial port mode(串口模式)
ELCommunicationModeTypeI2C = 1, //I2C mode(I2C模式)
ELCommunicationModeTypeSPI = 2, //SPI mode( SPI模式)
};
//Battery charge status (电池充电状态)
typedef NS_ENUM(NSUInteger, ELBatteryChargingState) {
ELBatteryChargingStateDefault = 0x00, //No charging (default)(没有充电(默认))
ELBatteryChargingStateWorking = 0x01, //charging(充电中)
ELBatteryChargingStateComplete = 0x02, //full charge(充满电)
ELBatteryChargingStateException = 0x03, //Abnormal charging(充电异常)
ELBatteryChargingStatePowerLow = 0x04, //Low battery(电量过低)
};


//CID,VID,PID
struct ELDIDStruct {
ELSupportDeviceType deviceType; //CID
int vendorID; //VID
int productID; //PID
};
//Battery charging state and power structur(电池充电状态和电量的结构体)
struct ELBatteryStruct {
ELBatteryChargingState state; //charging(充电状态)
int power; //Electricity(电量)(0—100%)
};
//Connection interval structure(连接间隔时间的结构体)
struct ELConnectIntervalStruct {
int interval; //Connection interval, unit: ms; range: 20-2000(连接间隔,单位:ms;范围:20-2000)
int latency; //Slave delay, value: 0-4(从设备延时,取值:0-4)
int timeout; //Connection timeout, unit: ms; Range: 1000~6000(连接超时,单位:ms; 范围: 1000~6000)
};

struct ELUUIDStruct {
char *serviceUUID; //Service UUID(服务UUID)
char *writeUUID; //For APP to send data to MCU (write)(用于 APP 下发数据到 MCU(write))
char *notifyUUID; //Used for MCU data transfer to APP (notify)(用于 MCU 数据传输到 APP (notify))
};

struct ELAutoSleepTimeStruct {
int sleepTime; //Automatic sleep time, unit: s(自动睡眠时间,单位:s)
int open; //Whether to enable low frequency broadcast after sleep: 0: not open, 1: open(睡眠后是否开启低频广播: 0:不开启 ,1:开启)
int interval; //Low frequency broadcast interval, unit: ms; range 20~2000(低频广播间隔,单位 :ms ;范围 20~2000)
};
//WiFi连接状态
typedef NS_ENUM(NSUInteger, BleWiFiConnectState) {
BleWiFiConnectStateNoWiFi = 0,//0:没有连接,0: No connection
BleWiFiConnectStateConnectFail = 1 ,//1:尝试连接热点,但是失败1: Attempt to connect to the hotspot, but failed
BleWiFiConnectStateNoNetwork = 2 ,//2:连接热点,热点无网络,2: Connected to the hotspot, the hotspot has no network
BleWiFiConnectStateSuccess = 3 ,//3:连接热点,热点有网络,3: Connected to the hotspot, the hotspot has a network
BleWiFiConnectStateNoConnect = 4 ,//4:有热点信息,未连接,4: There is hotspot information, not connected
};


struct ELMCUStateStruct {
int connectState; //Connection status: 0: no connection 1: connected(蓝牙连接状态: 0:无连接 1:已连接 2:配对完成)
BleWiFiConnectState wifiState; //
int workState; //Working status: 0: Wake 1: Go to sleep 2: Module is ready(工作状态: 0:唤醒 1:进入休眠 2:模块准备就绪)
};

#pragma mark - AiLink unit

/** Type key of unit string(单位字符串的type key) */
#define ELDeviceUnitTypeKey @"type"
/** supportUnit key */
#define ELDeviceUnitSupportUnitKey @"supportUnit"

/** Ailink unit */
typedef NS_ENUM(NSInteger, ELDeviceUnitType) {
/** Weight(重量) */
ELDeviceUnitType_Weight = 1 ,
/** length(长度) */
ELDeviceUnitType_Height ,
/** temperature(温度) */
ELDeviceUnitType_Temperature ,
/** Pressure(血压) */
ELDeviceUnitType_BloodPressure ,
/** Tire pressure(轮胎胎压压力) */
ELDeviceUnitType_Pressure ,
};

#define AiLinkBleWeightUnit_KG_Str @"kg"
#define AiLinkBleWeightUnit_Jin_Str @"斤"
#define AiLinkBleWeightUnit_LB_OZ_Str @"lb:oz"
#define AiLinkBleWeightUnit_OZ_Str @"oz"
#define AiLinkBleWeightUnit_ST_LB_Str @"st:lb"
#define AiLinkBleWeightUnit_G_Str @"g"
#define AiLinkBleWeightUnit_LB_Str @"lb"

#define AiLinkBleWeightUnitStrDic(key) [@{AiLinkBleWeightUnit_KG_Str:@(ELDeviceWeightUnit_KG),AiLinkBleWeightUnit_Jin_Str:@(ELDeviceWeightUnit_JIN),AiLinkBleWeightUnit_LB_OZ_Str:@(ELDeviceWeightUnit_LB_OZ),AiLinkBleWeightUnit_OZ_Str:@(ELDeviceWeightUnit_OZ),AiLinkBleWeightUnit_ST_LB_Str:@(ELDeviceWeightUnit_ST_LB),AiLinkBleWeightUnit_G_Str:@(ELDeviceWeightUnit_G),AiLinkBleWeightUnit_LB_Str:@(ELDeviceWeightUnit_LB)}[key] integerValue]

#define AiLinkBleWeightUnitDic @{@(ELDeviceWeightUnit_KG):AiLinkBleWeightUnit_KG_Str,@(ELDeviceWeightUnit_JIN):AiLinkBleWeightUnit_Jin_Str,@(ELDeviceWeightUnit_LB_OZ):AiLinkBleWeightUnit_LB_OZ_Str,@(ELDeviceWeightUnit_OZ):AiLinkBleWeightUnit_OZ_Str,@(ELDeviceWeightUnit_ST_LB):AiLinkBleWeightUnit_ST_LB_Str,@(ELDeviceWeightUnit_G):AiLinkBleWeightUnit_G_Str,@(ELDeviceWeightUnit_LB):AiLinkBleWeightUnit_LB_Str}
/** AiLink Weight unit(体重单位)*/
typedef NS_ENUM(NSInteger, ELDeviceWeightUnit) {
/** kg */
ELDeviceWeightUnit_KG = 0x00 ,
/** 斤 */
ELDeviceWeightUnit_JIN = 0x01 ,
/** lb:oz */
ELDeviceWeightUnit_LB_OZ = 0x02 ,
/** oz */
ELDeviceWeightUnit_OZ = 0x03 ,
/** st:lb */
ELDeviceWeightUnit_ST_LB = 0x04 ,
/** g */
ELDeviceWeightUnit_G = 0x05 ,
/** lb */
ELDeviceWeightUnit_LB = 0x06 ,
/** Unsupported unit */
ELDeviceWeightUnit_Fail = 0xFF ,
};

#define AiLinkBleHeightUnit_CMStr @"cm"
#define AiLinkBleHeightUnit_InchStr @"inch"
#define AiLinkBleHeightUnit_FeetStr @"feet"

#define AiLinkBleHeightUnitDic @{@(ELDeviceHeightUnit_CM):AiLinkBleHeightUnit_CMStr,@(ELDeviceHeightUnit_Inch):AiLinkBleHeightUnit_InchStr,@(ELDeviceHeightUnit_FT_IN):AiLinkBleHeightUnit_FeetStr}
/** AiLink Length unit(长度单位) */
typedef NS_ENUM(NSInteger, ELDeviceHeightUnit) {
/** cm */
ELDeviceHeightUnit_CM = 0x00 ,
/** inch */
ELDeviceHeightUnit_Inch = 0x01 ,
/** feet:inch */
ELDeviceHeightUnit_FT_IN = 0x02 ,
/** Unsupported unit */
ELDeviceHeightUnit_Fail = 0xFF ,
};

#define AiLinkBleTempUnit_CStr @"℃"

#define AiLinkBleTempUnit_FStr @"℉"

#define AiLinkBleTempUnitDic @{@(ELDeviceTemperatureUnit_C):AiLinkBleTempUnit_CStr,@(ELDeviceTemperatureUnit_F):AiLinkBleTempUnit_FStr}
/** AiLink Temperature unit(温度单位)*/
typedef NS_ENUM(NSInteger, ELDeviceTemperatureUnit) {
/** ℃ */
ELDeviceTemperatureUnit_C = 0x00 ,
/** ℉ */
ELDeviceTemperatureUnit_F = 0x01 ,
/** Unsupported unit */
ELDeviceTemperatureUnit_Fail = 0xFF ,
};

#define AiLinkBloodUnit_mmHgStr @"mmHg"
#define AiLinkBloodUnit_kPaStr @"kPa"

#define AiLinkBloodUnitDic @{\
@(ELDeviceBloodPressureUnit_mmhg):AiLinkBloodUnit_mmHgStr,\
@(ELDeviceBloodPressureUnit_kPa):AiLinkBloodUnit_kPaStr\
}
/** AiLink Blood pressure unit(血压单位) */
typedef NS_ENUM(NSInteger, ELDeviceBloodPressureUnit) {
/** mmhg */
ELDeviceBloodPressureUnit_mmhg = 0x00 ,
/** kPa */
ELDeviceBloodPressureUnit_kPa ,
/** Unsupported unit */
ELDeviceBloodPressureUnit_Fail ,
};

#define AiLinkBlePressureUnit_BarStr @"Bar"
#define AiLinkBlePressureUnit_PsiStr @"Psi"
#define AiLinkBlePressureUnit_KpaStr @"Kpa"

#define AiLinkBlePressureUnitDic @{@(ELDevicePressureUnit_Bar):AiLinkBlePressureUnit_BarStr,@(ELDevicePressureUnit_Psi):AiLinkBlePressureUnit_PsiStr,@(ELDevicePressureUnit_kPa):AiLinkBlePressureUnit_KpaStr}
/** AiLink Tire tire pressure unit(轮胎胎压单位) */
typedef NS_ENUM(NSInteger, ELDevicePressureUnit) {
/** kPa */
ELDevicePressureUnit_kPa = 0x00 ,
/** Psi */
ELDevicePressureUnit_Psi = 0x01 ,
/** Bar */
ELDevicePressureUnit_Bar = 0x02 ,
/** Unsupported unit */
ELDevicePressureUnit_Fail ,
};

#pragma mark ============ 枚举 ==============
typedef NS_ENUM(NSUInteger, ELBluetoothState) {
ELBluetoothStateUnavailable, //Bluetooth is not available(蓝牙不可用)
ELBluetoothStateAvailable, //Bluetooth available(蓝牙可用)
ELBluetoothStateStopScan, //Stop scanning(停止扫描)
ELBluetoothStateScaning, //Scanning(正在扫描)
ELBluetoothStateWillConnect, //Will connect(将要连接)
ELBluetoothStateDidConnect, //Already connected(已经连接)
ELBluetoothStateConnectFail, //Connection error(连接出错)
ELBluetoothStateDidDiscoverCharacteristics, //Peripheral feature callback(外设特征回调)
ELBluetoothStateDidDisconnect, //Disconnect(断开连接)
ELBluetoothStateDidValidationPass, //approved(通过验证)
ELBluetoothStateFailedValidation, //Failed verification(未通过验证)
};

//sex(性别)
typedef NS_ENUM(NSUInteger, ELBluetoothUserSex) {
ELBluetoothUserSex_Woman = 0x00,//female(女)
ELBluetoothUserSex_Man = 0x01,//male(男)
};

#endif /* ELSDKHeader_h */

+ 82
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELThermometerBleManager.h View File

@@ -0,0 +1,82 @@
//
// ELThermometerBleManager.h
// Elink
//
// Created by 王庭 on 2019/5/28.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import "ELBluetoothManager.h"
#import "ELThermometerDeviceModel.h"
#import "ELThermometerBleModel.h"

NS_ASSUME_NONNULL_BEGIN

typedef NS_ENUM(NSInteger , ThermometerBleDataType) {
/**Stable temperature( 稳定温度 )*/
ThermometerBleDataType_StableData = 0x01 ,
/** Real-time temperature(实时温度) */
ThermometerBleDataType_RealtimeData = 0x02 ,
/** App release unit settings(app下发单位设置) */
ThermometerBleDataType_AppSendUnit = 0x81 ,
/** The MCU replies to the setting result(MCU回复设置结果) */
ThermometerBleDataType_BackSendUnit = 0x82 ,
/** Error code sent on the device(设备上发错误码) */
ThermometerBleDataType_DeviceBackErrorCode = 0xFF ,
};

typedef NS_ENUM(NSInteger , ThermometerBleResultType) {
/** success(设置成功 )*/
ThermometerBleResultType_Succeed = 0x01 ,
/** failure(设置失败) */
ThermometerBleResultType_Failure ,
/** unsupport(不支持设置) */
ThermometerBleResultType_Unsupported ,
};

typedef NS_ENUM(NSInteger , ThermometerBleErrorCode) {
/** Hyperthermia(体温过高) */
ThermometerBleErrorCode_Hyperthemia = 0x00 ,
/** Hypothermia(体温过低 )*/
ThermometerBleErrorCode_Hypothermia ,
/** error(测量出错) */
ThermometerBleErrorCode_Failure ,
};

@protocol ELThermometerBleDelegate <NSObject>

@optional
/** Callback Bluetooth status(回调蓝牙状态) */
- (void)thermometerManagerUpdateState:(ELBluetoothState )state;

/** Call back all thermometer devices(回调所有体温计设备) */
- (void)thermometerManagerScanDevices:(NSArray<ELThermometerDeviceModel *> *)thermometerDevices;

/** Callback temperature data(回调温度数据) */
- (void)thermometerManagerReceiveModel:(ELThermometerBleModel *)model;

/** Return unit setting result(返回单位设置结果) */
- (void)thermometerManagerSetUnitResults:(ThermometerBleResultType )result;

/** Error code sent on the device(设备上发错误码)*/
- (void)thermometerManagerBackDeviceErrorCode:(ThermometerBleErrorCode )code;


@end

@interface ELThermometerBleManager : ELBluetoothManager


@property (nonatomic,weak) id<ELThermometerBleDelegate> thermometerDelegate;

+ (ELThermometerBleManager *)shareManager;

/** App release unit settings(app下发单位设置 )*/
- (void)changeThermometerUnit:(ELDeviceTemperatureUnit )unit;

@end

NS_ASSUME_NONNULL_END

+ 24
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELThermometerBleModel.h View File

@@ -0,0 +1,24 @@
//
// ELThermometerBleModel.h
// Elink
//
// Created by 王庭 on 2019/5/28.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ELSDKHeader.h"

NS_ASSUME_NONNULL_BEGIN

@interface ELThermometerBleModel : NSObject

@property (nonatomic,assign) ELDeviceTemperatureUnit unit;//单位
@property (nonatomic,assign) NSUInteger temperature;//温度
@property (nonatomic,assign) BOOL dataType;//Stability flag: 0 real-time data, 1 stable data(稳定标志:0 实时数据,1 稳定数据)
@property (nonatomic,copy) NSString *unitStr;
@property (nonatomic,assign) NSInteger tempPoint; //小数点偏移位置

@end

NS_ASSUME_NONNULL_END

+ 17
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELThermometerDeviceModel.h View File

@@ -0,0 +1,17 @@
//
// ELThermometerDeviceModel.h
// Elink
//
// Created by 王庭 on 2019/5/28.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import "ELPeripheralModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface ELThermometerDeviceModel : ELPeripheralModel

@end

NS_ASSUME_NONNULL_END

+ 60
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELUnitConvertTool.h View File

@@ -0,0 +1,60 @@
//
// ELUnitChangeTool.h
// Elink
//
// Created by steven wu on 2019/9/21.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ELSDKHeader.h"

#define StLbSymbol @":"
#define FeetSymbol @"′"
#define InchSymbol @"″"

#define KG_LB_CONST 2.2046226f
#define ST_LB_CONST 14.0f

#define INCH_CM_CONST 2.54f
#define FEET_INCH_CONST 12.0f


@interface ELUnitConvertTool : NSObject

/**
Convert the integer returned by Bluetooth to the character string required for interface display, the display unit is the current user unit
  @param weightInt AILink protocol integer returned by Bluetooth
  @param unit kg / lb / st: lb / jin
  @param point 1,2
  @return The weight displayed on the interface, such as 5: 6.5 st: lb
将蓝牙返回的整数,转换为界面显示所需要的字符串,显示单位为当前用户单位
// weightInt AILink协议蓝牙返回的整数
// unit kg/lb/st:lb/jin
// point 1,2
// 界面显示的体重,如 5:6.5 st:lb
*/
+ (NSString *)getWeightShowStrWithTargetUnit:(ELDeviceWeightUnit)targetUnit bleWeightInt:(NSUInteger)weightInt bleWeightUnit:(ELDeviceWeightUnit)unit bleWeightPoint:(NSUInteger)point;

+ (NSString *)getHeightShowStrWithTargetUnit:(ELDeviceHeightUnit)targetUnit origHeightShow:(NSString *)origHeightShow origHeightUnit:(ELDeviceHeightUnit)origHeightUnit origHeightPoint:(NSUInteger)origHeightPoint;


/**
Display data returned from the server or converted from the original Bluetooth data: such as 5: 6.5, 56.2, etc., converted to kg for drawing or conversion
  @param weightShow The data read directly from the database, or the AILink protocol Bluetooth returns to the interface 68.56 (kg) 120.6 (lb)
  @param unit kg / lb / st: lb / jin
  @param point 1,2
  @return is converted to the value of kg (the number of kg used for drawing or conversion, rounded to 2 decimal places)
将服务器返回或者蓝牙原始数据转换来的显示数据:如5:6.5、56.2等数据转换为kg,用来画图或者换算
// weightShow 从数据库中直接读出来的,或者AILink协议蓝牙返给界面的数据 68.56(kg) 120.6(lb)
// unit kg/lb/st:lb/jin
// point 1,2
// 转换为kg的值(用于绘图或换算的kg数,一律四舍五入保留2位小数)
*/
+ (NSString *)getKgWithWeightShowStr:(NSString *)weightShow weightUnit:(ELDeviceWeightUnit)unit weightPoint:(NSUInteger)point;

+ (NSString *)getCmWithHeightShowStr:(NSString *)heightShow heightUnit:(ELDeviceHeightUnit)unit heightPoint:(NSUInteger)point;


@end


+ 55
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELWheelMonitorBleHeader.h View File

@@ -0,0 +1,55 @@
//
// ELWheelMonitorBleHeader.h
// Elink
//
// Created by iot_user on 2019/7/4.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#ifndef ELWheelMonitorBleHeader_h
#define ELWheelMonitorBleHeader_h

#import "ELSDKHeader.h"

typedef NS_ENUM(NSUInteger, WheelMonitorBleDataType) {
WheelMonitorBleDataTypeMCUSend = 0x01, //MCU upload tire pressure status(MCU 上传胎压状态)
WheelMonitorBleDataTypeMCUReceive = 0x02, //MCU returns to tire pressure(MCU 返回胎压状态)
WheelMonitorBleDataTypeSetUnit = 0x81, //App release unit settings(app 下发单位设置)
WheelMonitorBleDataTypeSetUnitResult = 0x82, //MCU reply unit setting result(MCU 回复单位设置结果)
WheelMonitorBleDataTypeSetPressureLimit = 0x84, //MCU reverts to setting the tire pressure threshold(MCU 回复设置胎压阀值)
WheelMonitorBleDataTypeSetTempLimit = 0x86, //MCU reply setting temperature threshold and alarm value(MCU 回复设置温度阀值、报警值)
WheelMonitorBleDataTypeSetVoice = 0x88 , //MCU reply to set alarm prompt(MCU 回复设置报警提示)
};
typedef NS_ENUM(NSUInteger, WheelMonitorWheelType) {
WheelMonitorWheelTypeLeftFront = 1, //左前轮
WheelMonitorWheelTypeRightFront = 2, //右前轮
WheelMonitorWheelTypeLeftBack = 3, //左后轮
WheelMonitorWheelTypeRightBack = 4, //右后轮
};

typedef NS_ENUM(NSInteger, WheelMonitorDeviceState) {
WheelMonitorDeviceStateNormal = 0x00, //Normal(正常)
WheelMonitorDeviceStateAirLeakage = 0x01, //Air Leakage (漏气)
WheelMonitorDeviceStateInflatable = 0x02, //Inflatable(充气)
WheelMonitorDeviceStateStart = 0x03, //Start(启动)
WheelMonitorDeviceStatePowerOn = 0x04, //Power On(上电)
WheelMonitorDeviceStateWakeUp = 0x05, //Wake Up(唤醒)
WheelMonitorDeviceStateLost = 0x06, //Lost(丢失)
};

typedef NS_ENUM(NSUInteger, WheelMonitorGetWheelData) {
WheelMonitorGetWheelData_All = 0x00, //全部数据
WheelMonitorGetWheelData_LeftFront = 0x01, //左前轮数据
WheelMonitorGetWheelData_RightFront = 0x02, //右前轮数据
WheelMonitorGetWheelData_LeftBack = 0x03, //左后轮
WheelMonitorGetWheelData_RightBack = 0x04, //右后轮
};
//Get whether the front and rear wheel parameters are set uniformly(获取前后轮参数是否统一设置)
typedef NS_ENUM(NSUInteger, WheelMonitorSettingType) {
WheelMonitorSettingType_Together = 1, //Set together(一起设置)
WheelMonitorSettingType_Separate = 2, //Set separately(分开设定)
};


#endif /* ELWheelMonitorBleHeader_h */

+ 116
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELWheelMonitorBleManager.h View File

@@ -0,0 +1,116 @@
//
// ELWheelMonitorBleManager.h
// Elink
//
// Created by iot_user on 2019/7/3.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import "ELBluetoothManager.h"
#import "ELWheelMonitorBleHeader.h"
#import "ELWheelMonitorBleModel.h"

@protocol WheelMonitorBleManagerDelegate <NSObject>

@optional

/**
Callback Bluetooth status(回调蓝牙状态)
@param state 蓝牙状态
*/
-(void)wheelMonitorBleManagerUpdateBleState:(ELBluetoothState)state;

/**
Callback scanned device(回调扫描到的设备)
@param devices 设备
*/
-(void)wheelMonitorBleManagerScanDevices:(NSArray<ELPeripheralModel *> *_Nullable)devices;

/**
Set unit callback(设置单位回调)
@param type 结果
@param settingType 支持类型:
WheelMonitorBleDataTypeSetUnitResult
WheelMonitorBleDataTypeSetPressureLimit
WheelMonitorBleDataTypeSetTempLimit
WheelMonitorBleDataTypeSetVoice
*/
-(void)wheelMonitorBleManagerReceiveSetResult:(ELSetBluetoothResponseType)type settingType:(WheelMonitorBleDataType)settingType;

/**
Callback tire pressure data(回调胎压数据)

@param model 胎压数据模型
*/
-(void)wheelMonitorBleManagerWheelMonitorData:(ELWheelMonitorBleModel *_Nonnull)model;


/**
Get front and rear wheel parameter setting type(获取前后轮参数设置类型)

@param type 类型
*/
-(void)wheelMonitorBleManagerReceiveSettingType:(WheelMonitorSettingType)type;

@end


NS_ASSUME_NONNULL_BEGIN

@interface ELWheelMonitorBleManager : ELBluetoothManager

@property (nonatomic, weak) id<WheelMonitorBleManagerDelegate> wheelMonitordelegate;


+(instancetype)shareManager;

/**
Set unit(设置单位)

@param pressureUnit 压力单位
@param tempUnit 温度单位
*/
-(void)changePressureUnit:(ELDevicePressureUnit)pressureUnit tempUnit:(ELDeviceTemperatureUnit)tempUnit;

/**
Read tire pressure information(读取胎压信息)

@param type 轮胎
*/
-(void)getWheelData:(WheelMonitorGetWheelData)type;

/**
Set tire pressure threshold(设置胎压阀值)

@param frontMax 前轮上限阀值
@param frontMin 前轮下限阀值
@param backMax 后轮上限阀值
@param backMin 后轮下限阀值
@param unit 单位
@param point 阀值数值小数点
*/
-(void)sendSettingWheelPressureLimitWithFrontMax:(int)frontMax frontMin:(int)frontMin backMax:(int)backMax backMin:(int)backMin pressureUnit:(ELDevicePressureUnit)unit valuePoint:(int)point;

/**
Set temperature threshold and alarm value(设置温度阀值、报警值)

@param tempMax 温度上限阀值
@param tempMin 温度下限阀值(目前用不到,值为 0000)
@param unit 温度值单位
@param point 阀值数值小数点
@param open 语音报警:YES:打开,NO:关闭
*/
-(void)sendSettingWheelTempLimitWithTempMax:(int16_t)tempMax tempMin:(int16_t)tempMin tempUnit:(ELDeviceTemperatureUnit)unit valuePoint:(int)point openVoice:(BOOL)open;

/**
Set alarm prompt(设置报警提示)

@param open Voice alarm: YES: on, NO: off(语音报警:YES:打开,NO:关闭)
*/
-(void)sendSettingWheelOpenVoice:(BOOL)open;
@end

NS_ASSUME_NONNULL_END

+ 42
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/Headers/ELWheelMonitorBleModel.h View File

@@ -0,0 +1,42 @@
//
// ELWheelMonitorBleModel.h
// Elink
//
// Created by iot_user on 2019/7/3.
// Copyright © 2019 iot_iMac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ELWheelMonitorBleHeader.h"

NS_ASSUME_NONNULL_BEGIN

@interface ELWheelMonitorBleModel : NSObject

@property (nonatomic, assign) WheelMonitorWheelType wheelType;//Tire number, 1: front left wheel 2: front right wheel 3: rear left wheel 4: rear right wheel(轮胎编号,1:左前轮 2:右前轮 3:左后轮 4:右后轮)

@property (nonatomic, copy) NSString *v;//Actual voltage (unit: V)(实际电压(单位:V))

@property (nonatomic, copy) NSString *p;//pressure(压力)

@property (nonatomic, assign) ELDevicePressureUnit pressureUnit;

@property (nonatomic, copy) NSString *t;//temperature(温度)

@property (nonatomic, assign) ELDeviceTemperatureUnit tempUnit;//

@property (nonatomic, assign) WheelMonitorDeviceState state;//状态

@property (nonatomic, assign) NSInteger createTime;


/**
Analyze tire pressure data(解析胎压数据)

@param playload playload
@return 数据模型
*/
+(ELWheelMonitorBleModel *)analysisWheelMonitorData:(NSData *)playload;
@end

NS_ASSUME_NONNULL_END

BIN
AILinkBleSDKDemo/AILinkBleSDK.framework/Info.plist View File


BIN
AILinkBleSDKDemo/AILinkBleSDK.framework/_CodeSignature/CodeDirectory View File


BIN
AILinkBleSDKDemo/AILinkBleSDK.framework/_CodeSignature/CodeRequirements View File


BIN
AILinkBleSDKDemo/AILinkBleSDK.framework/_CodeSignature/CodeRequirements-1 View File


+ 612
- 0
AILinkBleSDKDemo/AILinkBleSDK.framework/_CodeSignature/CodeResources View File

@@ -0,0 +1,612 @@
<?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>Headers/ELBabyScaleBleHeader.h</key>
<data>
g7G6A8WA/vvsdi0F844f28aSSXo=
</data>
<key>Headers/ELBabyScaleBleHeightModel.h</key>
<data>
eoRBRUYRuUN6TPaU0r6KkdNgJyE=
</data>
<key>Headers/ELBabyScaleBleManager.h</key>
<data>
J6c1MDjvS95sK0HOdRSWo8VYj+o=
</data>
<key>Headers/ELBabyScaleBleWeightModel.h</key>
<data>
+XHoAFklse3pcB92l6nle0vbk+o=
</data>
<key>Headers/ELBabyScaleDeviceModel.h</key>
<data>
OvZQw4fYrptuR1uSrpNxOlSyms0=
</data>
<key>Headers/ELBlePublicTool.h</key>
<data>
JUlukzH3vjpTzoXduB2VQIAyTJI=
</data>
<key>Headers/ELBleWifiDetailModel.h</key>
<data>
tamPhBn4G67QTURIBneQDHggOaY=
</data>
<key>Headers/ELBloodBleDataModel.h</key>
<data>
DpRqeBN9ZsF9qYH3I3sP2RuP2WQ=
</data>
<key>Headers/ELBloodBleManager.h</key>
<data>
DqRpRvzW1aR+Uhl0Bir4WcjwG9Y=
</data>
<key>Headers/ELBloodBleSDKHeader.h</key>
<data>
N2ScrY3zUXS4vLeY/b3xtcPA5J8=
</data>
<key>Headers/ELBluetoothManager.h</key>
<data>
q3LVBfQJJqGw0AR8h6q3nC+Nlgw=
</data>
<key>Headers/ELBodyFatScaleBleHeader.h</key>
<data>
0b9mGDuee7WiIQE4CW0ADfbEL1s=
</data>
<key>Headers/ELBodyFatScaleBleManager.h</key>
<data>
k+OxOANxEznDe5jW76CiJ9hdU7k=
</data>
<key>Headers/ELBodyFatScaleBleUserModel.h</key>
<data>
MBQ6uNFIQp9eH5QYseXEn9u8XSs=
</data>
<key>Headers/ELBodyFatScaleBleWeightModel.h</key>
<data>
ACYbuCI3GXFXuNHirYhKf1nx9Jk=
</data>
<key>Headers/ELBodyFatScaleDeviceModel.h</key>
<data>
wzOhRUInZ0tuoj3LHMmJV1XejoY=
</data>
<key>Headers/ELForeHeadBleManager.h</key>
<data>
PGM6FQ7DALcjdFVRIe5TI/8HAjM=
</data>
<key>Headers/ELForeheadBleDataModel.h</key>
<data>
5pOOuuEZPUiCO8mC+8RieX0ZktE=
</data>
<key>Headers/ELForeheadHeader.h</key>
<data>
3LS8MObWrVCjLnaKWwoUKBaqc34=
</data>
<key>Headers/ELHeightGaugeBleDataModel.h</key>
<data>
B+jv5YT79HhyGg7UL0jGn0SAvdg=
</data>
<key>Headers/ELHeightGaugeBleManager.h</key>
<data>
fI+CN9ThacjPbLrkT67I1KEp7do=
</data>
<key>Headers/ELHeightGaugeHeader.h</key>
<data>
ame1lW5x3LyjrTa2tD/aBjA8Cfw=
</data>
<key>Headers/ELPeripheralModel.h</key>
<data>
ibVmqneQ5mPsyjCTT8qkT1PXy9w=
</data>
<key>Headers/ELRemoteControlBleHeader.h</key>
<data>
aiNkkJtSvIT1yQxcICSDLRbP4j0=
</data>
<key>Headers/ELRemoteControlBleManager.h</key>
<data>
zuhb0JmsWk+ScnpB7P4E34IU1r8=
</data>
<key>Headers/ELRemoteControlDeviceModel.h</key>
<data>
ckFgMSGZyOJnzl2Kxs0FPR96pn4=
</data>
<key>Headers/ELSDKHeader.h</key>
<data>
iRAPDeauG3rYOdp0JoDPzK6Ozhc=
</data>
<key>Headers/ELThermometerBleManager.h</key>
<data>
/o/ZHXV/7Avopz38NRDtUATN7Ak=
</data>
<key>Headers/ELThermometerBleModel.h</key>
<data>
gfcdH3dOdDIjBaU0lbhAsuqSDQU=
</data>
<key>Headers/ELThermometerDeviceModel.h</key>
<data>
Oa8GTYS1hEhJk+BQL1IiR2T3eSw=
</data>
<key>Headers/ELUnitConvertTool.h</key>
<data>
KUvTJzAj6UgO0TVIag6jroPEZ9g=
</data>
<key>Headers/ELWheelMonitorBleHeader.h</key>
<data>
IKCvB9SN0bht+QzbqywX+LIO45A=
</data>
<key>Headers/ELWheelMonitorBleManager.h</key>
<data>
E86BRjWkC4g+n/X86i53afpC5pI=
</data>
<key>Headers/ELWheelMonitorBleModel.h</key>
<data>
33QcqrJFFbKEYqLTPl0GvIq3/4c=
</data>
<key>Info.plist</key>
<data>
7GRWEyAnXxjLbVEdHfMEXqK3VO0=
</data>
</dict>
<key>files2</key>
<dict>
<key>Headers/ELBabyScaleBleHeader.h</key>
<dict>
<key>hash</key>
<data>
g7G6A8WA/vvsdi0F844f28aSSXo=
</data>
<key>hash2</key>
<data>
JzZihsx0frCLjAQHwuezNCUYdFlgQNvs37cFhVnZ9Cc=
</data>
</dict>
<key>Headers/ELBabyScaleBleHeightModel.h</key>
<dict>
<key>hash</key>
<data>
eoRBRUYRuUN6TPaU0r6KkdNgJyE=
</data>
<key>hash2</key>
<data>
h1sk9fTlb1WTfx/adOgj+Kcg1QnSAqrw9CZ29x9+RsM=
</data>
</dict>
<key>Headers/ELBabyScaleBleManager.h</key>
<dict>
<key>hash</key>
<data>
J6c1MDjvS95sK0HOdRSWo8VYj+o=
</data>
<key>hash2</key>
<data>
pIQTGSmxrY0vKeLBz0vZVwVYeaNsnSU7i44UhErmGl8=
</data>
</dict>
<key>Headers/ELBabyScaleBleWeightModel.h</key>
<dict>
<key>hash</key>
<data>
+XHoAFklse3pcB92l6nle0vbk+o=
</data>
<key>hash2</key>
<data>
ucVO/T2eZbfDm4CKfRNz7UmOXc+sZ/iPVapGZr1dzbo=
</data>
</dict>
<key>Headers/ELBabyScaleDeviceModel.h</key>
<dict>
<key>hash</key>
<data>
OvZQw4fYrptuR1uSrpNxOlSyms0=
</data>
<key>hash2</key>
<data>
w2jBr/fZ98z7Umjq/fr4QA1RAJ0FD5EB/QzCdF/BQjo=
</data>
</dict>
<key>Headers/ELBlePublicTool.h</key>
<dict>
<key>hash</key>
<data>
JUlukzH3vjpTzoXduB2VQIAyTJI=
</data>
<key>hash2</key>
<data>
NsQTTlAs1Jf6T3Yh6zBZU/sBAwDX974Cc23kkrvwHxo=
</data>
</dict>
<key>Headers/ELBleWifiDetailModel.h</key>
<dict>
<key>hash</key>
<data>
tamPhBn4G67QTURIBneQDHggOaY=
</data>
<key>hash2</key>
<data>
xfyapBE5STjDisWWQRyG7EFZXeM/zEUkTcuKbCZztug=
</data>
</dict>
<key>Headers/ELBloodBleDataModel.h</key>
<dict>
<key>hash</key>
<data>
DpRqeBN9ZsF9qYH3I3sP2RuP2WQ=
</data>
<key>hash2</key>
<data>
MQxwbR+wSqYSadxV6Wy7ODXlaFYZDwSs8J15eSLT3BI=
</data>
</dict>
<key>Headers/ELBloodBleManager.h</key>
<dict>
<key>hash</key>
<data>
DqRpRvzW1aR+Uhl0Bir4WcjwG9Y=
</data>
<key>hash2</key>
<data>
gEVr8x9+ssQPT/NdA0zVhw1jHhbYbAy2sSxZ9Rus02I=
</data>
</dict>
<key>Headers/ELBloodBleSDKHeader.h</key>
<dict>
<key>hash</key>
<data>
N2ScrY3zUXS4vLeY/b3xtcPA5J8=
</data>
<key>hash2</key>
<data>
DJIEwcPb2L+C8PWkXoK8ChDmrREy1z4j+KIPlU/Pxv8=
</data>
</dict>
<key>Headers/ELBluetoothManager.h</key>
<dict>
<key>hash</key>
<data>
q3LVBfQJJqGw0AR8h6q3nC+Nlgw=
</data>
<key>hash2</key>
<data>
5VoTwBUB4Lq2im9bqd73754D6HCo53vW6XoX6EioHXw=
</data>
</dict>
<key>Headers/ELBodyFatScaleBleHeader.h</key>
<dict>
<key>hash</key>
<data>
0b9mGDuee7WiIQE4CW0ADfbEL1s=
</data>
<key>hash2</key>
<data>
2py6JfIiYKS46qwDo7/27T0rqmu7YbHa+fqUBdvhth0=
</data>
</dict>
<key>Headers/ELBodyFatScaleBleManager.h</key>
<dict>
<key>hash</key>
<data>
k+OxOANxEznDe5jW76CiJ9hdU7k=
</data>
<key>hash2</key>
<data>
v1HPAh30uLZy9KqJxyWSvifOrjCBTDPNRYKsM/kDPw4=
</data>
</dict>
<key>Headers/ELBodyFatScaleBleUserModel.h</key>
<dict>
<key>hash</key>
<data>
MBQ6uNFIQp9eH5QYseXEn9u8XSs=
</data>
<key>hash2</key>
<data>
EhqjKgLFWoipLPU+hDqAOmsB8L3eapoVCS+dq4P+f8g=
</data>
</dict>
<key>Headers/ELBodyFatScaleBleWeightModel.h</key>
<dict>
<key>hash</key>
<data>
ACYbuCI3GXFXuNHirYhKf1nx9Jk=
</data>
<key>hash2</key>
<data>
MJq+xb+X8LJ7f1ynJoK0wMQHkQ845EDay2JyAHuMN/E=
</data>
</dict>
<key>Headers/ELBodyFatScaleDeviceModel.h</key>
<dict>
<key>hash</key>
<data>
wzOhRUInZ0tuoj3LHMmJV1XejoY=
</data>
<key>hash2</key>
<data>
ZP6cxgBFbWaQx/NIDxVVSWHwIu4JcVyIgQFhDh/6WO0=
</data>
</dict>
<key>Headers/ELForeHeadBleManager.h</key>
<dict>
<key>hash</key>
<data>
PGM6FQ7DALcjdFVRIe5TI/8HAjM=
</data>
<key>hash2</key>
<data>
fPQqdIxqDufGCTCTrgQ+ZUZAPxIvk7sTuvSgH+3A2CQ=
</data>
</dict>
<key>Headers/ELForeheadBleDataModel.h</key>
<dict>
<key>hash</key>
<data>
5pOOuuEZPUiCO8mC+8RieX0ZktE=
</data>
<key>hash2</key>
<data>
OT0VXqsUYZUY7X+MRujUaoJEDRFRUoaeIOwn2ZeVlpU=
</data>
</dict>
<key>Headers/ELForeheadHeader.h</key>
<dict>
<key>hash</key>
<data>
3LS8MObWrVCjLnaKWwoUKBaqc34=
</data>
<key>hash2</key>
<data>
S4+2M5mPrWRGaOZPU2ZBnh0I3EC8Xsw160okYl9SdKU=
</data>
</dict>
<key>Headers/ELHeightGaugeBleDataModel.h</key>
<dict>
<key>hash</key>
<data>
B+jv5YT79HhyGg7UL0jGn0SAvdg=
</data>
<key>hash2</key>
<data>
LTE74gs3V3TrNvclF3YfurebOuZ/6SGGdbunw0bZKxk=
</data>
</dict>
<key>Headers/ELHeightGaugeBleManager.h</key>
<dict>
<key>hash</key>
<data>
fI+CN9ThacjPbLrkT67I1KEp7do=
</data>
<key>hash2</key>
<data>
DC+5AXDTzQwo3qk4gZsG2XUZGcnJEbh5+uGEqYMEFk8=
</data>
</dict>
<key>Headers/ELHeightGaugeHeader.h</key>
<dict>
<key>hash</key>
<data>
ame1lW5x3LyjrTa2tD/aBjA8Cfw=
</data>
<key>hash2</key>
<data>
cGlFpjbfDm88HxwGHZsIk5PD17XWUnkyEUNeaM8BALk=
</data>
</dict>
<key>Headers/ELPeripheralModel.h</key>
<dict>
<key>hash</key>
<data>
ibVmqneQ5mPsyjCTT8qkT1PXy9w=
</data>
<key>hash2</key>
<data>
1kPE7LNXG51xcfDIuG0pi0iM5tWGqj3rUPDJhLoyaBg=
</data>
</dict>
<key>Headers/ELRemoteControlBleHeader.h</key>
<dict>
<key>hash</key>
<data>
aiNkkJtSvIT1yQxcICSDLRbP4j0=
</data>
<key>hash2</key>
<data>
kHJsJM71CmIbvMKh6ltED65HzWa0OFUsgV/xHpnKWLE=
</data>
</dict>
<key>Headers/ELRemoteControlBleManager.h</key>
<dict>
<key>hash</key>
<data>
zuhb0JmsWk+ScnpB7P4E34IU1r8=
</data>
<key>hash2</key>
<data>
Eh9arZbJEreN/PCu301E65iPDLM3c0/Bi1maaCc41b0=
</data>
</dict>
<key>Headers/ELRemoteControlDeviceModel.h</key>
<dict>
<key>hash</key>
<data>
ckFgMSGZyOJnzl2Kxs0FPR96pn4=
</data>
<key>hash2</key>
<data>
L/ievm90HlYaSADq8DO3GkT7wk9nFYrQKcHf0Xq+X9g=
</data>
</dict>
<key>Headers/ELSDKHeader.h</key>
<dict>
<key>hash</key>
<data>
iRAPDeauG3rYOdp0JoDPzK6Ozhc=
</data>
<key>hash2</key>
<data>
uUXMgU5uOmIE0Ng8ZTZiiam+Cy5TOvMxThDSAhOmRoY=
</data>
</dict>
<key>Headers/ELThermometerBleManager.h</key>
<dict>
<key>hash</key>
<data>
/o/ZHXV/7Avopz38NRDtUATN7Ak=
</data>
<key>hash2</key>
<data>
hwwcRlEBfaVTWb8fTirt6y+tSfC0ZBEe/6sqDTu0Nx4=
</data>
</dict>
<key>Headers/ELThermometerBleModel.h</key>
<dict>
<key>hash</key>
<data>
gfcdH3dOdDIjBaU0lbhAsuqSDQU=
</data>
<key>hash2</key>
<data>
ay1fe+kwQGlcxg6zWWv0Z9h+hZdIiWcqkXaWmfHUfKQ=
</data>
</dict>
<key>Headers/ELThermometerDeviceModel.h</key>
<dict>
<key>hash</key>
<data>
Oa8GTYS1hEhJk+BQL1IiR2T3eSw=
</data>
<key>hash2</key>
<data>
gSjca3FLXifg5U5v47xNQpOf4dgQ0ib6CwitQPp1Hbs=
</data>
</dict>
<key>Headers/ELUnitConvertTool.h</key>
<dict>
<key>hash</key>
<data>
KUvTJzAj6UgO0TVIag6jroPEZ9g=
</data>
<key>hash2</key>
<data>
m9kGIMT+Hyb5vxlcF8hsbi4cmg8IWW0u1d690GOSIqA=
</data>
</dict>
<key>Headers/ELWheelMonitorBleHeader.h</key>
<dict>
<key>hash</key>
<data>
IKCvB9SN0bht+QzbqywX+LIO45A=
</data>
<key>hash2</key>
<data>
qQ9uS8FPSSjcilXKMf/6E1rO+WYq8/TkezeJGdGarWk=
</data>
</dict>
<key>Headers/ELWheelMonitorBleManager.h</key>
<dict>
<key>hash</key>
<data>
E86BRjWkC4g+n/X86i53afpC5pI=
</data>
<key>hash2</key>
<data>
XeP8EN2/J69v1/z0O1P8dd2R+DM/sP4lz2ALZhKwB0Y=
</data>
</dict>
<key>Headers/ELWheelMonitorBleModel.h</key>
<dict>
<key>hash</key>
<data>
33QcqrJFFbKEYqLTPl0GvIq3/4c=
</data>
<key>hash2</key>
<data>
3x0+7c3+zhAdZCb2nagaiXYx5O2P124ki7PJrSqjxUI=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^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>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<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>^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>

BIN
AILinkBleSDKDemo/AILinkBleSDK.framework/_CodeSignature/CodeSignature View File


+ 17
- 0
AILinkBleSDKDemo/AiLinkSuper/AiLinkSuperViewController.h View File

@@ -0,0 +1,17 @@
//
// AiLinkSuperViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface AiLinkSuperViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

+ 96
- 0
AILinkBleSDKDemo/AiLinkSuper/AiLinkSuperViewController.m View File

@@ -0,0 +1,96 @@
//
// AiLinkSuperViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import "AiLinkSuperViewController.h"
#import <AILinkBleSDK/ELBluetoothManager.h>
#import "Masonry.h"
#import "AilinkSuperConnectViewController.h"

@interface AiLinkSuperViewController ()<UITableViewDelegate,UITableViewDataSource,ELBluetoothManagerDelegate>
@property (nonatomic, strong) UITableView *tableView;

@property (nonatomic, strong) NSArray<ELPeripheralModel *> *devices;


@end

@implementation AiLinkSuperViewController
//-(NSMutableArray *)devices{
// if (_devices == nil) {
// _devices = [[NSMutableArray alloc] init];
// }
// return _devices;
//}
- (void)viewDidLoad {
[super viewDidLoad];
// self.title = @"Devices";
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.bottom.mas_equalTo(0);
}];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[ELBluetoothManager shareManager] startScan];
[ELBluetoothManager shareManager].delegate = self;
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[[ELBluetoothManager shareManager] stopScan];
}
#pragma mark ============ ELBluetoothManagerDelegate ==============
-(void)bluetoothManagerUpdateBleState:(ELBluetoothState)state{
NSLog(@"bluetoothManagerUpdateBleState = %ld",state);
}

-(void)bluetoothManagerScanedPeripherals:(NSArray<ELPeripheralModel *> *)peripherals{
self.devices = peripherals;
[self.tableView reloadData];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.devices.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellId = @"cellid";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
ELPeripheralModel *p = self.devices[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"Name:%@---Mac:%@\nCID:%ld---VID:%ld---PID:%ld",p.deviceName,p.macAddress,p.deviceType,p.vendorID,p.productID];
cell.textLabel.numberOfLines = 2;
cell.textLabel.textColor = [UIColor blackColor];
return cell;

}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
ELPeripheralModel *p = self.devices[indexPath.row];
AilinkSuperConnectViewController *vc = [[AilinkSuperConnectViewController alloc] init];
vc.p = p;
[self.navigationController pushViewController:vc animated:YES];
}
-(UITableView *)tableView{
if (_tableView == nil) {
_tableView = [[UITableView alloc] init];
_tableView.delegate = self;
_tableView.dataSource = self;
}
return _tableView;
}

@end

+ 19
- 0
AILinkBleSDKDemo/AiLinkSuper/AilinkSuperConnectViewController.h View File

@@ -0,0 +1,19 @@
//
// AilinkSuperConnectViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>

@class ELPeripheralModel;
NS_ASSUME_NONNULL_BEGIN

@interface AilinkSuperConnectViewController : UIViewController
@property (nonatomic, strong) ELPeripheralModel *p;

@end

NS_ASSUME_NONNULL_END

+ 236
- 0
AILinkBleSDKDemo/AiLinkSuper/AilinkSuperConnectViewController.m View File

@@ -0,0 +1,236 @@
//
// AilinkSuperConnectViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import "AilinkSuperConnectViewController.h"
#import <AILinkBleSDK/ELBluetoothManager.h>
#import "Masonry.h"

@interface AilinkSuperConnectViewController ()<ELBluetoothManagerDelegate>
@property (nonatomic, strong) UITextView *textView;

@end

@implementation AilinkSuperConnectViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[ELBluetoothManager shareManager].delegate = self;
[[ELBluetoothManager shareManager] connectPeripheral:self.p];
[self setupUIView];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[ELBluetoothManager shareManager] disconnectPeripheral];
}
-(void)addLog:(NSString *)log{
self.textView.text = [NSString stringWithFormat:@"%@\n%@",log,self.textView.text];
}
-(void)buttonAction:(UIButton *)sender{
if ([ELBluetoothManager shareManager].state != ELBluetoothStateDidValidationPass) {
[self addLog:@"Disconnected"];
return;
}
[self addLog:sender.titleLabel.text];
NSInteger tag = sender.tag;
if (tag == 1) {
//getBluetoothInfoWithELInetGetCmdType是获取设备信息的方法
[[ELBluetoothManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetBMVersion)];
}else if (tag == 2){
[[ELBluetoothManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetC_V_P_ID)];
}else if (tag == 3){
[[ELBluetoothManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetName)];
}else if (tag == 4){
[[ELBluetoothManager shareManager] setBluetoothName:@"AILink"];
}else if (tag == 5){
//MARK:发送透传数据
Byte b[5] = {0x0A,0x00,0x01,0x02,0xA0};
NSData *data = [[NSData alloc] initWithBytes:b length:5];
[self addLog:data.description];
[[ELBluetoothManager shareManager] sendData:data];
}

}
-(void)setupUIView{
UIButton *button1 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button1 setTitle:@"Get BM Version" forState:(UIControlStateNormal)];
button1.tag = 1;
button1.titleLabel.adjustsFontSizeToFitWidth = YES;
button1.titleLabel.numberOfLines = 2;
button1.backgroundColor = [UIColor blackColor];
[button1 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button1];
[button1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button2 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button2 setTitle:@"Get C V P ID" forState:(UIControlStateNormal)];
button2.tag = 2;
button2.titleLabel.adjustsFontSizeToFitWidth = YES;
button2.titleLabel.numberOfLines = 2;
button2.backgroundColor = [UIColor blackColor];
[button2 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button2];
[button2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button1.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button3 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button3 setTitle:@"Get Name" forState:(UIControlStateNormal)];
button3.tag = 3;
button3.titleLabel.adjustsFontSizeToFitWidth = YES;
button3.titleLabel.numberOfLines = 2;
button3.backgroundColor = [UIColor blackColor];
[button3 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button3];
[button3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button2.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button4 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button4 setTitle:@"Set Name" forState:(UIControlStateNormal)];
button4.tag = 4;
button4.titleLabel.adjustsFontSizeToFitWidth = YES;
button4.titleLabel.numberOfLines = 2;
button4.backgroundColor = [UIColor blackColor];
[button4 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button4];
[button4 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button5 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button5 setTitle:@"Send Data" forState:(UIControlStateNormal)];
button5.tag = 5;
button5.titleLabel.adjustsFontSizeToFitWidth = YES;
button5.titleLabel.numberOfLines = 2;
button5.backgroundColor = [UIColor blackColor];
[button5 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button5];
[button5 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button4.mas_right).mas_offset(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
self.textView = [[UITextView alloc] init];
self.textView.backgroundColor = [UIColor blackColor];
self.textView.text = @"Log";
self.textView.textColor = [UIColor redColor];
[self.view addSubview:self.textView];
[self.textView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.right.bottom.mas_equalTo(-10);
make.height.mas_equalTo(200);
}];
}

-(void)bluetoothManagerReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result{
if (type == ELInetSetCmdTypeSetName) {
if (result == ELSetBluetoothResponseTypeSuccess) {
[self addLog:@"Set name Success "];
}else if (result == ELSetBluetoothResponseTypeFailure){
[self addLog:@"Set name failure "];
}else if (result == ELSetBluetoothResponseTypeNoSupport){
[self addLog:@"Set name unsupport "];
}

}

}
-(void)bluetoothManagerReceiceName:(NSString *)name{
[self addLog:name];
}
-(void)bluetoothManagerReceiveDID:(struct ELDIDStruct)did{
[self addLog:[NSString stringWithFormat:@"CID = %d,VID = %d,PID = %d",did.deviceType,did.vendorID,did.productID]];
}

-(void)bluetoothManagerReceiveBMVersion:(NSString *)bmVersion{
[self addLog:bmVersion];
}
//MARK:接收透传数据(不符合AILink协议的数据,需要做透传的客户可在此根据自己的协议解析数据,透传数据不可以"A6"或"A7"开头)
-(void)bluetoothManagerReceivePassData:(NSData *)data{
NSLog(@"bluetoothManagerReceivePassData = %@",data.description);
[self addLog:[NSString stringWithFormat:@"Penetrate:%@",data.description]];
}

//MARK:获取设备支持的单位
-(void)bluetoothManagerBackDeviceSupportUnitWithWeight:(NSArray<NSNumber *> *)weightArray Height:(NSArray<NSNumber *> *)heightArray Temperature:(NSArray<NSNumber *> *)temperatureArray BloodPressure:(NSArray<NSNumber *> *)bloodPressureArray Pressure:(NSArray<NSNumber *> *)pressureArray{
//这里要压力和温度单位
//设置单位时,要设置设备支持的单位
}

-(void)bluetoothManagerUpdateBleState:(ELBluetoothState)state{
switch (state) {
case ELBluetoothStateUnavailable:
{
self.title = @"Please open the bluetooth";
}
break;
case ELBluetoothStateAvailable:
{
self.title = @"Bluetooth is open";
}
break;
case ELBluetoothStateScaning:
{
self.title = @"Scaning";
}
break;
case ELBluetoothStateConnectFail:
{
self.title = @"Connect fail";
}
break;
case ELBluetoothStateDidDisconnect:
{
self.title = @"Disconnected";
}
break;
case ELBluetoothStateDidValidationPass:
{
self.title = @"Connected";
[[ELBluetoothManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeReadDeviceSupportUnit)];
}
break;
case ELBluetoothStateFailedValidation:
{
self.title = @"Illegal equipment";
}
break;
case ELBluetoothStateWillConnect:
self.title = @"Connecting";
break;
default:
break;
}
}
-(void)dealloc{
}

@end

+ 15
- 0
AILinkBleSDKDemo/AppDelegate.h View File

@@ -0,0 +1,15 @@
//
// AppDelegate.h
// AILinkBleSDKDemo
//
// Created by iot_user on 2020/4/9.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>


@end


+ 43
- 0
AILinkBleSDKDemo/AppDelegate.m View File

@@ -0,0 +1,43 @@
//
// AppDelegate.m
// AILinkBleSDKDemo
//
// Created by iot_user on 2020/4/9.
// Copyright © 2020 IOT. All rights reserved.
//

#import "AppDelegate.h"
#import <AILinkBleSDK/ELBluetoothManager.h>

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[ELBluetoothManager setAppKey:@"df97ca735924fff0" appSecret:@"00912bb4e6b4a0c1363618b3f8"];
return YES;
}


#pragma mark - UISceneSession lifecycle


- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}


- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}


@end

+ 98
- 0
AILinkBleSDKDemo/Assets.xcassets/AppIcon.appiconset/Contents.json View File

@@ -0,0 +1,98 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

+ 6
- 0
AILinkBleSDKDemo/Assets.xcassets/Contents.json View File

@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

+ 17
- 0
AILinkBleSDKDemo/BabyScale/BabyScaleConnectViewController.h View File

@@ -0,0 +1,17 @@
//
// BabyScaleConnectViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>
@class ELPeripheralModel;
NS_ASSUME_NONNULL_BEGIN

@interface BabyScaleConnectViewController : UIViewController
@property (nonatomic, strong) ELPeripheralModel *p;
@end

NS_ASSUME_NONNULL_END

+ 303
- 0
AILinkBleSDKDemo/BabyScale/BabyScaleConnectViewController.m View File

@@ -0,0 +1,303 @@
//
// BabyScaleConnectViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import "BabyScaleConnectViewController.h"
#import "Masonry.h"
#import <AILinkBleSDK/ELBabyScaleBleManager.h>

@interface BabyScaleConnectViewController ()<ELBluetoothManagerDelegate,BabyScaleBleDelegate>
@property (nonatomic, strong) UITextView *textView;
@end

@implementation BabyScaleConnectViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[ELBabyScaleBleManager shareManager].babyScaleDelegate = self;
[ELBabyScaleBleManager shareManager].delegate =self;
[[ELBabyScaleBleManager shareManager] connectPeripheral:self.p];
[self setupUIView];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[ELBabyScaleBleManager shareManager] disconnectPeripheral];
}
-(void)addLog:(NSString *)log{
self.textView.text = [NSString stringWithFormat:@"%@\n%@",log,self.textView.text];
}
-(void)buttonAction:(UIButton *)sender{
if ([ELBabyScaleBleManager shareManager].state != ELBluetoothStateDidValidationPass) {
[self addLog:@"Disconnected"];
return;
}
[self addLog:sender.titleLabel.text];
NSInteger tag = sender.tag;
if (tag == 1) {
//getBluetoothInfoWithELInetGetCmdType是获取设备信息的方法
[[ELBabyScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetBMVersion)];
}else if (tag == 2){
[[ELBabyScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetC_V_P_ID)];
}else if (tag == 3){
[[ELBabyScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetName)];
}else if (tag == 4){
[[ELBabyScaleBleManager shareManager] setBluetoothName:@"AILink"];
}else if (tag == 5){
[[ELBabyScaleBleManager shareManager] changeHold:YES];
}else if (tag == 6){
[[ELBabyScaleBleManager shareManager] changeHold:NO];
}else if (tag == 7){
[[ELBabyScaleBleManager shareManager] changeHeightUnit:(ELDeviceHeightUnit_CM) AndWeightUnit:(ELDeviceWeightUnit_KG)];
}

}
-(void)setupUIView{
UIButton *button1 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button1 setTitle:@"Get BM Version" forState:(UIControlStateNormal)];
button1.tag = 1;
button1.titleLabel.adjustsFontSizeToFitWidth = YES;
button1.titleLabel.numberOfLines = 2;
button1.backgroundColor = [UIColor blackColor];
[button1 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button1];
[button1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button2 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button2 setTitle:@"Get C V P ID" forState:(UIControlStateNormal)];
button2.tag = 2;
button2.titleLabel.adjustsFontSizeToFitWidth = YES;
button2.titleLabel.numberOfLines = 2;
button2.backgroundColor = [UIColor blackColor];
[button2 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button2];
[button2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button1.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button3 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button3 setTitle:@"Get Name" forState:(UIControlStateNormal)];
button3.tag = 3;
button3.titleLabel.adjustsFontSizeToFitWidth = YES;
button3.titleLabel.numberOfLines = 2;
button3.backgroundColor = [UIColor blackColor];
[button3 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button3];
[button3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button2.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button4 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button4 setTitle:@"Set Name" forState:(UIControlStateNormal)];
button4.tag = 4;
button4.titleLabel.adjustsFontSizeToFitWidth = YES;
button4.titleLabel.numberOfLines = 2;
button4.backgroundColor = [UIColor blackColor];
[button4 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button4];
[button4 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button5 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button5 setTitle:@"Hold" forState:(UIControlStateNormal)];
button5.tag = 5;
button5.titleLabel.adjustsFontSizeToFitWidth = YES;
button5.titleLabel.numberOfLines = 2;
button5.backgroundColor = [UIColor blackColor];
[button5 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button5];
[button5 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button4.mas_right).mas_offset(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
//
UIButton *button6 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button6 setTitle:@"Zero" forState:(UIControlStateNormal)];
button6.tag = 6;
button6.titleLabel.adjustsFontSizeToFitWidth = YES;
button6.titleLabel.numberOfLines = 2;
button6.backgroundColor = [UIColor blackColor];
[button6 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button6];
[button6 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button5.mas_right).mas_offset(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button7 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button7 setTitle:@"Change Unit" forState:(UIControlStateNormal)];
button7.tag = 7;
button7.titleLabel.adjustsFontSizeToFitWidth = YES;
button7.titleLabel.numberOfLines = 2;
button7.backgroundColor = [UIColor blackColor];
[button7 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button7];
[button7 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.equalTo(button4.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
self.textView = [[UITextView alloc] init];
self.textView.backgroundColor = [UIColor blackColor];
self.textView.text = @"Log";
self.textView.textColor = [UIColor redColor];
[self.view addSubview:self.textView];
[self.textView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.right.bottom.mas_equalTo(-10);
make.height.mas_equalTo(200);
}];
}
//错误
-(void)babyScaleBackDeviceErrorCode:(BabyScaleDeviceErrorCode)code{
[self addLog:[NSString stringWithFormat:@"error code = %ld",code]];
}
//体重
-(void)babyScaleManagerReceiveWeightModel:(ELBabyScaleBleWeightModel *)model{
[self addLog:[NSString stringWithFormat:@"weight = %ld unit=%@ point = %ld",model.weight,model.unitStr,model.weightPoint]];
}
//身长数据
-(void)babyScaleManagerHeightModel:(ELBabyScaleBleHeightModel *)model{
[self addLog:[NSString stringWithFormat:@"height = %ld unit=%@ point = %ld",model.height,model.unitStr,model.heightPoint]];
}
-(void)babyScaleBackCtrlType:(NSInteger)type Results:(BabyScaleResultType)result{
// 0去皮,1锁定)
if (type == 0) {
if (result == BabyScaleResultType_Succeed) {
[self addLog:@"Zero Unit success"];
}else if (result == BabyScaleResultType_Failure){
[self addLog:@"Zero Unit failure"];
}else if (result == BabyScaleResultType_Unsupported){
[self addLog:@"Zero Unit unsupported"];
}
}else{
if (result == BabyScaleResultType_Succeed) {
[self addLog:@"Hold Unit success"];
}else if (result == BabyScaleResultType_Failure){
[self addLog:@"Hold Unit failure"];
}else if (result == BabyScaleResultType_Unsupported){
[self addLog:@"Hold Unit unsupported"];
}
}

}
-(void)babyScaleBackSetUnitResults:(BabyScaleResultType)result{
if (result == BabyScaleResultType_Succeed) {
[self addLog:@"Change Unit success"];
}else if (result == BabyScaleResultType_Failure){
[self addLog:@"Change Unit failure"];
}else if (result == BabyScaleResultType_Unsupported){
[self addLog:@"Change Unit unsupported"];
}

}
-(void)bluetoothManagerReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result{
if (type == ELInetSetCmdTypeSetName) {
if (result == ELSetBluetoothResponseTypeSuccess) {
[self addLog:@"Set name Success "];
}else if (result == ELSetBluetoothResponseTypeFailure){
[self addLog:@"Set name failure "];
}else if (result == ELSetBluetoothResponseTypeNoSupport){
[self addLog:@"Set name unsupport "];
}

}

}
-(void)bluetoothManagerReceiceName:(NSString *)name{
[self addLog:name];
}
-(void)bluetoothManagerReceiveDID:(struct ELDIDStruct)did{
[self addLog:[NSString stringWithFormat:@"CID = %d,VID = %d,PID = %d",did.deviceType,did.vendorID,did.productID]];
}

-(void)bluetoothManagerReceiveBMVersion:(NSString *)bmVersion{
[self addLog:bmVersion];
}
//MARK:获取设备支持的单位
-(void)bluetoothManagerBackDeviceSupportUnitWithWeight:(NSArray<NSNumber *> *)weightArray Height:(NSArray<NSNumber *> *)heightArray Temperature:(NSArray<NSNumber *> *)temperatureArray BloodPressure:(NSArray<NSNumber *> *)bloodPressureArray Pressure:(NSArray<NSNumber *> *)pressureArray{
//这里体重和身高单位
//设置单位时,要设置设备支持的单位
}

-(void)babyScaleManagerUpdateState:(ELBluetoothState)state{
switch (state) {
case ELBluetoothStateUnavailable:
{
self.title = @"Please open the bluetooth";
}
break;
case ELBluetoothStateAvailable:
{
self.title = @"Bluetooth is open";
}
break;
case ELBluetoothStateScaning:
{
self.title = @"Scaning";
}
break;
case ELBluetoothStateConnectFail:
{
self.title = @"Connect fail";
}
break;
case ELBluetoothStateDidDisconnect:
{
self.title = @"Disconnected";
}
break;
case ELBluetoothStateDidValidationPass:
{
self.title = @"Connected";
[[ELBabyScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeReadDeviceSupportUnit)];
}
break;
case ELBluetoothStateFailedValidation:
{
self.title = @"Illegal equipment";
}
break;
case ELBluetoothStateWillConnect:
self.title = @"Connecting";
break;
default:
break;
}
}
-(void)dealloc{
}

@end

+ 17
- 0
AILinkBleSDKDemo/BabyScale/BabyScaleViewController.h View File

@@ -0,0 +1,17 @@
//
// BabyScaleViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface BabyScaleViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

+ 89
- 0
AILinkBleSDKDemo/BabyScale/BabyScaleViewController.m View File

@@ -0,0 +1,89 @@
//
// BabyScaleViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import "BabyScaleViewController.h"
#import "Masonry.h"
#import <AILinkBleSDK/ELBabyScaleBleManager.h>
#import "BabyScaleConnectViewController.h"

@interface BabyScaleViewController ()<UITableViewDelegate,UITableViewDataSource,BabyScaleBleDelegate>
@property (nonatomic, strong) UITableView *tableView;

@property (nonatomic, strong) NSArray<ELPeripheralModel *> *devices;

@end

@implementation BabyScaleViewController

- (void)viewDidLoad {
[super viewDidLoad];
// self.title = @"Devices";
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.bottom.mas_equalTo(0);
}];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[ELBabyScaleBleManager shareManager] startScan];
[ELBabyScaleBleManager shareManager].babyScaleDelegate = self;
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[[ELBabyScaleBleManager shareManager] stopScan];
}
#pragma mark ============ ELBluetoothManagerDelegate ==============
-(void)babyScaleManagerUpdateState:(ELBluetoothState)state{
NSLog(@"bluetoothManagerUpdateBleState = %ld",state);
}

-(void)babyScaleManagerScanDevices:(NSArray<ELBabyScaleDeviceModel *> *)babyScaleDevices{
self.devices = babyScaleDevices;
[self.tableView reloadData];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.devices.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellId = @"cellid";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
ELPeripheralModel *p = self.devices[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"Name:%@---Mac:%@\nCID:%ld---VID:%ld---PID:%ld",p.deviceName,p.macAddress,p.deviceType,p.vendorID,p.productID];
cell.textLabel.numberOfLines = 2;
cell.textLabel.textColor = [UIColor blackColor];
return cell;

}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
ELPeripheralModel *p = self.devices[indexPath.row];
BabyScaleConnectViewController *vc = [[BabyScaleConnectViewController alloc] init];
vc.p = p;
[self.navigationController pushViewController:vc animated:YES];
}
-(UITableView *)tableView{
if (_tableView == nil) {
_tableView = [[UITableView alloc] init];
_tableView.delegate = self;
_tableView.dataSource = self;
}
return _tableView;
}

@end

+ 25
- 0
AILinkBleSDKDemo/Base.lproj/LaunchScreen.storyboard View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>

+ 17
- 0
AILinkBleSDKDemo/BloodPressure/BloodConnectViewController.h View File

@@ -0,0 +1,17 @@
//
// BloodConnectViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>
@class ELPeripheralModel;
NS_ASSUME_NONNULL_BEGIN

@interface BloodConnectViewController : UIViewController
@property (nonatomic, strong) ELPeripheralModel *p;
@end

NS_ASSUME_NONNULL_END

+ 312
- 0
AILinkBleSDKDemo/BloodPressure/BloodConnectViewController.m View File

@@ -0,0 +1,312 @@
//
// BloodConnectViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import "BloodConnectViewController.h"
#import "Masonry.h"
#import <AILinkBleSDK/ELBloodBleManager.h>

@interface BloodConnectViewController ()<ELBluetoothManagerDelegate,ELBloodBleManagerDelegate>
@property (nonatomic, strong) UITextView *textView;

@end

@implementation BloodConnectViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[ELBloodBleManager shareManager].bloodDelegate = self;
[ELBloodBleManager shareManager].delegate =self;
[[ELBloodBleManager shareManager] connectPeripheral:self.p];
[self setupUIView];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[ELBloodBleManager shareManager] disconnectPeripheral];
}
-(void)addLog:(NSString *)log{
self.textView.text = [NSString stringWithFormat:@"%@\n%@",log,self.textView.text];
}
-(void)buttonAction:(UIButton *)sender{
if ([ELBloodBleManager shareManager].state != ELBluetoothStateDidValidationPass) {
[self addLog:@"Disconnected"];
return;
}
[self addLog:sender.titleLabel.text];
NSInteger tag = sender.tag;
if (tag == 1) {
//getBluetoothInfoWithELInetGetCmdType是获取设备信息的方法
[[ELBloodBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetBMVersion)];
}else if (tag == 2){
[[ELBloodBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetC_V_P_ID)];
}else if (tag == 3){
[[ELBloodBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetName)];
}else if (tag == 4){
[[ELBloodBleManager shareManager] setBluetoothName:@"AILink"];
}else if (tag == 5){
[[ELBloodBleManager shareManager] sendInteractiveInstructions:(ELBloodInteractionTypeStartTest)];
}else if (tag == 6){
[[ELBloodBleManager shareManager] sendInteractiveInstructions:(ELBloodInteractionTypeStopTest)];
}else if (tag == 7){
[[ELBloodBleManager shareManager] changeUnit:(ELDeviceBloodPressureUnit_mmhg)];
}else if (tag == 8){
[[ELBloodBleManager shareManager] sendSwitchVoice:(ELBloodBleSwitchVoiceTypeOff)];
}else if (tag == 9){
[[ELBloodBleManager shareManager] sendSwitchVoice:(ELBloodBleSwitchVoiceTypeOn)];
}

}
-(void)setupUIView{
UIButton *button1 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button1 setTitle:@"Get BM Version" forState:(UIControlStateNormal)];
button1.tag = 1;
button1.titleLabel.adjustsFontSizeToFitWidth = YES;
button1.titleLabel.numberOfLines = 2;
button1.backgroundColor = [UIColor blackColor];
[button1 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button1];
[button1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button2 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button2 setTitle:@"Get C V P ID" forState:(UIControlStateNormal)];
button2.tag = 2;
button2.titleLabel.adjustsFontSizeToFitWidth = YES;
button2.titleLabel.numberOfLines = 2;
button2.backgroundColor = [UIColor blackColor];
[button2 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button2];
[button2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button1.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button3 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button3 setTitle:@"Get Name" forState:(UIControlStateNormal)];
button3.tag = 3;
button3.titleLabel.adjustsFontSizeToFitWidth = YES;
button3.titleLabel.numberOfLines = 2;
button3.backgroundColor = [UIColor blackColor];
[button3 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button3];
[button3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button2.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button4 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button4 setTitle:@"Set Name" forState:(UIControlStateNormal)];
button4.tag = 4;
button4.titleLabel.adjustsFontSizeToFitWidth = YES;
button4.titleLabel.numberOfLines = 2;
button4.backgroundColor = [UIColor blackColor];
[button4 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button4];
[button4 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button5 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button5 setTitle:@"Start Test" forState:(UIControlStateNormal)];
button5.tag = 5;
button5.titleLabel.adjustsFontSizeToFitWidth = YES;
button5.titleLabel.numberOfLines = 2;
button5.backgroundColor = [UIColor blackColor];
[button5 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button5];
[button5 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button4.mas_right).mas_offset(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
//
UIButton *button6 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button6 setTitle:@"Stop Test" forState:(UIControlStateNormal)];
button6.tag = 6;
button6.titleLabel.adjustsFontSizeToFitWidth = YES;
button6.titleLabel.numberOfLines = 2;
button6.backgroundColor = [UIColor blackColor];
[button6 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button6];
[button6 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button5.mas_right).mas_offset(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button7 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button7 setTitle:@"Change Unit" forState:(UIControlStateNormal)];
button7.tag = 7;
button7.titleLabel.adjustsFontSizeToFitWidth = YES;
button7.titleLabel.numberOfLines = 2;
button7.backgroundColor = [UIColor blackColor];
[button7 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button7];
[button7 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.equalTo(button4.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button8 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button8 setTitle:@"Close Voice" forState:(UIControlStateNormal)];
button8.tag = 8;
button8.titleLabel.adjustsFontSizeToFitWidth = YES;
button8.titleLabel.numberOfLines = 2;
button8.backgroundColor = [UIColor blackColor];
[button8 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button8];
[button8 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.equalTo(button4.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button9 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button9 setTitle:@"Open Voice" forState:(UIControlStateNormal)];
button9.tag = 9;
button9.titleLabel.adjustsFontSizeToFitWidth = YES;
button9.titleLabel.numberOfLines = 2;
button9.backgroundColor = [UIColor blackColor];
[button9 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button9];
[button9 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button8.mas_right).mas_offset(10);
make.top.equalTo(button4.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
self.textView = [[UITextView alloc] init];
self.textView.backgroundColor = [UIColor blackColor];
self.textView.text = @"Log";
self.textView.textColor = [UIColor redColor];
[self.view addSubview:self.textView];
[self.textView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.right.bottom.mas_equalTo(-10);
make.height.mas_equalTo(200);
}];
}

-(void)bluetoothManagerReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result{
if (type == ELInetSetCmdTypeSetName) {
if (result == ELSetBluetoothResponseTypeSuccess) {
[self addLog:@"Set name Success "];
}else if (result == ELSetBluetoothResponseTypeFailure){
[self addLog:@"Set name failure "];
}else if (result == ELSetBluetoothResponseTypeNoSupport){
[self addLog:@"Set name unsupport "];
}

}

}
-(void)bluetoothManagerReceiceName:(NSString *)name{
[self addLog:name];
}
-(void)bluetoothManagerReceiveDID:(struct ELDIDStruct)did{
[self addLog:[NSString stringWithFormat:@"CID = %d,VID = %d,PID = %d",did.deviceType,did.vendorID,did.productID]];
}

-(void)bluetoothManagerReceiveBMVersion:(NSString *)bmVersion{
[self addLog:bmVersion];
}
//MARK:获取设备支持的单位
-(void)bluetoothManagerBackDeviceSupportUnitWithWeight:(NSArray<NSNumber *> *)weightArray Height:(NSArray<NSNumber *> *)heightArray Temperature:(NSArray<NSNumber *> *)temperatureArray BloodPressure:(NSArray<NSNumber *> *)bloodPressureArray Pressure:(NSArray<NSNumber *> *)pressureArray{
//这里要血压单位
//设置单位时,要设置设备支持的单位
}

-(void)bloodBleManagerReceiceTestData:(ELBloodBleDataModel *)model type:(ELBloodBleDataModelType)type{
[self addLog:[NSString stringWithFormat:@"dia = %@--sys=%@ unit = %ld point = %ld",model.dia,model.sys,AiLinkBloodUnitDic[@(model.unit)],model.point]];
}
-(void)bloodBleManagerReceiveSetSwitchVoiceOperationType:(ELBloodBleSwitchVoiceType)type result:(ELSetBluetoothResponseType)result{
if (type == ELBloodBleSwitchVoiceTypeOff) {
[self addLog:[NSString stringWithFormat:@"close voice result = %ld",result]];
}else{
[self addLog:[NSString stringWithFormat:@"open voice result = %ld",result]];
}
}
-(void)bloodBleManagerReceiveSetUnitResult:(ELSetBluetoothResponseType)type{
[self addLog:[NSString stringWithFormat:@"change unit result = %ld",type]];
}
-(void)bloodBleManagerReceiveFailCode:(ELBloodFailCode)code{
[self addLog:[NSString stringWithFormat:@"error code = %ld",code]];
}
-(void)bloodBleManagerUpdateBleState:(ELBluetoothState)state{
switch (state) {
case ELBluetoothStateUnavailable:
{
self.title = @"Please open the bluetooth";
}
break;
case ELBluetoothStateAvailable:
{
self.title = @"Bluetooth is open";
}
break;
case ELBluetoothStateScaning:
{
self.title = @"Scaning";
}
break;
case ELBluetoothStateConnectFail:
{
self.title = @"Connect fail";
}
break;
case ELBluetoothStateDidDisconnect:
{
self.title = @"Disconnected";
}
break;
case ELBluetoothStateDidValidationPass:
{
self.title = @"Connected";
[[ELBloodBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeReadDeviceSupportUnit)];
}
break;
case ELBluetoothStateFailedValidation:
{
self.title = @"Illegal equipment";
}
break;
case ELBluetoothStateWillConnect:
self.title = @"Connecting";
break;
default:
break;
}
}
-(void)dealloc{
}

@end

+ 17
- 0
AILinkBleSDKDemo/BloodPressure/BloodScanViewController.h View File

@@ -0,0 +1,17 @@
//
// BloodScanViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface BloodScanViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

+ 89
- 0
AILinkBleSDKDemo/BloodPressure/BloodScanViewController.m View File

@@ -0,0 +1,89 @@
//
// BloodScanViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import "BloodScanViewController.h"
#import "Masonry.h"
#import <AILinkBleSDK/ELBloodBleManager.h>
#import "BloodConnectViewController.h"

@interface BloodScanViewController ()<UITableViewDelegate,UITableViewDataSource,ELBloodBleManagerDelegate>
@property (nonatomic, strong) UITableView *tableView;

@property (nonatomic, strong) NSArray<ELPeripheralModel *> *devices;

@end

@implementation BloodScanViewController

- (void)viewDidLoad {
[super viewDidLoad];
// self.title = @"Devices";
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.bottom.mas_equalTo(0);
}];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[ELBloodBleManager shareManager] startScan];
[ELBloodBleManager shareManager].bloodDelegate = self;
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[[ELBloodBleManager shareManager] stopScan];
}
#pragma mark ============ ELBluetoothManagerDelegate ==============
-(void)bloodBleManagerUpdateBleState:(ELBluetoothState)state{
NSLog(@"bluetoothManagerUpdateBleState = %ld",state);
}

-(void)bloodBleManagerScanDevices:(NSArray<ELPeripheralModel *> *)devices{
self.devices = devices;
[self.tableView reloadData];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.devices.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellId = @"cellid";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
ELPeripheralModel *p = self.devices[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"Name:%@---Mac:%@\nCID:%ld---VID:%ld---PID:%ld",p.deviceName,p.macAddress,p.deviceType,p.vendorID,p.productID];
cell.textLabel.numberOfLines = 2;
cell.textLabel.textColor = [UIColor blackColor];
return cell;

}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
ELPeripheralModel *p = self.devices[indexPath.row];
BloodConnectViewController *vc = [[BloodConnectViewController alloc] init];
vc.p = p;
[self.navigationController pushViewController:vc animated:YES];
}
-(UITableView *)tableView{
if (_tableView == nil) {
_tableView = [[UITableView alloc] init];
_tableView.delegate = self;
_tableView.dataSource = self;
}
return _tableView;
}

@end

+ 17
- 0
AILinkBleSDKDemo/BodyFatScale/BodyFatScaleConnectViewController.h View File

@@ -0,0 +1,17 @@
//
// BodyFatScaleConnectViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/8.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>
@class ELPeripheralModel;
NS_ASSUME_NONNULL_BEGIN

@interface BodyFatScaleConnectViewController : UIViewController
@property (nonatomic, strong) ELPeripheralModel *p;
@end

NS_ASSUME_NONNULL_END

+ 676
- 0
AILinkBleSDKDemo/BodyFatScale/BodyFatScaleConnectViewController.m View File

@@ -0,0 +1,676 @@
//
// BodyFatScaleConnectViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/8.
// Copyright © 2020 IOT. All rights reserved.
//

#import "BodyFatScaleConnectViewController.h"
#import "Masonry.h"
#import <AILinkBleSDK/ELBodyFatScaleBleManager.h>
#import <AILinkBleSDK/ELBodyFatScaleBleUserModel.h>
#import <AILinkBleSDK/ELBodyFatScaleBleWeightModel.h>
#import "WiFiSetupViewController.h"

@interface BodyFatScaleConnectViewController ()<ELBluetoothManagerDelegate,ELBodyFatScaleBleDelegate,ElBleWifiDelegate>
@property (nonatomic, strong) UITextView *textView;

@property (nonatomic, copy) NSArray<NSNumber *> *units;


@end

@implementation BodyFatScaleConnectViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[ELBodyFatScaleBleManager shareManager].bodyFatScaleDelegate = self;
[ELBodyFatScaleBleManager shareManager].delegate =self;
[[ELBodyFatScaleBleManager shareManager] connectPeripheral:self.p];
[ELBodyFatScaleBleManager shareManager].bleWifiDelegate = self;
[self setupUIView];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[ELBodyFatScaleBleManager shareManager] disconnectPeripheral];
}
-(void)addLog:(NSString *)log{
self.textView.text = [NSString stringWithFormat:@"%@\n%@",log,self.textView.text];
}
-(void)buttonAction:(UIButton *)sender{
if ([ELBodyFatScaleBleManager shareManager].state != ELBluetoothStateDidValidationPass) {
[self addLog:@"Disconnected"];
return;
}
[self addLog:sender.titleLabel.text];
NSInteger tag = sender.tag;
if (tag == 1) {
//getBluetoothInfoWithELInetGetCmdType是获取设备信息的方法
[[ELBodyFatScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetBMVersion)];
}else if (tag == 2){
[[ELBodyFatScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetC_V_P_ID)];
}else if (tag == 3){
[[ELBodyFatScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetName)];
}else if (tag == 4){
[[ELBodyFatScaleBleManager shareManager] setBluetoothName:@"AILink"];
}else if (tag == 5){
if (self.units.count==0) {
[self addLog:@"No units obtained"];
return;
}
// [[ELBodyFatScaleBleManager shareManager] changeBodyFatScaleUnit:(ELDeviceWeightUnit_KG)];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Change Unit" message:@"" preferredStyle:(UIAlertControllerStyleAlert)];
for (int i=0; i<self.units.count; i++) {
UIAlertAction *action = [UIAlertAction actionWithTitle:AiLinkBleWeightUnitDic[self.units[i]] style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
[[ELBodyFatScaleBleManager shareManager] changeBodyFatScaleUnit:self.units[i].integerValue];
}];
[alert addAction:action];
}
[self presentViewController:alert animated:YES completion:nil];
}else if (tag == 6){
}else if (tag == 7){
}else if (tag == 8){
}else if (tag == 9){
}
}
-(void)setupUIView{
UIButton *button1 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button1 setTitle:@"Get BM Version" forState:(UIControlStateNormal)];
button1.tag = 1;
button1.titleLabel.adjustsFontSizeToFitWidth = YES;
button1.titleLabel.numberOfLines = 2;
button1.backgroundColor = [UIColor blackColor];
[button1 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button1];
[button1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button2 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button2 setTitle:@"Get C V P ID" forState:(UIControlStateNormal)];
button2.tag = 2;
button2.titleLabel.adjustsFontSizeToFitWidth = YES;
button2.titleLabel.numberOfLines = 2;
button2.backgroundColor = [UIColor blackColor];
[button2 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button2];
[button2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button1.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button3 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button3 setTitle:@"Get Name" forState:(UIControlStateNormal)];
button3.tag = 3;
button3.titleLabel.adjustsFontSizeToFitWidth = YES;
button3.titleLabel.numberOfLines = 2;
button3.backgroundColor = [UIColor blackColor];
[button3 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button3];
[button3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button2.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button4 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button4 setTitle:@"Set Name" forState:(UIControlStateNormal)];
button4.tag = 4;
button4.titleLabel.adjustsFontSizeToFitWidth = YES;
button4.titleLabel.numberOfLines = 2;
button4.backgroundColor = [UIColor blackColor];
[button4 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button4];
[button4 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button5 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button5 setTitle:@"Change unit" forState:(UIControlStateNormal)];
button5.tag = 5;
button5.titleLabel.adjustsFontSizeToFitWidth = YES;
button5.titleLabel.numberOfLines = 2;
button5.backgroundColor = [UIColor blackColor];
[button5 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button5];
[button5 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button4.mas_right).mas_offset(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
//
// UIButton *button6 = [UIButton buttonWithType:(UIButtonTypeCustom)];
// [button6 setTitle:@"" forState:(UIControlStateNormal)];
// button6.tag = 6;
// button6.titleLabel.adjustsFontSizeToFitWidth = YES;
// button6.titleLabel.numberOfLines = 2;
// button6.backgroundColor = [UIColor blackColor];
// [button6 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
// [self.view addSubview:button6];
// [button6 mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.equalTo(button5.mas_right).mas_offset(10);
// make.top.equalTo(button1.mas_bottom).mas_offset(10);
// make.width.mas_equalTo(100);
// make.height.mas_equalTo(40);
// }];
// //
// UIButton *button7 = [UIButton buttonWithType:(UIButtonTypeCustom)];
// [button7 setTitle:@"" forState:(UIControlStateNormal)];
// button7.tag = 7;
// button7.titleLabel.adjustsFontSizeToFitWidth = YES;
// button7.titleLabel.numberOfLines = 2;
// button7.backgroundColor = [UIColor blackColor];
// [button7 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
// [self.view addSubview:button7];
// [button7 mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.mas_equalTo(10);
// make.top.equalTo(button4.mas_bottom).mas_offset(10);
// make.width.mas_equalTo(100);
// make.height.mas_equalTo(40);
// }];
//
// UIButton *button8 = [UIButton buttonWithType:(UIButtonTypeCustom)];
// [button8 setTitle:@"" forState:(UIControlStateNormal)];
// button8.tag = 8;
// button8.titleLabel.adjustsFontSizeToFitWidth = YES;
// button8.titleLabel.numberOfLines = 2;
// button8.backgroundColor = [UIColor blackColor];
// [button8 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
// [self.view addSubview:button8];
// [button8 mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.equalTo(button7.mas_right).mas_offset(10);
// make.top.equalTo(button4.mas_bottom).mas_offset(10);
// make.width.mas_equalTo(100);
// make.height.mas_equalTo(40);
// }];
//
// UIButton *button9 = [UIButton buttonWithType:(UIButtonTypeCustom)];
// [button9 setTitle:@"" forState:(UIControlStateNormal)];
// button9.tag = 9;
// button9.titleLabel.adjustsFontSizeToFitWidth = YES;
// button9.titleLabel.numberOfLines = 2;
// button9.backgroundColor = [UIColor blackColor];
// [button9 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
// [self.view addSubview:button9];
// [button9 mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.equalTo(button8.mas_right).mas_offset(10);
// make.top.equalTo(button4.mas_bottom).mas_offset(10);
// make.width.mas_equalTo(100);
// make.height.mas_equalTo(40);
// }];
//
self.textView = [[UITextView alloc] init];
self.textView.backgroundColor = [UIColor blackColor];
self.textView.text = @"Log";
self.textView.textColor = [UIColor redColor];
[self.view addSubview:self.textView];
[self.textView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.right.bottom.mas_equalTo(-10);
make.height.mas_equalTo(200);
}];
}

-(void)bluetoothManagerReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result{
if (type == ELInetSetCmdTypeSetName) {
if (result == ELSetBluetoothResponseTypeSuccess) {
[self addLog:@"Set name Success "];
}else if (result == ELSetBluetoothResponseTypeFailure){
[self addLog:@"Set name failure "];
}else if (result == ELSetBluetoothResponseTypeNoSupport){
[self addLog:@"Set name unsupport "];
}
}
}
-(void)bluetoothManagerReceiceName:(NSString *)name{
[self addLog:name];
}
-(void)bluetoothManagerReceiveDID:(struct ELDIDStruct)did{
[self addLog:[NSString stringWithFormat:@"CID = %d,VID = %d,PID = %d",did.deviceType,did.vendorID,did.productID]];
}

-(void)bluetoothManagerReceiveBMVersion:(NSString *)bmVersion{
[self addLog:bmVersion];
}

-(void)bluetoothManagerBackDeviceSupportUnitWithWeight:(NSArray<NSNumber *> *)weightArray Height:(NSArray<NSNumber *> *)heightArray Temperature:(NSArray<NSNumber *> *)temperatureArray BloodPressure:(NSArray<NSNumber *> *)bloodPressureArray Pressure:(NSArray<NSNumber *> *)pressureArray{
//这里只要体重数据
self.units = weightArray;
}

-(void)bluetoothManagerReceiveMCUConnectedState:(struct ELMCUStateStruct)stateStrct{
BleWiFiConnectState wifiState = stateStrct.wifiState;

if (self.p.deviceType == ELSupportDeviceTypeBLE_WIFIScale) {
//蓝牙WiFi体脂秤
//请求会话码
[[ELBodyFatScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetSNNumber];
//MARK:1.WiFi配置提示用户配网
//TODO:注意:wifi配置过程必须保持蓝牙与设备的连接
if (wifiState == BleWiFiConnectStateNoWiFi) {
//1.如果没有配网,则提示用户去配网
//MARK:2.WiFi配置先获取wifi列表
//
[[ELBodyFatScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetNearbyWifi];
//
// UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Change Unit" message:@"" preferredStyle:(UIAlertControllerStyleAlert)];
// UIAlertAction *action = [UIAlertAction actionWithTitle:@"去配网" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
// if ([ELBodyFatScaleBleManager shareManager].state == ELBluetoothStateDidValidationPass) {
// WiFiSetupViewController *vc = [[WiFiSetupViewController alloc] init];
// [self.navigationController pushViewController:vc animated:YES];
// }else{
// [self addLog:@"Disconnected"];
// }
//
// }];
// UIAlertAction *action2 = [UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
//
// }];
// [alert addAction:action];
// [alert addAction:action2];
// [self presentViewController:alert animated:YES completion:nil];
}
}
///MARK:9.wifi配置结果
//wifi相关的其他指令和数据接收,请查看ELBluetoothManager.h文件
if (stateStrct.wifiState == BleWiFiConnectStateSuccess) {
//成功
//MARK:10.获取wifi设备的SN号,即设备id
[[ELBodyFatScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeBleWifiGetSNNumber)];
}else{
//失败
}

}

/**
Callback to set unit result(回调设置单位结果)
@param result 结果
*/
- (void)bodyFatScaleManagerCallBackSetUnitResult:(ELSetBluetoothResponseType)result{
switch (result) {
case ELSetBluetoothResponseTypeSuccess:
{
[self addLog:@"Change Unit Success"];
}
break;
case ELSetBluetoothResponseTypeFailure:
{
[self addLog:@"Change Unit Failure"];
}
break;
case ELSetBluetoothResponseTypeNoSupport:
{
[self addLog:@"Unsupport Change Unit"];
}
break;
default:
break;
}
}
//MARK:回调Wifi列表
-(void)bleWifiReceiveWifiDetailModel:(ELBleWifiDetailModel *)model{
// MARK:3.WiFi配置得到Wifi列表
//用一个tableview显示喽
[self addLog:[NSString stringWithFormat:@"wifi类型---%lu 名称---%@",(unsigned long)model.wifiState,model.wifiName]];
}
-(void)bleWifiReceiveScanedWifiCount:(int)count {
//MARK:扫描Wifi结束
//MARK:4.WiFi配置得到一个附近wifi的列表,点击选择一个wifi,进行配置
//MARK:5.输入wifi密码
//写个“textfield”输入密码
//MARK:6.先发送配置wifi的mac地址的指令
// [[ELBodyFatScaleBleManager shareManager] bleWifiSetConnectWifiMac:[NSData data]];
}
-(void)bleWifiReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result{
[self addLog:[NSString stringWithFormat:@"bleWifiReceiceResponseType==%lu----%lu",type,result]];
if (result == ELSetBluetoothResponseTypeSuccess) {
//设置WiFi结果
if (type == ELInetSetCmdTypeBleWifiSetWifiMac) {
//MARK:7.再发送配置wifi的密码的指令
[[ELBodyFatScaleBleManager shareManager] bleWifiSetWifiPwd:@"WiFi密码"];
}else if (type == ELInetSetCmdTypeBleWifiSetWifiPwd){
//MARK:8.然后发起连接Wifi
[[ELBodyFatScaleBleManager shareManager] bleWifiSetupWifiConnect:YES];
}else if (type == ELInetSetCmdTypeBleWifiSetConnectWifi){
//获取连接状态
}
}
else{
//TODO:Wifi配置过程中失败的情况自行处理
}
}
/**
MCU requests user information( MCU 请求用户信息)
@param status 请求状态
*/
- (void)bodyFatScaleManagerMCURequestAppUserInfoType:(BodyFatScaleMCURequestUserInfoStatus)status{
if (status == BodyFatScaleMCURequestUserInfoStatus_Get) {
//下发当前用户给秤
[[ELBodyFatScaleBleManager shareManager] sendCurrentUserToBle:[self getOneUser]];
}else if (status == BodyFatScaleMCURequestUserInfoStatus_Success){
[self addLog:@"MCU requests user information success"];
}else if (BodyFatScaleMCURequestUserInfoStatus_Fail){
[self addLog:@"MCU requests user information failure"];
}

}


/**
Return weight and body fat model(返回重量及体脂model)
*/
-(void)bodyFatScaleManagerCallBackWeight:(ELBodyFatScaleBleWeightModel *)weightModel state:(BodyFatScaleMeasureStatus)status{
switch (status) {
case BodyFatScaleMeasureStatus_Unstable:
{
[self addLog:[NSString stringWithFormat:@"Unstable data weight = %ld unit = %@ point = %ld adc = %ld",weightModel.weight,AiLinkBleWeightUnitDic[@(weightModel.weightUnit)],weightModel.weightPoint,weightModel.adc]];
}
break;
case BodyFatScaleMeasureStatus_Stable:
{
[self addLog:[NSString stringWithFormat:@"Stable data weight = %ld unit = %@ point = %ld adc = %ld",weightModel.weight,AiLinkBleWeightUnitDic[@(weightModel.weightUnit)],weightModel.weightPoint,weightModel.adc]];
}
break;
case BodyFatScaleMeasureStatus_Failed:
{
[self addLog:@"Test failure"];
}
break;
case BodyFatScaleMeasureStatus_Complete:
{
[self addLog:[NSString stringWithFormat:@"Tested weight = %ld unit = %@ point = %ld adc = %ld",weightModel.weight,AiLinkBleWeightUnitDic[@(weightModel.weightUnit)],weightModel.weightPoint,weightModel.adc]];
//更新用户信息给秤
[[ELBodyFatScaleBleManager shareManager] sendCurrentUserToBle:[self getOneUser]];
//下发用户列表
[[ELBodyFatScaleBleManager shareManager] sendOfflineUserListToBle:[self get8Users]];
}
break;
default:
break;
}
}


/**
Return temperature (unit: ° C)(返回温度(单位:°C))
@param temp 温度(单位:°C)
*/
-(void)bodyFatScaleManagerCallBackTemp:(NSString *)temp{
[self addLog:[NSString stringWithFormat:@"temperature is %@",temp]];
}

/**
Back to impedance measurement(返回阻抗测量)
@param status 阻抗测量状态
@param adc 阻抗
*/
-(void)bodyFatScaleManagerCallBackAdcMeasureStatus:(BodyFatScaleAdcMeasureStatus)status adcValue:(NSInteger)adc{
switch (status) {
case BodyFatScaleAdcMeasureStatus_Testing:
{
[self addLog:@"adc testing"];
}
break;
case BodyFatScaleAdcMeasureStatus_Success:
{
[self addLog:[NSString stringWithFormat:@"adc is %ld",adc]];
}
break;
case BodyFatScaleAdcMeasureStatus_Fail:
{
[self addLog:@"adc test failure"];
}
break;
case BodyFatScaleAdcMeasureStatus_SuccessCustom:
{
[self addLog:[NSString stringWithFormat:@"adc is %ld and user app algum",adc]];
}
break;
default:
break;
}
}

/**
Callback heart rate measurement(回调心率测量)
@param status 心率测量状态
@param heartRate 心率
*/
-(void)bodyFatScaleManagerCallBackHeartRateMeasureStatus:(BodyFatScaleHeartRateMeasureStatus)status heartRateValue:(NSInteger)heartRate{
switch (status) {
case BodyFatScaleHeartRateMeasureStatus_Testing:
{
[self addLog:@"Heart Rate Testing"];
}
break;
case BodyFatScaleHeartRateMeasureStatus_Success:
{
[self addLog:[NSString stringWithFormat:@"Heart Rate is %ld",heartRate]];
}
break;
case BodyFatScaleHeartRateMeasureStatus_Fail:
{
[self addLog:@"Heart Rate Test failure"];
}
break;
default:
break;
}
}

/**
Return error code(返回错误码)
@param code 错误码
1:超重
*/
-(void)bodyFatScaleManagerCallBackErrorCode:(NSInteger)code{
[self addLog:[NSString stringWithFormat:@"error code = %ld",code]];
}
//MARK:回调A6指令数据

/**
Send success or failure callback for offline user list(发送离线用户列表的成功或失败回调)
@param status 状态
*/
-(void)bodyFatScaleManagerCallBackUpdateRecordStatus:(BodyFatScaleUpdateRecordStatus)status{
switch (status) {
case BodyFatScaleUpdateRecordStatus_AllSuccess:
{
[self addLog:@"Update All Users Success"];
}
break;
case BodyFatScaleUpdateRecordStatus_OneSuccess:
{
[self addLog:@"Update A User Success"];
}
break;
case BodyFatScaleUpdateRecordStatus_OneFail:
{
[self addLog:@"Update A User Failure"];
}
break;
case BodyFatScaleUpdateRecordStatus_AllFail:
{
[self addLog:@"Update All Users Failure"];
}
break;
default:
break;
}
}

/**
Request callback for offline history(请求离线历史记录的回调)
@param status 状态
*/
-(void)bodyFatScaleManagerCallBackSendHistoryDataStatus:(BodyFatScaleSendHistoryDataStatus)status{
if (status == BodyFatScaleSendHistoryDataStatus_No) {
[self addLog:@"No offline datas"];
}else if (status == BodyFatScaleSendHistoryDataStatus_Begin){
[self addLog:@"Begin receive offline datas"];
}else if (status == BodyFatScaleSendHistoryDataStatus_End){
[self addLog:@"End receive offline datas"];
}
}

/**
APP algorithm-offline history data(APP 算法-离线历史记录数据)
@param user 用户信息
*/
-(void)bodyFatScaleManagerCallBackBleUserHistoryDataCustomADCModel:(ELBodyFatScaleBleUserModel *)user bodyDataModel:(ELBodyFatScaleBleWeightModel *)bodyModel{
//这里的身体指标等数据由app自定义算法计算得到,请区分bodyModel.algNum来调用算法
[self addLog:[NSString stringWithFormat:@"App algorithm-offline history data:userId = %ld weight = %ld unit =%@ point = %ld",user.usrID,bodyModel.weight,AiLinkBleWeightUnitDic[@(bodyModel.weightUnit)],bodyModel.weightPoint]];
}

/**
MCU algorithm-offline history data(MCU 算法-离线历史记录数据)
@param user 用户信息
@param bodyModel 体脂数据
*/
-(void)bodyFatScaleManagerCallBackBleUserHistoryDataModel:(ELBodyFatScaleBleUserModel *)user bodyDataModel:(ELBodyFatScaleBleWeightModel *)bodyModel{
//这里的身体指标数据由秤计算得到
[self addLog:[NSString stringWithFormat:@"MCU algorithm-offline history data:userId = %ld weight = %ld unit =%@ point = %ld",user.usrID,bodyModel.weight,AiLinkBleWeightUnitDic[@(bodyModel.weightUnit)],bodyModel.weightPoint]];
}

-(void)bleWifiReceiveWifiSNCode:(int)code{
//MARK:11.根据wifi设备的设备id从服务器获取离线数据(找自己后台要接口)
}

-(void)bodyFatScaleManagerUpdateState:(ELBluetoothState)state{
switch (state) {
case ELBluetoothStateUnavailable:
{
self.title = @"Please open the bluetooth";
}
break;
case ELBluetoothStateAvailable:
{
self.title = @"Bluetooth is open";
}
break;
case ELBluetoothStateScaning:
{
self.title = @"Scaning";
}
break;
case ELBluetoothStateConnectFail:
{
self.title = @"Connect fail";
}
break;
case ELBluetoothStateDidDisconnect:
{
self.title = @"Disconnected";
}
break;
case ELBluetoothStateDidValidationPass:
{
self.title = @"Connected";
//获取设备支持的单位
[[ELBodyFatScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeReadDeviceSupportUnit)];
//将你自己设置的单位发给秤
ELDeviceWeightUnit unit = ELDeviceWeightUnit_KG;
[[ELBodyFatScaleBleManager shareManager] changeBodyFatScaleUnit:unit];
//请求历史记录
[[ELBodyFatScaleBleManager shareManager] sendCmd_RequestHistory];
//下发用户列表
[[ELBodyFatScaleBleManager shareManager] sendOfflineUserListToBle:[self get8Users]];
if (self.p.deviceType == ELSupportDeviceTypeBLE_WIFIScale) {
//获取蓝牙连接状态
[[ELBodyFatScaleBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetConnectState)];
}
}
break;
case ELBluetoothStateFailedValidation:
{
self.title = @"Illegal equipment";
}
break;
case ELBluetoothStateWillConnect:
self.title = @"Connecting";
break;
default:
break;
}
}
-(NSArray<ELBodyFatScaleBleUserModel *> *)get8Users{
NSMutableArray *users = [[NSMutableArray alloc] init];
for (int i=0; i<8; i++) {
ELBodyFatScaleBleUserModel *user = [[ELBodyFatScaleBleUserModel alloc] init];
user.createTime = [[NSDate date] timeIntervalSince1970];
user.usrID = i;
user.role = i%4;
user.sex = i%2;
user.age = 26+i;
user.height = 170+i;
user.weight = 600+i;
user.adc = 560+i;
[users addObject:user];
}

return users.copy;
}

-(ELBodyFatScaleBleUserModel *)getOneUser{
ELBodyFatScaleBleUserModel *user = [[ELBodyFatScaleBleUserModel alloc] init];
user.createTime = [[NSDate date] timeIntervalSince1970];
user.usrID = 0;
user.role = BodyFatScaleRole_Ordinary;
user.sex = ELBluetoothUserSex_Woman;
user.age = 26;
user.height = 170;
user.weight = 600;
user.adc = 560;
return user;
}
-(void)dealloc{
}

@end

+ 17
- 0
AILinkBleSDKDemo/BodyFatScale/BodyFatScaleScanViewController.h View File

@@ -0,0 +1,17 @@
//
// BodyFatScaleScanViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/8.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface BodyFatScaleScanViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

+ 87
- 0
AILinkBleSDKDemo/BodyFatScale/BodyFatScaleScanViewController.m View File

@@ -0,0 +1,87 @@
//
// BodyFatScaleScanViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/8.
// Copyright © 2020 IOT. All rights reserved.
//

#import "BodyFatScaleScanViewController.h"
#import "Masonry.h"
#import <AILinkBleSDK/ELBodyFatScaleBleManager.h>
#import "BodyFatScaleConnectViewController.h"

@interface BodyFatScaleScanViewController ()<UITableViewDelegate,UITableViewDataSource,ELBodyFatScaleBleDelegate>
@property (nonatomic, strong) UITableView *tableView;

@property (nonatomic, strong) NSArray<ELPeripheralModel *> *devices;

@end

@implementation BodyFatScaleScanViewController

- (void)viewDidLoad {
[super viewDidLoad];
// self.title = @"Devices";
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.bottom.mas_equalTo(0);
}];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[ELBodyFatScaleBleManager shareManager] startScan];
[ELBodyFatScaleBleManager shareManager].bodyFatScaleDelegate = self;
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[[ELBodyFatScaleBleManager shareManager] stopScan];
}
#pragma mark ============ ELBluetoothManagerDelegate ==============
-(void)bodyFatScaleManagerUpdateState:(ELBluetoothState)state{
NSLog(@"bluetoothManagerUpdateBleState = %ld",state);
}
-(void)bodyFatScaleManagerScanDevices:(NSArray<ELBodyFatScaleDeviceModel *> *)scaleDevices{
self.devices = scaleDevices;
[self.tableView reloadData];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.devices.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellId = @"cellid";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
ELPeripheralModel *p = self.devices[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"Name:%@---Mac:%@\nCID:%ld---VID:%ld---PID:%ld",p.deviceName,p.macAddress,p.deviceType,p.vendorID,p.productID];
cell.textLabel.numberOfLines = 2;
cell.textLabel.textColor = [UIColor blackColor];
return cell;

}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
ELPeripheralModel *p = self.devices[indexPath.row];
BodyFatScaleConnectViewController *vc = [[BodyFatScaleConnectViewController alloc] init];
vc.p = p;
[self.navigationController pushViewController:vc animated:YES];
}
-(UITableView *)tableView{
if (_tableView == nil) {
_tableView = [[UITableView alloc] init];
_tableView.delegate = self;
_tableView.dataSource = self;
}
return _tableView;
}
@end

+ 17
- 0
AILinkBleSDKDemo/BodyFatScale/WiFiSetupViewController.h View File

@@ -0,0 +1,17 @@
//
// WiFiSetupViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/8.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface WiFiSetupViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

+ 32
- 0
AILinkBleSDKDemo/BodyFatScale/WiFiSetupViewController.m View File

@@ -0,0 +1,32 @@
//
// WiFiSetupViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/8.
// Copyright © 2020 IOT. All rights reserved.
//

#import "WiFiSetupViewController.h"

@interface WiFiSetupViewController ()

@end

@implementation WiFiSetupViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/

@end

+ 17
- 0
AILinkBleSDKDemo/Forehead/ForeheadConnectViewController.h View File

@@ -0,0 +1,17 @@
//
// ForeheadConnectViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/8.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>
@class ELPeripheralModel;
NS_ASSUME_NONNULL_BEGIN

@interface ForeheadConnectViewController : UIViewController
@property (nonatomic, strong) ELPeripheralModel *p;
@end

NS_ASSUME_NONNULL_END

+ 277
- 0
AILinkBleSDKDemo/Forehead/ForeheadConnectViewController.m View File

@@ -0,0 +1,277 @@
//
// ForeheadConnectViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/8.
// Copyright © 2020 IOT. All rights reserved.
//

#import "ForeheadConnectViewController.h"
#import "Masonry.h"
#import <AILinkBleSDK/ELForeHeadBleManager.h>

@interface ForeheadConnectViewController ()<ELBluetoothManagerDelegate,ELForeheadBleManagerDelegate>
@property (nonatomic, strong) UITextView *textView;

@end

@implementation ForeheadConnectViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[ELForeHeadBleManager shareManager].foreheadDelegate = self;
[ELForeHeadBleManager shareManager].delegate =self;
[[ELForeHeadBleManager shareManager] connectPeripheral:self.p];
[self setupUIView];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[ELForeHeadBleManager shareManager] disconnectPeripheral];
}
-(void)addLog:(NSString *)log{
self.textView.text = [NSString stringWithFormat:@"%@\n%@",log,self.textView.text];
}
-(void)buttonAction:(UIButton *)sender{
if ([ELForeHeadBleManager shareManager].state != ELBluetoothStateDidValidationPass) {
[self addLog:@"Disconnected"];
return;
}
[self addLog:sender.titleLabel.text];
NSInteger tag = sender.tag;
if (tag == 1) {
//getBluetoothInfoWithELInetGetCmdType是获取设备信息的方法
[[ELForeHeadBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetBMVersion)];
}else if (tag == 2){
[[ELForeHeadBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetC_V_P_ID)];
}else if (tag == 3){
[[ELForeHeadBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetName)];
}else if (tag == 4){
[[ELForeHeadBleManager shareManager] setBluetoothName:@"AILink"];
}else if (tag == 5){
[[ELForeHeadBleManager shareManager] changeUnit:(ELDeviceTemperatureUnit_C)];
}else if (tag == 6){
[[ELForeHeadBleManager shareManager] changeUnit:(ELDeviceTemperatureUnit_F)];
}else if (tag == 7){
}else if (tag == 8){
}else if (tag == 9){
}

}
-(void)setupUIView{
UIButton *button1 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button1 setTitle:@"Get BM Version" forState:(UIControlStateNormal)];
button1.tag = 1;
button1.titleLabel.adjustsFontSizeToFitWidth = YES;
button1.titleLabel.numberOfLines = 2;
button1.backgroundColor = [UIColor blackColor];
[button1 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button1];
[button1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button2 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button2 setTitle:@"Get C V P ID" forState:(UIControlStateNormal)];
button2.tag = 2;
button2.titleLabel.adjustsFontSizeToFitWidth = YES;
button2.titleLabel.numberOfLines = 2;
button2.backgroundColor = [UIColor blackColor];
[button2 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button2];
[button2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button1.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button3 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button3 setTitle:@"Get Name" forState:(UIControlStateNormal)];
button3.tag = 3;
button3.titleLabel.adjustsFontSizeToFitWidth = YES;
button3.titleLabel.numberOfLines = 2;
button3.backgroundColor = [UIColor blackColor];
[button3 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button3];
[button3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button2.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button4 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button4 setTitle:@"Set Name" forState:(UIControlStateNormal)];
button4.tag = 4;
button4.titleLabel.adjustsFontSizeToFitWidth = YES;
button4.titleLabel.numberOfLines = 2;
button4.backgroundColor = [UIColor blackColor];
[button4 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button4];
[button4 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button5 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button5 setTitle:@"Change Unit To C" forState:(UIControlStateNormal)];
button5.tag = 5;
button5.titleLabel.adjustsFontSizeToFitWidth = YES;
button5.titleLabel.numberOfLines = 2;
button5.backgroundColor = [UIColor blackColor];
[button5 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button5];
[button5 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button4.mas_right).mas_offset(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button6 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button6 setTitle:@"Change Unit To F" forState:(UIControlStateNormal)];
button6.tag = 6;
button6.titleLabel.adjustsFontSizeToFitWidth = YES;
button6.titleLabel.numberOfLines = 2;
button6.backgroundColor = [UIColor blackColor];
[button6 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button6];
[button6 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button5.mas_right).mas_offset(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
self.textView = [[UITextView alloc] init];
self.textView.backgroundColor = [UIColor blackColor];
self.textView.text = @"Log";
self.textView.textColor = [UIColor redColor];
[self.view addSubview:self.textView];
[self.textView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.right.bottom.mas_equalTo(-10);
make.height.mas_equalTo(200);
}];
}

-(void)bluetoothManagerReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result{
if (type == ELInetSetCmdTypeSetName) {
if (result == ELSetBluetoothResponseTypeSuccess) {
[self addLog:@"Set name Success "];
}else if (result == ELSetBluetoothResponseTypeFailure){
[self addLog:@"Set name failure "];
}else if (result == ELSetBluetoothResponseTypeNoSupport){
[self addLog:@"Set name unsupport "];
}

}

}
-(void)bluetoothManagerReceiceName:(NSString *)name{
[self addLog:name];
}
-(void)bluetoothManagerReceiveDID:(struct ELDIDStruct)did{
[self addLog:[NSString stringWithFormat:@"CID = %d,VID = %d,PID = %d",did.deviceType,did.vendorID,did.productID]];
}

-(void)bluetoothManagerReceiveBMVersion:(NSString *)bmVersion{
[self addLog:bmVersion];
}

//MARK:获取设备支持的单位
-(void)bluetoothManagerBackDeviceSupportUnitWithWeight:(NSArray<NSNumber *> *)weightArray Height:(NSArray<NSNumber *> *)heightArray Temperature:(NSArray<NSNumber *> *)temperatureArray BloodPressure:(NSArray<NSNumber *> *)bloodPressureArray Pressure:(NSArray<NSNumber *> *)pressureArray{
//这里要压力和温度单位
//设置单位时,要设置设备支持的单位
}
/**
Callback temperature(回调温度)

@param model ELForeheadBleDataModel
*/
-(void)foreheadBleManagerReceiveTemperature:(ELForeheadBleDataModel *_Nonnull)model dataType:(ForeheadBleDataType)dataType{
[self addLog:[NSString stringWithFormat:@"temperature = %@ unit = %@ point = %ld",model.temperature,AiLinkBleTempUnitDic[@(model.unit)],model.point]];
}

/**
Set unit callback( 设置单位回调)

@param type 结果
*/
-(void)foreheadBleManagerReceiveSetUnitResult:(ELSetBluetoothResponseType)type{
[self addLog:[NSString stringWithFormat:@"Change Unit result = %lu",(unsigned long)type]];
}

/**
Error code sent on the device(设备上发错误码)

@param code 错误码
*/
-(void)foreheadBleManagerReceiveFailCode:(ForeheadFailCode)code{
[self addLog:[NSString stringWithFormat:@"error code = %lu",(unsigned long)code]];
}

-(void)foreheadBleManagerUpdateBleState:(ELBluetoothState)state{
switch (state) {
case ELBluetoothStateUnavailable:
{
self.title = @"Please open the bluetooth";
}
break;
case ELBluetoothStateAvailable:
{
self.title = @"Bluetooth is open";
}
break;
case ELBluetoothStateScaning:
{
self.title = @"Scaning";
}
break;
case ELBluetoothStateConnectFail:
{
self.title = @"Connect fail";
}
break;
case ELBluetoothStateDidDisconnect:
{
self.title = @"Disconnected";
}
break;
case ELBluetoothStateDidValidationPass:
{
self.title = @"Connected";
[[ELForeHeadBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeReadDeviceSupportUnit)];
}
break;
case ELBluetoothStateFailedValidation:
{
self.title = @"Illegal equipment";
}
break;
case ELBluetoothStateWillConnect:
self.title = @"Connecting";
break;
default:
break;
}
}
-(void)dealloc{
}

@end

+ 17
- 0
AILinkBleSDKDemo/Forehead/ForeheadScanViewController.h View File

@@ -0,0 +1,17 @@
//
// ForeheadScanViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/8.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface ForeheadScanViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

+ 89
- 0
AILinkBleSDKDemo/Forehead/ForeheadScanViewController.m View File

@@ -0,0 +1,89 @@
//
// ForeheadScanViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/8.
// Copyright © 2020 IOT. All rights reserved.
//

#import "ForeheadScanViewController.h"
#import "Masonry.h"
#import <AILinkBleSDK/ELForeHeadBleManager.h>
#import "ForeheadConnectViewController.h"

@interface ForeheadScanViewController ()<UITableViewDelegate,UITableViewDataSource,ELForeheadBleManagerDelegate>
@property (nonatomic, strong) UITableView *tableView;

@property (nonatomic, strong) NSArray<ELPeripheralModel *> *devices;

@end

@implementation ForeheadScanViewController

- (void)viewDidLoad {
[super viewDidLoad];
// self.title = @"Devices";
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.bottom.mas_equalTo(0);
}];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[ELForeHeadBleManager shareManager] startScan];
[ELForeHeadBleManager shareManager].foreheadDelegate = self;
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[[ELForeHeadBleManager shareManager] stopScan];
}
#pragma mark ============ ELBluetoothManagerDelegate ==============
-(void)foreheadBleManagerUpdateBleState:(ELBluetoothState)state{
NSLog(@"bluetoothManagerUpdateBleState = %ld",state);
}

-(void)foreheadBleManagerScanDevices:(NSArray<ELPeripheralModel *> *)devices{
self.devices = devices;
[self.tableView reloadData];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.devices.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellId = @"cellid";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
ELPeripheralModel *p = self.devices[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"Name:%@---Mac:%@\nCID:%ld---VID:%ld---PID:%ld",p.deviceName,p.macAddress,p.deviceType,p.vendorID,p.productID];
cell.textLabel.numberOfLines = 2;
cell.textLabel.textColor = [UIColor blackColor];
return cell;

}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
ELPeripheralModel *p = self.devices[indexPath.row];
ForeheadConnectViewController *vc = [[ForeheadConnectViewController alloc] init];
vc.p = p;
[self.navigationController pushViewController:vc animated:YES];
}
-(UITableView *)tableView{
if (_tableView == nil) {
_tableView = [[UITableView alloc] init];
_tableView.delegate = self;
_tableView.dataSource = self;
}
return _tableView;
}

@end

+ 17
- 0
AILinkBleSDKDemo/HeightGuage/HeightGuageConnectViewController.h View File

@@ -0,0 +1,17 @@
//
// HeightGuageConnectViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>
@class ELPeripheralModel;
NS_ASSUME_NONNULL_BEGIN

@interface HeightGuageConnectViewController : UIViewController
@property (nonatomic, strong) ELPeripheralModel *p;
@end

NS_ASSUME_NONNULL_END

+ 256
- 0
AILinkBleSDKDemo/HeightGuage/HeightGuageConnectViewController.m View File

@@ -0,0 +1,256 @@
//
// HeightGuageConnectViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import "HeightGuageConnectViewController.h"
#import "Masonry.h"
#import <AILinkBleSDK/ELHeightGaugeBleManager.h>

@interface HeightGuageConnectViewController ()<ELBluetoothManagerDelegate,ELHeightGaugeBleManagerDelegate>
@property (nonatomic, strong) UITextView *textView;

@end

@implementation HeightGuageConnectViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[ELHeightGaugeBleManager shareManager].heightGaugeDelegate = self;
[ELHeightGaugeBleManager shareManager].delegate =self;
[[ELHeightGaugeBleManager shareManager] connectPeripheral:self.p];
[self setupUIView];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[ELHeightGaugeBleManager shareManager] disconnectPeripheral];
}
-(void)addLog:(NSString *)log{
self.textView.text = [NSString stringWithFormat:@"%@\n%@",log,self.textView.text];
}
-(void)buttonAction:(UIButton *)sender{
if ([ELHeightGaugeBleManager shareManager].state != ELBluetoothStateDidValidationPass) {
[self addLog:@"Disconnected"];
return;
}
[self addLog:sender.titleLabel.text];
NSInteger tag = sender.tag;
if (tag == 1) {
//getBluetoothInfoWithELInetGetCmdType是获取设备信息的方法
[[ELHeightGaugeBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetBMVersion)];
}else if (tag == 2){
[[ELHeightGaugeBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetC_V_P_ID)];
}else if (tag == 3){
[[ELHeightGaugeBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetName)];
}else if (tag == 4){
[[ELHeightGaugeBleManager shareManager] setBluetoothName:@"AILink"];
}else if (tag == 5){
[[ELHeightGaugeBleManager shareManager] changeUnit:(ELDeviceHeightUnit_CM)];
}else if (tag == 6){
}else if (tag == 7){
}else if (tag == 8){
}else if (tag == 9){
}

}
-(void)setupUIView{
UIButton *button1 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button1 setTitle:@"Get BM Version" forState:(UIControlStateNormal)];
button1.tag = 1;
button1.titleLabel.adjustsFontSizeToFitWidth = YES;
button1.titleLabel.numberOfLines = 2;
button1.backgroundColor = [UIColor blackColor];
[button1 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button1];
[button1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button2 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button2 setTitle:@"Get C V P ID" forState:(UIControlStateNormal)];
button2.tag = 2;
button2.titleLabel.adjustsFontSizeToFitWidth = YES;
button2.titleLabel.numberOfLines = 2;
button2.backgroundColor = [UIColor blackColor];
[button2 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button2];
[button2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button1.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button3 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button3 setTitle:@"Get Name" forState:(UIControlStateNormal)];
button3.tag = 3;
button3.titleLabel.adjustsFontSizeToFitWidth = YES;
button3.titleLabel.numberOfLines = 2;
button3.backgroundColor = [UIColor blackColor];
[button3 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button3];
[button3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button2.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button4 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button4 setTitle:@"Set Name" forState:(UIControlStateNormal)];
button4.tag = 4;
button4.titleLabel.adjustsFontSizeToFitWidth = YES;
button4.titleLabel.numberOfLines = 2;
button4.backgroundColor = [UIColor blackColor];
[button4 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button4];
[button4 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button5 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button5 setTitle:@"Change Unit" forState:(UIControlStateNormal)];
button5.tag = 5;
button5.titleLabel.adjustsFontSizeToFitWidth = YES;
button5.titleLabel.numberOfLines = 2;
button5.backgroundColor = [UIColor blackColor];
[button5 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button5];
[button5 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button4.mas_right).mas_offset(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
self.textView = [[UITextView alloc] init];
self.textView.backgroundColor = [UIColor blackColor];
self.textView.text = @"Log";
self.textView.textColor = [UIColor redColor];
[self.view addSubview:self.textView];
[self.textView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.right.bottom.mas_equalTo(-10);
make.height.mas_equalTo(200);
}];
}

-(void)bluetoothManagerReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result{
if (type == ELInetSetCmdTypeSetName) {
if (result == ELSetBluetoothResponseTypeSuccess) {
[self addLog:@"Set name Success "];
}else if (result == ELSetBluetoothResponseTypeFailure){
[self addLog:@"Set name failure "];
}else if (result == ELSetBluetoothResponseTypeNoSupport){
[self addLog:@"Set name unsupport "];
}

}

}
-(void)bluetoothManagerReceiceName:(NSString *)name{
[self addLog:name];
}
-(void)bluetoothManagerReceiveDID:(struct ELDIDStruct)did{
[self addLog:[NSString stringWithFormat:@"CID = %d,VID = %d,PID = %d",did.deviceType,did.vendorID,did.productID]];
}

-(void)bluetoothManagerReceiveBMVersion:(NSString *)bmVersion{
[self addLog:bmVersion];
}

//MARK:获取设备支持的单位
-(void)bluetoothManagerBackDeviceSupportUnitWithWeight:(NSArray<NSNumber *> *)weightArray Height:(NSArray<NSNumber *> *)heightArray Temperature:(NSArray<NSNumber *> *)temperatureArray BloodPressure:(NSArray<NSNumber *> *)bloodPressureArray Pressure:(NSArray<NSNumber *> *)pressureArray{
//这里要身高单位
//设置单位时,要设置设备支持的单位
}

/**
call back ELHeightGaugeBleDataModel
*/
-(void)heightGaugeBleManagerReceiceTestData:(ELHeightGaugeBleDataModel *_Nonnull)model{
[self addLog:[NSString stringWithFormat:@"height = %ld unit = %@ point = %ld",model.height,AiLinkBleHeightUnitDic[@(model.heightUnit)],model.heightPoint]];
}

/**
call back the result of set unit
*/
-(void)heightGaugeBleManagerReceiveSetUnitResult:(ELSetBluetoothResponseType)type{
[self addLog:[NSString stringWithFormat:@"change unit result = %lu",(unsigned long)type]];
}

/**
call back fail code
*/
-(void)heightGaugeBleManagerReceiveFailCode:(ELHeightGaugeFailCode)code{
[self addLog:[NSString stringWithFormat:@"error code = %lu",(unsigned long)code]];
}
-(void)heightGaugeBleManagerUpdateBleState:(ELBluetoothState)state{
switch (state) {
case ELBluetoothStateUnavailable:
{
self.title = @"Please open the bluetooth";
}
break;
case ELBluetoothStateAvailable:
{
self.title = @"Bluetooth is open";
}
break;
case ELBluetoothStateScaning:
{
self.title = @"Scaning";
}
break;
case ELBluetoothStateConnectFail:
{
self.title = @"Connect fail";
}
break;
case ELBluetoothStateDidDisconnect:
{
self.title = @"Disconnected";
}
break;
case ELBluetoothStateDidValidationPass:
{
self.title = @"Connected";
[[ELHeightGaugeBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeReadDeviceSupportUnit)];
}
break;
case ELBluetoothStateFailedValidation:
{
self.title = @"Illegal equipment";
}
break;
case ELBluetoothStateWillConnect:
self.title = @"Connecting";
break;
default:
break;
}
}
-(void)dealloc{
}

@end

+ 17
- 0
AILinkBleSDKDemo/HeightGuage/HeightGuageScanViewController.h View File

@@ -0,0 +1,17 @@
//
// HeightGuageScanViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface HeightGuageScanViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

+ 89
- 0
AILinkBleSDKDemo/HeightGuage/HeightGuageScanViewController.m View File

@@ -0,0 +1,89 @@
//
// HeightGuageScanViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import "HeightGuageScanViewController.h"
#import "Masonry.h"
#import <AILinkBleSDK/ELHeightGaugeBleManager.h>
#import "HeightGuageConnectViewController.h"

@interface HeightGuageScanViewController ()<UITableViewDelegate,UITableViewDataSource,ELHeightGaugeBleManagerDelegate>
@property (nonatomic, strong) UITableView *tableView;

@property (nonatomic, strong) NSArray<ELPeripheralModel *> *devices;

@end

@implementation HeightGuageScanViewController

- (void)viewDidLoad {
[super viewDidLoad];
// self.title = @"Devices";
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.bottom.mas_equalTo(0);
}];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[ELHeightGaugeBleManager shareManager] startScan];
[ELHeightGaugeBleManager shareManager].heightGaugeDelegate = self;
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[[ELHeightGaugeBleManager shareManager] stopScan];
}
#pragma mark ============ ELBluetoothManagerDelegate ==============
-(void)heightGaugeBleManagerUpdateBleState:(ELBluetoothState)state{
NSLog(@"bluetoothManagerUpdateBleState = %ld",state);
}

-(void)heightGaugeBleManagerScanDevices:(NSArray<ELPeripheralModel *> *)devices{
self.devices = devices;
[self.tableView reloadData];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.devices.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellId = @"cellid";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
ELPeripheralModel *p = self.devices[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"Name:%@---Mac:%@\nCID:%ld---VID:%ld---PID:%ld",p.deviceName,p.macAddress,p.deviceType,p.vendorID,p.productID];
cell.textLabel.numberOfLines = 2;
cell.textLabel.textColor = [UIColor blackColor];
return cell;

}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
ELPeripheralModel *p = self.devices[indexPath.row];
HeightGuageConnectViewController *vc = [[HeightGuageConnectViewController alloc] init];
vc.p = p;
[self.navigationController pushViewController:vc animated:YES];
}
-(UITableView *)tableView{
if (_tableView == nil) {
_tableView = [[UITableView alloc] init];
_tableView.delegate = self;
_tableView.dataSource = self;
}
return _tableView;
}

@end

+ 66
- 0
AILinkBleSDKDemo/Info.plist View File

@@ -0,0 +1,66 @@
<?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>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>NSBluetoothAlwaysUsageDescription</key>
<string></string>
</dict>
</plist>

+ 18
- 0
AILinkBleSDKDemo/Inherit/InheritConnectViewController.h View File

@@ -0,0 +1,18 @@
//
// InheritConnectViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>

@class ELPeripheralModel;
NS_ASSUME_NONNULL_BEGIN

@interface InheritConnectViewController : UIViewController
@property (nonatomic, strong) ELPeripheralModel *p;
@end

NS_ASSUME_NONNULL_END

+ 252
- 0
AILinkBleSDKDemo/Inherit/InheritConnectViewController.m View File

@@ -0,0 +1,252 @@
//
// InheritConnectViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import "InheritConnectViewController.h"
#import "Masonry.h"
#import "SubBleManager.h"

@interface InheritConnectViewController ()<SubBleManagerDelegate,ELBluetoothManagerDelegate>
@property (nonatomic, strong) UITextView *textView;
@end

@implementation InheritConnectViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[SubBleManager shareManager].subDelegate = self;
[SubBleManager shareManager].delegate =self;
[[SubBleManager shareManager] connectPeripheral:self.p];
[self setupUIView];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[SubBleManager shareManager] disconnectPeripheral];
}
-(void)addLog:(NSString *)log{
self.textView.text = [NSString stringWithFormat:@"%@\n%@",log,self.textView.text];
}
-(void)buttonAction:(UIButton *)sender{
if ([SubBleManager shareManager].state != ELBluetoothStateDidValidationPass) {
[self addLog:@"Disconnected"];
return;
}
[self addLog:sender.titleLabel.text];
NSInteger tag = sender.tag;
if (tag == 1) {
//getBluetoothInfoWithELInetGetCmdType是获取设备信息的方法
[[SubBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetBMVersion)];
}else if (tag == 2){
[[SubBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetC_V_P_ID)];
}else if (tag == 3){
[[SubBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetName)];
}else if (tag == 4){
[[SubBleManager shareManager] setBluetoothName:@"AILink"];
}else if (tag == 5){
//MARK:发送A6数据
Byte b[5] = {0xA6,0x01,0x01,0x02,0x6A};
NSData *data = [[NSData alloc] initWithBytes:b length:5];
[self addLog:data.description];
[[SubBleManager shareManager] sendData:data];
}else if (tag == 6){
//MARK:发送A7数据
//假设根据协议得到数据为{0xA7,0x06,0x01,0x01,0x01,0x01,0x01,0x01,0x0B,0x7A}
//则payload为
Byte b[6] = {0x01,0x01,0x01,0x01,0x01,0x01};
NSData *payload = [[NSData alloc] initWithBytes:b length:6];
[self addLog:payload.description];
[[SubBleManager shareManager] sendData:payload];
}

}
-(void)setupUIView{
UIButton *button1 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button1 setTitle:@"Get BM Version" forState:(UIControlStateNormal)];
button1.tag = 1;
button1.titleLabel.adjustsFontSizeToFitWidth = YES;
button1.titleLabel.numberOfLines = 2;
button1.backgroundColor = [UIColor blackColor];
[button1 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button1];
[button1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button2 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button2 setTitle:@"Get C V P ID" forState:(UIControlStateNormal)];
button2.tag = 2;
button2.titleLabel.adjustsFontSizeToFitWidth = YES;
button2.titleLabel.numberOfLines = 2;
button2.backgroundColor = [UIColor blackColor];
[button2 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button2];
[button2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button1.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
UIButton *button3 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button3 setTitle:@"Get Name" forState:(UIControlStateNormal)];
button3.tag = 3;
button3.titleLabel.adjustsFontSizeToFitWidth = YES;
button3.titleLabel.numberOfLines = 2;
button3.backgroundColor = [UIColor blackColor];
[button3 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button3];
[button3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button2.mas_right).mas_offset(10);
make.top.mas_equalTo(80);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button4 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button4 setTitle:@"Set Name" forState:(UIControlStateNormal)];
button4.tag = 4;
button4.titleLabel.adjustsFontSizeToFitWidth = YES;
button4.titleLabel.numberOfLines = 2;
button4.backgroundColor = [UIColor blackColor];
[button4 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button4];
[button4 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
UIButton *button5 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button5 setTitle:@"Send A6 Data" forState:(UIControlStateNormal)];
button5.tag = 5;
button5.titleLabel.adjustsFontSizeToFitWidth = YES;
button5.titleLabel.numberOfLines = 2;
button5.backgroundColor = [UIColor blackColor];
[button5 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button5];
[button5 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button4.mas_right).mas_offset(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
//
UIButton *button6 = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button6 setTitle:@"Send A7 Data" forState:(UIControlStateNormal)];
button6.tag = 6;
button6.titleLabel.adjustsFontSizeToFitWidth = YES;
button6.titleLabel.numberOfLines = 2;
button6.backgroundColor = [UIColor blackColor];
[button6 addTarget:self action:@selector(buttonAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button6];
[button6 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(button5.mas_right).mas_offset(10);
make.top.equalTo(button1.mas_bottom).mas_offset(10);
make.width.mas_equalTo(100);
make.height.mas_equalTo(40);
}];
//
self.textView = [[UITextView alloc] init];
self.textView.backgroundColor = [UIColor blackColor];
self.textView.text = @"Log";
self.textView.textColor = [UIColor redColor];
[self.view addSubview:self.textView];
[self.textView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.right.bottom.mas_equalTo(-10);
make.height.mas_equalTo(200);
}];
}

-(void)bluetoothManagerReceiceResponseType:(ELInetSetCmdType)type result:(ELSetBluetoothResponseType)result{
if (type == ELInetSetCmdTypeSetName) {
if (result == ELSetBluetoothResponseTypeSuccess) {
[self addLog:@"Set name Success "];
}else if (result == ELSetBluetoothResponseTypeFailure){
[self addLog:@"Set name failure "];
}else if (result == ELSetBluetoothResponseTypeNoSupport){
[self addLog:@"Set name unsupport "];
}
}
}
-(void)bluetoothManagerReceiceName:(NSString *)name{
[self addLog:name];
}
-(void)bluetoothManagerReceiveDID:(struct ELDIDStruct)did{
[self addLog:[NSString stringWithFormat:@"CID = %ld,VID = %d,PID = %d",did.deviceType,did.vendorID,did.productID]];
}

-(void)bluetoothManagerReceiveBMVersion:(NSString *)bmVersion{
[self addLog:bmVersion];
}
//MARK:获取设备支持的单位
-(void)bluetoothManagerBackDeviceSupportUnitWithWeight:(NSArray<NSNumber *> *)weightArray Height:(NSArray<NSNumber *> *)heightArray Temperature:(NSArray<NSNumber *> *)temperatureArray BloodPressure:(NSArray<NSNumber *> *)bloodPressureArray Pressure:(NSArray<NSNumber *> *)pressureArray{
//需要什么单位根据设备而定
//设置单位时,要设置设备支持的单位
}

-(void)subBluetoothUpdateState:(ELBluetoothState)state{
switch (state) {
case ELBluetoothStateUnavailable:
{
self.title = @"Please open the bluetooth";
}
break;
case ELBluetoothStateAvailable:
{
self.title = @"Bluetooth is open";
}
break;
case ELBluetoothStateScaning:
{
self.title = @"Scaning";
}
break;
case ELBluetoothStateConnectFail:
{
self.title = @"Connect fail";
}
break;
case ELBluetoothStateDidDisconnect:
{
self.title = @"Disconnected";
}
break;
case ELBluetoothStateDidValidationPass:
{
self.title = @"Connected";
[[SubBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeReadDeviceSupportUnit)];
}
break;
case ELBluetoothStateFailedValidation:
{
self.title = @"Illegal equipment";
}
break;
case ELBluetoothStateWillConnect:
self.title = @"Connecting";
break;
default:
break;
}
}
-(void)dealloc{
}

@end

+ 17
- 0
AILinkBleSDKDemo/Inherit/InheritScanViewController.h View File

@@ -0,0 +1,17 @@
//
// InheritScanViewController.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface InheritScanViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

+ 91
- 0
AILinkBleSDKDemo/Inherit/InheritScanViewController.m View File

@@ -0,0 +1,91 @@
//
// InheritScanViewController.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import "InheritScanViewController.h"
#import <AILinkBleSDK/ELBluetoothManager.h>
#import "Masonry.h"
#import "SubBleManager.h"
#import "InheritConnectViewController.h"

@interface InheritScanViewController ()<UITableViewDelegate,UITableViewDataSource,SubBleManagerDelegate>
@property (nonatomic, strong) UITableView *tableView;

@property (nonatomic, strong) NSArray<ELPeripheralModel *> *devices;

@end

@implementation InheritScanViewController


- (void)viewDidLoad {
[super viewDidLoad];
// self.title = @"Devices";
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.bottom.mas_equalTo(0);
}];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[SubBleManager shareManager] startScan];
[SubBleManager shareManager].subDelegate = self;
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[[ELBluetoothManager shareManager] stopScan];
}
#pragma mark ============ ELBluetoothManagerDelegate ==============
-(void)subBluetoothUpdateState:(ELBluetoothState)state{
NSLog(@"bluetoothManagerUpdateBleState = %ld",state);
}

-(void)subBluetoothScanPeripherals:(NSArray *)peripherals{
self.devices = peripherals;
[self.tableView reloadData];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.devices.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellId = @"cellid";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
ELPeripheralModel *p = self.devices[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"Name:%@---Mac:%@\nCID:%ld---VID:%ld---PID:%ld",p.deviceName,p.macAddress,p.deviceType,p.vendorID,p.productID];
cell.textLabel.numberOfLines = 2;
cell.textLabel.textColor = [UIColor blackColor];
return cell;

}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
ELPeripheralModel *p = self.devices[indexPath.row];
InheritConnectViewController *vc = [[InheritConnectViewController alloc] init];
vc.p = p;
[self.navigationController pushViewController:vc animated:YES];
}
-(UITableView *)tableView{
if (_tableView == nil) {
_tableView = [[UITableView alloc] init];
_tableView.delegate = self;
_tableView.dataSource = self;
}
return _tableView;
}

@end

+ 38
- 0
AILinkBleSDKDemo/Inherit/SubBleManager.h View File

@@ -0,0 +1,38 @@
//
// SubBleManager.h
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import <AILinkBleSDK/ELBluetoothManager.h>

@protocol SubBleManagerDelegate <NSObject>

//蓝牙连接状态
-(void)subBluetoothUpdateState:(ELBluetoothState)state;
//扫描到的设备
-(void)subBluetoothScanPeripherals:(NSArray *)peripherals;
@end


NS_ASSUME_NONNULL_BEGIN

@interface SubBleManager : ELBluetoothManager
//
@property (nonatomic, weak) id<SubBleManagerDelegate> subDelegate;

+(instancetype)shareManager;


/// 发送数据给mcu
/// @param data 协议对应数据
-(void)subBleSendA6Data:(NSData *)data;

/// 发送数据给蓝牙
/// @param payload 协议的payload部分数据
-(void)subBleSendA7Data:(NSData *)payload;
@end

NS_ASSUME_NONNULL_END

+ 87
- 0
AILinkBleSDKDemo/Inherit/SubBleManager.m View File

@@ -0,0 +1,87 @@
//
// SubBleManager.m
// AILinkBleSDKSourceCode
//
// Created by iot_user on 2020/4/7.
// Copyright © 2020 IOT. All rights reserved.
//

#import "SubBleManager.h"

@implementation SubBleManager
+(instancetype)shareManager{
static SubBleManager *manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[self alloc] init];
});

return manager;
}
#pragma mark ============ 实现父类的方法 ==============
-(void)bluetoothUpdateState:(ELBluetoothState)state{
if ([self.subDelegate respondsToSelector:@selector(subBluetoothUpdateState:)]) {
[self.subDelegate subBluetoothUpdateState:state];
}

}

-(void)bluetoothScanPeripherals:(NSArray *)peripherals{
//筛选单种设备
//这里以体脂秤为例
NSArray *device = [ELPeripheralModel getDevicesWithPeripherals:peripherals supportDeviceType:(ELSupportDeviceTypeBodyFatScale)];
// NSArray *device = [ELPeripheralModel getDevicesWithPeripherals:peripherals supportDeviceTypes:@[@(ELSupportDeviceTypeBodyFatScale),@(ELSupportDeviceTypeBLE_WIFIScale)]];
if ([self.subDelegate respondsToSelector:@selector(subBluetoothScanPeripherals:)]) {
[self.subDelegate subBluetoothScanPeripherals:device];
}

}


/**
Callback decrypted A7 transparent data (payload part), type device type( 回调解密后的A7透传数据(payload部分),type设备类型)
*/
-(void)bluetoothReceiveData:(NSData *)playload deviceType:(ELSupportDeviceType)type{
if (type == ELSupportDeviceTypeBodyFatScale /*|| type == ELSupportDeviceTypeBLE_WIFIScale*/) {
//根据体脂秤协议解析playload部分
}
}

/**
The special A6 data will only be received by the supported devices, and the complete A6 data (A6 is not encrypted) is passed to the subclass resolution.
特殊的A6数据,只有支持的设备才会收到,将完整A6数据(A6不加密)传给子类解析
ELSupportDeviceType support:
ELSupportDeviceTypeBodyFatScale
ELSupportDeviceTypeSmartLock
*/
-(void)bluetoothBackA6Data:(NSData *)data withClassId:(ELSupportDeviceType)type{
if (type == ELSupportDeviceTypeBodyFatScale /*|| type == ELSupportDeviceTypeBLE_WIFIScale*/) {
//根据体脂秤协议解析data部分
}
}

/**
Callback to scan special devices that can be bound, such as door locks(回调扫描到的可以绑定的特殊设备,如门锁)
*/
-(void)bluetoothScanCanBindSpecialPeripherals:(NSArray *)peripherals{
//特殊数据:这个方法目前只有门锁会用到
}

/**
Callback device basic information(回调设备基本信息)

@param data Device basic information payload data (length is 16 bytes)(设备基本信息pabyload数据(长度为16个byte))
*/
-(void)bluetoothReceiveBasicInfoPayloadData:(NSData *)data{
//特殊数据:门锁和胎压监测会用到,需根据具体协议解析
}
#pragma mark ============ 发送数据给蓝牙 ==============
-(void)subBleSendA6Data:(NSData *)data{
[self sendCmdToMCUWithA6PayloadData:data];
}
-(void)subBleSendA7Data:(NSData *)payload{
[self sendCmdToMCUWithA7PayloadData:payload deviceType:(ELSupportDeviceTypeBodyFatScale)];
}
@end

+ 47
- 0
AILinkBleSDKDemo/Main.storyboard View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15705" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="0sa-4L-yEo">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15706"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--AiLinkBleSDK-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
<navigationItem key="navigationItem" title="AiLinkBleSDK" id="xuc-kS-VAC">
<barButtonItem key="backBarButtonItem" title="Back" id="1KB-6k-EVp"/>
</navigationItem>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1047.8260869565217" y="137.94642857142856"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="YsI-e1-hcJ">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="0sa-4L-yEo" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="Rxy-eQ-EUU">
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="zhi-FC-KEN"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="vUu-Ht-Of2" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="137.68115942028987" y="137.94642857142856"/>
</scene>
</scenes>
</document>

+ 19
- 0
AILinkBleSDKDemo/Masonry/LICENSE View File

@@ -0,0 +1,19 @@
Copyright (c) 2011-2012 Masonry Team - https://github.com/Masonry

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

+ 26
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASCompositeConstraint.h View File

@@ -0,0 +1,26 @@
//
// MASCompositeConstraint.h
// Masonry
//
// Created by Jonas Budelmann on 21/07/13.
// Copyright (c) 2013 cloudling. All rights reserved.
//

#import "MASConstraint.h"
#import "MASUtilities.h"

/**
* A group of MASConstraint objects
*/
@interface MASCompositeConstraint : MASConstraint

/**
* Creates a composite with a predefined array of children
*
* @param children child MASConstraints
*
* @return a composite constraint
*/
- (id)initWithChildren:(NSArray *)children;

@end

+ 183
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASCompositeConstraint.m View File

@@ -0,0 +1,183 @@
//
// MASCompositeConstraint.m
// Masonry
//
// Created by Jonas Budelmann on 21/07/13.
// Copyright (c) 2013 cloudling. All rights reserved.
//

#import "MASCompositeConstraint.h"
#import "MASConstraint+Private.h"

@interface MASCompositeConstraint () <MASConstraintDelegate>

@property (nonatomic, strong) id mas_key;
@property (nonatomic, strong) NSMutableArray *childConstraints;

@end

@implementation MASCompositeConstraint

- (id)initWithChildren:(NSArray *)children {
self = [super init];
if (!self) return nil;

_childConstraints = [children mutableCopy];
for (MASConstraint *constraint in _childConstraints) {
constraint.delegate = self;
}

return self;
}

#pragma mark - MASConstraintDelegate

- (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint {
NSUInteger index = [self.childConstraints indexOfObject:constraint];
NSAssert(index != NSNotFound, @"Could not find constraint %@", constraint);
[self.childConstraints replaceObjectAtIndex:index withObject:replacementConstraint];
}

- (MASConstraint *)constraint:(MASConstraint __unused *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
id<MASConstraintDelegate> strongDelegate = self.delegate;
MASConstraint *newConstraint = [strongDelegate constraint:self addConstraintWithLayoutAttribute:layoutAttribute];
newConstraint.delegate = self;
[self.childConstraints addObject:newConstraint];
return newConstraint;
}

#pragma mark - NSLayoutConstraint multiplier proxies

- (MASConstraint * (^)(CGFloat))multipliedBy {
return ^id(CGFloat multiplier) {
for (MASConstraint *constraint in self.childConstraints) {
constraint.multipliedBy(multiplier);
}
return self;
};
}

- (MASConstraint * (^)(CGFloat))dividedBy {
return ^id(CGFloat divider) {
for (MASConstraint *constraint in self.childConstraints) {
constraint.dividedBy(divider);
}
return self;
};
}

#pragma mark - MASLayoutPriority proxy

- (MASConstraint * (^)(MASLayoutPriority))priority {
return ^id(MASLayoutPriority priority) {
for (MASConstraint *constraint in self.childConstraints) {
constraint.priority(priority);
}
return self;
};
}

#pragma mark - NSLayoutRelation proxy

- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation {
return ^id(id attr, NSLayoutRelation relation) {
for (MASConstraint *constraint in self.childConstraints.copy) {
constraint.equalToWithRelation(attr, relation);
}
return self;
};
}

#pragma mark - attribute chaining

- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
[self constraint:self addConstraintWithLayoutAttribute:layoutAttribute];
return self;
}

#pragma mark - Animator proxy

#if TARGET_OS_MAC && !(TARGET_OS_IPHONE || TARGET_OS_TV)

- (MASConstraint *)animator {
for (MASConstraint *constraint in self.childConstraints) {
[constraint animator];
}
return self;
}

#endif

#pragma mark - debug helpers

- (MASConstraint * (^)(id))key {
return ^id(id key) {
self.mas_key = key;
int i = 0;
for (MASConstraint *constraint in self.childConstraints) {
constraint.key([NSString stringWithFormat:@"%@[%d]", key, i++]);
}
return self;
};
}

#pragma mark - NSLayoutConstraint constant setters

- (void)setInsets:(MASEdgeInsets)insets {
for (MASConstraint *constraint in self.childConstraints) {
constraint.insets = insets;
}
}

- (void)setInset:(CGFloat)inset {
for (MASConstraint *constraint in self.childConstraints) {
constraint.inset = inset;
}
}

- (void)setOffset:(CGFloat)offset {
for (MASConstraint *constraint in self.childConstraints) {
constraint.offset = offset;
}
}

- (void)setSizeOffset:(CGSize)sizeOffset {
for (MASConstraint *constraint in self.childConstraints) {
constraint.sizeOffset = sizeOffset;
}
}

- (void)setCenterOffset:(CGPoint)centerOffset {
for (MASConstraint *constraint in self.childConstraints) {
constraint.centerOffset = centerOffset;
}
}

#pragma mark - MASConstraint

- (void)activate {
for (MASConstraint *constraint in self.childConstraints) {
[constraint activate];
}
}

- (void)deactivate {
for (MASConstraint *constraint in self.childConstraints) {
[constraint deactivate];
}
}

- (void)install {
for (MASConstraint *constraint in self.childConstraints) {
constraint.updateExisting = self.updateExisting;
[constraint install];
}
}

- (void)uninstall {
for (MASConstraint *constraint in self.childConstraints) {
[constraint uninstall];
}
}

@end

+ 66
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASConstraint+Private.h View File

@@ -0,0 +1,66 @@
//
// MASConstraint+Private.h
// Masonry
//
// Created by Nick Tymchenko on 29/04/14.
// Copyright (c) 2014 cloudling. All rights reserved.
//

#import "MASConstraint.h"

@protocol MASConstraintDelegate;


@interface MASConstraint ()

/**
* Whether or not to check for an existing constraint instead of adding constraint
*/
@property (nonatomic, assign) BOOL updateExisting;

/**
* Usually MASConstraintMaker but could be a parent MASConstraint
*/
@property (nonatomic, weak) id<MASConstraintDelegate> delegate;

/**
* Based on a provided value type, is equal to calling:
* NSNumber - setOffset:
* NSValue with CGPoint - setPointOffset:
* NSValue with CGSize - setSizeOffset:
* NSValue with MASEdgeInsets - setInsets:
*/
- (void)setLayoutConstantWithValue:(NSValue *)value;

@end


@interface MASConstraint (Abstract)

/**
* Sets the constraint relation to given NSLayoutRelation
* returns a block which accepts one of the following:
* MASViewAttribute, UIView, NSValue, NSArray
* see readme for more details.
*/
- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation;

/**
* Override to set a custom chaining behaviour
*/
- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute;

@end


@protocol MASConstraintDelegate <NSObject>

/**
* Notifies the delegate when the constraint needs to be replaced with another constraint. For example
* A MASViewConstraint may turn into a MASCompositeConstraint when an array is passed to one of the equality blocks
*/
- (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint;

- (MASConstraint *)constraint:(MASConstraint *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute;

@end

+ 272
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASConstraint.h View File

@@ -0,0 +1,272 @@
//
// MASConstraint.h
// Masonry
//
// Created by Jonas Budelmann on 22/07/13.
// Copyright (c) 2013 cloudling. All rights reserved.
//

#import "MASUtilities.h"

/**
* Enables Constraints to be created with chainable syntax
* Constraint can represent single NSLayoutConstraint (MASViewConstraint)
* or a group of NSLayoutConstraints (MASComposisteConstraint)
*/
@interface MASConstraint : NSObject

// Chaining Support

/**
* Modifies the NSLayoutConstraint constant,
* only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
* NSLayoutAttributeTop, NSLayoutAttributeLeft, NSLayoutAttributeBottom, NSLayoutAttributeRight
*/
- (MASConstraint * (^)(MASEdgeInsets insets))insets;

/**
* Modifies the NSLayoutConstraint constant,
* only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
* NSLayoutAttributeTop, NSLayoutAttributeLeft, NSLayoutAttributeBottom, NSLayoutAttributeRight
*/
- (MASConstraint * (^)(CGFloat inset))inset;

/**
* Modifies the NSLayoutConstraint constant,
* only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
* NSLayoutAttributeWidth, NSLayoutAttributeHeight
*/
- (MASConstraint * (^)(CGSize offset))sizeOffset;

/**
* Modifies the NSLayoutConstraint constant,
* only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
* NSLayoutAttributeCenterX, NSLayoutAttributeCenterY
*/
- (MASConstraint * (^)(CGPoint offset))centerOffset;

/**
* Modifies the NSLayoutConstraint constant
*/
- (MASConstraint * (^)(CGFloat offset))offset;

/**
* Modifies the NSLayoutConstraint constant based on a value type
*/
- (MASConstraint * (^)(NSValue *value))valueOffset;

/**
* Sets the NSLayoutConstraint multiplier property
*/
- (MASConstraint * (^)(CGFloat multiplier))multipliedBy;

/**
* Sets the NSLayoutConstraint multiplier to 1.0/dividedBy
*/
- (MASConstraint * (^)(CGFloat divider))dividedBy;

/**
* Sets the NSLayoutConstraint priority to a float or MASLayoutPriority
*/
- (MASConstraint * (^)(MASLayoutPriority priority))priority;

/**
* Sets the NSLayoutConstraint priority to MASLayoutPriorityLow
*/
- (MASConstraint * (^)(void))priorityLow;

/**
* Sets the NSLayoutConstraint priority to MASLayoutPriorityMedium
*/
- (MASConstraint * (^)(void))priorityMedium;

/**
* Sets the NSLayoutConstraint priority to MASLayoutPriorityHigh
*/
- (MASConstraint * (^)(void))priorityHigh;

/**
* Sets the constraint relation to NSLayoutRelationEqual
* returns a block which accepts one of the following:
* MASViewAttribute, UIView, NSValue, NSArray
* see readme for more details.
*/
- (MASConstraint * (^)(id attr))equalTo;

/**
* Sets the constraint relation to NSLayoutRelationGreaterThanOrEqual
* returns a block which accepts one of the following:
* MASViewAttribute, UIView, NSValue, NSArray
* see readme for more details.
*/
- (MASConstraint * (^)(id attr))greaterThanOrEqualTo;

/**
* Sets the constraint relation to NSLayoutRelationLessThanOrEqual
* returns a block which accepts one of the following:
* MASViewAttribute, UIView, NSValue, NSArray
* see readme for more details.
*/
- (MASConstraint * (^)(id attr))lessThanOrEqualTo;

/**
* Optional semantic property which has no effect but improves the readability of constraint
*/
- (MASConstraint *)with;

/**
* Optional semantic property which has no effect but improves the readability of constraint
*/
- (MASConstraint *)and;

/**
* Creates a new MASCompositeConstraint with the called attribute and reciever
*/
- (MASConstraint *)left;
- (MASConstraint *)top;
- (MASConstraint *)right;
- (MASConstraint *)bottom;
- (MASConstraint *)leading;
- (MASConstraint *)trailing;
- (MASConstraint *)width;
- (MASConstraint *)height;
- (MASConstraint *)centerX;
- (MASConstraint *)centerY;
- (MASConstraint *)baseline;

#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)

- (MASConstraint *)firstBaseline;
- (MASConstraint *)lastBaseline;

#endif

#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000)

- (MASConstraint *)leftMargin;
- (MASConstraint *)rightMargin;
- (MASConstraint *)topMargin;
- (MASConstraint *)bottomMargin;
- (MASConstraint *)leadingMargin;
- (MASConstraint *)trailingMargin;
- (MASConstraint *)centerXWithinMargins;
- (MASConstraint *)centerYWithinMargins;

#endif


/**
* Sets the constraint debug name
*/
- (MASConstraint * (^)(id key))key;

// NSLayoutConstraint constant Setters
// for use outside of mas_updateConstraints/mas_makeConstraints blocks

/**
* Modifies the NSLayoutConstraint constant,
* only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
* NSLayoutAttributeTop, NSLayoutAttributeLeft, NSLayoutAttributeBottom, NSLayoutAttributeRight
*/
- (void)setInsets:(MASEdgeInsets)insets;

/**
* Modifies the NSLayoutConstraint constant,
* only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
* NSLayoutAttributeTop, NSLayoutAttributeLeft, NSLayoutAttributeBottom, NSLayoutAttributeRight
*/
- (void)setInset:(CGFloat)inset;

/**
* Modifies the NSLayoutConstraint constant,
* only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
* NSLayoutAttributeWidth, NSLayoutAttributeHeight
*/
- (void)setSizeOffset:(CGSize)sizeOffset;

/**
* Modifies the NSLayoutConstraint constant,
* only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
* NSLayoutAttributeCenterX, NSLayoutAttributeCenterY
*/
- (void)setCenterOffset:(CGPoint)centerOffset;

/**
* Modifies the NSLayoutConstraint constant
*/
- (void)setOffset:(CGFloat)offset;


// NSLayoutConstraint Installation support

#if TARGET_OS_MAC && !(TARGET_OS_IPHONE || TARGET_OS_TV)
/**
* Whether or not to go through the animator proxy when modifying the constraint
*/
@property (nonatomic, copy, readonly) MASConstraint *animator;
#endif

/**
* Activates an NSLayoutConstraint if it's supported by an OS.
* Invokes install otherwise.
*/
- (void)activate;

/**
* Deactivates previously installed/activated NSLayoutConstraint.
*/
- (void)deactivate;

/**
* Creates a NSLayoutConstraint and adds it to the appropriate view.
*/
- (void)install;

/**
* Removes previously installed NSLayoutConstraint
*/
- (void)uninstall;

@end


/**
* Convenience auto-boxing macros for MASConstraint methods.
*
* Defining MAS_SHORTHAND_GLOBALS will turn on auto-boxing for default syntax.
* A potential drawback of this is that the unprefixed macros will appear in global scope.
*/
#define mas_equalTo(...) equalTo(MASBoxValue((__VA_ARGS__)))
#define mas_greaterThanOrEqualTo(...) greaterThanOrEqualTo(MASBoxValue((__VA_ARGS__)))
#define mas_lessThanOrEqualTo(...) lessThanOrEqualTo(MASBoxValue((__VA_ARGS__)))

#define mas_offset(...) valueOffset(MASBoxValue((__VA_ARGS__)))


#ifdef MAS_SHORTHAND_GLOBALS

#define equalTo(...) mas_equalTo(__VA_ARGS__)
#define greaterThanOrEqualTo(...) mas_greaterThanOrEqualTo(__VA_ARGS__)
#define lessThanOrEqualTo(...) mas_lessThanOrEqualTo(__VA_ARGS__)

#define offset(...) mas_offset(__VA_ARGS__)

#endif


@interface MASConstraint (AutoboxingSupport)

/**
* Aliases to corresponding relation methods (for shorthand macros)
* Also needed to aid autocompletion
*/
- (MASConstraint * (^)(id attr))mas_equalTo;
- (MASConstraint * (^)(id attr))mas_greaterThanOrEqualTo;
- (MASConstraint * (^)(id attr))mas_lessThanOrEqualTo;

/**
* A dummy method to aid autocompletion
*/
- (MASConstraint * (^)(id offset))mas_offset;

@end

+ 301
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASConstraint.m View File

@@ -0,0 +1,301 @@
//
// MASConstraint.m
// Masonry
//
// Created by Nick Tymchenko on 1/20/14.
//

#import "MASConstraint.h"
#import "MASConstraint+Private.h"

#define MASMethodNotImplemented() \
@throw [NSException exceptionWithName:NSInternalInconsistencyException \
reason:[NSString stringWithFormat:@"You must override %@ in a subclass.", NSStringFromSelector(_cmd)] \
userInfo:nil]

@implementation MASConstraint

#pragma mark - Init

- (id)init {
NSAssert(![self isMemberOfClass:[MASConstraint class]], @"MASConstraint is an abstract class, you should not instantiate it directly.");
return [super init];
}

#pragma mark - NSLayoutRelation proxies

- (MASConstraint * (^)(id))equalTo {
return ^id(id attribute) {
return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
};
}

- (MASConstraint * (^)(id))mas_equalTo {
return ^id(id attribute) {
return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
};
}

- (MASConstraint * (^)(id))greaterThanOrEqualTo {
return ^id(id attribute) {
return self.equalToWithRelation(attribute, NSLayoutRelationGreaterThanOrEqual);
};
}

- (MASConstraint * (^)(id))mas_greaterThanOrEqualTo {
return ^id(id attribute) {
return self.equalToWithRelation(attribute, NSLayoutRelationGreaterThanOrEqual);
};
}

- (MASConstraint * (^)(id))lessThanOrEqualTo {
return ^id(id attribute) {
return self.equalToWithRelation(attribute, NSLayoutRelationLessThanOrEqual);
};
}

- (MASConstraint * (^)(id))mas_lessThanOrEqualTo {
return ^id(id attribute) {
return self.equalToWithRelation(attribute, NSLayoutRelationLessThanOrEqual);
};
}

#pragma mark - MASLayoutPriority proxies

- (MASConstraint * (^)(void))priorityLow {
return ^id{
self.priority(MASLayoutPriorityDefaultLow);
return self;
};
}

- (MASConstraint * (^)(void))priorityMedium {
return ^id{
self.priority(MASLayoutPriorityDefaultMedium);
return self;
};
}

- (MASConstraint * (^)(void))priorityHigh {
return ^id{
self.priority(MASLayoutPriorityDefaultHigh);
return self;
};
}

#pragma mark - NSLayoutConstraint constant proxies

- (MASConstraint * (^)(MASEdgeInsets))insets {
return ^id(MASEdgeInsets insets){
self.insets = insets;
return self;
};
}

- (MASConstraint * (^)(CGFloat))inset {
return ^id(CGFloat inset){
self.inset = inset;
return self;
};
}

- (MASConstraint * (^)(CGSize))sizeOffset {
return ^id(CGSize offset) {
self.sizeOffset = offset;
return self;
};
}

- (MASConstraint * (^)(CGPoint))centerOffset {
return ^id(CGPoint offset) {
self.centerOffset = offset;
return self;
};
}

- (MASConstraint * (^)(CGFloat))offset {
return ^id(CGFloat offset){
self.offset = offset;
return self;
};
}

- (MASConstraint * (^)(NSValue *value))valueOffset {
return ^id(NSValue *offset) {
NSAssert([offset isKindOfClass:NSValue.class], @"expected an NSValue offset, got: %@", offset);
[self setLayoutConstantWithValue:offset];
return self;
};
}

- (MASConstraint * (^)(id offset))mas_offset {
// Will never be called due to macro
return nil;
}

#pragma mark - NSLayoutConstraint constant setter

- (void)setLayoutConstantWithValue:(NSValue *)value {
if ([value isKindOfClass:NSNumber.class]) {
self.offset = [(NSNumber *)value doubleValue];
} else if (strcmp(value.objCType, @encode(CGPoint)) == 0) {
CGPoint point;
[value getValue:&point];
self.centerOffset = point;
} else if (strcmp(value.objCType, @encode(CGSize)) == 0) {
CGSize size;
[value getValue:&size];
self.sizeOffset = size;
} else if (strcmp(value.objCType, @encode(MASEdgeInsets)) == 0) {
MASEdgeInsets insets;
[value getValue:&insets];
self.insets = insets;
} else {
NSAssert(NO, @"attempting to set layout constant with unsupported value: %@", value);
}
}

#pragma mark - Semantic properties

- (MASConstraint *)with {
return self;
}

- (MASConstraint *)and {
return self;
}

#pragma mark - Chaining

- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute __unused)layoutAttribute {
MASMethodNotImplemented();
}

- (MASConstraint *)left {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeft];
}

- (MASConstraint *)top {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTop];
}

- (MASConstraint *)right {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRight];
}

- (MASConstraint *)bottom {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottom];
}

- (MASConstraint *)leading {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeading];
}

- (MASConstraint *)trailing {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailing];
}

- (MASConstraint *)width {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeWidth];
}

- (MASConstraint *)height {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeHeight];
}

- (MASConstraint *)centerX {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterX];
}

- (MASConstraint *)centerY {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterY];
}

- (MASConstraint *)baseline {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBaseline];
}

#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)

- (MASConstraint *)firstBaseline {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeFirstBaseline];
}
- (MASConstraint *)lastBaseline {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLastBaseline];
}

#endif

#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000)

- (MASConstraint *)leftMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeftMargin];
}

- (MASConstraint *)rightMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRightMargin];
}

- (MASConstraint *)topMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTopMargin];
}

- (MASConstraint *)bottomMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottomMargin];
}

- (MASConstraint *)leadingMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeadingMargin];
}

- (MASConstraint *)trailingMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailingMargin];
}

- (MASConstraint *)centerXWithinMargins {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterXWithinMargins];
}

- (MASConstraint *)centerYWithinMargins {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterYWithinMargins];
}

#endif

#pragma mark - Abstract

- (MASConstraint * (^)(CGFloat multiplier))multipliedBy { MASMethodNotImplemented(); }

- (MASConstraint * (^)(CGFloat divider))dividedBy { MASMethodNotImplemented(); }

- (MASConstraint * (^)(MASLayoutPriority priority))priority { MASMethodNotImplemented(); }

- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation { MASMethodNotImplemented(); }

- (MASConstraint * (^)(id key))key { MASMethodNotImplemented(); }

- (void)setInsets:(MASEdgeInsets __unused)insets { MASMethodNotImplemented(); }

- (void)setInset:(CGFloat __unused)inset { MASMethodNotImplemented(); }

- (void)setSizeOffset:(CGSize __unused)sizeOffset { MASMethodNotImplemented(); }

- (void)setCenterOffset:(CGPoint __unused)centerOffset { MASMethodNotImplemented(); }

- (void)setOffset:(CGFloat __unused)offset { MASMethodNotImplemented(); }

#if TARGET_OS_MAC && !(TARGET_OS_IPHONE || TARGET_OS_TV)

- (MASConstraint *)animator { MASMethodNotImplemented(); }

#endif

- (void)activate { MASMethodNotImplemented(); }

- (void)deactivate { MASMethodNotImplemented(); }

- (void)install { MASMethodNotImplemented(); }

- (void)uninstall { MASMethodNotImplemented(); }

@end

+ 146
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASConstraintMaker.h View File

@@ -0,0 +1,146 @@
//
// MASConstraintMaker.h
// Masonry
//
// Created by Jonas Budelmann on 20/07/13.
// Copyright (c) 2013 cloudling. All rights reserved.
//

#import "MASConstraint.h"
#import "MASUtilities.h"

typedef NS_OPTIONS(NSInteger, MASAttribute) {
MASAttributeLeft = 1 << NSLayoutAttributeLeft,
MASAttributeRight = 1 << NSLayoutAttributeRight,
MASAttributeTop = 1 << NSLayoutAttributeTop,
MASAttributeBottom = 1 << NSLayoutAttributeBottom,
MASAttributeLeading = 1 << NSLayoutAttributeLeading,
MASAttributeTrailing = 1 << NSLayoutAttributeTrailing,
MASAttributeWidth = 1 << NSLayoutAttributeWidth,
MASAttributeHeight = 1 << NSLayoutAttributeHeight,
MASAttributeCenterX = 1 << NSLayoutAttributeCenterX,
MASAttributeCenterY = 1 << NSLayoutAttributeCenterY,
MASAttributeBaseline = 1 << NSLayoutAttributeBaseline,
#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
MASAttributeFirstBaseline = 1 << NSLayoutAttributeFirstBaseline,
MASAttributeLastBaseline = 1 << NSLayoutAttributeLastBaseline,
#endif
#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000)
MASAttributeLeftMargin = 1 << NSLayoutAttributeLeftMargin,
MASAttributeRightMargin = 1 << NSLayoutAttributeRightMargin,
MASAttributeTopMargin = 1 << NSLayoutAttributeTopMargin,
MASAttributeBottomMargin = 1 << NSLayoutAttributeBottomMargin,
MASAttributeLeadingMargin = 1 << NSLayoutAttributeLeadingMargin,
MASAttributeTrailingMargin = 1 << NSLayoutAttributeTrailingMargin,
MASAttributeCenterXWithinMargins = 1 << NSLayoutAttributeCenterXWithinMargins,
MASAttributeCenterYWithinMargins = 1 << NSLayoutAttributeCenterYWithinMargins,

#endif
};

/**
* Provides factory methods for creating MASConstraints.
* Constraints are collected until they are ready to be installed
*
*/
@interface MASConstraintMaker : NSObject

/**
* The following properties return a new MASViewConstraint
* with the first item set to the makers associated view and the appropriate MASViewAttribute
*/
@property (nonatomic, strong, readonly) MASConstraint *left;
@property (nonatomic, strong, readonly) MASConstraint *top;
@property (nonatomic, strong, readonly) MASConstraint *right;
@property (nonatomic, strong, readonly) MASConstraint *bottom;
@property (nonatomic, strong, readonly) MASConstraint *leading;
@property (nonatomic, strong, readonly) MASConstraint *trailing;
@property (nonatomic, strong, readonly) MASConstraint *width;
@property (nonatomic, strong, readonly) MASConstraint *height;
@property (nonatomic, strong, readonly) MASConstraint *centerX;
@property (nonatomic, strong, readonly) MASConstraint *centerY;
@property (nonatomic, strong, readonly) MASConstraint *baseline;

#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)

@property (nonatomic, strong, readonly) MASConstraint *firstBaseline;
@property (nonatomic, strong, readonly) MASConstraint *lastBaseline;

#endif

#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000)

@property (nonatomic, strong, readonly) MASConstraint *leftMargin;
@property (nonatomic, strong, readonly) MASConstraint *rightMargin;
@property (nonatomic, strong, readonly) MASConstraint *topMargin;
@property (nonatomic, strong, readonly) MASConstraint *bottomMargin;
@property (nonatomic, strong, readonly) MASConstraint *leadingMargin;
@property (nonatomic, strong, readonly) MASConstraint *trailingMargin;
@property (nonatomic, strong, readonly) MASConstraint *centerXWithinMargins;
@property (nonatomic, strong, readonly) MASConstraint *centerYWithinMargins;

#endif

/**
* Returns a block which creates a new MASCompositeConstraint with the first item set
* to the makers associated view and children corresponding to the set bits in the
* MASAttribute parameter. Combine multiple attributes via binary-or.
*/
@property (nonatomic, strong, readonly) MASConstraint *(^attributes)(MASAttribute attrs);

/**
* Creates a MASCompositeConstraint with type MASCompositeConstraintTypeEdges
* which generates the appropriate MASViewConstraint children (top, left, bottom, right)
* with the first item set to the makers associated view
*/
@property (nonatomic, strong, readonly) MASConstraint *edges;

/**
* Creates a MASCompositeConstraint with type MASCompositeConstraintTypeSize
* which generates the appropriate MASViewConstraint children (width, height)
* with the first item set to the makers associated view
*/
@property (nonatomic, strong, readonly) MASConstraint *size;

/**
* Creates a MASCompositeConstraint with type MASCompositeConstraintTypeCenter
* which generates the appropriate MASViewConstraint children (centerX, centerY)
* with the first item set to the makers associated view
*/
@property (nonatomic, strong, readonly) MASConstraint *center;

/**
* Whether or not to check for an existing constraint instead of adding constraint
*/
@property (nonatomic, assign) BOOL updateExisting;

/**
* Whether or not to remove existing constraints prior to installing
*/
@property (nonatomic, assign) BOOL removeExisting;

/**
* initialises the maker with a default view
*
* @param view any MASConstraint are created with this view as the first item
*
* @return a new MASConstraintMaker
*/
- (id)initWithView:(MAS_VIEW *)view;

/**
* Calls install method on any MASConstraints which have been created by this maker
*
* @return an array of all the installed MASConstraints
*/
- (NSArray *)install;

- (MASConstraint * (^)(dispatch_block_t))group;

@end

+ 273
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASConstraintMaker.m View File

@@ -0,0 +1,273 @@
//
// MASConstraintMaker.m
// Masonry
//
// Created by Jonas Budelmann on 20/07/13.
// Copyright (c) 2013 cloudling. All rights reserved.
//

#import "MASConstraintMaker.h"
#import "MASViewConstraint.h"
#import "MASCompositeConstraint.h"
#import "MASConstraint+Private.h"
#import "MASViewAttribute.h"
#import "View+MASAdditions.h"

@interface MASConstraintMaker () <MASConstraintDelegate>

@property (nonatomic, weak) MAS_VIEW *view;
@property (nonatomic, strong) NSMutableArray *constraints;

@end

@implementation MASConstraintMaker

- (id)initWithView:(MAS_VIEW *)view {
self = [super init];
if (!self) return nil;
self.view = view;
self.constraints = NSMutableArray.new;
return self;
}

- (NSArray *)install {
if (self.removeExisting) {
NSArray *installedConstraints = [MASViewConstraint installedConstraintsForView:self.view];
for (MASConstraint *constraint in installedConstraints) {
[constraint uninstall];
}
}
NSArray *constraints = self.constraints.copy;
for (MASConstraint *constraint in constraints) {
constraint.updateExisting = self.updateExisting;
[constraint install];
}
[self.constraints removeAllObjects];
return constraints;
}

#pragma mark - MASConstraintDelegate

- (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint {
NSUInteger index = [self.constraints indexOfObject:constraint];
NSAssert(index != NSNotFound, @"Could not find constraint %@", constraint);
[self.constraints replaceObjectAtIndex:index withObject:replacementConstraint];
}

- (MASConstraint *)constraint:(MASConstraint *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
MASViewAttribute *viewAttribute = [[MASViewAttribute alloc] initWithView:self.view layoutAttribute:layoutAttribute];
MASViewConstraint *newConstraint = [[MASViewConstraint alloc] initWithFirstViewAttribute:viewAttribute];
if ([constraint isKindOfClass:MASViewConstraint.class]) {
//replace with composite constraint
NSArray *children = @[constraint, newConstraint];
MASCompositeConstraint *compositeConstraint = [[MASCompositeConstraint alloc] initWithChildren:children];
compositeConstraint.delegate = self;
[self constraint:constraint shouldBeReplacedWithConstraint:compositeConstraint];
return compositeConstraint;
}
if (!constraint) {
newConstraint.delegate = self;
[self.constraints addObject:newConstraint];
}
return newConstraint;
}

- (MASConstraint *)addConstraintWithAttributes:(MASAttribute)attrs {
__unused MASAttribute anyAttribute = (MASAttributeLeft | MASAttributeRight | MASAttributeTop | MASAttributeBottom | MASAttributeLeading
| MASAttributeTrailing | MASAttributeWidth | MASAttributeHeight | MASAttributeCenterX
| MASAttributeCenterY | MASAttributeBaseline
#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
| MASAttributeFirstBaseline | MASAttributeLastBaseline
#endif
#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000)
| MASAttributeLeftMargin | MASAttributeRightMargin | MASAttributeTopMargin | MASAttributeBottomMargin
| MASAttributeLeadingMargin | MASAttributeTrailingMargin | MASAttributeCenterXWithinMargins
| MASAttributeCenterYWithinMargins
#endif
);
NSAssert((attrs & anyAttribute) != 0, @"You didn't pass any attribute to make.attributes(...)");
NSMutableArray *attributes = [NSMutableArray array];
if (attrs & MASAttributeLeft) [attributes addObject:self.view.mas_left];
if (attrs & MASAttributeRight) [attributes addObject:self.view.mas_right];
if (attrs & MASAttributeTop) [attributes addObject:self.view.mas_top];
if (attrs & MASAttributeBottom) [attributes addObject:self.view.mas_bottom];
if (attrs & MASAttributeLeading) [attributes addObject:self.view.mas_leading];
if (attrs & MASAttributeTrailing) [attributes addObject:self.view.mas_trailing];
if (attrs & MASAttributeWidth) [attributes addObject:self.view.mas_width];
if (attrs & MASAttributeHeight) [attributes addObject:self.view.mas_height];
if (attrs & MASAttributeCenterX) [attributes addObject:self.view.mas_centerX];
if (attrs & MASAttributeCenterY) [attributes addObject:self.view.mas_centerY];
if (attrs & MASAttributeBaseline) [attributes addObject:self.view.mas_baseline];
#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
if (attrs & MASAttributeFirstBaseline) [attributes addObject:self.view.mas_firstBaseline];
if (attrs & MASAttributeLastBaseline) [attributes addObject:self.view.mas_lastBaseline];
#endif
#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000)
if (attrs & MASAttributeLeftMargin) [attributes addObject:self.view.mas_leftMargin];
if (attrs & MASAttributeRightMargin) [attributes addObject:self.view.mas_rightMargin];
if (attrs & MASAttributeTopMargin) [attributes addObject:self.view.mas_topMargin];
if (attrs & MASAttributeBottomMargin) [attributes addObject:self.view.mas_bottomMargin];
if (attrs & MASAttributeLeadingMargin) [attributes addObject:self.view.mas_leadingMargin];
if (attrs & MASAttributeTrailingMargin) [attributes addObject:self.view.mas_trailingMargin];
if (attrs & MASAttributeCenterXWithinMargins) [attributes addObject:self.view.mas_centerXWithinMargins];
if (attrs & MASAttributeCenterYWithinMargins) [attributes addObject:self.view.mas_centerYWithinMargins];
#endif
NSMutableArray *children = [NSMutableArray arrayWithCapacity:attributes.count];
for (MASViewAttribute *a in attributes) {
[children addObject:[[MASViewConstraint alloc] initWithFirstViewAttribute:a]];
}
MASCompositeConstraint *constraint = [[MASCompositeConstraint alloc] initWithChildren:children];
constraint.delegate = self;
[self.constraints addObject:constraint];
return constraint;
}

#pragma mark - standard Attributes

- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
return [self constraint:nil addConstraintWithLayoutAttribute:layoutAttribute];
}

- (MASConstraint *)left {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeft];
}

- (MASConstraint *)top {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTop];
}

- (MASConstraint *)right {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRight];
}

- (MASConstraint *)bottom {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottom];
}

- (MASConstraint *)leading {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeading];
}

- (MASConstraint *)trailing {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailing];
}

- (MASConstraint *)width {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeWidth];
}

- (MASConstraint *)height {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeHeight];
}

- (MASConstraint *)centerX {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterX];
}

- (MASConstraint *)centerY {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterY];
}

- (MASConstraint *)baseline {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBaseline];
}

- (MASConstraint *(^)(MASAttribute))attributes {
return ^(MASAttribute attrs){
return [self addConstraintWithAttributes:attrs];
};
}

#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)

- (MASConstraint *)firstBaseline {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeFirstBaseline];
}

- (MASConstraint *)lastBaseline {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLastBaseline];
}

#endif


#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000)

- (MASConstraint *)leftMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeftMargin];
}

- (MASConstraint *)rightMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRightMargin];
}

- (MASConstraint *)topMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTopMargin];
}

- (MASConstraint *)bottomMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottomMargin];
}

- (MASConstraint *)leadingMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeadingMargin];
}

- (MASConstraint *)trailingMargin {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailingMargin];
}

- (MASConstraint *)centerXWithinMargins {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterXWithinMargins];
}

- (MASConstraint *)centerYWithinMargins {
return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterYWithinMargins];
}

#endif


#pragma mark - composite Attributes

- (MASConstraint *)edges {
return [self addConstraintWithAttributes:MASAttributeTop | MASAttributeLeft | MASAttributeRight | MASAttributeBottom];
}

- (MASConstraint *)size {
return [self addConstraintWithAttributes:MASAttributeWidth | MASAttributeHeight];
}

- (MASConstraint *)center {
return [self addConstraintWithAttributes:MASAttributeCenterX | MASAttributeCenterY];
}

#pragma mark - grouping

- (MASConstraint *(^)(dispatch_block_t group))group {
return ^id(dispatch_block_t group) {
NSInteger previousCount = self.constraints.count;
group();

NSArray *children = [self.constraints subarrayWithRange:NSMakeRange(previousCount, self.constraints.count - previousCount)];
MASCompositeConstraint *constraint = [[MASCompositeConstraint alloc] initWithChildren:children];
constraint.delegate = self;
return constraint;
};
}

@end

+ 22
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASLayoutConstraint.h View File

@@ -0,0 +1,22 @@
//
// MASLayoutConstraint.h
// Masonry
//
// Created by Jonas Budelmann on 3/08/13.
// Copyright (c) 2013 Jonas Budelmann. All rights reserved.
//

#import "MASUtilities.h"

/**
* When you are debugging or printing the constraints attached to a view this subclass
* makes it easier to identify which constraints have been created via Masonry
*/
@interface MASLayoutConstraint : NSLayoutConstraint

/**
* a key to associate with this constraint
*/
@property (nonatomic, strong) id mas_key;

@end

+ 13
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASLayoutConstraint.m View File

@@ -0,0 +1,13 @@
//
// MASLayoutConstraint.m
// Masonry
//
// Created by Jonas Budelmann on 3/08/13.
// Copyright (c) 2013 Jonas Budelmann. All rights reserved.
//

#import "MASLayoutConstraint.h"

@implementation MASLayoutConstraint

@end

+ 136
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASUtilities.h View File

@@ -0,0 +1,136 @@
//
// MASUtilities.h
// Masonry
//
// Created by Jonas Budelmann on 19/08/13.
// Copyright (c) 2013 Jonas Budelmann. All rights reserved.
//

#import <Foundation/Foundation.h>



#if TARGET_OS_IPHONE || TARGET_OS_TV

#import <UIKit/UIKit.h>
#define MAS_VIEW UIView
#define MAS_VIEW_CONTROLLER UIViewController
#define MASEdgeInsets UIEdgeInsets

typedef UILayoutPriority MASLayoutPriority;
static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired;
static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh;
static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500;
static const MASLayoutPriority MASLayoutPriorityDefaultLow = UILayoutPriorityDefaultLow;
static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel = UILayoutPriorityFittingSizeLevel;

#elif TARGET_OS_MAC

#import <AppKit/AppKit.h>
#define MAS_VIEW NSView
#define MASEdgeInsets NSEdgeInsets

typedef NSLayoutPriority MASLayoutPriority;
static const MASLayoutPriority MASLayoutPriorityRequired = NSLayoutPriorityRequired;
static const MASLayoutPriority MASLayoutPriorityDefaultHigh = NSLayoutPriorityDefaultHigh;
static const MASLayoutPriority MASLayoutPriorityDragThatCanResizeWindow = NSLayoutPriorityDragThatCanResizeWindow;
static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 501;
static const MASLayoutPriority MASLayoutPriorityWindowSizeStayPut = NSLayoutPriorityWindowSizeStayPut;
static const MASLayoutPriority MASLayoutPriorityDragThatCannotResizeWindow = NSLayoutPriorityDragThatCannotResizeWindow;
static const MASLayoutPriority MASLayoutPriorityDefaultLow = NSLayoutPriorityDefaultLow;
static const MASLayoutPriority MASLayoutPriorityFittingSizeCompression = NSLayoutPriorityFittingSizeCompression;

#endif

/**
* Allows you to attach keys to objects matching the variable names passed.
*
* view1.mas_key = @"view1", view2.mas_key = @"view2";
*
* is equivalent to:
*
* MASAttachKeys(view1, view2);
*/
#define MASAttachKeys(...) \
{ \
NSDictionary *keyPairs = NSDictionaryOfVariableBindings(__VA_ARGS__); \
for (id key in keyPairs.allKeys) { \
id obj = keyPairs[key]; \
NSAssert([obj respondsToSelector:@selector(setMas_key:)], \
@"Cannot attach mas_key to %@", obj); \
[obj setMas_key:key]; \
} \
}

/**
* Used to create object hashes
* Based on http://www.mikeash.com/pyblog/friday-qa-2010-06-18-implementing-equality-and-hashing.html
*/
#define MAS_NSUINT_BIT (CHAR_BIT * sizeof(NSUInteger))
#define MAS_NSUINTROTATE(val, howmuch) ((((NSUInteger)val) << howmuch) | (((NSUInteger)val) >> (MAS_NSUINT_BIT - howmuch)))

/**
* Given a scalar or struct value, wraps it in NSValue
* Based on EXPObjectify: https://github.com/specta/expecta
*/
static inline id _MASBoxValue(const char *type, ...) {
va_list v;
va_start(v, type);
id obj = nil;
if (strcmp(type, @encode(id)) == 0) {
id actual = va_arg(v, id);
obj = actual;
} else if (strcmp(type, @encode(CGPoint)) == 0) {
CGPoint actual = (CGPoint)va_arg(v, CGPoint);
obj = [NSValue value:&actual withObjCType:type];
} else if (strcmp(type, @encode(CGSize)) == 0) {
CGSize actual = (CGSize)va_arg(v, CGSize);
obj = [NSValue value:&actual withObjCType:type];
} else if (strcmp(type, @encode(MASEdgeInsets)) == 0) {
MASEdgeInsets actual = (MASEdgeInsets)va_arg(v, MASEdgeInsets);
obj = [NSValue value:&actual withObjCType:type];
} else if (strcmp(type, @encode(double)) == 0) {
double actual = (double)va_arg(v, double);
obj = [NSNumber numberWithDouble:actual];
} else if (strcmp(type, @encode(float)) == 0) {
float actual = (float)va_arg(v, double);
obj = [NSNumber numberWithFloat:actual];
} else if (strcmp(type, @encode(int)) == 0) {
int actual = (int)va_arg(v, int);
obj = [NSNumber numberWithInt:actual];
} else if (strcmp(type, @encode(long)) == 0) {
long actual = (long)va_arg(v, long);
obj = [NSNumber numberWithLong:actual];
} else if (strcmp(type, @encode(long long)) == 0) {
long long actual = (long long)va_arg(v, long long);
obj = [NSNumber numberWithLongLong:actual];
} else if (strcmp(type, @encode(short)) == 0) {
short actual = (short)va_arg(v, int);
obj = [NSNumber numberWithShort:actual];
} else if (strcmp(type, @encode(char)) == 0) {
char actual = (char)va_arg(v, int);
obj = [NSNumber numberWithChar:actual];
} else if (strcmp(type, @encode(bool)) == 0) {
bool actual = (bool)va_arg(v, int);
obj = [NSNumber numberWithBool:actual];
} else if (strcmp(type, @encode(unsigned char)) == 0) {
unsigned char actual = (unsigned char)va_arg(v, unsigned int);
obj = [NSNumber numberWithUnsignedChar:actual];
} else if (strcmp(type, @encode(unsigned int)) == 0) {
unsigned int actual = (unsigned int)va_arg(v, unsigned int);
obj = [NSNumber numberWithUnsignedInt:actual];
} else if (strcmp(type, @encode(unsigned long)) == 0) {
unsigned long actual = (unsigned long)va_arg(v, unsigned long);
obj = [NSNumber numberWithUnsignedLong:actual];
} else if (strcmp(type, @encode(unsigned long long)) == 0) {
unsigned long long actual = (unsigned long long)va_arg(v, unsigned long long);
obj = [NSNumber numberWithUnsignedLongLong:actual];
} else if (strcmp(type, @encode(unsigned short)) == 0) {
unsigned short actual = (unsigned short)va_arg(v, unsigned int);
obj = [NSNumber numberWithUnsignedShort:actual];
}
va_end(v);
return obj;
}

#define MASBoxValue(value) _MASBoxValue(@encode(__typeof__((value))), (value))

+ 49
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASViewAttribute.h View File

@@ -0,0 +1,49 @@
//
// MASViewAttribute.h
// Masonry
//
// Created by Jonas Budelmann on 21/07/13.
// Copyright (c) 2013 cloudling. All rights reserved.
//

#import "MASUtilities.h"

/**
* An immutable tuple which stores the view and the related NSLayoutAttribute.
* Describes part of either the left or right hand side of a constraint equation
*/
@interface MASViewAttribute : NSObject

/**
* The view which the reciever relates to. Can be nil if item is not a view.
*/
@property (nonatomic, weak, readonly) MAS_VIEW *view;

/**
* The item which the reciever relates to.
*/
@property (nonatomic, weak, readonly) id item;

/**
* The attribute which the reciever relates to
*/
@property (nonatomic, assign, readonly) NSLayoutAttribute layoutAttribute;

/**
* Convenience initializer.
*/
- (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAttribute;

/**
* The designated initializer.
*/
- (id)initWithView:(MAS_VIEW *)view item:(id)item layoutAttribute:(NSLayoutAttribute)layoutAttribute;

/**
* Determine whether the layoutAttribute is a size attribute
*
* @return YES if layoutAttribute is equal to NSLayoutAttributeWidth or NSLayoutAttributeHeight
*/
- (BOOL)isSizeAttribute;

@end

+ 46
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASViewAttribute.m View File

@@ -0,0 +1,46 @@
//
// MASViewAttribute.m
// Masonry
//
// Created by Jonas Budelmann on 21/07/13.
// Copyright (c) 2013 cloudling. All rights reserved.
//

#import "MASViewAttribute.h"

@implementation MASViewAttribute

- (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAttribute {
self = [self initWithView:view item:view layoutAttribute:layoutAttribute];
return self;
}

- (id)initWithView:(MAS_VIEW *)view item:(id)item layoutAttribute:(NSLayoutAttribute)layoutAttribute {
self = [super init];
if (!self) return nil;
_view = view;
_item = item;
_layoutAttribute = layoutAttribute;
return self;
}

- (BOOL)isSizeAttribute {
return self.layoutAttribute == NSLayoutAttributeWidth
|| self.layoutAttribute == NSLayoutAttributeHeight;
}

- (BOOL)isEqual:(MASViewAttribute *)viewAttribute {
if ([viewAttribute isKindOfClass:self.class]) {
return self.view == viewAttribute.view
&& self.layoutAttribute == viewAttribute.layoutAttribute;
}
return [super isEqual:viewAttribute];
}

- (NSUInteger)hash {
return MAS_NSUINTROTATE([self.view hash], MAS_NSUINT_BIT / 2) ^ self.layoutAttribute;
}

@end

+ 48
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASViewConstraint.h View File

@@ -0,0 +1,48 @@
//
// MASViewConstraint.h
// Masonry
//
// Created by Jonas Budelmann on 20/07/13.
// Copyright (c) 2013 cloudling. All rights reserved.
//

#import "MASViewAttribute.h"
#import "MASConstraint.h"
#import "MASLayoutConstraint.h"
#import "MASUtilities.h"

/**
* A single constraint.
* Contains the attributes neccessary for creating a NSLayoutConstraint and adding it to the appropriate view
*/
@interface MASViewConstraint : MASConstraint <NSCopying>

/**
* First item/view and first attribute of the NSLayoutConstraint
*/
@property (nonatomic, strong, readonly) MASViewAttribute *firstViewAttribute;

/**
* Second item/view and second attribute of the NSLayoutConstraint
*/
@property (nonatomic, strong, readonly) MASViewAttribute *secondViewAttribute;

/**
* initialises the MASViewConstraint with the first part of the equation
*
* @param firstViewAttribute view.mas_left, view.mas_width etc.
*
* @return a new view constraint
*/
- (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute;

/**
* Returns all MASViewConstraints installed with this view as a first item.
*
* @param view A view to retrieve constraints for.
*
* @return An array of MASViewConstraints.
*/
+ (NSArray *)installedConstraintsForView:(MAS_VIEW *)view;

@end

+ 0
- 0
AILinkBleSDKDemo/Masonry/Masonry/MASViewConstraint.m View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save