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.

ELMeatProbeScreenBoxBleParser.m 9.8KB

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