RDSBindDeviceVC.m 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. //
  2. // RDSBindDeviceVC.m
  3. // Temperature
  4. //
  5. // Created by RD on 2022/11/21.
  6. //
  7. #import "RDSBindDeviceVC.h"
  8. #import "RDSBabyBluetooth.h"
  9. #import <WebKit/WebKit.h>
  10. #import <SDWebImage/SDWebImage.h>
  11. #import "RDSMapHelper.h"
  12. @interface RDSBindDeviceVC ()
  13. @property (weak, nonatomic) IBOutlet UIView *gifView;
  14. @property (weak, nonatomic) IBOutlet UIView *searchView;
  15. @property (weak, nonatomic) IBOutlet UIButton *finishBtn;
  16. @property (weak, nonatomic) IBOutlet UILabel *tipsLab;
  17. @property (weak, nonatomic) IBOutlet UILabel *countDownLab;
  18. @property (weak, nonatomic) IBOutlet UIImageView *ringImgView;
  19. @property (nonatomic, strong) CADisplayLink *displayLink;
  20. @property (nonatomic, strong) CADisplayLink *displayLinkCountDown;//倒计时
  21. @property (nonatomic, assign) int countDown;
  22. @property (nonatomic, strong) RDSBabyBluetooth *baby;
  23. @end
  24. @implementation RDSBindDeviceVC
  25. - (void)viewDidLoad {
  26. [super viewDidLoad];
  27. // Do any additional setup after loading the view from its nib.
  28. self.title = @"绑定设备";
  29. [self startAnimation];
  30. RDSBabyBluetooth *baby = TheBabyBluetooth;
  31. self.baby = baby;
  32. [TheBabyBluetooth rds_refreshScanDeviceName:_deviceID];
  33. RDS_WEAKSELF(weakSelf)
  34. [TheBabyBluetooth rds_cmdResponceObserve:[self class] responce:^(RDSDeviceReply *reply) {
  35. [weakSelf p_receiveCmd:reply];
  36. }];
  37. TheBabyBluetooth.onConnectDeviceSuccessAndCanWrite = ^{
  38. [weakSelf p_sendWifiToDecive];
  39. };
  40. dispatch_async(dispatch_get_main_queue(), ^{
  41. [self performSelector:@selector(p_timeout) withObject:nil afterDelay:120];
  42. });
  43. }
  44. // 配对超时 延时任务
  45. - (void)p_timeout{
  46. self.finishBtn.hidden = NO;
  47. _searchView.hidden = YES;
  48. [self stopAnimation];
  49. [TheAlertCtrl rds_alertWithTitle:@"提示" message:@"绑定失败,配对超时。"];
  50. }
  51. // 取消执行延时任务
  52. - (void)p_cancelTimeout{
  53. dispatch_async(dispatch_get_main_queue(), ^{
  54. [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(p_timeout) object:nil];
  55. });
  56. }
  57. - (void)viewDidDisappear:(BOOL)animated{
  58. [super viewDidDisappear:animated];
  59. [self stopAnimation];
  60. [self p_cancelTimeout];
  61. }
  62. - (IBAction)onSendCmdClick {
  63. [self p_sendWifiToDecive];
  64. }
  65. - (IBAction)onFinishClick:(UIButton *)sender {
  66. [self.navigationController popToRootViewControllerAnimated:YES];
  67. }
  68. #pragma mark - 设备信息
  69. - (void)p_receiveCmd:(RDSDeviceReply *)reply{
  70. NSString *msg = [NSString stringWithFormat:@"Step %ld ---- %d", reply.bindStep, reply.code];
  71. [RDSHudShower showCenterToast:msg];
  72. dispatch_async(dispatch_get_main_queue(), ^{
  73. self.tipsLab.text = @"正在配网";
  74. });
  75. if (reply.bindStep == Step5 && reply.code == 0) {
  76. RDS_WEAKSELF(weakSelf)
  77. dispatch_async(dispatch_get_main_queue(), ^{
  78. self.finishBtn.hidden = NO;
  79. self.tipsLab.text = @"配网完成";
  80. [weakSelf p_cancelTimeout];
  81. [RDSDemoApiHelper rds_addRoomName:self->_roomName control_number:reply.deviceCode device_type_id:self.deviceTypeModel.record_id success:^(id responseObject) {
  82. if ([responseObject[@"code"] intValue] != 0) {
  83. [RDSHudShower showBottomToast:responseObject[@"message"]];
  84. [self.navigationController popViewControllerAnimated:YES];
  85. }else{
  86. [weakSelf p_cancelTimeout];
  87. [RDSHudShower showCenterToast:@"绑定成功"];
  88. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  89. [weakSelf p_setupGif];
  90. });
  91. }
  92. } failure:^(NSError *error) {
  93. [RDSHudShower showBottomToast:@"连接服务器失败"];
  94. [self.navigationController popViewControllerAnimated:YES];
  95. }];
  96. [TheMapHelper rds_startLocationSevice:^(RDSUserLocation *userLocation) {
  97. [weakSelf p_updateLocation];
  98. }];
  99. });
  100. }
  101. }
  102. - (void)p_updateLocation{
  103. // RDS_WEAKSELF(weakSelf)
  104. [RDSDemoApiHelper rds_updateHomeInfoWithHomeId:TheDataManager.current_home_id name:TheDataManager.current_home_name city:TheMapHelper.userLocation.cityString success:^(id responseObject) {
  105. if ([responseObject[@"code"] intValue] == 0) {
  106. DDLog(@"更新城市成功");
  107. } else{
  108. DDLog(@"更新城市失败:%@",responseObject[@"message"]);
  109. }
  110. } failure:^(NSError *error) {
  111. }];
  112. }
  113. - (void)p_sendWifiToDecive{
  114. NSDictionary *param = @{
  115. @"ssid" : _wifiName,
  116. @"pwd" : _pwd,
  117. @"user_id" : TheDataManager.currentUser.record_id,
  118. @"home_id" : TheDataManager.current_home_id,
  119. @"room_name" : _roomName,
  120. @"env" : @(TheApiHelper.isTest),
  121. };
  122. DDLog(@"发送WiFi账号密码:%@",param);
  123. NSError *parseError = nil;
  124. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:param options:NSJSONWritingSortedKeys error:&parseError];
  125. [TheBabyBluetooth rds_writeValue:jsonData];
  126. }
  127. #pragma mark - 爱的魔力转圈圈
  128. - (void)startAnimation{
  129. // 爱的魔力转圈圈
  130. self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(d_displayLinkAnimation)];
  131. [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
  132. // 每秒调用次数 = 60/frameInterval
  133. //self.displayLink.preferredFramesPerSecond = 3;
  134. self.displayLink.paused = NO;
  135. self.countDown = 120;
  136. self.displayLinkCountDown = [CADisplayLink displayLinkWithTarget:self selector:@selector(p_countDown)];
  137. [self.displayLinkCountDown addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
  138. self.displayLinkCountDown.paused = NO;
  139. self.displayLinkCountDown.preferredFramesPerSecond = 1;
  140. }
  141. - (void)stopAnimation{
  142. self.displayLink.paused = YES;
  143. [self.displayLink invalidate];
  144. self.displayLink = nil;
  145. self.displayLinkCountDown.paused = YES;
  146. [self.displayLinkCountDown invalidate];
  147. self.displayLinkCountDown = nil;
  148. self.countDownLab.text = @"";
  149. }
  150. - (void)p_countDown{
  151. self.countDownLab.text = [NSString stringWithFormat:@"%d", self.countDown];
  152. self.countDown --;
  153. }
  154. static CGFloat const RDSNormalAngle = 0.08;// 1/60秒旋转的角度
  155. static CGFloat const RDSLowAngle = 0.08; // 秒旋转的角度
  156. static CGFloat const RDSHighAngle = 0.08; // 秒旋转的角度
  157. static CGFloat curAngle = 0;
  158. - (void)d_displayLinkAnimation {
  159. if (curAngle >= 2*M_PI) {
  160. curAngle -= 2*M_PI;
  161. }
  162. if (curAngle >= 0 && curAngle <= M_PI/3.0) {
  163. self.ringImgView.transform = CGAffineTransformRotate(self.ringImgView.transform, RDSNormalAngle);
  164. curAngle += RDSNormalAngle;
  165. }
  166. else if (curAngle > M_PI/3.0 && curAngle <= M_PI_2*3) {
  167. self.ringImgView.transform = CGAffineTransformRotate(self.ringImgView.transform, RDSHighAngle);
  168. curAngle += RDSHighAngle;
  169. }
  170. else {
  171. self.ringImgView.transform = CGAffineTransformRotate(self.ringImgView.transform, RDSLowAngle);
  172. curAngle += RDSLowAngle;
  173. }
  174. }
  175. #pragma mark - GIF
  176. - (void)p_setupGif{
  177. if(_searchView.hidden) return;
  178. _searchView.hidden = YES;
  179. [self stopAnimation];
  180. NSData *gifData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"finish" ofType:@"gif"]];
  181. // gif只播放1次
  182. CGImageSourceRef gifSource = CGImageSourceCreateWithData(CFBridgingRetain(gifData), nil);
  183. size_t gifCount = CGImageSourceGetCount(gifSource);
  184. NSMutableArray *frames = [NSMutableArray array];
  185. UIImage *lastImg;
  186. for (size_t i = 0; i < gifCount; i++) {
  187. CGImageRef imageRef =CGImageSourceCreateImageAtIndex(gifSource, i,NULL);
  188. UIImage*image = [UIImage imageWithCGImage:imageRef];
  189. [frames addObject:image];
  190. CGImageRelease(imageRef);
  191. if(i == gifCount-1){
  192. lastImg = image;
  193. }
  194. }
  195. UIImageView *imgView = [[UIImageView alloc] init];
  196. imgView.frame = CGRectMake(0, 0, _gifView.rds_width, _gifView.rds_height);
  197. [_gifView addSubview:imgView];
  198. imgView.animationImages = frames;
  199. imgView.animationDuration = 2.5;
  200. imgView.animationRepeatCount = 1;
  201. [imgView startAnimating];
  202. RDS_WEAKSELF(weakSelf)
  203. UIImageView *ok = [[UIImageView alloc] init];
  204. ok.frame = CGRectMake(0, 0, weakSelf.gifView.rds_width, weakSelf.gifView.rds_height);
  205. ok.alpha = 0;
  206. [self.gifView addSubview:ok];
  207. [ok setImage:lastImg];
  208. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  209. ok.alpha = 1;
  210. [RDSHudShower showCenterToast:@"绑定成功"];
  211. });
  212. // WKWebView *webView = [[WKWebView alloc] initWithFrame:_gifView.bounds];
  213. // webView.backgroundColor=[UIColor clearColor];
  214. // webView.scrollView.scrollEnabled=NO;
  215. // [webView loadData:gifData MIMEType:@"image/gif" characterEncodingName:@"" baseURL:[NSURL URLWithString:@""]];
  216. // [_gifView addSubview:webView];
  217. }
  218. - (void)dealloc{
  219. [TheBabyBluetooth rds_cancelScan];
  220. [TheBabyBluetooth rds_cancelConnection];
  221. [kNotificationCenter removeObserver:self];
  222. DDLog(@"dealloc~~ 绑定设备");
  223. }
  224. @end