iOS AILinkBleSDK - 蓝牙SDK
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.

ELMeatProbeBoxMultipleBleParser.m 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. //
  2. // ELMeatProbeBoxMultipleBleParser.m
  3. // Pods
  4. //
  5. #import "ELMeatProbeBoxMultipleBleParser.h"
  6. #import "ELMeatProbeBoxMultipleBleBBQParamModel.h"
  7. @interface ELMeatProbeBoxMultipleBleParser()
  8. //@property (nonatomic, strong) ELMeatProbeBoxMultipleStatusModel *boxStatus;
  9. @end
  10. @implementation ELMeatProbeBoxMultipleBleParser
  11. - (void)parseA7Payload:(nonnull NSData *)payload {
  12. NSLog(@"#### parseA7Payload payload:%@", payload.debugDescription);
  13. Byte *bytes = (Byte *)payload.bytes;
  14. Byte cmd = bytes[0];
  15. switch (cmd) {
  16. case ELMeatProbeBoxMultipleCMDMcuUploadStatus_Type02:
  17. [self parseStatusData:payload];
  18. break;
  19. case ELMeatProbeBoxMultipleCCMDAppSwitchUnit_Type03:
  20. {
  21. UInt8 unit = bytes[1];
  22. if (self.delegate && [self.delegate respondsToSelector:@selector(meatProbeBoxMultipleBleParser:unit:)]) {
  23. [self.delegate meatProbeBoxMultipleBleParser:self unit:unit];
  24. }
  25. }
  26. break;
  27. // case ELMeatProbeBoxMultipleCCMDAppSwitchUnitResponse_Type04:
  28. // break;
  29. case ELMeatProbeBoxMultipleCMDStartAlarmState_Type05: {
  30. Byte i = 1;
  31. NSData *macData = [payload subdataWithRange:NSMakeRange(i, 6)];
  32. i += 6;
  33. Byte state = bytes[i];
  34. if (self.delegate && [self.delegate respondsToSelector:@selector(meatProbeBoxMultipleBleParser:startAlarmWithState:macData:mac:)]) {
  35. [self.delegate meatProbeBoxMultipleBleParser:self startAlarmWithState:state macData:macData mac:[self macDataToString:macData]];
  36. }
  37. }
  38. break;
  39. // case ELMeatProbeBoxMultipleCMDStartAlarmStateResponse_Type06:
  40. // break;
  41. case ELMeatProbeBoxMultipleCMDStoplAlarm_Type07: {
  42. Byte i = 1;
  43. NSData *macData = [payload subdataWithRange:NSMakeRange(i, 6)];
  44. if (self.delegate && [self.delegate respondsToSelector:@selector(meatProbeBoxMultipleBleParser:stopAlarmWithMacData:mac:)]) {
  45. [self.delegate meatProbeBoxMultipleBleParser:self stopAlarmWithMacData:macData mac:[self macDataToString:macData]];
  46. }
  47. }
  48. break;
  49. // case ELMeatProbeBoxMultipleCMDStoplAlarmResponse_Type08:
  50. // break;
  51. case ELMeatProbeBoxMultipleCMDSetInfo_Type09:
  52. case ELMeatProbeBoxMultipleCMDSetInfoResponse_Type0A: {
  53. [self parseSetInfoParamData:payload];
  54. }
  55. break;
  56. case ELMeatProbeBoxMultipleCMDColorInfoResponse_Type0C: {
  57. NSMutableArray *arr = [NSMutableArray array];
  58. if (payload.length < 4) break;
  59. for (int i=2; i<payload.length; i+=2) {
  60. UInt8 probeIndex = bytes[i];
  61. UInt8 colorIndex = bytes[i+1];
  62. ELMeatProbeBoxMultipleColorInfoModel *color = [[ELMeatProbeBoxMultipleColorInfoModel alloc] init];
  63. color.probeIndex = probeIndex;
  64. color.colorIndex = colorIndex;
  65. [arr addObject:color];
  66. }
  67. if (self.delegate && [self.delegate respondsToSelector:@selector(meatProbeBoxMultipleBleParser:colorInfos:)]) {
  68. [self.delegate meatProbeBoxMultipleBleParser:self colorInfos:arr.copy];
  69. }
  70. }
  71. default:
  72. break;
  73. }
  74. }
  75. - (NSString *)macDataToString:(NSData *)macData {
  76. if (macData == nil || macData.length != 6) {
  77. return nil;
  78. }
  79. Byte *bytes = (Byte *)macData.bytes;
  80. NSString *str = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0]];
  81. return str;
  82. }
  83. - (void)parseSetInfoParamData:(NSData *)payload {
  84. NSLog(@"##### parseSetInfoParamData payload:%@", payload.debugDescription);
  85. if (payload.length != 72 && payload.length != 140) {
  86. return;
  87. }
  88. Byte *bytes = (Byte *)payload.bytes;
  89. Byte i = 1;
  90. Byte option = bytes[i];
  91. i = 2;
  92. Byte supportProbe = bytes[i];
  93. i = 3;
  94. // NSMutableArray *arr = [NSMutableArray array];
  95. //
  96. // while (i < payload.length) {
  97. //探针 1
  98. ELMeatProbeBoxMultipleBleBBQParamModel *param = [[ELMeatProbeBoxMultipleBleBBQParamModel alloc] init];
  99. param.timestamp = [NSDate date].timeIntervalSince1970;
  100. param.macData = [payload subdataWithRange:NSMakeRange(i, 6)];
  101. i += 6;
  102. param.state = bytes[i];
  103. i += 1;
  104. param.foodType = bytes[i];//if (param.foodType == 0xFF) param.foodType = 0xFE;
  105. i += 1;
  106. param.targetTemperatureRaw_C = (bytes[i] << 0) | (bytes[i+1] << 8);
  107. i += 2;
  108. param.targetTemperatureRaw_F = (bytes[i] << 0) | (bytes[i+1] << 8);
  109. i += 2;
  110. param.ambientMaxTemperatureRaw_C = (bytes[i] << 0) | (bytes[i+1] << 8);
  111. i += 2;
  112. param.ambientMaxTemperatureRaw_F = (bytes[i] << 0) | (bytes[i+1] << 8);
  113. i += 2;
  114. param.ambientMinTemperatureRaw_C = (bytes[i] << 0) | (bytes[i+1] << 8);
  115. i += 2;
  116. param.ambientMinTemperatureRaw_F = (bytes[i] << 0) | (bytes[i+1] << 8);
  117. i += 2;
  118. param.cookingId = (bytes[i] << 0) | (bytes[i+1] << 8) | (bytes[i+2] << 16) | (bytes[i+3] << 24);
  119. i += 4;
  120. param.workTime = (bytes[i] << 0) | (bytes[i+1] << 8) | (bytes[i+2] << 16) | (bytes[i+3] << 24);
  121. i += 4;
  122. param.timerCount = (bytes[i] << 0) | (bytes[i+1] << 8) | (bytes[i+2] << 16) | (bytes[i+3] << 24);
  123. i += 4;
  124. UInt32 alarmTemperaturePercentU32 = (bytes[i] << 0) | (bytes[i+1] << 8) | (bytes[i+2] << 16) | (bytes[i+3] << 24);
  125. float alarmTemperaturePercent = 0;
  126. memcpy(&alarmTemperaturePercent, &alarmTemperaturePercentU32, sizeof(UInt32));
  127. param.alarmTemperaturePercent = alarmTemperaturePercent;
  128. i += 4;
  129. param.foodRawness = bytes[i];
  130. i += 1;
  131. param.remarkData = [payload subdataWithRange:NSMakeRange(i, 32)];
  132. i += 32;
  133. if (param.state == 0) {
  134. [param clearAll];
  135. }
  136. // [arr addObject:param];
  137. // }
  138. // if (self.delegate && [self.delegate respondsToSelector:@selector(meatProbeBoxMultipleBleParser:option:supportProbe:params:)]) {
  139. // [self.delegate meatProbeBoxMultipleBleParser:self option:option supportProbe:supportProbe params:arr.copy];
  140. // }
  141. if (self.delegate && [self.delegate respondsToSelector:@selector(meatProbeBoxMultipleBleParser:option:supportProbe:param:)]) {
  142. [self.delegate meatProbeBoxMultipleBleParser:self option:option supportProbe:supportProbe param:param];
  143. }
  144. }
  145. - (void)parseStatusData:(NSData *)payload {
  146. if (payload.length != 25 && payload.length != 41) {
  147. return;
  148. }
  149. Byte *bytes = (Byte *)payload.bytes;
  150. ELMeatProbeBoxMultipleStatusModel *boxStatus = [[ELMeatProbeBoxMultipleStatusModel alloc] init];
  151. boxStatus.timestamp = [NSDate date].timeIntervalSince1970;
  152. boxStatus.boxMacString = self.mac;
  153. Byte i = 1;
  154. boxStatus.version = bytes[i];
  155. i = 2;
  156. boxStatus.probeMaxCount = bytes[i];
  157. i = 3;
  158. boxStatus.probeCount = bytes[i];
  159. i = 4;
  160. boxStatus.batteryStatus = bytes[i] >> 7;
  161. boxStatus.batteryPercent = bytes[i] & 0x7F;
  162. i = 5;
  163. boxStatus.unit = bytes[i];
  164. i = 9;
  165. NSMutableArray *arr = [NSMutableArray array];
  166. while (i < payload.length) {
  167. ELMeatProbeBoxMultipleProbeStatusModel *probeStatus = [[ELMeatProbeBoxMultipleProbeStatusModel alloc] init];
  168. probeStatus.timestamp = boxStatus.timestamp;
  169. probeStatus.index = bytes[i];
  170. i += 1;
  171. NSData *macData = [payload subdataWithRange:NSMakeRange(i, 6)];
  172. probeStatus.macData = macData;
  173. i += 6;
  174. probeStatus.internalTemperatureRaw = (bytes[i] << 0) | (bytes[i+1] << 8);
  175. // 凸(艹皿艹 ) //0x639F (25503)
  176. if (probeStatus.internalTemperatureRaw == 25503) {
  177. probeStatus.internalTemperatureRaw = 0xFFFF;
  178. }
  179. i += 2;
  180. probeStatus.ambientTemperatureRaw = (bytes[i] << 0) | (bytes[i+1] << 8);
  181. // 凸(艹皿艹 ) //0x639F (25503)
  182. if (probeStatus.ambientTemperatureRaw == 25503) {
  183. probeStatus.ambientTemperatureRaw = 0xFFFF;
  184. }
  185. i += 2;
  186. probeStatus.batteryStatus = bytes[i] >> 7;
  187. probeStatus.batteryPercent = bytes[i] & 0x7F;
  188. probeStatus.batteryRaw = bytes[i];
  189. i += 1;
  190. probeStatus.insertStatusRaw = bytes[i];
  191. i += 1;
  192. probeStatus.connectState = bytes[i];
  193. i += 3;
  194. [arr addObject:probeStatus];
  195. }
  196. boxStatus.probeStatusArray = arr.copy;
  197. if (self.delegate && [self.delegate respondsToSelector:@selector(meatProbeBoxMultipleBleParser:boxStatus:)]) {
  198. [self.delegate meatProbeBoxMultipleBleParser:self boxStatus:boxStatus];
  199. }
  200. }
  201. @end
  202. @implementation ELMeatProbeBoxMultipleStatusModel
  203. @end
  204. @implementation ELMeatProbeBoxMultipleProbeStatusModel
  205. - (NSString *)macString {
  206. if (self.macData == nil || self.macData.length != 6) {
  207. return nil;
  208. }
  209. Byte *bytes = (Byte *)self.macData.bytes;
  210. NSString *str = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0]];
  211. return str;
  212. }
  213. - (NSInteger)internalTemperature_C {
  214. if (self.internalTemperatureRaw == 0xFFFF) {
  215. return 0xFFFF;
  216. }
  217. if (self.internalTemperatureUnit == ELDeviceTemperatureUnit_C) {
  218. return self.internalTemperature;
  219. }
  220. return [self convertF2C:self.internalTemperature];
  221. }
  222. - (NSInteger)internalTemperature_F {
  223. if (self.internalTemperatureRaw == 0xFFFF) {
  224. return 0xFFFF;
  225. }
  226. if (self.internalTemperatureUnit == ELDeviceTemperatureUnit_F) {
  227. return self.internalTemperature;
  228. }
  229. return [self convertC2F:self.internalTemperature];
  230. }
  231. - (NSInteger)internalTemperature {
  232. NSInteger value = self.internalTemperatureRaw & 0x3FFF;
  233. if (self.internalTemperatureRaw & 0x4000) {
  234. value = -value;
  235. }
  236. return value;
  237. }
  238. - (ELDeviceTemperatureUnit)internalTemperatureUnit {
  239. return self.internalTemperatureRaw >> 15;
  240. }
  241. - (NSInteger)ambientTemperature_C {
  242. if (self.ambientTemperatureRaw == 0xFFFF) {
  243. return 0xFFFF;
  244. }
  245. if (self.ambientTemperatureUnit == ELDeviceTemperatureUnit_C) {
  246. return self.ambientTemperature;
  247. }
  248. return [self convertF2C:self.ambientTemperature];
  249. }
  250. - (NSInteger)ambientTemperature_F {
  251. if (self.ambientTemperatureRaw == 0xFFFF) {
  252. return 0xFFFF;
  253. }
  254. if (self.ambientTemperatureUnit == ELDeviceTemperatureUnit_F) {
  255. return self.ambientTemperature;
  256. }
  257. return [self convertC2F:self.ambientTemperature];
  258. }
  259. - (NSInteger)ambientTemperature {
  260. NSInteger value = self.ambientTemperatureRaw & 0x3FFF;
  261. if (self.ambientTemperatureRaw & 0x4000) {
  262. value = -value;
  263. }
  264. return value;
  265. }
  266. - (ELDeviceTemperatureUnit)ambientTemperatureUnit {
  267. return self.ambientTemperatureRaw >> 15;
  268. }
  269. //温度换算
  270. - (float)convertF2C:(float)fahrenheit {
  271. return round((fahrenheit - 32) / 1.8);
  272. }
  273. - (float)convertC2F:(float)celsius {
  274. return round(celsius * 1.8 + 32);
  275. }
  276. @end
  277. @implementation ELMeatProbeBoxMultipleColorInfoModel
  278. @end