最近藍牙項目中,藍牙手環(huán)中的指令比較多,比如同步時間,發(fā)送震動指令,來點提醒等等,根據(jù)和硬件定義的規(guī)則來發(fā)送指令。
比如同步時間的指令:
<ab000009 00000000 01000100 04 +年月日時分秒>
這里的年月日時分秒都有一定的位數(shù)限制
比如年是6位,月是4位,日是5位,這就需要將本地時間給拆分,封裝出一個方法算出這串指令
直接上代碼
/**
同步時間的指令
根據(jù)當前年月日時分秒 根據(jù)規(guī)則先轉(zhuǎn)二進制,然后四位一組轉(zhuǎn)十六進制
@return 返回的數(shù)據(jù)
*/
+ (NSString *)senderTimeCommand {
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *nowdate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
NSInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit |
NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit;
comps = [calendar components:unitFlags fromDate:nowdate];
NSString *year = [[NSString stringWithFormat:@"%ld",(long)[comps year]] substringFromIndex:2];
NSString *month = [NSString stringWithFormat:@"%ld",(long)[comps month]];
NSString *day = [NSString stringWithFormat:@"%ld",(long)[comps day]];
NSString *hour = [NSString stringWithFormat:@"%ld",(long)[comps hour]];
NSString *minute = [NSString stringWithFormat:@"%ld",(long)[comps minute]];
NSString *second = [NSString stringWithFormat:@"%ld",(long)[comps second]];
// 十進制轉(zhuǎn)換為二進制帶位數(shù)
NSString *yearByte = [self toBinarySystemWithDecimalSystem:[year intValue] length:6];//6位
NSString *monthByte = [self toBinarySystemWithDecimalSystem:[month intValue] length:4];//4位
NSString *dayByte = [self toBinarySystemWithDecimalSystem:[day intValue] length:5];//5位
NSString *hourByte = [self toBinarySystemWithDecimalSystem:[hour intValue] length:5];//5位
NSString *minuteByte = [self toBinarySystemWithDecimalSystem:[minute intValue] length:6];//6位
NSString *secondByte = [self toBinarySystemWithDecimalSystem:[second intValue] length:6];//6位
//將時間的二進制組合起來
NSString *byteStr = [NSString stringWithFormat:@"%@%@%@%@%@%@",yearByte,monthByte,dayByte,hourByte,minuteByte,secondByte];
//每4位轉(zhuǎn)換成十六進制
NSString *byte0 = [byteStr substringToIndex:4];
NSString *byte1 = [byteStr substringWithRange:NSMakeRange(4, 4)];
NSString *byte2 = [byteStr substringWithRange:NSMakeRange(8, 4)];
NSString *byte3 = [byteStr substringWithRange:NSMakeRange(12, 4)];
NSString *byte4 = [byteStr substringWithRange:NSMakeRange(16, 4)];
NSString *byte5 = [byteStr substringWithRange:NSMakeRange(20, 4)];
NSString *byte6 = [byteStr substringWithRange:NSMakeRange(24, 4)];
NSString *byte7 = [byteStr substringWithRange:NSMakeRange(28, 4)];
NSString *finalStr = [NSString stringWithFormat:@"ab000009000000000100010004%@%@%@%@%@%@%@%@",[self getHexByBinary:byte0],[self getHexByBinary:byte1],[self getHexByBinary:byte2],[self getHexByBinary:byte3],[self getHexByBinary:byte4],[self getHexByBinary:byte5],[self getHexByBinary:byte6],[self getHexByBinary:byte7]];
BYLog(@"%@",finalStr);
return finalStr;
}
上面用到的方法
// 十進制轉(zhuǎn)二進制
- (NSString *)toBinarySystemWithDecimalSystem:(int)num length:(int)length
{
int remainder = 0; //余數(shù)
int divisor = 0; //除數(shù)
NSString * prepare = @"";
while (true)
{
remainder = num%2;
divisor = num/2;
num = divisor;
prepare = [prepare stringByAppendingFormat:@"%d",remainder];
if (divisor == 0)
{
break;
}
}
//倒序輸出
NSString * result = @"";
for (int i = length -1; i >= 0; i --)
{
if (i <= prepare.length - 1) {
result = [result stringByAppendingFormat:@"%@",
[prepare substringWithRange:NSMakeRange(i , 1)]];
}else{
result = [result stringByAppendingString:@"0"];
}
}
return result;
}
二進制轉(zhuǎn)16進制
//2zhuan16
- (NSString *)getHexByBinary:(NSString *)binary {
NSMutableDictionary *binaryDic = [[NSMutableDictionary alloc] initWithCapacity:16];
[binaryDic setObject:@"0" forKey:@"0000"];
[binaryDic setObject:@"1" forKey:@"0001"];
[binaryDic setObject:@"2" forKey:@"0010"];
[binaryDic setObject:@"3" forKey:@"0011"];
[binaryDic setObject:@"4" forKey:@"0100"];
[binaryDic setObject:@"5" forKey:@"0101"];
[binaryDic setObject:@"6" forKey:@"0110"];
[binaryDic setObject:@"7" forKey:@"0111"];
[binaryDic setObject:@"8" forKey:@"1000"];
[binaryDic setObject:@"9" forKey:@"1001"];
[binaryDic setObject:@"A" forKey:@"1010"];
[binaryDic setObject:@"B" forKey:@"1011"];
[binaryDic setObject:@"C" forKey:@"1100"];
[binaryDic setObject:@"D" forKey:@"1101"];
[binaryDic setObject:@"E" forKey:@"1110"];
[binaryDic setObject:@"F" forKey:@"1111"];
if (binary.length % 4 != 0) {
NSMutableString *mStr = [[NSMutableString alloc]init];;
for (int i = 0; i < 4 - binary.length % 4; i++) {
[mStr appendString:@"0"];
}
binary = [mStr stringByAppendingString:binary];
}
NSString *hex = @"";
for (int i=0; i<binary.length; i+=4) {
NSString *key = [binary substringWithRange:NSMakeRange(i, 4)];
NSString *value = [binaryDic objectForKey:key];
if (value) {
hex = [hex stringByAppendingString:value];
}
}
return hex;
}
然后發(fā)送這串指令,手環(huán)時間就同步了。
打工是不可能的.gif