UUUtils.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. //
  2. // UUUtils.m
  3. // StreetLampProject
  4. //
  5. // Created by lhn on 2018/3/24.
  6. // Copyright © 2018年 UU. All rights reserved.
  7. //
  8. #import "UUUtils.h"
  9. #import "NSData+CRC16.h"
  10. #import "NSString+WithCRCModbus.h"
  11. @interface UUUtils ()
  12. @property (nonatomic,strong)NSMutableArray *yearDataAll;//年份数组
  13. @property (nonatomic,strong)NSMutableArray *monthDataAll;//月份数组
  14. @property (nonatomic,strong)NSMutableArray *dayDataAll;//日期数组
  15. @end
  16. @implementation UUUtils
  17. //分包发送蓝牙数据
  18. -(void)sendMsgWithSubPackage:(NSData*)msgData{
  19. for (int i = 0; i < [msgData length]; i += 20) {
  20. // 预加 最大包长度,如果依然小于总数据长度,可以取最大包数据大小
  21. if ((i + 20) < [msgData length]) {
  22. NSString *rangeStr = [NSString stringWithFormat:@"%i,%i", i, 20];
  23. NSData *subData = [msgData subdataWithRange:NSRangeFromString(rangeStr)];
  24. NSLog(@"%@",subData);
  25. //根据接收模块的处理能力做相应延时
  26. // usleep(20 * 1000);
  27. }
  28. else {
  29. NSString *rangeStr = [NSString stringWithFormat:@"%i,%i", i, (int)([msgData length] - i)];
  30. NSData *subData = [msgData subdataWithRange:NSRangeFromString(rangeStr)];
  31. // usleep(20 * 1000);
  32. }
  33. }
  34. }
  35. //汉字转unicode
  36. + (NSString *) utf8ToUnicode:(NSString *)string{
  37. NSUInteger length = [string length];
  38. NSMutableString *str = [NSMutableString stringWithCapacity:0];
  39. for (int i = 0;i < length; i++){
  40. NSMutableString *s = [NSMutableString stringWithCapacity:0];
  41. unichar _char = [string characterAtIndex:i];
  42. // 判断是否为英文和数字
  43. if (_char <= '9' && _char >='0'){
  44. NSString *a = [UUUtils hexStringFromString:[string substringWithRange:NSMakeRange(i,1)]];
  45. [s appendFormat:@"00%@",a];
  46. }else if(_char >='a' && _char <= 'z'){
  47. NSString *a = [UUUtils hexStringFromString:[string substringWithRange:NSMakeRange(i,1)]];
  48. [s appendFormat:@"00%@",a];
  49. }else if(_char >='A' && _char <= 'Z')
  50. {
  51. NSString *a = [UUUtils hexStringFromString:[string substringWithRange:NSMakeRange(i,1)]];
  52. [s appendFormat:@"00%@",a];
  53. }else{
  54. // 中文和字符
  55. [s appendFormat:@"\\u%x",[string characterAtIndex:i]];
  56. // 不足位数补0 否则解码不成功
  57. if (s.length == 4) {
  58. [s insertString:@"00" atIndex:2];
  59. } else if (s.length == 5) {
  60. [s insertString:@"0" atIndex:2];
  61. }
  62. }
  63. [str appendFormat:@"%@", s];
  64. }
  65. NSString* aStr = [str stringByReplacingOccurrencesOfString:@"\\u" withString:@""];
  66. return aStr;
  67. }
  68. + (NSString *)deUnicodeStringFromHexString:(NSString *)hexString
  69. {
  70. //每4位16进制Unicode编码转为一个字符
  71. if(hexString.length%4!=0||hexString==nil)
  72. return nil;
  73. NSString *enUnicode;
  74. NSMutableString *deUnicode;
  75. for(NSInteger i=0;i<(hexString.length/4);i++)
  76. { unsigned int anInt;
  77. enUnicode=[hexString substringWithRange:NSMakeRange(i*4,4)];
  78. NSScanner * scanner = [[NSScanner alloc] initWithString:enUnicode];
  79. [scanner scanHexInt:&anInt];
  80. enUnicode=[NSString stringWithFormat:@"%C",(unichar)anInt];
  81. if(i==0)
  82. deUnicode=[NSMutableString stringWithString:enUnicode];
  83. else
  84. [deUnicode appendString:enUnicode];
  85. }
  86. return deUnicode;
  87. }
  88. //将十六进制字符串转换成汉字
  89. + (NSString *)ChineseStringFromHexString:(NSString *)hexString { // eg. hexString = @"8c376b4c"
  90. char *myBuffer = (char *)malloc((int)[hexString length] / 2 + 1);
  91. bzero(myBuffer, [hexString length] / 2 + 1);
  92. for (int i = 0; i < [hexString length] - 1; i += 2) {
  93. unsigned int anInt;
  94. NSString * hexCharStr = [hexString substringWithRange:NSMakeRange(i, 2)];
  95. NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr] ;
  96. [scanner scanHexInt:&anInt];
  97. myBuffer[i / 2] = (char)anInt;
  98. }
  99. NSString *unicodeString = [NSString stringWithCString:myBuffer encoding:NSUnicodeStringEncoding];
  100. // printf("%s\n", myBuffer);
  101. free(myBuffer);
  102. NSString *temp1 = [unicodeString stringByReplacingOccurrencesOfString:@"\\u" withString:@"\\U"];
  103. NSString *temp2 = [temp1 stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
  104. NSString *temp3 = [[@"\"" stringByAppendingString:temp2] stringByAppendingString:@"\""];
  105. NSData *tempData = [temp3 dataUsingEncoding:NSUTF8StringEncoding];
  106. NSString *temp4 = [NSPropertyListSerialization propertyListFromData:tempData
  107. mutabilityOption:NSPropertyListImmutable
  108. format:NULL
  109. errorDescription:NULL];
  110. NSString *string = [temp4 stringByReplacingOccurrencesOfString:@"\\r\\n" withString:@"\n"];
  111. NSLog(@"-------string----%@", string); //输出 谷歌
  112. return string;
  113. }
  114. //CRC 校验
  115. +(NSString *)CRC16Test:(NSString *)string{
  116. NSData *data =[[string withCrc16CCITT] toNSData];
  117. NSLog(@"crc data - %@",data);
  118. NSString *str = [string withCrc16CCITT];
  119. NSString *str2 = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
  120. NSString *str3 = [str2 stringByReplacingOccurrencesOfString:@"<" withString:@""];
  121. NSString *str4 = [str3 stringByReplacingOccurrencesOfString:@">" withString:@""];
  122. return str4;
  123. }
  124. //普通字符串转换为十六进制的。
  125. + (NSString *)hexStringFromString:(NSString *)string{
  126. NSData *myD = [string dataUsingEncoding:NSUTF8StringEncoding];
  127. Byte *bytes = (Byte *)[myD bytes];
  128. //下面是Byte 转换为16进制。
  129. NSString *hexStr=@"";
  130. for(int i=0;i<[myD length];i++)
  131. {
  132. NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数
  133. if([newHexStr length]==1)
  134. hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
  135. else
  136. hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
  137. }
  138. NSLog(@"十六进制 -- %@",hexStr);
  139. return hexStr;
  140. }
  141. // 十六进制转换为普通字符串的。
  142. + (NSString *)stringFromHexString:(NSString *)hexString { //
  143. NSLog(@" f要处理的的 hex %@",hexString);
  144. char *myBuffer = (char *)malloc((int)[hexString length] / 2 + 1);
  145. bzero(myBuffer, [hexString length] / 2 + 1);
  146. for (int i = 0; i < [hexString length] - 1; i += 2) {
  147. unsigned int anInt;
  148. NSString * hexCharStr = [hexString substringWithRange:NSMakeRange(i, 2)];
  149. NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr] ;
  150. [scanner scanHexInt:&anInt];
  151. myBuffer[i / 2] = (char)anInt;
  152. }
  153. NSString *unicodeString = [NSString stringWithCString:myBuffer encoding:4];
  154. NSLog(@"------字符串=======%@",unicodeString);
  155. return unicodeString;
  156. }
  157. #pragma mark - 获取某年某月的天数
  158. + (NSInteger)howManyDaysInThisYear:(NSInteger)year withMonth:(NSInteger)month{
  159. return [self howManyDaysInThisYear:year withMonth:month];
  160. }
  161. - (NSInteger)howManyDaysInThisYear:(NSInteger)year withMonth:(NSInteger)month{
  162. if((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
  163. return 31 ;
  164. if((month == 4) || (month == 6) || (month == 9) || (month == 11))
  165. return 30;
  166. if((year % 4 == 1) || (year % 4 == 2) || (year % 4 == 3))
  167. {
  168. return 28;
  169. }
  170. if(year % 400 == 0)
  171. return 29;
  172. if(year % 100 == 0)
  173. return 28;
  174. return 29;
  175. }
  176. /**
  177. * 获取b19 负载异常
  178. */
  179. + (NSInteger)getB19ByHex:(NSString *)hex {
  180. NSString *binaryStr = [[self class ]getBinaryByHex:hex];
  181. // 倒序
  182. NSString *bit19Str = [binaryStr substringWithRange:NSMakeRange(32- 19 - 1, 1)];
  183. NSInteger bit19 = [bit19Str integerValue];
  184. return bit19;
  185. }
  186. /**
  187. * 获取b24 太阳板异常
  188. */
  189. + (NSInteger)getB28ByHex:(NSString *)hex {
  190. NSString *binaryStr = [[self class ]getBinaryByHex:hex];
  191. // 倒序
  192. NSString *bit28Str = [binaryStr substringWithRange:NSMakeRange(32- 28 - 1, 1)];
  193. NSInteger bit28 = [bit28Str integerValue];
  194. return bit28;
  195. }
  196. /**
  197. 十六进制转换为二进制
  198. @param hex 十六进制数
  199. @return 二进制数
  200. */
  201. + (NSString *)getBinaryByHex:(NSString *)hex {
  202. NSMutableDictionary *hexDic = [[NSMutableDictionary alloc] initWithCapacity:16];
  203. [hexDic setObject:@"0000" forKey:@"0"];
  204. [hexDic setObject:@"0001" forKey:@"1"];
  205. [hexDic setObject:@"0010" forKey:@"2"];
  206. [hexDic setObject:@"0011" forKey:@"3"];
  207. [hexDic setObject:@"0100" forKey:@"4"];
  208. [hexDic setObject:@"0101" forKey:@"5"];
  209. [hexDic setObject:@"0110" forKey:@"6"];
  210. [hexDic setObject:@"0111" forKey:@"7"];
  211. [hexDic setObject:@"1000" forKey:@"8"];
  212. [hexDic setObject:@"1001" forKey:@"9"];
  213. [hexDic setObject:@"1010" forKey:@"A"];
  214. [hexDic setObject:@"1011" forKey:@"B"];
  215. [hexDic setObject:@"1100" forKey:@"C"];
  216. [hexDic setObject:@"1101" forKey:@"D"];
  217. [hexDic setObject:@"1110" forKey:@"E"];
  218. [hexDic setObject:@"1111" forKey:@"F"];
  219. NSString *binary = @"";
  220. for (int i=0; i<[hex length]; i++) {
  221. NSString *key = [hex substringWithRange:NSMakeRange(i, 1)];
  222. NSString *value = [hexDic objectForKey:key.uppercaseString];
  223. if (value) {
  224. binary = [binary stringByAppendingString:value];
  225. }
  226. }
  227. return binary;
  228. }
  229. // 16进制转10进制
  230. + (NSNumber *) numberHexString:(NSString *)aHexString
  231. {
  232. // 为空,直接返回.
  233. if (nil == aHexString){
  234. return nil;
  235. }
  236. NSScanner * scanner = [NSScanner scannerWithString:aHexString];
  237. unsigned long long longlongValue;
  238. [scanner scanHexLongLong:&longlongValue];
  239. //将整数转换为NSNumber,存储到数组中,并返回.
  240. NSNumber * hexNumber = [NSNumber numberWithLongLong:longlongValue];
  241. return hexNumber;
  242. }
  243. /**
  244. 十进制转换十六进制
  245. */
  246. + (NSString *)getHexByDecimal:(NSInteger)decimal {
  247. NSString *hex =@"";
  248. NSString *letter;
  249. NSInteger number;
  250. for (int i = 0; i<9; i++) {
  251. number = decimal % 16;
  252. decimal = decimal / 16;
  253. switch (number) {
  254. case 10:
  255. letter =@"A"; break;
  256. case 11:
  257. letter =@"B"; break;
  258. case 12:
  259. letter =@"C"; break;
  260. case 13:
  261. letter =@"D"; break;
  262. case 14:
  263. letter =@"E"; break;
  264. case 15:
  265. letter =@"F"; break;
  266. default:
  267. letter = [NSString stringWithFormat:@"%ld", number];
  268. }
  269. hex = [letter stringByAppendingString:hex];
  270. if (decimal == 0) {
  271. break;
  272. }
  273. }
  274. if (hex.length < 4) {
  275. NSUInteger inter = 4-hex.length;
  276. for (int i=0;i< inter; i++) {
  277. hex = [NSString stringWithFormat:@"0%@",hex];
  278. }
  279. }
  280. return hex;
  281. }
  282. //字符串补零操作
  283. +(NSString *)addZero:(NSString *)str withLength:(int)length{
  284. NSString *string = nil;
  285. if (str.length==length) {
  286. return str;
  287. }
  288. if (str.length<length) {
  289. NSUInteger inter = length-str.length;
  290. for (int i=0;i< inter; i++) {
  291. string = [NSString stringWithFormat:@"0%@",str];
  292. str = string;
  293. }
  294. }
  295. return string;
  296. }
  297. //格式化时间 传入分钟(min)返回分钟+小时(0h 0min)
  298. + (NSString *)getTimeByminNumber:(NSNumber *)minNum {
  299. if ([minNum intValue] < 60) {
  300. return [NSString stringWithFormat:@"0h %@min",minNum];
  301. }else {
  302. int sss = ([minNum intValue] - 60) % 60;
  303. int hours = [minNum intValue] / 60;
  304. return [NSString stringWithFormat:@"%dh %dmin",hours,sss];
  305. }
  306. }
  307. //获取当前时间
  308. - (NSString *)currentDateStrWithformater:(NSString *)dateFormater{
  309. NSDate *currentDate = [NSDate date];//获取当前时间,日期
  310. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];// 创建一个时间格式化对象
  311. [dateFormatter setDateFormat:dateFormater];//设定时间格式,这里可以设置成自己需要的格式
  312. NSString *dateString = [dateFormatter stringFromDate:currentDate];//将时间转化成字符串
  313. return dateString;
  314. }
  315. - (NSInteger)numberOfDaysWithFromDate:(NSDate *)fromDate toDate:(NSDate *)toDate{
  316. NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
  317. NSDateComponents * comp = [calendar components:NSCalendarUnitDay fromDate:fromDate toDate:toDate options:NSCalendarWrapComponents];
  318. NSLog(@" -- >> comp : %@ << --",comp);
  319. return comp.day;
  320. }
  321. //历史数据算地址
  322. - (NSMutableArray *)returnDateArrayWithSelectedDate:(NSString *)selectDataStr {
  323. // NSDate *data = [NSDate date];
  324. // NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
  325. // [formatter setDateFormat:@"yyyy-MM-dd"];
  326. // NSString * dateStrNo = [formatter stringFromDate:data];//设定时间格式,这里可以设置成自己需要的格式
  327. // NSLog(@" dateStrNo - %@",dateStrNo);
  328. // NSLog(@"selectDataStr - %@",selectDataStr);
  329. // if ([selectDataStr isEqualToString:NSLocalizedString(@"all", nil)]) {
  330. // // 全部
  331. // NSMutableArray *dateArr = [NSMutableArray array];
  332. // for (int i = 0; i < self.yearDataAll.count; i++) {
  333. // NSInteger days = [self numberOfDaysWithFromDate:[formatter dateFromString:self.yearDataAll[i]] toDate:[formatter dateFromString:dateStrNo]];
  334. // if (days >= 0 && days < 2000) {
  335. // NSInteger integn = [[UUUtils numberHexString:@"f000"] integerValue] + days;
  336. // NSString *dareStr = [NSString stringWithFormat:@"ff03%@0001",[UUUtils getHexByDecimal:integn]];
  337. // [dateArr addObject:dareStr];
  338. // }
  339. // }
  340. // NSLog(@"self.dateArr = %@",dateArr);
  341. // return dateArr;
  342. // }else if (selectDataStr.length == 4) {
  343. // // 年份
  344. // NSMutableArray *dateArr = [NSMutableArray array];
  345. // for (int i = 0; i < self.monthDataAll.count; i++) {
  346. // NSString *forDStr = [NSString stringWithFormat:@"%@-%@-01",selectDataStr,self.monthDataAll[i]];
  347. // NSInteger days = [self numberOfDaysWithFromDate:[formatter dateFromString:forDStr] toDate:[formatter dateFromString:dateStrNo]];
  348. // if (days >= 0 && days < 2000) {
  349. // NSInteger integn = [[UUUtils numberHexString:@"f000"] integerValue] + days;
  350. // NSString *dareStr = [NSString stringWithFormat:@"ff03%@0001",[UUUtils getHexByDecimal:integn]];
  351. // [dateArr addObject:dareStr];
  352. // }
  353. //
  354. // }
  355. // NSLog(@"self.dateArr = %@",dateArr);
  356. // return dateArr;
  357. // }else {
  358. //
  359. // int start = 0 ;
  360. // // NSArray *selecteddataarray1 = [selectDataStr componentsSeparatedByString:@"-"];
  361. //
  362. // int currrentDay1 = [[self currentDayStr]intValue];
  363. // if (currrentDay1 > 8 ) {
  364. // start = currrentDay1 - 8 ;
  365. // }
  366. NSMutableArray *dateArr = [NSMutableArray array];
  367. for (int i = 7; i >= 0 ; i --) {
  368. // NSLog(@"测试2 -----%d",i);
  369. // NSArray *selecteddataarray = [selectDataStr componentsSeparatedByString:@"-"];
  370. // NSString *forDStr = [NSString stringWithFormat:@"%@-%@-%@",selecteddataarray[0],selecteddataarray[1],self.dayDataAll[i]];
  371. // NSLog(@"当天%@",forDStr);
  372. // NSInteger days = [self numberOfDaysWithFromDate:[formatter dateFromString:forDStr] toDate:[formatter dateFromString:dateStrNo]];
  373. // NSLog(@"days --- %zd ",days);
  374. // if (days >= 0 && days < 2000) {
  375. NSInteger integn = [[UUUtils numberHexString:@"f000"] integerValue] + i;
  376. NSString *dareStr = [NSString stringWithFormat:@"ff03%@0001",[UUUtils getHexByDecimal:integn]];
  377. [dateArr addObject:dareStr];
  378. // }
  379. }
  380. NSLog(@" 发送的数据 self.dateArr = %@",dateArr);
  381. return dateArr;
  382. // }
  383. }
  384. +(NSString *)currentDayStr{
  385. return [self currentDayStr];
  386. }
  387. //获取当前是几号
  388. -(NSString *)currentDayStr{
  389. NSDate *currentDate = [NSDate date];//获取当前时间,日期
  390. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];// 创建一个时间格式化对象
  391. [dateFormatter setDateFormat:@"dd"];//设定时间格式,这里可以设置成自己需要的格式
  392. NSString *dateString = [dateFormatter stringFromDate:currentDate];//将时间转化成字符串
  393. NSLog(@"现在是 %@号",dateString);
  394. return dateString;
  395. }
  396. -(NSMutableArray *)yearDataAll
  397. {
  398. if (!_yearDataAll) {
  399. _yearDataAll = [[NSMutableArray alloc] initWithObjects:@"2014-01-01",@"2015-01-01",@"2016-01-01",@"2017-01-01",@"2018-01-01",nil];
  400. }
  401. return _yearDataAll;
  402. }
  403. -(NSMutableArray *)monthDataAll
  404. {
  405. if (!_monthDataAll) {
  406. _monthDataAll = [[NSMutableArray alloc] initWithObjects:@"01",@"03",@"05",@"07",@"09",@"11",nil];
  407. }
  408. return _monthDataAll;
  409. }
  410. -(NSMutableArray *)dayDataAll
  411. {
  412. if (!_dayDataAll) {
  413. _dayDataAll = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"03",@"04",@"05",@"06",@"07",@"08",@"09",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17",@"18",@"19",@"20",@"21",@"22",@"23",@"24",@"25",@"26",@"27",@"28",@"29",@"30",@"31",nil];
  414. }
  415. return _dayDataAll;
  416. }
  417. @end