You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
380 lines
14 KiB
380 lines
14 KiB
![]()
2 years ago
|
//
|
||
|
// BLETools.m
|
||
![]()
1 year ago
|
// FireBoltt
|
||
![]()
2 years ago
|
//
|
||
|
// Created by lemo. on 2020/3/21.
|
||
|
// Copyright © 2020 Sheldon. All rights reserved.
|
||
|
//
|
||
|
|
||
|
#import "BLETools.h"
|
||
|
#import "NSString+methods.h"
|
||
|
#import "JZLocationConverter.h"
|
||
|
|
||
|
@implementation BLETools
|
||
|
|
||
|
/**
|
||
|
将时间戳按指定格式时间输出
|
||
|
|
||
|
@param spString 秒
|
||
|
@param formatStr 指定格式
|
||
|
|
||
|
*/
|
||
|
+ (NSString*)nsdateToTime:(long long)spString formatStr:(NSString *)formatStr
|
||
|
{
|
||
|
NSDate *date = [NSDate dateWithTimeIntervalSince1970:spString];
|
||
|
NSTimeZone *zone = [NSTimeZone systemTimeZone]; // 获得系统的时区
|
||
|
NSTimeInterval time = [zone secondsFromGMTForDate:date];
|
||
|
[date dateByAddingTimeInterval:time];
|
||
|
NSDateFormatter *dateFormat=[[NSDateFormatter alloc]init];
|
||
|
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
|
||
|
[dateFormat setLocale:locale];
|
||
|
[dateFormat setCalendar: [[NSCalendar alloc]
|
||
|
initWithCalendarIdentifier:NSCalendarIdentifierGregorian]];
|
||
|
[dateFormat setDateFormat:formatStr];
|
||
|
NSString* string=[dateFormat stringFromDate:date];
|
||
|
|
||
|
return string;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
将指定格式时间转NSDate输出
|
||
|
*/
|
||
|
+ (NSDate *)nsdateToformatStr:(NSString *)formatStr {
|
||
|
NSDateFormatter *dateFormat=[[NSDateFormatter alloc]init];
|
||
|
[dateFormat setCalendar: [[NSCalendar alloc]
|
||
|
initWithCalendarIdentifier:NSCalendarIdentifierGregorian]];
|
||
|
NSInteger formatStrCount = [formatStr componentsSeparatedByString:@"-"].count;
|
||
|
NSArray *timeArr = @[@"yyyy-",@"MM-",@"dd-",@"HH-",@"mm-",@"ss-"];
|
||
|
if (formatStrCount && formatStrCount <= 6) {
|
||
|
NSMutableString *format = [[NSMutableString alloc] init];
|
||
|
for (NSInteger i = 0; i < formatStrCount; i ++) {
|
||
|
[format appendString:timeArr[i]];
|
||
|
}
|
||
|
[dateFormat setDateFormat:[format substringToIndex:format.length - 1]];
|
||
|
NSDate *date = [dateFormat dateFromString:formatStr];
|
||
|
return date;
|
||
|
}
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
将字符串变成数组
|
||
|
|
||
|
@param valueStr 字符串
|
||
|
@return 返回一个数组
|
||
|
*/
|
||
|
+ (NSArray *)stringByArrayData:(NSString *)valueStr
|
||
|
{
|
||
|
NSString *tempStr = [valueStr stringByReplacingOccurrencesOfString:@"|" withString:@"-"];
|
||
|
NSString *tempstring = [tempStr stringByReplacingOccurrencesOfString:@":" withString:@"-"];
|
||
|
NSString *spacestring = [tempstring stringByReplacingOccurrencesOfString:@" " withString:@"-"];
|
||
|
NSArray *valueArray = [spacestring componentsSeparatedByString:@"-"];
|
||
|
return valueArray;
|
||
|
}
|
||
|
|
||
|
+ (NSString *)getCurrentLanguage
|
||
|
{
|
||
|
NSArray *languages = [NSLocale preferredLanguages];
|
||
|
NSString *currentLanguage = [languages objectAtIndex:0];
|
||
|
return currentLanguage;
|
||
|
}
|
||
|
|
||
|
|
||
|
/** 获取当前是星期几 把当前日期变成星期 */
|
||
|
+ (NSInteger)getNowWeekday {
|
||
|
NSDate *date = [NSDate date];
|
||
|
NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; // 指定日历的算法
|
||
|
NSDateComponents *comps = [calendar components:NSCalendarUnitWeekday fromDate:date];
|
||
|
NSInteger week = [comps weekday];
|
||
|
return week;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
若是中文直接转拼音
|
||
|
*/
|
||
|
+ (NSString *)transformPinyin:(NSString *)chinese
|
||
|
{
|
||
|
if (![BLETools isChinese:chinese]) {
|
||
|
return chinese;
|
||
|
}
|
||
|
NSMutableString *pinyin = [chinese mutableCopy];
|
||
|
CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO);
|
||
|
CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripCombiningMarks, NO);
|
||
|
//去掉空格
|
||
|
return [[NSString stringWithFormat:@"%@",pinyin] stringByReplacingOccurrencesOfString:@" " withString:@""];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
检测是否是中文
|
||
|
*/
|
||
|
+(BOOL)isChinese:(NSString *)str
|
||
|
{
|
||
|
NSString *match = @"(^[\u4e00-\u9fa5]+$)";
|
||
|
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF matches %@", match];
|
||
|
return [predicate evaluateWithObject:str];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
两个时间差(分钟)
|
||
|
|
||
|
@param startTime 开始时间
|
||
|
@param endTime 结束时间
|
||
|
@return 分钟 (字符串)
|
||
|
*/
|
||
|
+(NSString *)compareStartTime:(NSString *)startTime EndTime:(NSString *)endTime
|
||
|
{
|
||
|
//同一天内 如果开始时间为9:01 结束时间为21:01 那么这条数据就是无效的
|
||
|
//不在一天内如果开始时间为 21:02 结束时间为22:01 那么这条数据也是无效的
|
||
|
if ((![[startTime substringWithRange:NSMakeRange(0, 10)] isEqualToString:[endTime substringWithRange:NSMakeRange(0, 10)]]&&[endTime substringWithRange:NSMakeRange(11, 2)].integerValue >= 21)
|
||
|
|| ([[startTime substringWithRange:NSMakeRange(0, 10)] isEqualToString:[endTime substringWithRange:NSMakeRange(0, 10)]]&& [startTime substringWithRange:NSMakeRange(11, 2)].integerValue < 21 && [startTime substringWithRange:NSMakeRange(11, 2)].integerValue >= 9)) {
|
||
|
return @"0";
|
||
|
}
|
||
|
|
||
|
else{
|
||
|
long long start = [NSString changeTimeToMinutes:startTime];
|
||
|
long long end = [NSString changeTimeToMinutes:endTime];
|
||
|
NSString *compareStr = [NSString stringWithFormat:@"%lld",(end-start)/60];
|
||
|
return compareStr;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
本地语言转换
|
||
|
|
||
|
@param language 系统语言
|
||
|
*/
|
||
|
+(NSString*)laguageTransform:(NSString*)language
|
||
|
{
|
||
|
NSDictionary * dict =@{@"zh-Hans-CN":@"zh_CN",// zh-Hans-CN, 简体中文
|
||
|
@"zh-Hant-HK":@"zh_TW",// zh-Hant-HK, 香港繁体
|
||
|
@"zh-Hant-HK":@"zh_TW",// zh-Hant-CN, 繁体中文
|
||
|
@"zh-Hant-MO":@"zh_TW",// zh-Hant-MO, 繁体中文(澳门)
|
||
|
@"zh-Hant-TW":@"zh_TW",// zh-Hant-TW 繁体中文(台湾)
|
||
|
@"en-CN":@"en_US", // en-CN, 英文
|
||
|
@"en-AU":@"en_US", // en-AU, 英文(澳大利亚)
|
||
|
@"en-IN":@"en_US", // en-IN, 英文(印度)
|
||
|
@"en-GB":@"en_GB", // en-GB, 英文(英国)
|
||
|
@"es-CN":@"es_SA", // es-CN, 西班牙
|
||
|
@"es-419":@"es_SA", // es-419, 西班牙(拉丁美洲)
|
||
|
@"es-MX":@"es_SA", // es-MX, 西班牙(墨西哥)
|
||
|
@"de-AT":@"de_DE", // de-AT, 德文(奥地利)
|
||
|
@"de-CN":@"de_DE", // de-CN, 德文
|
||
|
@"de-DE":@"de_DE", // de-DE, 德文(德国)
|
||
|
@"de-CH":@"de_DE", // de-CH, 德文(瑞士)
|
||
|
@"fr-BE":@"fr_FR", // fr-BE, 法文(比利时)
|
||
|
@"fr-FR":@"fr_FR", // fr-FR, 法文(法国)
|
||
|
@"fr-CH":@"fr_FR", // fr-CH, 法文(瑞士)
|
||
|
@"fr-CA":@"fr_FR", // fr-CA, 法文(加拿大)
|
||
|
@"fr-CN":@"fr_FR", // fr-CN, 法文
|
||
|
@"pt-PT":@"pt_PT", // pt-PT, 葡萄牙文
|
||
|
@"pt-BR":@"pt_BZ", // pt-BR, 葡萄牙(巴西)
|
||
|
@"ko-CN":@"ko", // ko-CN, 韩文
|
||
|
@"ja-CN":@"ja_JP", // ja-CN, 日文
|
||
|
@"ru-CN":@"ru_RU", // ru-CN 俄文
|
||
|
@"ro-CN":@"ro_RO", // ro-CN, 罗马尼亚
|
||
|
@"it_CN":@"it_IT", // it-CN, 意大利
|
||
|
@"el_CN":@"el_GR", // el-CN, 希腊文
|
||
|
@"tr-CN":@"tr-TR" // tr-CN, 土耳其
|
||
|
};
|
||
|
NSArray * dictKeyArray = [dict allKeys];
|
||
|
if ([dictKeyArray containsObject:language])
|
||
|
{
|
||
|
return dict[language];
|
||
|
};
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
获取时间戳
|
||
|
|
||
|
@param date 日期
|
||
|
@param hour 小时
|
||
|
@param minute 分钟
|
||
|
@param seconds 秒
|
||
|
@return 时间戳
|
||
|
*/
|
||
|
+ (NSInteger)zeroOfSecondsTimestampWithDate:(NSDate *)date hour:(NSInteger)hour minute:(NSInteger)minute seconds:(NSInteger)seconds
|
||
|
{
|
||
|
NSCalendar *calendar = [NSCalendar currentCalendar];
|
||
|
NSDateComponents *components = [calendar components:NSUIntegerMax fromDate:[NSDate date]];
|
||
|
components.hour = hour;
|
||
|
components.minute = minute;
|
||
|
components.second = seconds;
|
||
|
NSTimeInterval ts = (NSInteger)[[calendar dateFromComponents:components] timeIntervalSince1970];
|
||
|
return ts;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
获取时间戳
|
||
|
|
||
|
@param time 2017-01-01-12-12-12格式的时间
|
||
|
@return 时间戳字符串
|
||
|
*/
|
||
|
+ (NSString *)getTimestampWithTime:(NSString *)time{
|
||
|
|
||
|
if (!time.length) {
|
||
|
return @"";
|
||
|
}
|
||
|
|
||
|
NSArray *arr = [time componentsSeparatedByString:@"-"];
|
||
|
NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
|
||
|
[inputFormatter setCalendar: [[NSCalendar alloc]
|
||
|
initWithCalendarIdentifier:NSCalendarIdentifierGregorian]];
|
||
|
// [inputFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
|
||
|
switch (arr.count) {
|
||
|
case 3:
|
||
|
[inputFormatter setDateFormat:@"yyyy-MM-dd"];
|
||
|
break;
|
||
|
|
||
|
case 4:
|
||
|
[inputFormatter setDateFormat:@"yyyy-MM-dd-HH"];
|
||
|
break;
|
||
|
|
||
|
case 5:
|
||
|
[inputFormatter setDateFormat:@"yyyy-MM-dd-HH-mm"];
|
||
|
break;
|
||
|
|
||
|
|
||
|
case 6:
|
||
|
[inputFormatter setDateFormat:@"yyyy-MM-dd-HH-mm-ss"];
|
||
|
break;
|
||
|
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
NSDate* inputDate = [inputFormatter dateFromString:time];
|
||
|
NSLog(@"date = %@", inputDate);
|
||
|
|
||
|
NSString *timestamp = [NSString stringWithFormat:@"%ld",(long)[inputDate timeIntervalSince1970]];
|
||
|
return timestamp;
|
||
|
}
|
||
|
|
||
|
+ (int)heartRateGrade:(NSInteger)heartRate
|
||
|
{
|
||
|
if (heartRate >= 150 && heartRate<= 180) {
|
||
|
return 3;
|
||
|
}else if (heartRate >= 120 && heartRate< 150){
|
||
|
return 2;
|
||
|
}else if (heartRate < 120){
|
||
|
return 1;
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
将周期字符串转成对应日期字符串(1100000-周一,周二)
|
||
|
*/
|
||
|
+ (NSString *)cycleStrConversion:(NSString *)cycleStr {
|
||
|
|
||
|
NSArray *cycleArr = @[NSLocalizedString(@"周一 ", nil),
|
||
|
NSLocalizedString(@"周二 ", nil),
|
||
|
NSLocalizedString(@"周三 ", nil),
|
||
|
NSLocalizedString(@"周四 ", nil),
|
||
|
NSLocalizedString(@"周五 ", nil),
|
||
|
NSLocalizedString(@"周六 ", nil),
|
||
|
NSLocalizedString(@"周日 ", nil)];
|
||
|
NSMutableString *tempStr = [[NSMutableString alloc] init];
|
||
|
|
||
|
for (int i = 0; i < 7; i++) {
|
||
|
|
||
|
if ([[cycleStr substringWithRange:NSMakeRange(i, 1)] isEqualToString:@"1"]) {
|
||
|
[tempStr appendString:cycleArr[i]];
|
||
|
}
|
||
|
}
|
||
|
return tempStr.length ? (NSString *)tempStr : NSLocalizedString(@"仅一次", nil);
|
||
|
}
|
||
|
|
||
|
+ (NSString *)stringDecode:(NSString *)str {
|
||
|
NSString *result = [(NSString *)str stringByReplacingOccurrencesOfString:@"+" withString:@" "];
|
||
|
result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
+ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString
|
||
|
{
|
||
|
if (jsonString == nil) {
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
|
||
|
NSError *err;
|
||
|
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
|
||
|
options:NSJSONReadingMutableContainers
|
||
|
error:&err];
|
||
|
|
||
|
if(err)
|
||
|
{
|
||
|
NSLog(@"json解析失败:%@",err);
|
||
|
return nil;
|
||
|
}
|
||
|
return dic;
|
||
|
}
|
||
|
|
||
|
///16进制字符串转data
|
||
|
+ (NSData *)convertHexStrToData:(NSString *)str
|
||
|
{
|
||
|
if (!str || [str length] == 0) {
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:20];
|
||
|
NSRange range;
|
||
|
if ([str length] % 2 == 0) {
|
||
|
range = NSMakeRange(0, 2);
|
||
|
} else {
|
||
|
range = NSMakeRange(0, 1);
|
||
|
}
|
||
|
for (NSInteger i = range.location; i < [str length]; i += 2) {
|
||
|
unsigned int anInt;
|
||
|
NSString *hexCharStr = [str substringWithRange:range];
|
||
|
NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
|
||
|
|
||
|
[scanner scanHexInt:&anInt];
|
||
|
NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
|
||
|
[hexData appendData:entity];
|
||
|
|
||
|
range.location += range.length;
|
||
|
range.length = 2;
|
||
|
}
|
||
|
return hexData;
|
||
|
}
|
||
|
|
||
|
// 将NSLog打印信息保存到Document目录下的文件中
|
||
|
+ (void)redirectNSlogToDocumentFolder
|
||
|
{
|
||
|
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||
|
NSString *documentDirectory = [paths objectAtIndex:0];
|
||
|
|
||
|
NSString *fileName = [NSString stringWithFormat:@"%@.log",[[NSDate alloc] initWithTimeIntervalSinceNow:8*3600]]; // 注意不是NSData!
|
||
|
NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName];
|
||
|
|
||
|
// 将log输入到文件
|
||
|
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
将步数转换为卡路里,公里(此算法与手环算法一致)
|
||
|
|
||
|
@param steps 步数
|
||
|
@param type 0:卡路里 1:公里
|
||
|
*/
|
||
|
+ (NSString *)stepsConversionCaloriesAndKmStpes:(NSString *)steps type:(NSInteger)type {
|
||
|
if (!steps.integerValue) {
|
||
|
return @"0";
|
||
|
}
|
||
|
// 卡路里跟公里数根据计算(与手环计算公式一致)
|
||
|
if (type) {
|
||
|
// 公里 = 步数*(0.415*身高)/100000
|
||
|
NSInteger height = 175;
|
||
|
return [NSString stringWithFormat:@"%.3f",steps.integerValue * (0.415 * height) / 100000];
|
||
|
}
|
||
|
// 卡路里 = 步数 *((体重- 15)* 0.000693 + 0.005895)
|
||
|
CGFloat weight = 65.0;
|
||
|
return [NSString stringWithFormat:@"%.3f",steps.integerValue * ((weight - 15) * 0.000693 + 0.005895)];
|
||
|
}
|
||
|
|
||
|
|
||
|
@end
|