Browse Source
之前 commit d4eaa42ac 为避免与 ota plugin 冲突删了这 4 个 xcframework,
现在 ota plugin 已废弃 → 由 device_jieli 独家提供:
- JL_OTALib.xcframework (v2.4.1)
- JL_AdvParse.xcframework
- JL_HashPair.xcframework
- JLLogHelper.xcframework
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
weicu
76 changed files with 3764 additions and 0 deletions
@ -0,0 +1,44 @@ |
|||||
|
<?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>AvailableLibraries</key> |
||||
|
<array> |
||||
|
<dict> |
||||
|
<key>BinaryPath</key> |
||||
|
<string>JLLogHelper.framework/JLLogHelper</string> |
||||
|
<key>LibraryIdentifier</key> |
||||
|
<string>ios-arm64_x86_64-simulator</string> |
||||
|
<key>LibraryPath</key> |
||||
|
<string>JLLogHelper.framework</string> |
||||
|
<key>SupportedArchitectures</key> |
||||
|
<array> |
||||
|
<string>arm64</string> |
||||
|
<string>x86_64</string> |
||||
|
</array> |
||||
|
<key>SupportedPlatform</key> |
||||
|
<string>ios</string> |
||||
|
<key>SupportedPlatformVariant</key> |
||||
|
<string>simulator</string> |
||||
|
</dict> |
||||
|
<dict> |
||||
|
<key>BinaryPath</key> |
||||
|
<string>JLLogHelper.framework/JLLogHelper</string> |
||||
|
<key>LibraryIdentifier</key> |
||||
|
<string>ios-arm64</string> |
||||
|
<key>LibraryPath</key> |
||||
|
<string>JLLogHelper.framework</string> |
||||
|
<key>SupportedArchitectures</key> |
||||
|
<array> |
||||
|
<string>arm64</string> |
||||
|
</array> |
||||
|
<key>SupportedPlatform</key> |
||||
|
<string>ios</string> |
||||
|
</dict> |
||||
|
</array> |
||||
|
<key>CFBundlePackageType</key> |
||||
|
<string>XFWK</string> |
||||
|
<key>XCFrameworkFormatVersion</key> |
||||
|
<string>1.0</string> |
||||
|
</dict> |
||||
|
</plist> |
||||
@ -0,0 +1,19 @@ |
|||||
|
//
|
||||
|
// JLLogHelper.h
|
||||
|
// JLLogHelper
|
||||
|
//
|
||||
|
// Created by EzioChan on 2024/5/8.
|
||||
|
// Copyright © 2024 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
//! Project version number for JLLogHelper.
|
||||
|
FOUNDATION_EXPORT double JLLogHelperVersionNumber; |
||||
|
|
||||
|
//! Project version string for JLLogHelper.
|
||||
|
FOUNDATION_EXPORT const unsigned char JLLogHelperVersionString[]; |
||||
|
|
||||
|
// In this header, you should import all the public headers of your framework using statements like #import <JLLogHelper/PublicHeader.h>
|
||||
|
|
||||
|
#import <JLLogHelper/JLLogManager.h> |
||||
@ -0,0 +1,88 @@ |
|||||
|
//
|
||||
|
// JLLogManager.h
|
||||
|
// JLLogHelper
|
||||
|
//
|
||||
|
// Created by EzioChan on 2024/5/8.
|
||||
|
// Copyright © 2024 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
/// 打印宏
|
||||
|
#define kJLLog(level,fmt...) [JLLogManager logLevel:level funcName:__FUNCTION__ line:__LINE__ format:fmt] |
||||
|
|
||||
|
typedef NS_ENUM(NSInteger, JLLOG_LEVEL) { |
||||
|
JLLOG_COMPLETE = 0, |
||||
|
JLLOG_DEBUG = 1, |
||||
|
JLLOG_INFO = 2, |
||||
|
JLLOG_WARN = 3, |
||||
|
JLLOG_ERROR = 4, |
||||
|
}; |
||||
|
|
||||
|
/// 日志打印
|
||||
|
@interface JLLogManager : NSObject |
||||
|
|
||||
|
/// 打印SDK版本
|
||||
|
+(void)sdkVersion; |
||||
|
|
||||
|
///清理已存储的打印
|
||||
|
+(void)clearLog; |
||||
|
|
||||
|
/**
|
||||
|
* 打印文本 |
||||
|
*/ |
||||
|
+(void)openLogTextFile; |
||||
|
|
||||
|
///重定向保存日志文件路径设置
|
||||
|
/// @param path 路径
|
||||
|
+(void)redirectLogPath:(NSString *)path; |
||||
|
|
||||
|
/// 收集日志回调接口
|
||||
|
/// @param block 回调
|
||||
|
+(void)collectLog:(void(^)(NSString *log))block; |
||||
|
|
||||
|
/// 打印时间
|
||||
|
/// @param isTimeStamp 是否打印 default is false
|
||||
|
+(void)logWithTimestamp:(BOOL)isTimeStamp; |
||||
|
|
||||
|
/// 把日志保存存储起来
|
||||
|
/// @param isSave 是否保存 default is yes
|
||||
|
+(void)saveLogAsFile:(BOOL)isSave; |
||||
|
|
||||
|
///LOG使能与等级,默认开启且debug等级。
|
||||
|
/// @param enable LOG使能
|
||||
|
/// @param isMore 是否打印【函数名&行号】
|
||||
|
/// @param level LOG等级
|
||||
|
+(void)setLog:(BOOL)enable IsMore:(BOOL)isMore Level:(JLLOG_LEVEL)level; |
||||
|
|
||||
|
/// 打印函数
|
||||
|
/// @param level LOG等级
|
||||
|
/// @param func 函数名
|
||||
|
/// @param line 行号
|
||||
|
/// @param format 内容
|
||||
|
+(void)logLevel:(JLLOG_LEVEL)level funcName:(const char* _Nullable)func line:(const int)line format:(NSString * _Nonnull)format,...; |
||||
|
|
||||
|
/// 打印
|
||||
|
/// @param something 任意字符串内容
|
||||
|
+(void)logSomething:(NSString *)something; |
||||
|
|
||||
|
/// 打印对象
|
||||
|
/// @param object 任意对象
|
||||
|
+(void)logObject:(id)object; |
||||
|
|
||||
|
|
||||
|
|
||||
|
/// 打印
|
||||
|
/// @param level LOG等级
|
||||
|
/// @param content 内容
|
||||
|
+(void)logLevel:(JLLOG_LEVEL)level content:(NSString *)content; |
||||
|
|
||||
|
/// 保存日志信息到文件中
|
||||
|
/// @param logContent 日志内容
|
||||
|
+(void)saveLog:(NSString *)logContent; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,6 @@ |
|||||
|
framework module JLLogHelper { |
||||
|
umbrella header "JLLogHelper.h" |
||||
|
export * |
||||
|
|
||||
|
module * { export * } |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
//
|
||||
|
// JLLogHelper.h
|
||||
|
// JLLogHelper
|
||||
|
//
|
||||
|
// Created by EzioChan on 2024/5/8.
|
||||
|
// Copyright © 2024 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
//! Project version number for JLLogHelper.
|
||||
|
FOUNDATION_EXPORT double JLLogHelperVersionNumber; |
||||
|
|
||||
|
//! Project version string for JLLogHelper.
|
||||
|
FOUNDATION_EXPORT const unsigned char JLLogHelperVersionString[]; |
||||
|
|
||||
|
// In this header, you should import all the public headers of your framework using statements like #import <JLLogHelper/PublicHeader.h>
|
||||
|
|
||||
|
#import <JLLogHelper/JLLogManager.h> |
||||
@ -0,0 +1,88 @@ |
|||||
|
//
|
||||
|
// JLLogManager.h
|
||||
|
// JLLogHelper
|
||||
|
//
|
||||
|
// Created by EzioChan on 2024/5/8.
|
||||
|
// Copyright © 2024 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
/// 打印宏
|
||||
|
#define kJLLog(level,fmt...) [JLLogManager logLevel:level funcName:__FUNCTION__ line:__LINE__ format:fmt] |
||||
|
|
||||
|
typedef NS_ENUM(NSInteger, JLLOG_LEVEL) { |
||||
|
JLLOG_COMPLETE = 0, |
||||
|
JLLOG_DEBUG = 1, |
||||
|
JLLOG_INFO = 2, |
||||
|
JLLOG_WARN = 3, |
||||
|
JLLOG_ERROR = 4, |
||||
|
}; |
||||
|
|
||||
|
/// 日志打印
|
||||
|
@interface JLLogManager : NSObject |
||||
|
|
||||
|
/// 打印SDK版本
|
||||
|
+(void)sdkVersion; |
||||
|
|
||||
|
///清理已存储的打印
|
||||
|
+(void)clearLog; |
||||
|
|
||||
|
/**
|
||||
|
* 打印文本 |
||||
|
*/ |
||||
|
+(void)openLogTextFile; |
||||
|
|
||||
|
///重定向保存日志文件路径设置
|
||||
|
/// @param path 路径
|
||||
|
+(void)redirectLogPath:(NSString *)path; |
||||
|
|
||||
|
/// 收集日志回调接口
|
||||
|
/// @param block 回调
|
||||
|
+(void)collectLog:(void(^)(NSString *log))block; |
||||
|
|
||||
|
/// 打印时间
|
||||
|
/// @param isTimeStamp 是否打印 default is false
|
||||
|
+(void)logWithTimestamp:(BOOL)isTimeStamp; |
||||
|
|
||||
|
/// 把日志保存存储起来
|
||||
|
/// @param isSave 是否保存 default is yes
|
||||
|
+(void)saveLogAsFile:(BOOL)isSave; |
||||
|
|
||||
|
///LOG使能与等级,默认开启且debug等级。
|
||||
|
/// @param enable LOG使能
|
||||
|
/// @param isMore 是否打印【函数名&行号】
|
||||
|
/// @param level LOG等级
|
||||
|
+(void)setLog:(BOOL)enable IsMore:(BOOL)isMore Level:(JLLOG_LEVEL)level; |
||||
|
|
||||
|
/// 打印函数
|
||||
|
/// @param level LOG等级
|
||||
|
/// @param func 函数名
|
||||
|
/// @param line 行号
|
||||
|
/// @param format 内容
|
||||
|
+(void)logLevel:(JLLOG_LEVEL)level funcName:(const char* _Nullable)func line:(const int)line format:(NSString * _Nonnull)format,...; |
||||
|
|
||||
|
/// 打印
|
||||
|
/// @param something 任意字符串内容
|
||||
|
+(void)logSomething:(NSString *)something; |
||||
|
|
||||
|
/// 打印对象
|
||||
|
/// @param object 任意对象
|
||||
|
+(void)logObject:(id)object; |
||||
|
|
||||
|
|
||||
|
|
||||
|
/// 打印
|
||||
|
/// @param level LOG等级
|
||||
|
/// @param content 内容
|
||||
|
+(void)logLevel:(JLLOG_LEVEL)level content:(NSString *)content; |
||||
|
|
||||
|
/// 保存日志信息到文件中
|
||||
|
/// @param logContent 日志内容
|
||||
|
+(void)saveLog:(NSString *)logContent; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,6 @@ |
|||||
|
framework module JLLogHelper { |
||||
|
umbrella header "JLLogHelper.h" |
||||
|
export * |
||||
|
|
||||
|
module * { export * } |
||||
|
} |
||||
@ -0,0 +1,147 @@ |
|||||
|
<?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/JLLogHelper.h</key> |
||||
|
<data> |
||||
|
TahP/o16a5TgPGLNFs/QhND95FU= |
||||
|
</data> |
||||
|
<key>Headers/JLLogManager.h</key> |
||||
|
<data> |
||||
|
Be4QtnAF0IDSmlMZquwyK7LLd8w= |
||||
|
</data> |
||||
|
<key>Info.plist</key> |
||||
|
<data> |
||||
|
PJl+BYy7qbdneBUnydYicJKb/SM= |
||||
|
</data> |
||||
|
<key>Modules/module.modulemap</key> |
||||
|
<data> |
||||
|
YwPsApnJXdp+uskVahraY2UK/Jk= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>files2</key> |
||||
|
<dict> |
||||
|
<key>Headers/JLLogHelper.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
TahP/o16a5TgPGLNFs/QhND95FU= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
nD5WuwBhpaoCwOGeWB5OusXVP21nYy+/Hcn6nPideIk= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLLogManager.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
Be4QtnAF0IDSmlMZquwyK7LLd8w= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
vOgQgQVptNwQdUKpCW2EBNruc0PL6BnkSjxVpptJsf0= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Modules/module.modulemap</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
YwPsApnJXdp+uskVahraY2UK/Jk= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
ViwpXSuoKoiEUwMpetyre+mlEz0+JE8UURyNSgBuylM= |
||||
|
</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> |
||||
@ -0,0 +1,44 @@ |
|||||
|
<?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>AvailableLibraries</key> |
||||
|
<array> |
||||
|
<dict> |
||||
|
<key>BinaryPath</key> |
||||
|
<string>JL_AdvParse.framework/JL_AdvParse</string> |
||||
|
<key>LibraryIdentifier</key> |
||||
|
<string>ios-arm64</string> |
||||
|
<key>LibraryPath</key> |
||||
|
<string>JL_AdvParse.framework</string> |
||||
|
<key>SupportedArchitectures</key> |
||||
|
<array> |
||||
|
<string>arm64</string> |
||||
|
</array> |
||||
|
<key>SupportedPlatform</key> |
||||
|
<string>ios</string> |
||||
|
</dict> |
||||
|
<dict> |
||||
|
<key>BinaryPath</key> |
||||
|
<string>JL_AdvParse.framework/JL_AdvParse</string> |
||||
|
<key>LibraryIdentifier</key> |
||||
|
<string>ios-arm64_x86_64-simulator</string> |
||||
|
<key>LibraryPath</key> |
||||
|
<string>JL_AdvParse.framework</string> |
||||
|
<key>SupportedArchitectures</key> |
||||
|
<array> |
||||
|
<string>arm64</string> |
||||
|
<string>x86_64</string> |
||||
|
</array> |
||||
|
<key>SupportedPlatform</key> |
||||
|
<string>ios</string> |
||||
|
<key>SupportedPlatformVariant</key> |
||||
|
<string>simulator</string> |
||||
|
</dict> |
||||
|
</array> |
||||
|
<key>CFBundlePackageType</key> |
||||
|
<string>XFWK</string> |
||||
|
<key>XCFrameworkFormatVersion</key> |
||||
|
<string>1.0</string> |
||||
|
</dict> |
||||
|
</plist> |
||||
@ -0,0 +1,72 @@ |
|||||
|
//
|
||||
|
// JLAdvParse.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/1/31.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
#import <JLLogHelper/JLLogHelper.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
typedef NS_ENUM(UInt8,JL_AdvType) { |
||||
|
JL_AdvTypeSoundBox = 0, //音箱类型
|
||||
|
JL_AdvTypeChargingBin = 1, //充电仓类型
|
||||
|
JL_AdvTypeTWS = 2, //TWS耳机类型
|
||||
|
JL_AdvTypeHeadset = 3, //普通耳机类型
|
||||
|
JL_AdvTypeSoundCard = 4, //声卡类型
|
||||
|
JL_AdvTypeWatch = 5, //手表类型
|
||||
|
JL_AdvTypeTradition = 6, //传统设备类型
|
||||
|
}; |
||||
|
|
||||
|
|
||||
|
typedef NS_ENUM(NSInteger,JL_DeviceType) { |
||||
|
JL_DeviceTypeSoundBox = 0, //AI音箱类型
|
||||
|
JL_DeviceTypeChargingBin = 1, //充电仓类型
|
||||
|
JL_DeviceTypeTWS = 2, //TWS耳机类型
|
||||
|
JL_DeviceTypeHeadset = 3, //普通耳机类型
|
||||
|
JL_DeviceTypeSoundCard = 4, //声卡类型
|
||||
|
JL_DeviceTypeWatch = 5, //手表类型
|
||||
|
JL_DeviceTypeDongle = 6, //Dongle
|
||||
|
JL_DeviceTypeTradition = -1, //传统设备类型
|
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/// 广播包解析器
|
||||
|
@interface JLAdvParse : NSObject |
||||
|
|
||||
|
/// 打印当前SDK的版本
|
||||
|
+(void)sdkVersion; |
||||
|
|
||||
|
/// 解析设备广播包内容
|
||||
|
/// @param key 过滤码(只针对传统设备生效,默认填空即可)
|
||||
|
/// @param advertData 蓝牙广播字典
|
||||
|
+(NSDictionary*)bluetoothAdvParse:(NSData *_Nullable)key AdvData:(NSDictionary*_Nonnull)advertData; |
||||
|
|
||||
|
/// 解析蓝牙广播包
|
||||
|
/// @param advertData 蓝牙广播报字典
|
||||
|
/// @param rssi 蓝牙信号强度
|
||||
|
+(NSDictionary *)bluetoothAdvData:(NSDictionary *)advertData RSSI:(NSNumber *)rssi; |
||||
|
|
||||
|
#pragma mark - 回连广播包信息 |
||||
|
/**
|
||||
|
* 获取广播包kCBAdvDataManufacturerData里面 'JLOTA' 标识的蓝牙地址 |
||||
|
* @param kCBAdvDataManufacturerData 广播包 |
||||
|
*/ |
||||
|
+ (NSString * _Nullable)otaBleMacAddressFromCBAdvDataManufacturerData:(NSData *)kCBAdvDataManufacturerData; |
||||
|
|
||||
|
/**
|
||||
|
* 判断当前蓝牙地址是否等于广播包kCBAdvDataManufacturerData里面的蓝牙地址 |
||||
|
* @param otaBleMacAddress ota升级中设备的蓝牙地址 |
||||
|
* @param kCBAdvDataManufacturerData 广播包 |
||||
|
*/ |
||||
|
+ (Boolean)otaBleMacAddress:(NSString *)otaBleMacAddress isEqualToCBAdvDataManufacturerData:(NSData *)kCBAdvDataManufacturerData; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,64 @@ |
|||||
|
//
|
||||
|
// JLChargingBoxAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import "JLDevicesAdv.h" |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLChargingBoxAdv : JLDevicesAdv |
||||
|
|
||||
|
/// 经典蓝牙地址
|
||||
|
@property(nonatomic, strong) NSString *edrAddr; |
||||
|
|
||||
|
/// 是否已配对
|
||||
|
@property(nonatomic, assign) BOOL isParied; |
||||
|
|
||||
|
/// 是否已开盖
|
||||
|
@property(nonatomic, assign) BOOL isOpen; |
||||
|
|
||||
|
/// 耳机状态
|
||||
|
///0x00:不显示弹窗
|
||||
|
///0x01:经典蓝牙未连接
|
||||
|
///0x02:经典蓝牙已连接
|
||||
|
///0x03:设备正在回连
|
||||
|
///0x04:设备不可连接 (需要手动进入配对模式)
|
||||
|
@property(nonatomic, assign) uint8_t status; |
||||
|
|
||||
|
/// 左耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryLeft; |
||||
|
|
||||
|
/// 右耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryRight; |
||||
|
|
||||
|
/// 充电仓电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryBox; |
||||
|
|
||||
|
///左耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingLeft; |
||||
|
|
||||
|
///右耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingRight; |
||||
|
|
||||
|
///充电仓是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingBox; |
||||
|
|
||||
|
/// seq
|
||||
|
/// 用于区分是否同一次开机。每次开机或者断开连接后 增加1
|
||||
|
@property(nonatomic, assign) uint8_t seq; |
||||
|
|
||||
|
///模式
|
||||
|
/// 0x00:充电模式
|
||||
|
/// 0x01:发射模式
|
||||
|
@property(nonatomic, assign) uint8_t mode; |
||||
|
|
||||
|
/// 加密 Hash 校验值
|
||||
|
@property(nonatomic, copy) NSData *hashData; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,54 @@ |
|||||
|
//
|
||||
|
// JLDevicesAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
#import "JLAdvParse.h" |
||||
|
|
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLDevicesAdv : NSObject |
||||
|
|
||||
|
/// 客户唯一标识
|
||||
|
@property(nonatomic,assign)uint16_t uid; |
||||
|
|
||||
|
/// 产品唯一标识
|
||||
|
@property(nonatomic,assign)uint16_t pid; |
||||
|
|
||||
|
/// 设备类型
|
||||
|
///JL_DeviceTypeSoundBox = 0, //AI音箱类型
|
||||
|
///JL_DeviceTypeChargingBin = 1, //充电仓类型
|
||||
|
///JL_DeviceTypeTWS = 2, //TWS耳机类型
|
||||
|
///JL_DeviceTypeHeadset = 3, //普通耳机类型
|
||||
|
///JL_DeviceTypeSoundCard = 4, //声卡类型
|
||||
|
///JL_DeviceTypeWatch = 5, //手表类型
|
||||
|
///JL_DeviceTypeTradition = -1, //传统设备类型
|
||||
|
@property(nonatomic,assign)JL_DeviceType type; |
||||
|
|
||||
|
/// 协议版本
|
||||
|
@property(nonatomic,assign)uint8_t version; |
||||
|
|
||||
|
/// 可变数据段
|
||||
|
@property(nonatomic,copy)NSData *variableData; |
||||
|
|
||||
|
- (instancetype)initWithData:(NSData *)data; |
||||
|
|
||||
|
|
||||
|
/// 转成model类型
|
||||
|
/// @param basicData 蓝牙广播数据
|
||||
|
+(JLDevicesAdv *__nullable)advertDataToModel:(NSData *)basicData; |
||||
|
|
||||
|
/// 转成model类型
|
||||
|
/// @param basicHexStr 蓝牙广播数据
|
||||
|
+(JLDevicesAdv *__nullable)advertDataHexStrToModel:(NSString *)basicHexStr; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
|
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,47 @@ |
|||||
|
//
|
||||
|
// JLEarphoneAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import "JLDevicesAdv.h" |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLEarphoneAdv : JLDevicesAdv |
||||
|
|
||||
|
/// 左耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryLeft; |
||||
|
|
||||
|
/// 右耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryRight; |
||||
|
|
||||
|
///左耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingLeft; |
||||
|
|
||||
|
///右耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingRight; |
||||
|
|
||||
|
/// 是否已配对
|
||||
|
@property(nonatomic, assign) BOOL isParied; |
||||
|
|
||||
|
/// 是否主机
|
||||
|
@property(nonatomic, assign) BOOL isMaster; |
||||
|
|
||||
|
/// 是否允许连接
|
||||
|
@property(nonatomic, assign) BOOL enableConnect; |
||||
|
|
||||
|
/// 耳机状态
|
||||
|
///0x00:不显示弹窗
|
||||
|
///0x01:经典蓝牙未连接
|
||||
|
///0x02:经典蓝牙已连接
|
||||
|
///0x03:设备正在回连
|
||||
|
///0x04:设备不可连接 (需要手动进入配对模式)
|
||||
|
@property(nonatomic, assign) uint8_t status; |
||||
|
|
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,25 @@ |
|||||
|
//
|
||||
|
// JLOtaAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <JL_AdvParse/JL_AdvParse.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLOtaAdv : JLDevicesAdv |
||||
|
|
||||
|
/// ble address before
|
||||
|
@property(nonatomic,strong)NSString *BleAddrBefore; |
||||
|
|
||||
|
//MARK: - Version 1
|
||||
|
/// battery
|
||||
|
@property(nonatomic,assign)uint8_t battery; |
||||
|
|
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,19 @@ |
|||||
|
//
|
||||
|
// JLSoundBoxAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import "JLTwsAdv.h" |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLSoundBoxAdv : JLTwsAdv |
||||
|
|
||||
|
@property(nonatomic,assign)uint8_t battery; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,19 @@ |
|||||
|
//
|
||||
|
// JLSoundCardAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import "JLTwsAdv.h" |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLSoundCardAdv : JLTwsAdv |
||||
|
|
||||
|
@property(nonatomic,assign)uint8_t battery; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,89 @@ |
|||||
|
//
|
||||
|
// JLTwsAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import "JLDevicesAdv.h" |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLTwsAdv : JLDevicesAdv |
||||
|
|
||||
|
//MARK: - Version 0
|
||||
|
|
||||
|
/// 经典蓝牙地址
|
||||
|
@property(nonatomic, strong) NSString *edrAddr; |
||||
|
|
||||
|
/// 耳机状态
|
||||
|
///0x00:不显示弹窗
|
||||
|
///0x01:经典蓝牙未连接
|
||||
|
///0x02:经典蓝牙已连接
|
||||
|
///0x03:设备正在回连
|
||||
|
///0x04:设备不可连接 (需要手动进入配对模式)
|
||||
|
@property(nonatomic, assign) uint8_t status; |
||||
|
|
||||
|
/// 左耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryLeft; |
||||
|
|
||||
|
/// 右耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryRight; |
||||
|
|
||||
|
/// 充电仓电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryBox; |
||||
|
|
||||
|
///左耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingLeft; |
||||
|
|
||||
|
///右耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingRight; |
||||
|
|
||||
|
///充电仓是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingBox; |
||||
|
|
||||
|
/// seq
|
||||
|
/// 用于区分是否同一次开机。每次开机或者断开连接后 增加1
|
||||
|
@property(nonatomic, assign) uint8_t seq; |
||||
|
|
||||
|
/// 加密 Hash 校验值
|
||||
|
@property(nonatomic, copy) NSData *hashData; |
||||
|
|
||||
|
//MARK: - Version 1
|
||||
|
/// BLE连接属性(enableConnect)
|
||||
|
@property(nonatomic, assign) BOOL bleEnable; |
||||
|
|
||||
|
//MARK: - Version 2
|
||||
|
/// 连接方式
|
||||
|
/// 0x00 BLE 通迅
|
||||
|
/// 0x01 SPP 通迅
|
||||
|
/// 0x02 GATT Over BR/EDR (V5/V6)
|
||||
|
@property(nonatomic, assign) uint8_t connectWay; |
||||
|
|
||||
|
/// 是否支持智能充电仓
|
||||
|
@property(nonatomic, assign) BOOL isSupportChargBox; |
||||
|
|
||||
|
//MARK: - Version 3
|
||||
|
/// 左耳电量为挂脖耳机电量!!!,其他耳机电量使用
|
||||
|
|
||||
|
//MARK: - Version 4/5/6 扩展
|
||||
|
/// LeAudio连接状态值
|
||||
|
@property(nonatomic, assign) uint8_t leAudioStatus; |
||||
|
/// 是否支持LeAudio
|
||||
|
@property(nonatomic, assign) BOOL supportLeAudio; |
||||
|
/// LeAudio是否已连接
|
||||
|
@property(nonatomic, assign) BOOL leAudioConnectedStatus; |
||||
|
/// RCSP是否使用LeAudio地址
|
||||
|
@property(nonatomic, assign) BOOL rcspUseLeAudioAddress; |
||||
|
/// 是否需要认证
|
||||
|
@property(nonatomic, assign) BOOL needAuth; |
||||
|
/// 协议版本号
|
||||
|
@property(nonatomic, assign) uint8_t protocolVersion; |
||||
|
|
||||
|
/// 设备数量 (V6)
|
||||
|
@property(nonatomic, assign) uint8_t deviceQuantity; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,35 @@ |
|||||
|
//
|
||||
|
// JLWatchAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <JL_AdvParse/JLDevicesAdv.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLWatchAdv : JLDevicesAdv |
||||
|
|
||||
|
/// 经典蓝牙地址
|
||||
|
@property(nonatomic, strong) NSString *edrAddr; |
||||
|
|
||||
|
/// 连接方式
|
||||
|
/// 0x00 ble
|
||||
|
/// 0x01 spp
|
||||
|
@property(nonatomic, assign) int8_t connectWay; |
||||
|
|
||||
|
|
||||
|
/// 手表状态
|
||||
|
/// 0x00:经典蓝牙未连接
|
||||
|
/// 0x01:经典蓝牙已连接 0x02:设备正在回连
|
||||
|
/// 0x03:设备不可连接 (需要手动进入配对模式)
|
||||
|
@property(nonatomic, assign) int8_t connectState; |
||||
|
|
||||
|
/// 是否需要先连上 ble
|
||||
|
@property(nonatomic, assign) BOOL priorityConnection; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,27 @@ |
|||||
|
//
|
||||
|
// JL_AdvParse.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/1/31.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
//! Project version number for JL_AdvParse.
|
||||
|
FOUNDATION_EXPORT double JL_AdvParseVersionNumber; |
||||
|
|
||||
|
//! Project version string for JL_AdvParse.
|
||||
|
FOUNDATION_EXPORT const unsigned char JL_AdvParseVersionString[]; |
||||
|
|
||||
|
// In this header, you should import all the public headers of your framework using statements like #import <JL_AdvParse/PublicHeader.h>
|
||||
|
#import <JL_AdvParse/JLAdvParse.h> |
||||
|
#import <JL_AdvParse/JLDevicesAdv.h> |
||||
|
#import <JL_AdvParse/JLTwsAdv.h> |
||||
|
#import <JL_AdvParse/JLSoundBoxAdv.h> |
||||
|
#import <JL_AdvParse/JLSoundCardAdv.h> |
||||
|
#import <JL_AdvParse/JLChargingBoxAdv.h> |
||||
|
#import <JL_AdvParse/JLEarphoneAdv.h> |
||||
|
#import <JL_AdvParse/JLWatchAdv.h> |
||||
|
#import <JL_AdvParse/JLOtaAdv.h> |
||||
|
|
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,6 @@ |
|||||
|
framework module JL_AdvParse { |
||||
|
umbrella header "JL_AdvParse.h" |
||||
|
export * |
||||
|
|
||||
|
module * { export * } |
||||
|
} |
||||
@ -0,0 +1,72 @@ |
|||||
|
//
|
||||
|
// JLAdvParse.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/1/31.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
#import <JLLogHelper/JLLogHelper.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
typedef NS_ENUM(UInt8,JL_AdvType) { |
||||
|
JL_AdvTypeSoundBox = 0, //音箱类型
|
||||
|
JL_AdvTypeChargingBin = 1, //充电仓类型
|
||||
|
JL_AdvTypeTWS = 2, //TWS耳机类型
|
||||
|
JL_AdvTypeHeadset = 3, //普通耳机类型
|
||||
|
JL_AdvTypeSoundCard = 4, //声卡类型
|
||||
|
JL_AdvTypeWatch = 5, //手表类型
|
||||
|
JL_AdvTypeTradition = 6, //传统设备类型
|
||||
|
}; |
||||
|
|
||||
|
|
||||
|
typedef NS_ENUM(NSInteger,JL_DeviceType) { |
||||
|
JL_DeviceTypeSoundBox = 0, //AI音箱类型
|
||||
|
JL_DeviceTypeChargingBin = 1, //充电仓类型
|
||||
|
JL_DeviceTypeTWS = 2, //TWS耳机类型
|
||||
|
JL_DeviceTypeHeadset = 3, //普通耳机类型
|
||||
|
JL_DeviceTypeSoundCard = 4, //声卡类型
|
||||
|
JL_DeviceTypeWatch = 5, //手表类型
|
||||
|
JL_DeviceTypeDongle = 6, //Dongle
|
||||
|
JL_DeviceTypeTradition = -1, //传统设备类型
|
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/// 广播包解析器
|
||||
|
@interface JLAdvParse : NSObject |
||||
|
|
||||
|
/// 打印当前SDK的版本
|
||||
|
+(void)sdkVersion; |
||||
|
|
||||
|
/// 解析设备广播包内容
|
||||
|
/// @param key 过滤码(只针对传统设备生效,默认填空即可)
|
||||
|
/// @param advertData 蓝牙广播字典
|
||||
|
+(NSDictionary*)bluetoothAdvParse:(NSData *_Nullable)key AdvData:(NSDictionary*_Nonnull)advertData; |
||||
|
|
||||
|
/// 解析蓝牙广播包
|
||||
|
/// @param advertData 蓝牙广播报字典
|
||||
|
/// @param rssi 蓝牙信号强度
|
||||
|
+(NSDictionary *)bluetoothAdvData:(NSDictionary *)advertData RSSI:(NSNumber *)rssi; |
||||
|
|
||||
|
#pragma mark - 回连广播包信息 |
||||
|
/**
|
||||
|
* 获取广播包kCBAdvDataManufacturerData里面 'JLOTA' 标识的蓝牙地址 |
||||
|
* @param kCBAdvDataManufacturerData 广播包 |
||||
|
*/ |
||||
|
+ (NSString * _Nullable)otaBleMacAddressFromCBAdvDataManufacturerData:(NSData *)kCBAdvDataManufacturerData; |
||||
|
|
||||
|
/**
|
||||
|
* 判断当前蓝牙地址是否等于广播包kCBAdvDataManufacturerData里面的蓝牙地址 |
||||
|
* @param otaBleMacAddress ota升级中设备的蓝牙地址 |
||||
|
* @param kCBAdvDataManufacturerData 广播包 |
||||
|
*/ |
||||
|
+ (Boolean)otaBleMacAddress:(NSString *)otaBleMacAddress isEqualToCBAdvDataManufacturerData:(NSData *)kCBAdvDataManufacturerData; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,64 @@ |
|||||
|
//
|
||||
|
// JLChargingBoxAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import "JLDevicesAdv.h" |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLChargingBoxAdv : JLDevicesAdv |
||||
|
|
||||
|
/// 经典蓝牙地址
|
||||
|
@property(nonatomic, strong) NSString *edrAddr; |
||||
|
|
||||
|
/// 是否已配对
|
||||
|
@property(nonatomic, assign) BOOL isParied; |
||||
|
|
||||
|
/// 是否已开盖
|
||||
|
@property(nonatomic, assign) BOOL isOpen; |
||||
|
|
||||
|
/// 耳机状态
|
||||
|
///0x00:不显示弹窗
|
||||
|
///0x01:经典蓝牙未连接
|
||||
|
///0x02:经典蓝牙已连接
|
||||
|
///0x03:设备正在回连
|
||||
|
///0x04:设备不可连接 (需要手动进入配对模式)
|
||||
|
@property(nonatomic, assign) uint8_t status; |
||||
|
|
||||
|
/// 左耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryLeft; |
||||
|
|
||||
|
/// 右耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryRight; |
||||
|
|
||||
|
/// 充电仓电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryBox; |
||||
|
|
||||
|
///左耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingLeft; |
||||
|
|
||||
|
///右耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingRight; |
||||
|
|
||||
|
///充电仓是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingBox; |
||||
|
|
||||
|
/// seq
|
||||
|
/// 用于区分是否同一次开机。每次开机或者断开连接后 增加1
|
||||
|
@property(nonatomic, assign) uint8_t seq; |
||||
|
|
||||
|
///模式
|
||||
|
/// 0x00:充电模式
|
||||
|
/// 0x01:发射模式
|
||||
|
@property(nonatomic, assign) uint8_t mode; |
||||
|
|
||||
|
/// 加密 Hash 校验值
|
||||
|
@property(nonatomic, copy) NSData *hashData; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,54 @@ |
|||||
|
//
|
||||
|
// JLDevicesAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
#import "JLAdvParse.h" |
||||
|
|
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLDevicesAdv : NSObject |
||||
|
|
||||
|
/// 客户唯一标识
|
||||
|
@property(nonatomic,assign)uint16_t uid; |
||||
|
|
||||
|
/// 产品唯一标识
|
||||
|
@property(nonatomic,assign)uint16_t pid; |
||||
|
|
||||
|
/// 设备类型
|
||||
|
///JL_DeviceTypeSoundBox = 0, //AI音箱类型
|
||||
|
///JL_DeviceTypeChargingBin = 1, //充电仓类型
|
||||
|
///JL_DeviceTypeTWS = 2, //TWS耳机类型
|
||||
|
///JL_DeviceTypeHeadset = 3, //普通耳机类型
|
||||
|
///JL_DeviceTypeSoundCard = 4, //声卡类型
|
||||
|
///JL_DeviceTypeWatch = 5, //手表类型
|
||||
|
///JL_DeviceTypeTradition = -1, //传统设备类型
|
||||
|
@property(nonatomic,assign)JL_DeviceType type; |
||||
|
|
||||
|
/// 协议版本
|
||||
|
@property(nonatomic,assign)uint8_t version; |
||||
|
|
||||
|
/// 可变数据段
|
||||
|
@property(nonatomic,copy)NSData *variableData; |
||||
|
|
||||
|
- (instancetype)initWithData:(NSData *)data; |
||||
|
|
||||
|
|
||||
|
/// 转成model类型
|
||||
|
/// @param basicData 蓝牙广播数据
|
||||
|
+(JLDevicesAdv *__nullable)advertDataToModel:(NSData *)basicData; |
||||
|
|
||||
|
/// 转成model类型
|
||||
|
/// @param basicHexStr 蓝牙广播数据
|
||||
|
+(JLDevicesAdv *__nullable)advertDataHexStrToModel:(NSString *)basicHexStr; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
|
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,47 @@ |
|||||
|
//
|
||||
|
// JLEarphoneAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import "JLDevicesAdv.h" |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLEarphoneAdv : JLDevicesAdv |
||||
|
|
||||
|
/// 左耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryLeft; |
||||
|
|
||||
|
/// 右耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryRight; |
||||
|
|
||||
|
///左耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingLeft; |
||||
|
|
||||
|
///右耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingRight; |
||||
|
|
||||
|
/// 是否已配对
|
||||
|
@property(nonatomic, assign) BOOL isParied; |
||||
|
|
||||
|
/// 是否主机
|
||||
|
@property(nonatomic, assign) BOOL isMaster; |
||||
|
|
||||
|
/// 是否允许连接
|
||||
|
@property(nonatomic, assign) BOOL enableConnect; |
||||
|
|
||||
|
/// 耳机状态
|
||||
|
///0x00:不显示弹窗
|
||||
|
///0x01:经典蓝牙未连接
|
||||
|
///0x02:经典蓝牙已连接
|
||||
|
///0x03:设备正在回连
|
||||
|
///0x04:设备不可连接 (需要手动进入配对模式)
|
||||
|
@property(nonatomic, assign) uint8_t status; |
||||
|
|
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,25 @@ |
|||||
|
//
|
||||
|
// JLOtaAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <JL_AdvParse/JL_AdvParse.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLOtaAdv : JLDevicesAdv |
||||
|
|
||||
|
/// ble address before
|
||||
|
@property(nonatomic,strong)NSString *BleAddrBefore; |
||||
|
|
||||
|
//MARK: - Version 1
|
||||
|
/// battery
|
||||
|
@property(nonatomic,assign)uint8_t battery; |
||||
|
|
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,19 @@ |
|||||
|
//
|
||||
|
// JLSoundBoxAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import "JLTwsAdv.h" |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLSoundBoxAdv : JLTwsAdv |
||||
|
|
||||
|
@property(nonatomic,assign)uint8_t battery; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,19 @@ |
|||||
|
//
|
||||
|
// JLSoundCardAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import "JLTwsAdv.h" |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLSoundCardAdv : JLTwsAdv |
||||
|
|
||||
|
@property(nonatomic,assign)uint8_t battery; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,89 @@ |
|||||
|
//
|
||||
|
// JLTwsAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import "JLDevicesAdv.h" |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLTwsAdv : JLDevicesAdv |
||||
|
|
||||
|
//MARK: - Version 0
|
||||
|
|
||||
|
/// 经典蓝牙地址
|
||||
|
@property(nonatomic, strong) NSString *edrAddr; |
||||
|
|
||||
|
/// 耳机状态
|
||||
|
///0x00:不显示弹窗
|
||||
|
///0x01:经典蓝牙未连接
|
||||
|
///0x02:经典蓝牙已连接
|
||||
|
///0x03:设备正在回连
|
||||
|
///0x04:设备不可连接 (需要手动进入配对模式)
|
||||
|
@property(nonatomic, assign) uint8_t status; |
||||
|
|
||||
|
/// 左耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryLeft; |
||||
|
|
||||
|
/// 右耳电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryRight; |
||||
|
|
||||
|
/// 充电仓电量
|
||||
|
@property(nonatomic, assign) uint8_t batteryBox; |
||||
|
|
||||
|
///左耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingLeft; |
||||
|
|
||||
|
///右耳是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingRight; |
||||
|
|
||||
|
///充电仓是否在充电中
|
||||
|
@property(nonatomic, assign) BOOL isChargingBox; |
||||
|
|
||||
|
/// seq
|
||||
|
/// 用于区分是否同一次开机。每次开机或者断开连接后 增加1
|
||||
|
@property(nonatomic, assign) uint8_t seq; |
||||
|
|
||||
|
/// 加密 Hash 校验值
|
||||
|
@property(nonatomic, copy) NSData *hashData; |
||||
|
|
||||
|
//MARK: - Version 1
|
||||
|
/// BLE连接属性(enableConnect)
|
||||
|
@property(nonatomic, assign) BOOL bleEnable; |
||||
|
|
||||
|
//MARK: - Version 2
|
||||
|
/// 连接方式
|
||||
|
/// 0x00 BLE 通迅
|
||||
|
/// 0x01 SPP 通迅
|
||||
|
/// 0x02 GATT Over BR/EDR (V5/V6)
|
||||
|
@property(nonatomic, assign) uint8_t connectWay; |
||||
|
|
||||
|
/// 是否支持智能充电仓
|
||||
|
@property(nonatomic, assign) BOOL isSupportChargBox; |
||||
|
|
||||
|
//MARK: - Version 3
|
||||
|
/// 左耳电量为挂脖耳机电量!!!,其他耳机电量使用
|
||||
|
|
||||
|
//MARK: - Version 4/5/6 扩展
|
||||
|
/// LeAudio连接状态值
|
||||
|
@property(nonatomic, assign) uint8_t leAudioStatus; |
||||
|
/// 是否支持LeAudio
|
||||
|
@property(nonatomic, assign) BOOL supportLeAudio; |
||||
|
/// LeAudio是否已连接
|
||||
|
@property(nonatomic, assign) BOOL leAudioConnectedStatus; |
||||
|
/// RCSP是否使用LeAudio地址
|
||||
|
@property(nonatomic, assign) BOOL rcspUseLeAudioAddress; |
||||
|
/// 是否需要认证
|
||||
|
@property(nonatomic, assign) BOOL needAuth; |
||||
|
/// 协议版本号
|
||||
|
@property(nonatomic, assign) uint8_t protocolVersion; |
||||
|
|
||||
|
/// 设备数量 (V6)
|
||||
|
@property(nonatomic, assign) uint8_t deviceQuantity; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,35 @@ |
|||||
|
//
|
||||
|
// JLWatchAdv.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/12/12.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <JL_AdvParse/JLDevicesAdv.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLWatchAdv : JLDevicesAdv |
||||
|
|
||||
|
/// 经典蓝牙地址
|
||||
|
@property(nonatomic, strong) NSString *edrAddr; |
||||
|
|
||||
|
/// 连接方式
|
||||
|
/// 0x00 ble
|
||||
|
/// 0x01 spp
|
||||
|
@property(nonatomic, assign) int8_t connectWay; |
||||
|
|
||||
|
|
||||
|
/// 手表状态
|
||||
|
/// 0x00:经典蓝牙未连接
|
||||
|
/// 0x01:经典蓝牙已连接 0x02:设备正在回连
|
||||
|
/// 0x03:设备不可连接 (需要手动进入配对模式)
|
||||
|
@property(nonatomic, assign) int8_t connectState; |
||||
|
|
||||
|
/// 是否需要先连上 ble
|
||||
|
@property(nonatomic, assign) BOOL priorityConnection; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,27 @@ |
|||||
|
//
|
||||
|
// JL_AdvParse.h
|
||||
|
// JL_AdvParse
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/1/31.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
//! Project version number for JL_AdvParse.
|
||||
|
FOUNDATION_EXPORT double JL_AdvParseVersionNumber; |
||||
|
|
||||
|
//! Project version string for JL_AdvParse.
|
||||
|
FOUNDATION_EXPORT const unsigned char JL_AdvParseVersionString[]; |
||||
|
|
||||
|
// In this header, you should import all the public headers of your framework using statements like #import <JL_AdvParse/PublicHeader.h>
|
||||
|
#import <JL_AdvParse/JLAdvParse.h> |
||||
|
#import <JL_AdvParse/JLDevicesAdv.h> |
||||
|
#import <JL_AdvParse/JLTwsAdv.h> |
||||
|
#import <JL_AdvParse/JLSoundBoxAdv.h> |
||||
|
#import <JL_AdvParse/JLSoundCardAdv.h> |
||||
|
#import <JL_AdvParse/JLChargingBoxAdv.h> |
||||
|
#import <JL_AdvParse/JLEarphoneAdv.h> |
||||
|
#import <JL_AdvParse/JLWatchAdv.h> |
||||
|
#import <JL_AdvParse/JLOtaAdv.h> |
||||
|
|
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,6 @@ |
|||||
|
framework module JL_AdvParse { |
||||
|
umbrella header "JL_AdvParse.h" |
||||
|
export * |
||||
|
|
||||
|
module * { export * } |
||||
|
} |
||||
@ -0,0 +1,267 @@ |
|||||
|
<?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/JLAdvParse.h</key> |
||||
|
<data> |
||||
|
64SI1XBWnV1VmXIYu8XpmwMpE04= |
||||
|
</data> |
||||
|
<key>Headers/JLChargingBoxAdv.h</key> |
||||
|
<data> |
||||
|
dxEumtBFtKzehtXyVAacIJk/UU4= |
||||
|
</data> |
||||
|
<key>Headers/JLDevicesAdv.h</key> |
||||
|
<data> |
||||
|
WG6Ivw9lqj20J5OXda4lXMvAsig= |
||||
|
</data> |
||||
|
<key>Headers/JLEarphoneAdv.h</key> |
||||
|
<data> |
||||
|
fJODfMyuNuG59rHtw1StpNjde1A= |
||||
|
</data> |
||||
|
<key>Headers/JLOtaAdv.h</key> |
||||
|
<data> |
||||
|
4Mj6y77mEbeHdo+4OgFL9yf+E0c= |
||||
|
</data> |
||||
|
<key>Headers/JLSoundBoxAdv.h</key> |
||||
|
<data> |
||||
|
9psoYa5IuZ6p/X9FRRnLe5THJMQ= |
||||
|
</data> |
||||
|
<key>Headers/JLSoundCardAdv.h</key> |
||||
|
<data> |
||||
|
Q5T5xqjNDkTS+Niqp/KpoD9vipY= |
||||
|
</data> |
||||
|
<key>Headers/JLTwsAdv.h</key> |
||||
|
<data> |
||||
|
whLObetTxteRXS580FiZ1/A3Yzo= |
||||
|
</data> |
||||
|
<key>Headers/JLWatchAdv.h</key> |
||||
|
<data> |
||||
|
gK+FyDcSe6OVJK11wqqm1ppRE9k= |
||||
|
</data> |
||||
|
<key>Headers/JL_AdvParse.h</key> |
||||
|
<data> |
||||
|
gtcFkie1/FuAHO4WI/GUyN9chKY= |
||||
|
</data> |
||||
|
<key>Info.plist</key> |
||||
|
<data> |
||||
|
y32GLYYZ4FDhJGOjUkYUZfxaRn8= |
||||
|
</data> |
||||
|
<key>Modules/module.modulemap</key> |
||||
|
<data> |
||||
|
hBvb1e7FRkpwYoECUsVQBBscN38= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>files2</key> |
||||
|
<dict> |
||||
|
<key>Headers/JLAdvParse.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
64SI1XBWnV1VmXIYu8XpmwMpE04= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
ZG6RQ7l2Ko9IXNo517Aimfq7d03KANKIIPV09hZSFrg= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLChargingBoxAdv.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
dxEumtBFtKzehtXyVAacIJk/UU4= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
Bci4NCRbpGrT/YgMlRkA2DjX/lY/o8VmxkWPNtV+DjA= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLDevicesAdv.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
WG6Ivw9lqj20J5OXda4lXMvAsig= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
Mxf6qWhX6ctmSC0RVl7gdK4koCGeaUr8omEI9+9PMvc= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLEarphoneAdv.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
fJODfMyuNuG59rHtw1StpNjde1A= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
WThhDcnj1tcLW3Lrp2VUET7rXC/8iv9Y1dtAdPg0yWs= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLOtaAdv.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
4Mj6y77mEbeHdo+4OgFL9yf+E0c= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
HuR8+O4ONYywZcporXuxlzO1xXOtZZqm/P9+s8yj+OI= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLSoundBoxAdv.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
9psoYa5IuZ6p/X9FRRnLe5THJMQ= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
Iqjsp9NyRvmdlXu0gN7zltuwg75M+Kc9qFaTSHStolA= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLSoundCardAdv.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
Q5T5xqjNDkTS+Niqp/KpoD9vipY= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
WTBLq2+eyH5+TrY08Gh3/yReEWRnKg9UOCJmz56bnkE= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLTwsAdv.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
whLObetTxteRXS580FiZ1/A3Yzo= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
w6Ia/stHXZvCfmmPgTEpBj7A6haG6O+E0MeXH/fNKmA= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLWatchAdv.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
gK+FyDcSe6OVJK11wqqm1ppRE9k= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
7iXBmticKJ52uKE+6RrHJt5ES0gq2Xan5WIG/w0sCyk= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JL_AdvParse.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
gtcFkie1/FuAHO4WI/GUyN9chKY= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
t61emyM8slC+fTJM6XnBxjTDrpY7xvhUK5gCXfQf/3E= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Modules/module.modulemap</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
hBvb1e7FRkpwYoECUsVQBBscN38= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
F65y3OGliGsHZpxzdTdQxUwgmJdHiihk1gvX6sJzhxA= |
||||
|
</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> |
||||
@ -0,0 +1,44 @@ |
|||||
|
<?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>AvailableLibraries</key> |
||||
|
<array> |
||||
|
<dict> |
||||
|
<key>BinaryPath</key> |
||||
|
<string>JL_HashPair.framework/JL_HashPair</string> |
||||
|
<key>LibraryIdentifier</key> |
||||
|
<string>ios-arm64</string> |
||||
|
<key>LibraryPath</key> |
||||
|
<string>JL_HashPair.framework</string> |
||||
|
<key>SupportedArchitectures</key> |
||||
|
<array> |
||||
|
<string>arm64</string> |
||||
|
</array> |
||||
|
<key>SupportedPlatform</key> |
||||
|
<string>ios</string> |
||||
|
</dict> |
||||
|
<dict> |
||||
|
<key>BinaryPath</key> |
||||
|
<string>JL_HashPair.framework/JL_HashPair</string> |
||||
|
<key>LibraryIdentifier</key> |
||||
|
<string>ios-arm64_x86_64-simulator</string> |
||||
|
<key>LibraryPath</key> |
||||
|
<string>JL_HashPair.framework</string> |
||||
|
<key>SupportedArchitectures</key> |
||||
|
<array> |
||||
|
<string>arm64</string> |
||||
|
<string>x86_64</string> |
||||
|
</array> |
||||
|
<key>SupportedPlatform</key> |
||||
|
<string>ios</string> |
||||
|
<key>SupportedPlatformVariant</key> |
||||
|
<string>simulator</string> |
||||
|
</dict> |
||||
|
</array> |
||||
|
<key>CFBundlePackageType</key> |
||||
|
<string>XFWK</string> |
||||
|
<key>XCFrameworkFormatVersion</key> |
||||
|
<string>1.0</string> |
||||
|
</dict> |
||||
|
</plist> |
||||
@ -0,0 +1,25 @@ |
|||||
|
//
|
||||
|
// BtHash.h
|
||||
|
// BtHash
|
||||
|
//
|
||||
|
// Created by EzioChan on 2022/6/29.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
@interface BtHash : NSObject |
||||
|
/*
|
||||
|
@param [in] pt[*1] The plaintext |
||||
|
@param ptlen The length of the plaintext(octets) range: 1~32 |
||||
|
@param [in] key[*1] The key for encrypt |
||||
|
@param keylen[*1] The length of the key(octets) range: 1~32 |
||||
|
@param [out] mac[*1] output : The Message Authentication Code 16 bytes. |
||||
|
@return error if < 0, 0 is normal. |
||||
|
*/ |
||||
|
+(int)decryptWithPlaintext:(unsigned char *)pt |
||||
|
andPlaintextLen:(int)ptlen |
||||
|
andKey: (unsigned char *)key |
||||
|
andKeyLen: (int)keylen |
||||
|
andMac:(unsigned char *)mac; |
||||
|
|
||||
|
@end |
||||
@ -0,0 +1,59 @@ |
|||||
|
//
|
||||
|
// JLHashHandler.h
|
||||
|
// JL_BLEKit
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/1/30.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
#import <JLLogHelper/JLLogHelper.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
typedef void(^JLHashBlock)(BOOL ret); |
||||
|
|
||||
|
@protocol JLHashHandlerDelegate <NSObject> |
||||
|
|
||||
|
/// 需要发送到设备校验认证的数据
|
||||
|
/// - Parameter data: 数据
|
||||
|
-(void)hashOnPairOutputData:(NSData*)data; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
|
||||
|
/// 设备认证
|
||||
|
@interface JLHashHandler : NSObject |
||||
|
|
||||
|
@property(nonatomic,weak)id<JLHashHandlerDelegate> delegate; |
||||
|
|
||||
|
|
||||
|
/// APP端发起设备认证
|
||||
|
/// - Parameters:
|
||||
|
/// - pKey: 加密Key(默认为空)
|
||||
|
/// - bk: 配对认证回调结果
|
||||
|
-(void)bluetoothPairingKey:(NSData *__nullable)pKey Result:(JLHashBlock)bk; |
||||
|
|
||||
|
|
||||
|
/// 重置设备认证过程
|
||||
|
-(void)hashResetPair; |
||||
|
|
||||
|
|
||||
|
/// 填入设备回复数据
|
||||
|
/// - Parameter rData: 数据
|
||||
|
-(void)inputPairData:(NSData*)rData; |
||||
|
|
||||
|
|
||||
|
/// 停止设备认证过程
|
||||
|
/// stop device pairing
|
||||
|
-(void)stopAuthPair; |
||||
|
|
||||
|
|
||||
|
/// 打印当前SDK的版本
|
||||
|
+(void)sdkVersion; |
||||
|
|
||||
|
|
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,21 @@ |
|||||
|
//
|
||||
|
// JL_HashPair.h
|
||||
|
// JL_HashPair
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/1/30.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
//! Project version number for JL_HashPair.
|
||||
|
FOUNDATION_EXPORT double JL_HashPairVersionNumber; |
||||
|
|
||||
|
//! Project version string for JL_HashPair.
|
||||
|
FOUNDATION_EXPORT const unsigned char JL_HashPairVersionString[]; |
||||
|
|
||||
|
// In this header, you should import all the public headers of your framework using statements like #import <JL_HashPair/PublicHeader.h>
|
||||
|
|
||||
|
#import <JL_HashPair/BtHash.h> |
||||
|
#import <JL_HashPair/JLHashHandler.h> |
||||
|
#import <JL_HashPair/JL_ble_pair.h> |
||||
@ -0,0 +1,20 @@ |
|||||
|
//
|
||||
|
// JL_ble_pair.h
|
||||
|
// JL_BLEKit
|
||||
|
//
|
||||
|
// Created by zhihui liang on 2018/11/10.
|
||||
|
// Copyright © 2018 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#ifndef JL_ble_pair_h |
||||
|
#define JL_ble_pair_h |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <stdint.h> |
||||
|
|
||||
|
void function_jieli(uint8_t *address,uint8_t *RAND,uint8_t *K,uint8_t *result); |
||||
|
|
||||
|
#pragma mark CRC校验 |
||||
|
unsigned short JL_CRC16(unsigned char *ptr, int len, uint16_t lastCrc); |
||||
|
|
||||
|
#endif /* JL_ble_pair_h */ |
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,6 @@ |
|||||
|
framework module JL_HashPair { |
||||
|
umbrella header "JL_HashPair.h" |
||||
|
export * |
||||
|
|
||||
|
module * { export * } |
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
//
|
||||
|
// BtHash.h
|
||||
|
// BtHash
|
||||
|
//
|
||||
|
// Created by EzioChan on 2022/6/29.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
@interface BtHash : NSObject |
||||
|
/*
|
||||
|
@param [in] pt[*1] The plaintext |
||||
|
@param ptlen The length of the plaintext(octets) range: 1~32 |
||||
|
@param [in] key[*1] The key for encrypt |
||||
|
@param keylen[*1] The length of the key(octets) range: 1~32 |
||||
|
@param [out] mac[*1] output : The Message Authentication Code 16 bytes. |
||||
|
@return error if < 0, 0 is normal. |
||||
|
*/ |
||||
|
+(int)decryptWithPlaintext:(unsigned char *)pt |
||||
|
andPlaintextLen:(int)ptlen |
||||
|
andKey: (unsigned char *)key |
||||
|
andKeyLen: (int)keylen |
||||
|
andMac:(unsigned char *)mac; |
||||
|
|
||||
|
@end |
||||
@ -0,0 +1,59 @@ |
|||||
|
//
|
||||
|
// JLHashHandler.h
|
||||
|
// JL_BLEKit
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/1/30.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
#import <JLLogHelper/JLLogHelper.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
typedef void(^JLHashBlock)(BOOL ret); |
||||
|
|
||||
|
@protocol JLHashHandlerDelegate <NSObject> |
||||
|
|
||||
|
/// 需要发送到设备校验认证的数据
|
||||
|
/// - Parameter data: 数据
|
||||
|
-(void)hashOnPairOutputData:(NSData*)data; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
|
||||
|
/// 设备认证
|
||||
|
@interface JLHashHandler : NSObject |
||||
|
|
||||
|
@property(nonatomic,weak)id<JLHashHandlerDelegate> delegate; |
||||
|
|
||||
|
|
||||
|
/// APP端发起设备认证
|
||||
|
/// - Parameters:
|
||||
|
/// - pKey: 加密Key(默认为空)
|
||||
|
/// - bk: 配对认证回调结果
|
||||
|
-(void)bluetoothPairingKey:(NSData *__nullable)pKey Result:(JLHashBlock)bk; |
||||
|
|
||||
|
|
||||
|
/// 重置设备认证过程
|
||||
|
-(void)hashResetPair; |
||||
|
|
||||
|
|
||||
|
/// 填入设备回复数据
|
||||
|
/// - Parameter rData: 数据
|
||||
|
-(void)inputPairData:(NSData*)rData; |
||||
|
|
||||
|
|
||||
|
/// 停止设备认证过程
|
||||
|
/// stop device pairing
|
||||
|
-(void)stopAuthPair; |
||||
|
|
||||
|
|
||||
|
/// 打印当前SDK的版本
|
||||
|
+(void)sdkVersion; |
||||
|
|
||||
|
|
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,21 @@ |
|||||
|
//
|
||||
|
// JL_HashPair.h
|
||||
|
// JL_HashPair
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/1/30.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
//! Project version number for JL_HashPair.
|
||||
|
FOUNDATION_EXPORT double JL_HashPairVersionNumber; |
||||
|
|
||||
|
//! Project version string for JL_HashPair.
|
||||
|
FOUNDATION_EXPORT const unsigned char JL_HashPairVersionString[]; |
||||
|
|
||||
|
// In this header, you should import all the public headers of your framework using statements like #import <JL_HashPair/PublicHeader.h>
|
||||
|
|
||||
|
#import <JL_HashPair/BtHash.h> |
||||
|
#import <JL_HashPair/JLHashHandler.h> |
||||
|
#import <JL_HashPair/JL_ble_pair.h> |
||||
@ -0,0 +1,20 @@ |
|||||
|
//
|
||||
|
// JL_ble_pair.h
|
||||
|
// JL_BLEKit
|
||||
|
//
|
||||
|
// Created by zhihui liang on 2018/11/10.
|
||||
|
// Copyright © 2018 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#ifndef JL_ble_pair_h |
||||
|
#define JL_ble_pair_h |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <stdint.h> |
||||
|
|
||||
|
void function_jieli(uint8_t *address,uint8_t *RAND,uint8_t *K,uint8_t *result); |
||||
|
|
||||
|
#pragma mark CRC校验 |
||||
|
unsigned short JL_CRC16(unsigned char *ptr, int len, uint16_t lastCrc); |
||||
|
|
||||
|
#endif /* JL_ble_pair_h */ |
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,6 @@ |
|||||
|
framework module JL_HashPair { |
||||
|
umbrella header "JL_HashPair.h" |
||||
|
export * |
||||
|
|
||||
|
module * { export * } |
||||
|
} |
||||
@ -0,0 +1,177 @@ |
|||||
|
<?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/BtHash.h</key> |
||||
|
<data> |
||||
|
EdZDmmVVm0KY3D72UHE3hQF42e4= |
||||
|
</data> |
||||
|
<key>Headers/JLHashHandler.h</key> |
||||
|
<data> |
||||
|
ArAEdyp9k5H5o4gFjW9zdx+0ISY= |
||||
|
</data> |
||||
|
<key>Headers/JL_HashPair.h</key> |
||||
|
<data> |
||||
|
Y9dInJ7eyVXJ8WOASyZGNDDIj9s= |
||||
|
</data> |
||||
|
<key>Headers/JL_ble_pair.h</key> |
||||
|
<data> |
||||
|
YP6GQrFs1nWR8BkMoj1fQdKHKKM= |
||||
|
</data> |
||||
|
<key>Info.plist</key> |
||||
|
<data> |
||||
|
pLA2PfPyxsguwM09KFXPq/Cy2ko= |
||||
|
</data> |
||||
|
<key>Modules/module.modulemap</key> |
||||
|
<data> |
||||
|
6wQFoRjNQqLop5Z3m/K5slHiG2k= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>files2</key> |
||||
|
<dict> |
||||
|
<key>Headers/BtHash.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
EdZDmmVVm0KY3D72UHE3hQF42e4= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
EfOAmi/ycUONPu8OgPUuPkc9caXqUhvVXE27JNmmnPk= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLHashHandler.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
ArAEdyp9k5H5o4gFjW9zdx+0ISY= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
7iuW7k7IBL4tf/bE1O3SudVyeFxG8YHoo7DqZGFdSBI= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JL_HashPair.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
Y9dInJ7eyVXJ8WOASyZGNDDIj9s= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
5Ow8T39Md9cD7Jb7iMaoihnIJhv8GHHIjGAsgZG//Og= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JL_ble_pair.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
YP6GQrFs1nWR8BkMoj1fQdKHKKM= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
ggTJvYOE/W4Tmghs665eiywakMiTsvgl7PeEayUkKqQ= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Modules/module.modulemap</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
6wQFoRjNQqLop5Z3m/K5slHiG2k= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
N+WiNcfG40LwaFvJZeLG5iNA48ZbrW0Oph/B9U+7i9U= |
||||
|
</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> |
||||
@ -0,0 +1,44 @@ |
|||||
|
<?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>AvailableLibraries</key> |
||||
|
<array> |
||||
|
<dict> |
||||
|
<key>BinaryPath</key> |
||||
|
<string>JL_OTALib.framework/JL_OTALib</string> |
||||
|
<key>LibraryIdentifier</key> |
||||
|
<string>ios-arm64</string> |
||||
|
<key>LibraryPath</key> |
||||
|
<string>JL_OTALib.framework</string> |
||||
|
<key>SupportedArchitectures</key> |
||||
|
<array> |
||||
|
<string>arm64</string> |
||||
|
</array> |
||||
|
<key>SupportedPlatform</key> |
||||
|
<string>ios</string> |
||||
|
</dict> |
||||
|
<dict> |
||||
|
<key>BinaryPath</key> |
||||
|
<string>JL_OTALib.framework/JL_OTALib</string> |
||||
|
<key>LibraryIdentifier</key> |
||||
|
<string>ios-arm64_x86_64-simulator</string> |
||||
|
<key>LibraryPath</key> |
||||
|
<string>JL_OTALib.framework</string> |
||||
|
<key>SupportedArchitectures</key> |
||||
|
<array> |
||||
|
<string>arm64</string> |
||||
|
<string>x86_64</string> |
||||
|
</array> |
||||
|
<key>SupportedPlatform</key> |
||||
|
<string>ios</string> |
||||
|
<key>SupportedPlatformVariant</key> |
||||
|
<string>simulator</string> |
||||
|
</dict> |
||||
|
</array> |
||||
|
<key>CFBundlePackageType</key> |
||||
|
<string>XFWK</string> |
||||
|
<key>XCFrameworkFormatVersion</key> |
||||
|
<string>1.0</string> |
||||
|
</dict> |
||||
|
</plist> |
||||
@ -0,0 +1,52 @@ |
|||||
|
//
|
||||
|
// JLOTAFile.h
|
||||
|
// JL_OTALib
|
||||
|
//
|
||||
|
// Created by EzioChan on 2024/7/26.
|
||||
|
// Copyright © 2024 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
typedef NS_ENUM(UInt8, JL_OTAUrlResult) { |
||||
|
JL_OTAUrlResultSuccess = 0x00, //OTA文件获取成功
|
||||
|
JL_OTAUrlResultFail = 0x01, //OTA文件获取失败
|
||||
|
JL_OTAUrlResultDownloadFail = 0x02, //OTA文件下载失败
|
||||
|
}; |
||||
|
|
||||
|
typedef void(^JL_OTA_URL)(JL_OTAUrlResult result, |
||||
|
NSString* __nullable version, |
||||
|
NSString* __nullable url, |
||||
|
NSString* __nullable explain); |
||||
|
|
||||
|
@interface JLOTAFile : NSObject |
||||
|
|
||||
|
|
||||
|
#pragma mark -文件下载 |
||||
|
/**
|
||||
|
文件下载 |
||||
|
@param key 授权key |
||||
|
@param code 授权code |
||||
|
@param result 回复 |
||||
|
*/ |
||||
|
-(void)cmdGetOtaFileKey:(NSString*)key |
||||
|
Code:(NSString*)code |
||||
|
Result:(JL_OTA_URL __nullable)result; |
||||
|
|
||||
|
/**
|
||||
|
OTA升级文件下载【MD5】 |
||||
|
@param key 授权key |
||||
|
@param code 授权code |
||||
|
@param hash MD5值 |
||||
|
@param result 回复 |
||||
|
*/ |
||||
|
-(void)cmdGetOtaFileKey:(NSString*)key |
||||
|
Code:(NSString*)code |
||||
|
hash:(NSString*)hash |
||||
|
Result:(JL_OTA_URL __nullable)result; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,62 @@ |
|||||
|
//
|
||||
|
// JLOtaCustom.h
|
||||
|
// JL_OTALib
|
||||
|
//
|
||||
|
// Created by EzioChan on 2025/4/17.
|
||||
|
// Copyright © 2025 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
@class JL_OTAManager; |
||||
|
|
||||
|
/// 自定义命令对象
|
||||
|
@interface JLOtaCustomData : NSObject |
||||
|
|
||||
|
/// 是否需要回复
|
||||
|
@property (nonatomic, assign) BOOL needResponse; |
||||
|
|
||||
|
/// 数据
|
||||
|
@property (nonatomic, strong) NSData *data; |
||||
|
|
||||
|
/// 回复数据 SN
|
||||
|
@property (nonatomic, assign) uint8_t sn; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
|
||||
|
/// 自定义命令回调
|
||||
|
@protocol JLOtaCustomDelegate <NSObject> |
||||
|
|
||||
|
/// 自定义命令回调
|
||||
|
/// - Parameter data: 自定义命令对象
|
||||
|
-(void)otaCustomReceiveData:(JLOtaCustomData *)data; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
/// 自定义命令
|
||||
|
@interface JLOtaCustom : NSObject |
||||
|
|
||||
|
/// 自定义命令
|
||||
|
/// - Parameters:
|
||||
|
/// - delegate: 代理回调
|
||||
|
/// - manager: 升级对象
|
||||
|
-(instancetype)initWithDelegate:(id<JLOtaCustomDelegate>)delegate OtaManager:(JL_OTAManager *)manager; |
||||
|
|
||||
|
/// 发送自定义命令
|
||||
|
/// - Parameters:
|
||||
|
/// - data: 下发的数据
|
||||
|
/// - need: 是否需要回复内容
|
||||
|
/// - result: 命令回复结果
|
||||
|
- (void)cmdSendCommandData:(NSData *)data needResponse:(BOOL)need Result:(void(^)(NSData * __nullable response, NSError * __nullable error)) result; |
||||
|
|
||||
|
/// 回复自定义命令
|
||||
|
/// - Parameters:
|
||||
|
/// - data: 回复的数据
|
||||
|
/// - sn: 回复的SN
|
||||
|
- (void)cmdResponseData:(NSData *)data sn:(uint8_t)sn; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,43 @@ |
|||||
|
//
|
||||
|
// JLOtaReConnectOption.h
|
||||
|
// JL_OTALib
|
||||
|
//
|
||||
|
// Created by EzioChan on 2025/3/27.
|
||||
|
// Copyright © 2025 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLOtaReConnectOption : NSObject |
||||
|
|
||||
|
/// 是否需要使用设备认证
|
||||
|
@property (assign, nonatomic) BOOL deviceAuthorize; |
||||
|
|
||||
|
/// 握手(配对)秘钥
|
||||
|
@property(strong,nonatomic)NSData *__nullable authKey; |
||||
|
|
||||
|
/// 设备服务UUID
|
||||
|
/// 默认是 AE00
|
||||
|
@property (strong, nonatomic) NSString *serviceUUID; |
||||
|
|
||||
|
///写特征 UUID
|
||||
|
/// 默认是 AE01
|
||||
|
@property (strong, nonatomic) NSString *writeUUID; |
||||
|
|
||||
|
/// 读特征 UUID
|
||||
|
/// 默认是 AE02
|
||||
|
@property (strong, nonatomic) NSString *readUUID; |
||||
|
|
||||
|
/// 是否需要响应的回应方式
|
||||
|
/// 默认是NO
|
||||
|
@property (assign, nonatomic) BOOL isWriteWithResponse; |
||||
|
|
||||
|
|
||||
|
|
||||
|
+ (JLOtaReConnectOption *)defaultOption; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,22 @@ |
|||||
|
//
|
||||
|
// JL_OTALib.h
|
||||
|
// JL_OTALib
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/1/29.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
//! Project version number for JL_OTALib.
|
||||
|
FOUNDATION_EXPORT double JL_OTALibVersionNumber; |
||||
|
|
||||
|
//! Project version string for JL_OTALib.
|
||||
|
FOUNDATION_EXPORT const unsigned char JL_OTALibVersionString[]; |
||||
|
|
||||
|
// In this header, you should import all the public headers of your framework using statements like #import <JL_OTALib/PublicHeader.h>
|
||||
|
#import <JL_OTALib/JL_OTAManager.h> |
||||
|
#import <JL_OTALib/jl_ufw.h> |
||||
|
#import <JL_OTALib/JLOTAFile.h> |
||||
|
#import <JL_OTALib/JLOtaReConnectOption.h> |
||||
|
#import <JL_OTALib/JLOtaCustom.h> |
||||
@ -0,0 +1,302 @@ |
|||||
|
//
|
||||
|
// JL_OTAManager.h
|
||||
|
// JL_BLEKit
|
||||
|
//
|
||||
|
// Created by 杰理科技 on 2021/11/16.
|
||||
|
// Copyright © 2021 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
#import <JLLogHelper/JLLogHelper.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
@class JLOtaReConnectOption; |
||||
|
|
||||
|
typedef NS_ENUM(UInt16, JL_OTAResult) { |
||||
|
/// OTA升级成功
|
||||
|
JL_OTAResultSuccess = 0x00, |
||||
|
/// OTA升级失败
|
||||
|
JL_OTAResultFail = 0x01, |
||||
|
/// OTA升级数据为空
|
||||
|
JL_OTAResultDataIsNull = 0x02, |
||||
|
/// OTA指令失败
|
||||
|
JL_OTAResultCommandFail = 0x03, |
||||
|
/// OTA标示偏移查找失败
|
||||
|
JL_OTAResultSeekFail = 0x04, |
||||
|
/// OTA升级固件信息错误
|
||||
|
JL_OTAResultInfoFail = 0x05, |
||||
|
/// OTA升级设备电压低
|
||||
|
JL_OTAResultLowPower = 0x06, |
||||
|
/// 未能进入OTA升级模式
|
||||
|
JL_OTAResultEnterFail = 0x07, |
||||
|
/// OTA升级中
|
||||
|
JL_OTAResultUpgrading = 0x08, |
||||
|
/// OTA需重连设备(uuid方式)
|
||||
|
JL_OTAResultReconnect = 0x09, |
||||
|
/// OTA需设备重启
|
||||
|
JL_OTAResultReboot = 0x0a, |
||||
|
/// OTA准备中
|
||||
|
JL_OTAResultPreparing = 0x0b, |
||||
|
/// OTA准备完成
|
||||
|
JL_OTAResultPrepared = 0x0f, |
||||
|
/// 设备已在升级中
|
||||
|
JL_OTAResultStatusIsUpdating = 0x10, |
||||
|
/// 当前固件多台设备连接,请手动断开另一个设备连接
|
||||
|
JL_OTAResultFailedConnectMore = 0x11, |
||||
|
/// 升级数据校验失败,SN 多次重复
|
||||
|
JL_OTAResultFailSameSN = 0xe0, |
||||
|
/// 升级取消
|
||||
|
JL_OTAResultCancel = 0xe1, |
||||
|
/// 升级数据校验失败
|
||||
|
JL_OTAResultFailVerification = 0xf1, |
||||
|
/// 升级失败
|
||||
|
JL_OTAResultFailCompletely = 0xf2, |
||||
|
/// 升级数据校验失败,加密Key不对
|
||||
|
JL_OTAResultFailKey = 0xf3, |
||||
|
/// 升级文件出错
|
||||
|
JL_OTAResultFailErrorFile = 0xf4, |
||||
|
/// uboot不匹配
|
||||
|
JL_OTAResultFailUboot = 0xf5, |
||||
|
/// 升级过程长度出错
|
||||
|
JL_OTAResultFailLenght = 0xf6, |
||||
|
/// 升级过程flash读写失败
|
||||
|
JL_OTAResultFailFlash = 0xf7, |
||||
|
/// 升级过程指令超时
|
||||
|
JL_OTAResultFailCmdTimeout = 0xf8, |
||||
|
/// 相同版本
|
||||
|
JL_OTAResultFailSameVersion = 0xf9, |
||||
|
/// TWS耳机未连接
|
||||
|
JL_OTAResultFailTWSDisconnect = 0xfa, |
||||
|
/// 耳机未在充电仓
|
||||
|
JL_OTAResultFailNotInBin = 0xfb, |
||||
|
/// OTA需重连设备(mac方式)
|
||||
|
JL_OTAResultReconnectWithMacAddr = 0xfc, |
||||
|
/// OTA设备断开
|
||||
|
JL_OTAResultDisconnect = 0xfd, |
||||
|
/// OTA需重连设备(更新资源)
|
||||
|
JL_OTAResultReconnectUpdateSource = 0xfe, |
||||
|
/// OTA未知错误
|
||||
|
JL_OTAResultUnknown |
||||
|
}; |
||||
|
|
||||
|
typedef NS_ENUM(UInt8, JL_OTAReconnectType) { |
||||
|
JL_OTAReconnectTypeUUID = 0x00, // OTA升级回连使用uuid
|
||||
|
JL_OTAReconnectTypeMACAddr = 0x01, // OTA升级回连使用mac地址
|
||||
|
}; |
||||
|
|
||||
|
typedef NS_ENUM(UInt8, JL_OtaStatus) { |
||||
|
JL_OtaStatusNormal = 0, // 正常升级
|
||||
|
JL_OtaStatusForce = 1, // 强制升级
|
||||
|
}; |
||||
|
typedef NS_ENUM(UInt8, JL_OtaHeadset) { |
||||
|
JL_OtaHeadsetNO = 0, // 耳机单备份 正常升级
|
||||
|
JL_OtaHeadsetYES = 1, // 耳机单备份 强制升级
|
||||
|
}; |
||||
|
|
||||
|
typedef NS_ENUM(UInt8, JL_OtaWatch) { |
||||
|
JL_OtaWatchNO = 0, // 手表资源 正常升级
|
||||
|
JL_OtaWatchYES = 1, // 手表资源 强制升级
|
||||
|
}__attribute__((deprecated("This enum is deprecated. Use JLOtaSourcesExtendMode instead."))); |
||||
|
|
||||
|
/// OTA资源升级模式
|
||||
|
typedef NS_ENUM(UInt8, JLOtaSourcesExtendMode) { |
||||
|
/// 不启用
|
||||
|
JLSourcesExtendModeDisable = 0, |
||||
|
/// 启用普通资源升级模式
|
||||
|
JLSourcesExtendModeNormal = 1, |
||||
|
/// 启用只升级资源的模式
|
||||
|
JLSourcesExtendModeSourceOnly = 2, |
||||
|
/// 启用只升级固件程序的模式
|
||||
|
JLSourcesExtendModeFirmwareOnly = 3, |
||||
|
}; |
||||
|
|
||||
|
typedef NS_ENUM(UInt8, JL_BootLoader) { |
||||
|
JL_BootLoaderNO = 0, // 不需要下载Bootloader
|
||||
|
JL_BootLoaderYES = 1, // 需要下载BootLoader
|
||||
|
}; |
||||
|
typedef NS_ENUM(UInt8, JL_Partition) { |
||||
|
JL_PartitionSingle = 0, // 固件单备份
|
||||
|
JL_PartitionDouble = 1, // 固件双备份
|
||||
|
}; |
||||
|
|
||||
|
typedef void (^JL_OTA_RT)(JL_OTAResult result, float progress); |
||||
|
|
||||
|
typedef void (^JL_OTA_RESULT)(uint8_t status, uint8_t sn, NSData *__nullable data); |
||||
|
|
||||
|
@class JL_OTAManager; |
||||
|
|
||||
|
/// OTA 升级管理对象回调
|
||||
|
@protocol JL_OTAManagerDelegate <NSObject> |
||||
|
|
||||
|
/// 即将被发送的数据
|
||||
|
/// @param data 数据内容
|
||||
|
- (void)otaDataSend:(NSData *_Nonnull)data; |
||||
|
|
||||
|
@optional |
||||
|
/// 回调设备状态信息
|
||||
|
/// @param manager 对象状态
|
||||
|
- (void)otaFeatureResult:(JL_OTAManager *_Nonnull)manager; |
||||
|
|
||||
|
/// 回调升级状态以及进度等
|
||||
|
/// @param result 状态以及进度信息
|
||||
|
/// @param progress 进度信息
|
||||
|
- (void)otaUpgradeResult:(JL_OTAResult)result Progress:(float)progress; |
||||
|
|
||||
|
/// 取消OTA升级
|
||||
|
- (void)otaCancel; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
/// OTA升级管理对象
|
||||
|
@interface JL_OTAManager : NSObject |
||||
|
|
||||
|
/// 设备UUID(需要开发者填入)
|
||||
|
@property(strong, nonatomic) NSString *mBLE_UUID; |
||||
|
|
||||
|
/// 设备名称(需要开发者填入)
|
||||
|
@property(strong, nonatomic) NSString *mBLE_NAME; |
||||
|
|
||||
|
/// 是否仅仅支持BLE
|
||||
|
@property(assign, nonatomic) BOOL bleOnly; |
||||
|
|
||||
|
/// ble蓝牙地址
|
||||
|
@property(strong, nonatomic) NSString *bleAddr; |
||||
|
|
||||
|
/// SN值
|
||||
|
@property(assign, nonatomic) uint8_t mCmdSN; |
||||
|
|
||||
|
/// 设备版本号
|
||||
|
@property(assign, nonatomic) uint16_t version; |
||||
|
|
||||
|
/// 设备版本信息
|
||||
|
@property(strong, nonatomic) NSString *versionFirmware; |
||||
|
|
||||
|
/// 设备OTA状态
|
||||
|
@property(assign, nonatomic) JL_OtaStatus otaStatus; |
||||
|
|
||||
|
/// 耳机单备份 是否需要强制升级
|
||||
|
@property(assign, nonatomic) JL_OtaHeadset otaHeadset; |
||||
|
|
||||
|
/// 手表资源 是否需要强制升级
|
||||
|
@property(assign, nonatomic) JL_OtaWatch otaWatch __attribute__((deprecated("This property is deprecated. Use otaSourceMode instead."))); |
||||
|
|
||||
|
/// 是否支持复用空间进行 OTA
|
||||
|
@property(assign, nonatomic) BOOL isSupportReuseSpaceOTA; |
||||
|
|
||||
|
/// 是否支持 OTA 拓展功能
|
||||
|
@property (assign, nonatomic) BOOL isSupportExpand; |
||||
|
|
||||
|
/// 资源升级模式类型
|
||||
|
@property(assign, nonatomic) JLOtaSourcesExtendMode otaSourceMode; |
||||
|
|
||||
|
/// 设备OTA时支持单/双备份
|
||||
|
@property(assign, nonatomic) JL_Partition otaPartition; |
||||
|
|
||||
|
/// 设备是否需要下载Loader
|
||||
|
@property(assign, nonatomic) JL_BootLoader bootloaderType; |
||||
|
|
||||
|
/// OTA升级回连方式
|
||||
|
@property(assign, nonatomic) JL_OTAReconnectType otaReconnectType; |
||||
|
|
||||
|
/// OTA升级内容大小(设备通知的)
|
||||
|
@property(assign, nonatomic, readonly) int64_t otaLength; |
||||
|
|
||||
|
/// 已传输的数据大小
|
||||
|
@property(assign, nonatomic, readonly) uint32_t otaSent; |
||||
|
|
||||
|
/// 设备交互回调代理
|
||||
|
@property(weak, nonatomic) id<JL_OTAManagerDelegate> delegate; |
||||
|
|
||||
|
/// 获取 OTA 升级对象
|
||||
|
+ (JL_OTAManager *)getOTAManager; |
||||
|
|
||||
|
/// 不建议使用自行初始化
|
||||
|
/// 推荐获取 getOTAManager
|
||||
|
- (instancetype)init __attribute__((deprecated("Please use getOTAManager instead."))); |
||||
|
|
||||
|
/// 打印OTA发送的数据内容
|
||||
|
/// - Parameter status: 开关
|
||||
|
- (void)logSendData:(BOOL)status; |
||||
|
|
||||
|
/// 当BLE连接上时告知SDK
|
||||
|
- (void)noteEntityConnected; |
||||
|
|
||||
|
/// 当BLE断开时告知SDK
|
||||
|
- (void)noteEntityDisconnected; |
||||
|
|
||||
|
/// 设置最大丢包次数
|
||||
|
/// - Parameter count: 次数
|
||||
|
/// default: 10
|
||||
|
- (void)maxLostCount:(int)count; |
||||
|
|
||||
|
/// 设置超时时间
|
||||
|
/// - Parameter timeOut: 时间
|
||||
|
/// default: 5
|
||||
|
- (void)cmdTimeOut:(int)timeOut; |
||||
|
|
||||
|
/// 设置是否需要回连
|
||||
|
/// 一般不允许外部干扰状态机,外部不适用此方法
|
||||
|
/// - Parameter isReLink: 回连
|
||||
|
- (void)setOTARelink:(BOOL)isReLink __attribute__((deprecated("Can't be used externally."))); |
||||
|
|
||||
|
/// Receive data from rcsp
|
||||
|
/// 设备端过来的数据
|
||||
|
/// - Parameter data: data
|
||||
|
- (void)cmdOtaDataReceive:(NSData *)data; |
||||
|
|
||||
|
/// 查询设备OTA信息
|
||||
|
/// 所有情况下都需要执行,而且是在连上后(认证完成)第一步执行
|
||||
|
- (void)cmdTargetFeature; |
||||
|
|
||||
|
/// 查询设备系统状态
|
||||
|
/// 当设备需要挂载外置flash才能正常升级时需要执行,其他情况则无需执行
|
||||
|
- (void)cmdSystemFunction; |
||||
|
|
||||
|
/// OTA单备份,是否正在回连
|
||||
|
- (BOOL)cmdOtaIsRelinking; |
||||
|
|
||||
|
#pragma mark---> OTA升级 |
||||
|
/**
|
||||
|
开始OTA升级 |
||||
|
@param data 升级数据 |
||||
|
@param result 升级结果 |
||||
|
*/ |
||||
|
- (void)cmdOTAData:(NSData *)data |
||||
|
Result:(JL_OTA_RT __nullable)result; |
||||
|
|
||||
|
/// OTA升级II
|
||||
|
/// 单备份升级特有!!!!
|
||||
|
/// 此接口可用于 OTA 回连成功后,再次发起升级使用
|
||||
|
/// @param result 升级结果回调
|
||||
|
- (void)cmdOtaDataIIResult:(JL_OTA_RT __nullable)result; |
||||
|
|
||||
|
/// OTA升级III
|
||||
|
/// 单备份升级特有!!!
|
||||
|
/// 此接口免去了公版 OTA 的外边回连策略,内部实现回连
|
||||
|
/// ⚠️使用此方法时不可使用 delegate 的回调信息,要使用 Result 的回调信息
|
||||
|
/// @param data OTA数据
|
||||
|
/// @param option 回连选项
|
||||
|
/// @param result 回复
|
||||
|
-(void)cmdUpgrade:(NSData *)data Option:(JLOtaReConnectOption *_Nullable)option Result:(JL_OTA_RT _Nonnull)result; |
||||
|
|
||||
|
/**
|
||||
|
OTA升级取消 |
||||
|
@param result 回复 |
||||
|
*/ |
||||
|
- (void)cmdOTACancelResult:(JL_OTA_RESULT __nullable)result; |
||||
|
|
||||
|
/// 重启设备
|
||||
|
- (void)cmdRebootDevice; |
||||
|
|
||||
|
/// 强制重启设备
|
||||
|
- (void)cmdRebootForceDevice; |
||||
|
|
||||
|
/// 重置OTA manager
|
||||
|
- (void)resetOTAManager; |
||||
|
|
||||
|
/// 打印OTA SDK版本
|
||||
|
+ (NSString *)logSDKVersion; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,207 @@ |
|||||
|
/**
|
||||
|
* Des: |
||||
|
* author: Bob |
||||
|
* date: 2022/11/29 |
||||
|
* Copyright: Jieli Technology |
||||
|
*/ |
||||
|
|
||||
|
#ifndef NATIVEAPPLICATION_JL_UFW_H |
||||
|
#define NATIVEAPPLICATION_JL_UFW_H |
||||
|
|
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
#include <stdlib.h> |
||||
|
//#include <android/log.h>
|
||||
|
//#include <jni.h>
|
||||
|
//
|
||||
|
//#define tag "myJNI"
|
||||
|
//#define logi(TAG, ...) ((void)__android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__))
|
||||
|
//#define logw(TAG, ...) ((void)__android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__))
|
||||
|
//#define loge(TAG, ...) ((void)__android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__))
|
||||
|
|
||||
|
int parse_fw_info(const char *data, int size, uint8_t *resultBuff, uint32_t buffSize); |
||||
|
#define BIT(n) (1 << n) |
||||
|
|
||||
|
// for FW file
|
||||
|
enum eFW_FILE_TYPE { |
||||
|
|
||||
|
FILE_TYPE_FW_FLASH_BIN = 0, // FLASH文件,第一块FLASH数据
|
||||
|
FILE_TYPE_FW_OTP_BIN = 1, // OTP文件
|
||||
|
FILE_TYPE_FW_INFO_LOG = 2, // FW文件中保存的描述信息
|
||||
|
FILE_TYPE_FW_BURN_CFG = 3, // 烧写器配置文件
|
||||
|
FILE_TYPE_FW_SCRIPT_DATA = 4, // 烧写器打包烧写器下载文件时,需要执行的脚本数据
|
||||
|
FILE_TYPE_FW_SRC = 5, // 需要保存在FW文件中的代码文件, FW文件查看/编辑器都不能显示这些数据
|
||||
|
FILE_TYPE_FW_NAME_BIN = 6, // 升级名字用的FW文件,已经废除
|
||||
|
FILE_TYPE_FW_OTP_VER_BIN = 7, // OTP maskrom版本
|
||||
|
FILE_TYPE_FW_OTPCFG_BIN = 8, // OTP配置信息
|
||||
|
FILE_TYPE_FW_OTP_CHIP_CONTROL_BIN = 9, // OTP芯片控制信息
|
||||
|
|
||||
|
FILE_TYPE_FW_OTP_MINI_UBOOT = 0xA, // 烧写到OTP的MINI UBOOT文件
|
||||
|
FILE_TYPE_FW_OTP_FIX_UBOOT = 0xB, // 烧写到OTP的FIX UBOOT文件
|
||||
|
FILE_TYPE_FW_FLASH_2_BIN = 0xC, // 第二块FLASH数据
|
||||
|
FILE_TYPE_FW_BR18_EFUSE_CONFIG_BIN = 0xD, // BR18 24BIT EFUSE配置数据
|
||||
|
FILE_TYPE_FW_RESOURCE_FILE = 0xE, // 资源文件
|
||||
|
FILE_TYPE_FW_2018KEY_INFO = 0xF, // 2018年的新KEY信息
|
||||
|
|
||||
|
FILE_TYPE_FW_BURNER_CUSTOMER_DATA = 0x10, // 一拖八烧写器用户信息
|
||||
|
FILE_TYPE_FW_BURNER_DV15_FLASH_BIN = 0x11, // 一拖八烧写器第一块FLASH数据
|
||||
|
FILE_TYPE_FW_BURNER_APP_FLASH_BIN = 0x12, // 一拖八烧写器第二块FLASH数据
|
||||
|
FILE_TYPE_FW_BURNER_DATA_FLASH_BIN = 0x13, // 一拖八烧写器第三块FLASH数据
|
||||
|
FILE_TYPE_FW_BURNER_BR21_FLASH_BIN = 0x14, // 一拖八烧写器第四块FLASH数据
|
||||
|
|
||||
|
FILE_TYPE_FW_FLASH_BIN_2 = 0x20, // 下载到第一块FLASH的文件,下载工具根据条件要么下载FILE_TYPE_FW_FLASH_BIN,要么下载FILE_TYPE_FW_FLASH_BIN_2
|
||||
|
FILE_TYPE_FW_FLASH_BIN_3, |
||||
|
FILE_TYPE_FW_FLASH_BIN_4, |
||||
|
|
||||
|
FILE_TYPE_FW_LOADER_BIN = 0x31, // 打包的LOADER程序代码
|
||||
|
|
||||
|
FILE_TYPE_FW_TEST_BOX_OTA_BIN = 0x64, // 测试盒使用的ota.bin
|
||||
|
|
||||
|
FILE_TYPE_FW_3RD_DATA_FILE = 0x71, // 第三方烧写数据
|
||||
|
|
||||
|
FILE_TYPE_FW_OTA_TARGET_DEVICE_INFO = 0xA0, |
||||
|
FILE_TYPE_FW_BURN_COUNT_LIMIT = 0xA1, // 烧写授权信息
|
||||
|
|
||||
|
FILE_TYPE_FW_ADDITIONAL_FILE = 0xEE, // 附加文件,由烧写器根据名字决定用途
|
||||
|
FILE_TYPE_FW_PASSTHROUGH_DATA = 0xEF, // AC691X BTIF数据
|
||||
|
// 仅存在于FW文件中的数据
|
||||
|
FILE_TYPE_FW_HIDDEN_CFG_BIN = 0xFA, |
||||
|
FILE_TYPE_FW_INVISIBLE_DATA = 0xFB, // 保存在FW文件中的隐藏数据,FW文件查看/编辑器都不能显示这些数据
|
||||
|
FILE_TYPE_FW_VISIBLE_DATA = 0xFE, // 仅保存在FW文件中的HEX数据
|
||||
|
|
||||
|
FILE_TYPE_FW_TAIL = 0xFF, // FW文件尾部标识
|
||||
|
}; |
||||
|
|
||||
|
typedef struct U16BIT |
||||
|
{ |
||||
|
unsigned char b0 : 1; |
||||
|
unsigned char b1 : 1; |
||||
|
unsigned char b2 : 1; |
||||
|
unsigned char b3 : 1; |
||||
|
unsigned char b4 : 1; |
||||
|
unsigned char b5 : 1; |
||||
|
unsigned char b6 : 1; |
||||
|
unsigned char b7 : 1; |
||||
|
unsigned char b8 : 1; |
||||
|
unsigned char b9 : 1; |
||||
|
unsigned char b10 : 1; |
||||
|
unsigned char b11 : 1; |
||||
|
unsigned char b12 : 1; |
||||
|
unsigned char b13 : 1; |
||||
|
unsigned char b14 : 1; |
||||
|
unsigned char b15 : 1; |
||||
|
|
||||
|
} U16BIT; |
||||
|
typedef union UBIT16 |
||||
|
{ |
||||
|
U16BIT bits; |
||||
|
uint16_t val; |
||||
|
} UBIT16; |
||||
|
|
||||
|
typedef struct stRES_FILE_HEAD { |
||||
|
uint32_t u32Tag; |
||||
|
uint16_t u16Crc; |
||||
|
uint16_t u16CrcOfItems; |
||||
|
uint32_t u32Len; |
||||
|
uint16_t u16Count; |
||||
|
uint16_t u16Res; |
||||
|
uint8_t u8Res16[16]; |
||||
|
}RES_FILE_HEAD; |
||||
|
|
||||
|
typedef struct stRES_CONFIG_ITEM { |
||||
|
uint16_t u16Index; |
||||
|
uint16_t u16Type; |
||||
|
uint32_t u32Addr; |
||||
|
uint32_t u32Len; |
||||
|
uint16_t u16CrcOfData; |
||||
|
uint16_t u16Res; |
||||
|
char szName[16]; |
||||
|
}RES_CONFIG_ITEM; |
||||
|
static uint16_t m_u16ChipKey = 0xFFFF; |
||||
|
static uint16_t m_u16DefaultKey = 0xFFFF; |
||||
|
|
||||
|
|
||||
|
#pragma pack(1) |
||||
|
#define JL_FILE_ITEM_NAME_MAX_LEN 16 |
||||
|
#define JL_CHIP_KEY_ENC_LENGTH 32 |
||||
|
|
||||
|
typedef struct stUFW_SYD_HEAD_V1 { |
||||
|
uint16_t u16Crc; // crc16 for this struct
|
||||
|
uint16_t u16CrcOfSydFileHead; |
||||
|
uint32_t u32FileLength; // file length
|
||||
|
uint16_t u16FileCount; // 此FW文件中包含的子文件个数
|
||||
|
uint16_t u16Version; |
||||
|
uint32_t u32Res; |
||||
|
char szChipName[16]; // 此FW文件对应的芯片类型,如AC690X,AC691X
|
||||
|
uint32_t u32Res2[4]; |
||||
|
uint32_t u32Res3[4]; |
||||
|
}UFW_SYD_HEAD_V1; |
||||
|
|
||||
|
typedef struct stUFW_FILE_HEAD_V1 { |
||||
|
uint8_t u8FileType; // 文件类型
|
||||
|
uint8_t u8Res; // 保留
|
||||
|
uint16_t u16Index; // 文件索引号
|
||||
|
uint16_t u16Crc; // 明文数据的校验码
|
||||
|
uint16_t u16Version; // 本结构体版本
|
||||
|
uint32_t u32Addr; // 地址
|
||||
|
uint32_t u32Length; // 数据长度
|
||||
|
uint32_t u32AllLength; // 数据长度+尾部对齐的数据长度
|
||||
|
uint32_t u32EncryptedAddr; // 加密数据的地址偏移(相对u32Addr的地址)
|
||||
|
uint32_t u32EncryptedLength; // 加密的数据长度
|
||||
|
uint32_t u32Res; // 保留
|
||||
|
uint32_t u64Res1[4]; // 保留
|
||||
|
uint32_t u64Res2[4]; // 保留
|
||||
|
char name[JL_FILE_ITEM_NAME_MAX_LEN]; |
||||
|
|
||||
|
}UFW_FILE_HEAD_V1; |
||||
|
|
||||
|
typedef struct stJL_FILE_TAIL { |
||||
|
char szChipKey[JL_CHIP_KEY_ENC_LENGTH]; // 32 // 固定位置
|
||||
|
uint16_t u16ChipKeyCRC16; // 34 // 固定位置
|
||||
|
uint8_t u8Magic[6]; // 40 // 固定位置
|
||||
|
uint8_t u8Res8[8]; // 48
|
||||
|
char szTailChipName[6]; // 54 // 固定位置
|
||||
|
uint8_t u8Reserv10[10]; // 64
|
||||
|
}JL_FILE_TAIL; |
||||
|
|
||||
|
typedef struct { |
||||
|
char szName[3]; |
||||
|
char szVersion[3]; |
||||
|
uint8_t u8Flag; |
||||
|
uint8_t u8Res; |
||||
|
uint32_t u32Crc; |
||||
|
uint16_t u16Crc; |
||||
|
uint16_t u16Res; |
||||
|
}JL_FLASH_BIN_TAIL; |
||||
|
|
||||
|
typedef UFW_SYD_HEAD_V1 jl_ufw_syd_head; |
||||
|
typedef UFW_FILE_HEAD_V1 jl_ufw_file_head; |
||||
|
typedef JL_FILE_TAIL jl_ufw_tail; |
||||
|
|
||||
|
typedef struct stJL_BR22_FLASH_HEAD { |
||||
|
uint16_t u16Crc; // 结构体自身校验码
|
||||
|
uint8_t u8SizeForBurner; // 为烧写器保留的空间大小
|
||||
|
uint8_t u8Version; // FLASH FS版本号
|
||||
|
char vid[4]; // 4byte的vid
|
||||
|
uint32_t u32FlashSize; // FLASH大小,由isd_download计算得出
|
||||
|
uint8_t u8FsVersion; // 类型:br18/br22
|
||||
|
uint8_t u8BlockAlingnModulus; // 对齐系数
|
||||
|
uint8_t u8Res; // 保留,以后有可能会用于存放顶层目录的偏移和文件目录内偏移信息
|
||||
|
uint8_t u8SpecialOptFlag; // 用于标记是否需要生成2种flash格式的标记位,目前只用1位,以后如果需要特殊操作需要标记,再用其他位
|
||||
|
char pid[16]; // 16byte的pid
|
||||
|
}JL_BR22_FLASH_HEAD; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
#pragma pack() |
||||
|
|
||||
|
|
||||
|
#endif //NATIVEAPPLICATION_JL_UFW_H
|
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,6 @@ |
|||||
|
framework module JL_OTALib { |
||||
|
umbrella header "JL_OTALib.h" |
||||
|
export * |
||||
|
|
||||
|
module * { export * } |
||||
|
} |
||||
@ -0,0 +1,52 @@ |
|||||
|
//
|
||||
|
// JLOTAFile.h
|
||||
|
// JL_OTALib
|
||||
|
//
|
||||
|
// Created by EzioChan on 2024/7/26.
|
||||
|
// Copyright © 2024 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
typedef NS_ENUM(UInt8, JL_OTAUrlResult) { |
||||
|
JL_OTAUrlResultSuccess = 0x00, //OTA文件获取成功
|
||||
|
JL_OTAUrlResultFail = 0x01, //OTA文件获取失败
|
||||
|
JL_OTAUrlResultDownloadFail = 0x02, //OTA文件下载失败
|
||||
|
}; |
||||
|
|
||||
|
typedef void(^JL_OTA_URL)(JL_OTAUrlResult result, |
||||
|
NSString* __nullable version, |
||||
|
NSString* __nullable url, |
||||
|
NSString* __nullable explain); |
||||
|
|
||||
|
@interface JLOTAFile : NSObject |
||||
|
|
||||
|
|
||||
|
#pragma mark -文件下载 |
||||
|
/**
|
||||
|
文件下载 |
||||
|
@param key 授权key |
||||
|
@param code 授权code |
||||
|
@param result 回复 |
||||
|
*/ |
||||
|
-(void)cmdGetOtaFileKey:(NSString*)key |
||||
|
Code:(NSString*)code |
||||
|
Result:(JL_OTA_URL __nullable)result; |
||||
|
|
||||
|
/**
|
||||
|
OTA升级文件下载【MD5】 |
||||
|
@param key 授权key |
||||
|
@param code 授权code |
||||
|
@param hash MD5值 |
||||
|
@param result 回复 |
||||
|
*/ |
||||
|
-(void)cmdGetOtaFileKey:(NSString*)key |
||||
|
Code:(NSString*)code |
||||
|
hash:(NSString*)hash |
||||
|
Result:(JL_OTA_URL __nullable)result; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,62 @@ |
|||||
|
//
|
||||
|
// JLOtaCustom.h
|
||||
|
// JL_OTALib
|
||||
|
//
|
||||
|
// Created by EzioChan on 2025/4/17.
|
||||
|
// Copyright © 2025 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
@class JL_OTAManager; |
||||
|
|
||||
|
/// 自定义命令对象
|
||||
|
@interface JLOtaCustomData : NSObject |
||||
|
|
||||
|
/// 是否需要回复
|
||||
|
@property (nonatomic, assign) BOOL needResponse; |
||||
|
|
||||
|
/// 数据
|
||||
|
@property (nonatomic, strong) NSData *data; |
||||
|
|
||||
|
/// 回复数据 SN
|
||||
|
@property (nonatomic, assign) uint8_t sn; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
|
||||
|
/// 自定义命令回调
|
||||
|
@protocol JLOtaCustomDelegate <NSObject> |
||||
|
|
||||
|
/// 自定义命令回调
|
||||
|
/// - Parameter data: 自定义命令对象
|
||||
|
-(void)otaCustomReceiveData:(JLOtaCustomData *)data; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
/// 自定义命令
|
||||
|
@interface JLOtaCustom : NSObject |
||||
|
|
||||
|
/// 自定义命令
|
||||
|
/// - Parameters:
|
||||
|
/// - delegate: 代理回调
|
||||
|
/// - manager: 升级对象
|
||||
|
-(instancetype)initWithDelegate:(id<JLOtaCustomDelegate>)delegate OtaManager:(JL_OTAManager *)manager; |
||||
|
|
||||
|
/// 发送自定义命令
|
||||
|
/// - Parameters:
|
||||
|
/// - data: 下发的数据
|
||||
|
/// - need: 是否需要回复内容
|
||||
|
/// - result: 命令回复结果
|
||||
|
- (void)cmdSendCommandData:(NSData *)data needResponse:(BOOL)need Result:(void(^)(NSData * __nullable response, NSError * __nullable error)) result; |
||||
|
|
||||
|
/// 回复自定义命令
|
||||
|
/// - Parameters:
|
||||
|
/// - data: 回复的数据
|
||||
|
/// - sn: 回复的SN
|
||||
|
- (void)cmdResponseData:(NSData *)data sn:(uint8_t)sn; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,43 @@ |
|||||
|
//
|
||||
|
// JLOtaReConnectOption.h
|
||||
|
// JL_OTALib
|
||||
|
//
|
||||
|
// Created by EzioChan on 2025/3/27.
|
||||
|
// Copyright © 2025 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
|
||||
|
@interface JLOtaReConnectOption : NSObject |
||||
|
|
||||
|
/// 是否需要使用设备认证
|
||||
|
@property (assign, nonatomic) BOOL deviceAuthorize; |
||||
|
|
||||
|
/// 握手(配对)秘钥
|
||||
|
@property(strong,nonatomic)NSData *__nullable authKey; |
||||
|
|
||||
|
/// 设备服务UUID
|
||||
|
/// 默认是 AE00
|
||||
|
@property (strong, nonatomic) NSString *serviceUUID; |
||||
|
|
||||
|
///写特征 UUID
|
||||
|
/// 默认是 AE01
|
||||
|
@property (strong, nonatomic) NSString *writeUUID; |
||||
|
|
||||
|
/// 读特征 UUID
|
||||
|
/// 默认是 AE02
|
||||
|
@property (strong, nonatomic) NSString *readUUID; |
||||
|
|
||||
|
/// 是否需要响应的回应方式
|
||||
|
/// 默认是NO
|
||||
|
@property (assign, nonatomic) BOOL isWriteWithResponse; |
||||
|
|
||||
|
|
||||
|
|
||||
|
+ (JLOtaReConnectOption *)defaultOption; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,22 @@ |
|||||
|
//
|
||||
|
// JL_OTALib.h
|
||||
|
// JL_OTALib
|
||||
|
//
|
||||
|
// Created by EzioChan on 2023/1/29.
|
||||
|
// Copyright © 2023 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
|
||||
|
//! Project version number for JL_OTALib.
|
||||
|
FOUNDATION_EXPORT double JL_OTALibVersionNumber; |
||||
|
|
||||
|
//! Project version string for JL_OTALib.
|
||||
|
FOUNDATION_EXPORT const unsigned char JL_OTALibVersionString[]; |
||||
|
|
||||
|
// In this header, you should import all the public headers of your framework using statements like #import <JL_OTALib/PublicHeader.h>
|
||||
|
#import <JL_OTALib/JL_OTAManager.h> |
||||
|
#import <JL_OTALib/jl_ufw.h> |
||||
|
#import <JL_OTALib/JLOTAFile.h> |
||||
|
#import <JL_OTALib/JLOtaReConnectOption.h> |
||||
|
#import <JL_OTALib/JLOtaCustom.h> |
||||
@ -0,0 +1,302 @@ |
|||||
|
//
|
||||
|
// JL_OTAManager.h
|
||||
|
// JL_BLEKit
|
||||
|
//
|
||||
|
// Created by 杰理科技 on 2021/11/16.
|
||||
|
// Copyright © 2021 www.zh-jieli.com. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#import <Foundation/Foundation.h> |
||||
|
#import <JLLogHelper/JLLogHelper.h> |
||||
|
|
||||
|
NS_ASSUME_NONNULL_BEGIN |
||||
|
@class JLOtaReConnectOption; |
||||
|
|
||||
|
typedef NS_ENUM(UInt16, JL_OTAResult) { |
||||
|
/// OTA升级成功
|
||||
|
JL_OTAResultSuccess = 0x00, |
||||
|
/// OTA升级失败
|
||||
|
JL_OTAResultFail = 0x01, |
||||
|
/// OTA升级数据为空
|
||||
|
JL_OTAResultDataIsNull = 0x02, |
||||
|
/// OTA指令失败
|
||||
|
JL_OTAResultCommandFail = 0x03, |
||||
|
/// OTA标示偏移查找失败
|
||||
|
JL_OTAResultSeekFail = 0x04, |
||||
|
/// OTA升级固件信息错误
|
||||
|
JL_OTAResultInfoFail = 0x05, |
||||
|
/// OTA升级设备电压低
|
||||
|
JL_OTAResultLowPower = 0x06, |
||||
|
/// 未能进入OTA升级模式
|
||||
|
JL_OTAResultEnterFail = 0x07, |
||||
|
/// OTA升级中
|
||||
|
JL_OTAResultUpgrading = 0x08, |
||||
|
/// OTA需重连设备(uuid方式)
|
||||
|
JL_OTAResultReconnect = 0x09, |
||||
|
/// OTA需设备重启
|
||||
|
JL_OTAResultReboot = 0x0a, |
||||
|
/// OTA准备中
|
||||
|
JL_OTAResultPreparing = 0x0b, |
||||
|
/// OTA准备完成
|
||||
|
JL_OTAResultPrepared = 0x0f, |
||||
|
/// 设备已在升级中
|
||||
|
JL_OTAResultStatusIsUpdating = 0x10, |
||||
|
/// 当前固件多台设备连接,请手动断开另一个设备连接
|
||||
|
JL_OTAResultFailedConnectMore = 0x11, |
||||
|
/// 升级数据校验失败,SN 多次重复
|
||||
|
JL_OTAResultFailSameSN = 0xe0, |
||||
|
/// 升级取消
|
||||
|
JL_OTAResultCancel = 0xe1, |
||||
|
/// 升级数据校验失败
|
||||
|
JL_OTAResultFailVerification = 0xf1, |
||||
|
/// 升级失败
|
||||
|
JL_OTAResultFailCompletely = 0xf2, |
||||
|
/// 升级数据校验失败,加密Key不对
|
||||
|
JL_OTAResultFailKey = 0xf3, |
||||
|
/// 升级文件出错
|
||||
|
JL_OTAResultFailErrorFile = 0xf4, |
||||
|
/// uboot不匹配
|
||||
|
JL_OTAResultFailUboot = 0xf5, |
||||
|
/// 升级过程长度出错
|
||||
|
JL_OTAResultFailLenght = 0xf6, |
||||
|
/// 升级过程flash读写失败
|
||||
|
JL_OTAResultFailFlash = 0xf7, |
||||
|
/// 升级过程指令超时
|
||||
|
JL_OTAResultFailCmdTimeout = 0xf8, |
||||
|
/// 相同版本
|
||||
|
JL_OTAResultFailSameVersion = 0xf9, |
||||
|
/// TWS耳机未连接
|
||||
|
JL_OTAResultFailTWSDisconnect = 0xfa, |
||||
|
/// 耳机未在充电仓
|
||||
|
JL_OTAResultFailNotInBin = 0xfb, |
||||
|
/// OTA需重连设备(mac方式)
|
||||
|
JL_OTAResultReconnectWithMacAddr = 0xfc, |
||||
|
/// OTA设备断开
|
||||
|
JL_OTAResultDisconnect = 0xfd, |
||||
|
/// OTA需重连设备(更新资源)
|
||||
|
JL_OTAResultReconnectUpdateSource = 0xfe, |
||||
|
/// OTA未知错误
|
||||
|
JL_OTAResultUnknown |
||||
|
}; |
||||
|
|
||||
|
typedef NS_ENUM(UInt8, JL_OTAReconnectType) { |
||||
|
JL_OTAReconnectTypeUUID = 0x00, // OTA升级回连使用uuid
|
||||
|
JL_OTAReconnectTypeMACAddr = 0x01, // OTA升级回连使用mac地址
|
||||
|
}; |
||||
|
|
||||
|
typedef NS_ENUM(UInt8, JL_OtaStatus) { |
||||
|
JL_OtaStatusNormal = 0, // 正常升级
|
||||
|
JL_OtaStatusForce = 1, // 强制升级
|
||||
|
}; |
||||
|
typedef NS_ENUM(UInt8, JL_OtaHeadset) { |
||||
|
JL_OtaHeadsetNO = 0, // 耳机单备份 正常升级
|
||||
|
JL_OtaHeadsetYES = 1, // 耳机单备份 强制升级
|
||||
|
}; |
||||
|
|
||||
|
typedef NS_ENUM(UInt8, JL_OtaWatch) { |
||||
|
JL_OtaWatchNO = 0, // 手表资源 正常升级
|
||||
|
JL_OtaWatchYES = 1, // 手表资源 强制升级
|
||||
|
}__attribute__((deprecated("This enum is deprecated. Use JLOtaSourcesExtendMode instead."))); |
||||
|
|
||||
|
/// OTA资源升级模式
|
||||
|
typedef NS_ENUM(UInt8, JLOtaSourcesExtendMode) { |
||||
|
/// 不启用
|
||||
|
JLSourcesExtendModeDisable = 0, |
||||
|
/// 启用普通资源升级模式
|
||||
|
JLSourcesExtendModeNormal = 1, |
||||
|
/// 启用只升级资源的模式
|
||||
|
JLSourcesExtendModeSourceOnly = 2, |
||||
|
/// 启用只升级固件程序的模式
|
||||
|
JLSourcesExtendModeFirmwareOnly = 3, |
||||
|
}; |
||||
|
|
||||
|
typedef NS_ENUM(UInt8, JL_BootLoader) { |
||||
|
JL_BootLoaderNO = 0, // 不需要下载Bootloader
|
||||
|
JL_BootLoaderYES = 1, // 需要下载BootLoader
|
||||
|
}; |
||||
|
typedef NS_ENUM(UInt8, JL_Partition) { |
||||
|
JL_PartitionSingle = 0, // 固件单备份
|
||||
|
JL_PartitionDouble = 1, // 固件双备份
|
||||
|
}; |
||||
|
|
||||
|
typedef void (^JL_OTA_RT)(JL_OTAResult result, float progress); |
||||
|
|
||||
|
typedef void (^JL_OTA_RESULT)(uint8_t status, uint8_t sn, NSData *__nullable data); |
||||
|
|
||||
|
@class JL_OTAManager; |
||||
|
|
||||
|
/// OTA 升级管理对象回调
|
||||
|
@protocol JL_OTAManagerDelegate <NSObject> |
||||
|
|
||||
|
/// 即将被发送的数据
|
||||
|
/// @param data 数据内容
|
||||
|
- (void)otaDataSend:(NSData *_Nonnull)data; |
||||
|
|
||||
|
@optional |
||||
|
/// 回调设备状态信息
|
||||
|
/// @param manager 对象状态
|
||||
|
- (void)otaFeatureResult:(JL_OTAManager *_Nonnull)manager; |
||||
|
|
||||
|
/// 回调升级状态以及进度等
|
||||
|
/// @param result 状态以及进度信息
|
||||
|
/// @param progress 进度信息
|
||||
|
- (void)otaUpgradeResult:(JL_OTAResult)result Progress:(float)progress; |
||||
|
|
||||
|
/// 取消OTA升级
|
||||
|
- (void)otaCancel; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
/// OTA升级管理对象
|
||||
|
@interface JL_OTAManager : NSObject |
||||
|
|
||||
|
/// 设备UUID(需要开发者填入)
|
||||
|
@property(strong, nonatomic) NSString *mBLE_UUID; |
||||
|
|
||||
|
/// 设备名称(需要开发者填入)
|
||||
|
@property(strong, nonatomic) NSString *mBLE_NAME; |
||||
|
|
||||
|
/// 是否仅仅支持BLE
|
||||
|
@property(assign, nonatomic) BOOL bleOnly; |
||||
|
|
||||
|
/// ble蓝牙地址
|
||||
|
@property(strong, nonatomic) NSString *bleAddr; |
||||
|
|
||||
|
/// SN值
|
||||
|
@property(assign, nonatomic) uint8_t mCmdSN; |
||||
|
|
||||
|
/// 设备版本号
|
||||
|
@property(assign, nonatomic) uint16_t version; |
||||
|
|
||||
|
/// 设备版本信息
|
||||
|
@property(strong, nonatomic) NSString *versionFirmware; |
||||
|
|
||||
|
/// 设备OTA状态
|
||||
|
@property(assign, nonatomic) JL_OtaStatus otaStatus; |
||||
|
|
||||
|
/// 耳机单备份 是否需要强制升级
|
||||
|
@property(assign, nonatomic) JL_OtaHeadset otaHeadset; |
||||
|
|
||||
|
/// 手表资源 是否需要强制升级
|
||||
|
@property(assign, nonatomic) JL_OtaWatch otaWatch __attribute__((deprecated("This property is deprecated. Use otaSourceMode instead."))); |
||||
|
|
||||
|
/// 是否支持复用空间进行 OTA
|
||||
|
@property(assign, nonatomic) BOOL isSupportReuseSpaceOTA; |
||||
|
|
||||
|
/// 是否支持 OTA 拓展功能
|
||||
|
@property (assign, nonatomic) BOOL isSupportExpand; |
||||
|
|
||||
|
/// 资源升级模式类型
|
||||
|
@property(assign, nonatomic) JLOtaSourcesExtendMode otaSourceMode; |
||||
|
|
||||
|
/// 设备OTA时支持单/双备份
|
||||
|
@property(assign, nonatomic) JL_Partition otaPartition; |
||||
|
|
||||
|
/// 设备是否需要下载Loader
|
||||
|
@property(assign, nonatomic) JL_BootLoader bootloaderType; |
||||
|
|
||||
|
/// OTA升级回连方式
|
||||
|
@property(assign, nonatomic) JL_OTAReconnectType otaReconnectType; |
||||
|
|
||||
|
/// OTA升级内容大小(设备通知的)
|
||||
|
@property(assign, nonatomic, readonly) int64_t otaLength; |
||||
|
|
||||
|
/// 已传输的数据大小
|
||||
|
@property(assign, nonatomic, readonly) uint32_t otaSent; |
||||
|
|
||||
|
/// 设备交互回调代理
|
||||
|
@property(weak, nonatomic) id<JL_OTAManagerDelegate> delegate; |
||||
|
|
||||
|
/// 获取 OTA 升级对象
|
||||
|
+ (JL_OTAManager *)getOTAManager; |
||||
|
|
||||
|
/// 不建议使用自行初始化
|
||||
|
/// 推荐获取 getOTAManager
|
||||
|
- (instancetype)init __attribute__((deprecated("Please use getOTAManager instead."))); |
||||
|
|
||||
|
/// 打印OTA发送的数据内容
|
||||
|
/// - Parameter status: 开关
|
||||
|
- (void)logSendData:(BOOL)status; |
||||
|
|
||||
|
/// 当BLE连接上时告知SDK
|
||||
|
- (void)noteEntityConnected; |
||||
|
|
||||
|
/// 当BLE断开时告知SDK
|
||||
|
- (void)noteEntityDisconnected; |
||||
|
|
||||
|
/// 设置最大丢包次数
|
||||
|
/// - Parameter count: 次数
|
||||
|
/// default: 10
|
||||
|
- (void)maxLostCount:(int)count; |
||||
|
|
||||
|
/// 设置超时时间
|
||||
|
/// - Parameter timeOut: 时间
|
||||
|
/// default: 5
|
||||
|
- (void)cmdTimeOut:(int)timeOut; |
||||
|
|
||||
|
/// 设置是否需要回连
|
||||
|
/// 一般不允许外部干扰状态机,外部不适用此方法
|
||||
|
/// - Parameter isReLink: 回连
|
||||
|
- (void)setOTARelink:(BOOL)isReLink __attribute__((deprecated("Can't be used externally."))); |
||||
|
|
||||
|
/// Receive data from rcsp
|
||||
|
/// 设备端过来的数据
|
||||
|
/// - Parameter data: data
|
||||
|
- (void)cmdOtaDataReceive:(NSData *)data; |
||||
|
|
||||
|
/// 查询设备OTA信息
|
||||
|
/// 所有情况下都需要执行,而且是在连上后(认证完成)第一步执行
|
||||
|
- (void)cmdTargetFeature; |
||||
|
|
||||
|
/// 查询设备系统状态
|
||||
|
/// 当设备需要挂载外置flash才能正常升级时需要执行,其他情况则无需执行
|
||||
|
- (void)cmdSystemFunction; |
||||
|
|
||||
|
/// OTA单备份,是否正在回连
|
||||
|
- (BOOL)cmdOtaIsRelinking; |
||||
|
|
||||
|
#pragma mark---> OTA升级 |
||||
|
/**
|
||||
|
开始OTA升级 |
||||
|
@param data 升级数据 |
||||
|
@param result 升级结果 |
||||
|
*/ |
||||
|
- (void)cmdOTAData:(NSData *)data |
||||
|
Result:(JL_OTA_RT __nullable)result; |
||||
|
|
||||
|
/// OTA升级II
|
||||
|
/// 单备份升级特有!!!!
|
||||
|
/// 此接口可用于 OTA 回连成功后,再次发起升级使用
|
||||
|
/// @param result 升级结果回调
|
||||
|
- (void)cmdOtaDataIIResult:(JL_OTA_RT __nullable)result; |
||||
|
|
||||
|
/// OTA升级III
|
||||
|
/// 单备份升级特有!!!
|
||||
|
/// 此接口免去了公版 OTA 的外边回连策略,内部实现回连
|
||||
|
/// ⚠️使用此方法时不可使用 delegate 的回调信息,要使用 Result 的回调信息
|
||||
|
/// @param data OTA数据
|
||||
|
/// @param option 回连选项
|
||||
|
/// @param result 回复
|
||||
|
-(void)cmdUpgrade:(NSData *)data Option:(JLOtaReConnectOption *_Nullable)option Result:(JL_OTA_RT _Nonnull)result; |
||||
|
|
||||
|
/**
|
||||
|
OTA升级取消 |
||||
|
@param result 回复 |
||||
|
*/ |
||||
|
- (void)cmdOTACancelResult:(JL_OTA_RESULT __nullable)result; |
||||
|
|
||||
|
/// 重启设备
|
||||
|
- (void)cmdRebootDevice; |
||||
|
|
||||
|
/// 强制重启设备
|
||||
|
- (void)cmdRebootForceDevice; |
||||
|
|
||||
|
/// 重置OTA manager
|
||||
|
- (void)resetOTAManager; |
||||
|
|
||||
|
/// 打印OTA SDK版本
|
||||
|
+ (NSString *)logSDKVersion; |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
NS_ASSUME_NONNULL_END |
||||
@ -0,0 +1,207 @@ |
|||||
|
/**
|
||||
|
* Des: |
||||
|
* author: Bob |
||||
|
* date: 2022/11/29 |
||||
|
* Copyright: Jieli Technology |
||||
|
*/ |
||||
|
|
||||
|
#ifndef NATIVEAPPLICATION_JL_UFW_H |
||||
|
#define NATIVEAPPLICATION_JL_UFW_H |
||||
|
|
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
#include <stdlib.h> |
||||
|
//#include <android/log.h>
|
||||
|
//#include <jni.h>
|
||||
|
//
|
||||
|
//#define tag "myJNI"
|
||||
|
//#define logi(TAG, ...) ((void)__android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__))
|
||||
|
//#define logw(TAG, ...) ((void)__android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__))
|
||||
|
//#define loge(TAG, ...) ((void)__android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__))
|
||||
|
|
||||
|
int parse_fw_info(const char *data, int size, uint8_t *resultBuff, uint32_t buffSize); |
||||
|
#define BIT(n) (1 << n) |
||||
|
|
||||
|
// for FW file
|
||||
|
enum eFW_FILE_TYPE { |
||||
|
|
||||
|
FILE_TYPE_FW_FLASH_BIN = 0, // FLASH文件,第一块FLASH数据
|
||||
|
FILE_TYPE_FW_OTP_BIN = 1, // OTP文件
|
||||
|
FILE_TYPE_FW_INFO_LOG = 2, // FW文件中保存的描述信息
|
||||
|
FILE_TYPE_FW_BURN_CFG = 3, // 烧写器配置文件
|
||||
|
FILE_TYPE_FW_SCRIPT_DATA = 4, // 烧写器打包烧写器下载文件时,需要执行的脚本数据
|
||||
|
FILE_TYPE_FW_SRC = 5, // 需要保存在FW文件中的代码文件, FW文件查看/编辑器都不能显示这些数据
|
||||
|
FILE_TYPE_FW_NAME_BIN = 6, // 升级名字用的FW文件,已经废除
|
||||
|
FILE_TYPE_FW_OTP_VER_BIN = 7, // OTP maskrom版本
|
||||
|
FILE_TYPE_FW_OTPCFG_BIN = 8, // OTP配置信息
|
||||
|
FILE_TYPE_FW_OTP_CHIP_CONTROL_BIN = 9, // OTP芯片控制信息
|
||||
|
|
||||
|
FILE_TYPE_FW_OTP_MINI_UBOOT = 0xA, // 烧写到OTP的MINI UBOOT文件
|
||||
|
FILE_TYPE_FW_OTP_FIX_UBOOT = 0xB, // 烧写到OTP的FIX UBOOT文件
|
||||
|
FILE_TYPE_FW_FLASH_2_BIN = 0xC, // 第二块FLASH数据
|
||||
|
FILE_TYPE_FW_BR18_EFUSE_CONFIG_BIN = 0xD, // BR18 24BIT EFUSE配置数据
|
||||
|
FILE_TYPE_FW_RESOURCE_FILE = 0xE, // 资源文件
|
||||
|
FILE_TYPE_FW_2018KEY_INFO = 0xF, // 2018年的新KEY信息
|
||||
|
|
||||
|
FILE_TYPE_FW_BURNER_CUSTOMER_DATA = 0x10, // 一拖八烧写器用户信息
|
||||
|
FILE_TYPE_FW_BURNER_DV15_FLASH_BIN = 0x11, // 一拖八烧写器第一块FLASH数据
|
||||
|
FILE_TYPE_FW_BURNER_APP_FLASH_BIN = 0x12, // 一拖八烧写器第二块FLASH数据
|
||||
|
FILE_TYPE_FW_BURNER_DATA_FLASH_BIN = 0x13, // 一拖八烧写器第三块FLASH数据
|
||||
|
FILE_TYPE_FW_BURNER_BR21_FLASH_BIN = 0x14, // 一拖八烧写器第四块FLASH数据
|
||||
|
|
||||
|
FILE_TYPE_FW_FLASH_BIN_2 = 0x20, // 下载到第一块FLASH的文件,下载工具根据条件要么下载FILE_TYPE_FW_FLASH_BIN,要么下载FILE_TYPE_FW_FLASH_BIN_2
|
||||
|
FILE_TYPE_FW_FLASH_BIN_3, |
||||
|
FILE_TYPE_FW_FLASH_BIN_4, |
||||
|
|
||||
|
FILE_TYPE_FW_LOADER_BIN = 0x31, // 打包的LOADER程序代码
|
||||
|
|
||||
|
FILE_TYPE_FW_TEST_BOX_OTA_BIN = 0x64, // 测试盒使用的ota.bin
|
||||
|
|
||||
|
FILE_TYPE_FW_3RD_DATA_FILE = 0x71, // 第三方烧写数据
|
||||
|
|
||||
|
FILE_TYPE_FW_OTA_TARGET_DEVICE_INFO = 0xA0, |
||||
|
FILE_TYPE_FW_BURN_COUNT_LIMIT = 0xA1, // 烧写授权信息
|
||||
|
|
||||
|
FILE_TYPE_FW_ADDITIONAL_FILE = 0xEE, // 附加文件,由烧写器根据名字决定用途
|
||||
|
FILE_TYPE_FW_PASSTHROUGH_DATA = 0xEF, // AC691X BTIF数据
|
||||
|
// 仅存在于FW文件中的数据
|
||||
|
FILE_TYPE_FW_HIDDEN_CFG_BIN = 0xFA, |
||||
|
FILE_TYPE_FW_INVISIBLE_DATA = 0xFB, // 保存在FW文件中的隐藏数据,FW文件查看/编辑器都不能显示这些数据
|
||||
|
FILE_TYPE_FW_VISIBLE_DATA = 0xFE, // 仅保存在FW文件中的HEX数据
|
||||
|
|
||||
|
FILE_TYPE_FW_TAIL = 0xFF, // FW文件尾部标识
|
||||
|
}; |
||||
|
|
||||
|
typedef struct U16BIT |
||||
|
{ |
||||
|
unsigned char b0 : 1; |
||||
|
unsigned char b1 : 1; |
||||
|
unsigned char b2 : 1; |
||||
|
unsigned char b3 : 1; |
||||
|
unsigned char b4 : 1; |
||||
|
unsigned char b5 : 1; |
||||
|
unsigned char b6 : 1; |
||||
|
unsigned char b7 : 1; |
||||
|
unsigned char b8 : 1; |
||||
|
unsigned char b9 : 1; |
||||
|
unsigned char b10 : 1; |
||||
|
unsigned char b11 : 1; |
||||
|
unsigned char b12 : 1; |
||||
|
unsigned char b13 : 1; |
||||
|
unsigned char b14 : 1; |
||||
|
unsigned char b15 : 1; |
||||
|
|
||||
|
} U16BIT; |
||||
|
typedef union UBIT16 |
||||
|
{ |
||||
|
U16BIT bits; |
||||
|
uint16_t val; |
||||
|
} UBIT16; |
||||
|
|
||||
|
typedef struct stRES_FILE_HEAD { |
||||
|
uint32_t u32Tag; |
||||
|
uint16_t u16Crc; |
||||
|
uint16_t u16CrcOfItems; |
||||
|
uint32_t u32Len; |
||||
|
uint16_t u16Count; |
||||
|
uint16_t u16Res; |
||||
|
uint8_t u8Res16[16]; |
||||
|
}RES_FILE_HEAD; |
||||
|
|
||||
|
typedef struct stRES_CONFIG_ITEM { |
||||
|
uint16_t u16Index; |
||||
|
uint16_t u16Type; |
||||
|
uint32_t u32Addr; |
||||
|
uint32_t u32Len; |
||||
|
uint16_t u16CrcOfData; |
||||
|
uint16_t u16Res; |
||||
|
char szName[16]; |
||||
|
}RES_CONFIG_ITEM; |
||||
|
static uint16_t m_u16ChipKey = 0xFFFF; |
||||
|
static uint16_t m_u16DefaultKey = 0xFFFF; |
||||
|
|
||||
|
|
||||
|
#pragma pack(1) |
||||
|
#define JL_FILE_ITEM_NAME_MAX_LEN 16 |
||||
|
#define JL_CHIP_KEY_ENC_LENGTH 32 |
||||
|
|
||||
|
typedef struct stUFW_SYD_HEAD_V1 { |
||||
|
uint16_t u16Crc; // crc16 for this struct
|
||||
|
uint16_t u16CrcOfSydFileHead; |
||||
|
uint32_t u32FileLength; // file length
|
||||
|
uint16_t u16FileCount; // 此FW文件中包含的子文件个数
|
||||
|
uint16_t u16Version; |
||||
|
uint32_t u32Res; |
||||
|
char szChipName[16]; // 此FW文件对应的芯片类型,如AC690X,AC691X
|
||||
|
uint32_t u32Res2[4]; |
||||
|
uint32_t u32Res3[4]; |
||||
|
}UFW_SYD_HEAD_V1; |
||||
|
|
||||
|
typedef struct stUFW_FILE_HEAD_V1 { |
||||
|
uint8_t u8FileType; // 文件类型
|
||||
|
uint8_t u8Res; // 保留
|
||||
|
uint16_t u16Index; // 文件索引号
|
||||
|
uint16_t u16Crc; // 明文数据的校验码
|
||||
|
uint16_t u16Version; // 本结构体版本
|
||||
|
uint32_t u32Addr; // 地址
|
||||
|
uint32_t u32Length; // 数据长度
|
||||
|
uint32_t u32AllLength; // 数据长度+尾部对齐的数据长度
|
||||
|
uint32_t u32EncryptedAddr; // 加密数据的地址偏移(相对u32Addr的地址)
|
||||
|
uint32_t u32EncryptedLength; // 加密的数据长度
|
||||
|
uint32_t u32Res; // 保留
|
||||
|
uint32_t u64Res1[4]; // 保留
|
||||
|
uint32_t u64Res2[4]; // 保留
|
||||
|
char name[JL_FILE_ITEM_NAME_MAX_LEN]; |
||||
|
|
||||
|
}UFW_FILE_HEAD_V1; |
||||
|
|
||||
|
typedef struct stJL_FILE_TAIL { |
||||
|
char szChipKey[JL_CHIP_KEY_ENC_LENGTH]; // 32 // 固定位置
|
||||
|
uint16_t u16ChipKeyCRC16; // 34 // 固定位置
|
||||
|
uint8_t u8Magic[6]; // 40 // 固定位置
|
||||
|
uint8_t u8Res8[8]; // 48
|
||||
|
char szTailChipName[6]; // 54 // 固定位置
|
||||
|
uint8_t u8Reserv10[10]; // 64
|
||||
|
}JL_FILE_TAIL; |
||||
|
|
||||
|
typedef struct { |
||||
|
char szName[3]; |
||||
|
char szVersion[3]; |
||||
|
uint8_t u8Flag; |
||||
|
uint8_t u8Res; |
||||
|
uint32_t u32Crc; |
||||
|
uint16_t u16Crc; |
||||
|
uint16_t u16Res; |
||||
|
}JL_FLASH_BIN_TAIL; |
||||
|
|
||||
|
typedef UFW_SYD_HEAD_V1 jl_ufw_syd_head; |
||||
|
typedef UFW_FILE_HEAD_V1 jl_ufw_file_head; |
||||
|
typedef JL_FILE_TAIL jl_ufw_tail; |
||||
|
|
||||
|
typedef struct stJL_BR22_FLASH_HEAD { |
||||
|
uint16_t u16Crc; // 结构体自身校验码
|
||||
|
uint8_t u8SizeForBurner; // 为烧写器保留的空间大小
|
||||
|
uint8_t u8Version; // FLASH FS版本号
|
||||
|
char vid[4]; // 4byte的vid
|
||||
|
uint32_t u32FlashSize; // FLASH大小,由isd_download计算得出
|
||||
|
uint8_t u8FsVersion; // 类型:br18/br22
|
||||
|
uint8_t u8BlockAlingnModulus; // 对齐系数
|
||||
|
uint8_t u8Res; // 保留,以后有可能会用于存放顶层目录的偏移和文件目录内偏移信息
|
||||
|
uint8_t u8SpecialOptFlag; // 用于标记是否需要生成2种flash格式的标记位,目前只用1位,以后如果需要特殊操作需要标记,再用其他位
|
||||
|
char pid[16]; // 16byte的pid
|
||||
|
}JL_BR22_FLASH_HEAD; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
#pragma pack() |
||||
|
|
||||
|
|
||||
|
#endif //NATIVEAPPLICATION_JL_UFW_H
|
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,6 @@ |
|||||
|
framework module JL_OTALib { |
||||
|
umbrella header "JL_OTALib.h" |
||||
|
export * |
||||
|
|
||||
|
module * { export * } |
||||
|
} |
||||
@ -0,0 +1,207 @@ |
|||||
|
<?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/JLOTAFile.h</key> |
||||
|
<data> |
||||
|
OCi8PoI3GQr4HUxHQQytlXYCxe8= |
||||
|
</data> |
||||
|
<key>Headers/JLOtaCustom.h</key> |
||||
|
<data> |
||||
|
ohGYE+IOCliAaeZaO5VdRBwHvWo= |
||||
|
</data> |
||||
|
<key>Headers/JLOtaReConnectOption.h</key> |
||||
|
<data> |
||||
|
xqKc873u51zqagJXS172BK6h9Tg= |
||||
|
</data> |
||||
|
<key>Headers/JL_OTALib.h</key> |
||||
|
<data> |
||||
|
tH9kHWi/DKzq8j2NoSg0wXoBAro= |
||||
|
</data> |
||||
|
<key>Headers/JL_OTAManager.h</key> |
||||
|
<data> |
||||
|
PMESdvB6Bcu7gn1YJqH1tOi0eEw= |
||||
|
</data> |
||||
|
<key>Headers/jl_ufw.h</key> |
||||
|
<data> |
||||
|
KBTDPNzyz3mtGLkvJLZ7GIRKNeM= |
||||
|
</data> |
||||
|
<key>Info.plist</key> |
||||
|
<data> |
||||
|
WfMSuIuMgNEEbLR1JZENJAqvP5Y= |
||||
|
</data> |
||||
|
<key>Modules/module.modulemap</key> |
||||
|
<data> |
||||
|
Djaqrf2BV/5uLRNN6e4M1DPfyG4= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>files2</key> |
||||
|
<dict> |
||||
|
<key>Headers/JLOTAFile.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
OCi8PoI3GQr4HUxHQQytlXYCxe8= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
lz4Ha2Z62XzIHqsHW1574zMjx1W+IhrqaCJK8HGIs/o= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLOtaCustom.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
ohGYE+IOCliAaeZaO5VdRBwHvWo= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
KntKbJMahP2WujBsJDiGFbjDQvJdw3yo3CqTohYnPcE= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JLOtaReConnectOption.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
xqKc873u51zqagJXS172BK6h9Tg= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
obE+hckXBKKcYUtitl4rad/7W1Bi5ciNOH3ZPml7hY4= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JL_OTALib.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
tH9kHWi/DKzq8j2NoSg0wXoBAro= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
/E9fkD4b67lRdPY5BqxqffRv3H48y1qpNWHYw+a65Cg= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/JL_OTAManager.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
PMESdvB6Bcu7gn1YJqH1tOi0eEw= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
uHRHY8s9UMaaynCPFZOCTid9vmTW5l5PVNI5pAyQK/I= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Headers/jl_ufw.h</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
KBTDPNzyz3mtGLkvJLZ7GIRKNeM= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
l3c9CmVcHyBHIxKSG6GlCBpaZjnp6+fd4iKu2jGMyuE= |
||||
|
</data> |
||||
|
</dict> |
||||
|
<key>Modules/module.modulemap</key> |
||||
|
<dict> |
||||
|
<key>hash</key> |
||||
|
<data> |
||||
|
Djaqrf2BV/5uLRNN6e4M1DPfyG4= |
||||
|
</data> |
||||
|
<key>hash2</key> |
||||
|
<data> |
||||
|
CQv4Q+xyzKhKSJpAY8gU98Qv9Wv1W16ILQ5MGAKukrA= |
||||
|
</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> |
||||
Loading…
Reference in new issue