connectDeviceManager.m 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. //
  2. // connectDeviceManager.m
  3. // 隐私保护
  4. //
  5. // Created by xd h on 2023/10/9.
  6. //
  7. //第三方 瑞云 的链接服务
  8. #import "connectDeviceManager.h"
  9. #import <RayProxy/RaylinkProxy.h>
  10. #import <CocoaAsyncSocket/GCDAsyncSocket.h>
  11. #import "WHPingTester.h"
  12. #import "RSATool.h"
  13. #import "errorAlertTool.h"
  14. @interface connectDeviceManager ()<
  15. GCDAsyncSocketDelegate,
  16. RaylinkProxyDelegate,
  17. WHPingDelegate
  18. >
  19. {
  20. dispatch_queue_t initProxyQueue;
  21. WHPingTester *whPingTester;
  22. BOOL didRuiYunInitOkType;
  23. BOOL disconnected_cb_type;//瑞云回调链接断开了
  24. BOOL didPingType;//是否ping过
  25. BOOL didRuiyunLinkType;//是否瑞云链接通过
  26. NSInteger RuiyunLinkSecond;//瑞云链接描述
  27. }
  28. @property (nonatomic, strong) NSTimer *connectCheckTimer;//这个应该是检查初始化是否完成的
  29. @property (nonatomic, strong) NSTimer *customCheckTimer;//hxd 20240720 add to做业务检测的:主要判断 瑞云(x)秒内是否链接通过
  30. //@property (nonatomic, strong) GCDAsyncSocket *socket;
  31. //
  32. //@property (nonatomic, strong) GCDAsyncSocket *serverSocket;
  33. @property (nonatomic, assign) BOOL sdnConnected;
  34. @property (nonatomic, assign) BOOL peerConnected;
  35. @property (nonatomic, assign) NSInteger tcpPort;
  36. @property (nonatomic, copy) NSString *Pre_sdnId;//上一个sdn好
  37. @property (nonatomic, assign) BOOL isGetThridMsgType;
  38. @end
  39. @implementation connectDeviceManager
  40. static connectDeviceManager *connectDeviceManagerInstance = nil;
  41. +(connectDeviceManager *)shareInstance;
  42. {
  43. static dispatch_once_t onceToken;
  44. dispatch_once(&onceToken, ^{
  45. connectDeviceManagerInstance = [[connectDeviceManager alloc] init];
  46. connectDeviceManagerInstance.curConnectDeviceState = DeviceConnectUnknown;
  47. });
  48. return connectDeviceManagerInstance;
  49. }
  50. #pragma mark 根据扫码的sn获取第三方信息
  51. -(void)getThridMsgBySN:(NSString*)snStr needReconnect:(BOOL)needReconnect didNetEnd:(netWork_DidEndByOK)didNetEndIsOK
  52. {
  53. if(_isGetThridMsgType){
  54. didNetEndIsOK(-1);
  55. return;
  56. }
  57. if(needReconnect){
  58. _curConnectDeviceState = DeviceConnectGetThridMsging;
  59. //更换设备
  60. // NSString *curSdnId = self.DeviceThirdIdMod.data.sdnId;
  61. // if(curSdnId){
  62. // _Pre_sdnId = curSdnId;
  63. // }
  64. }
  65. NSMutableDictionary *paraDict = [NSMutableDictionary new];
  66. [paraDict setValue:snStr forKey:@"sn"];
  67. _isGetThridMsgType = YES;
  68. KWeakSelf
  69. [[netWorkManager shareInstance] CommonGetWithCallBackCode:getThirdIdBySn Parameters:paraDict success:^(id _Nonnull responseObject) {
  70. if(!needReconnect){
  71. NSError *parseError;
  72. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:responseObject options:NSJSONWritingPrettyPrinted error:&parseError];
  73. if (parseError) {
  74. //解析出错
  75. }
  76. NSString * str = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  77. [cachesFileManager writeLogsWithMsg:str];
  78. }
  79. self->_isGetThridMsgType = NO;
  80. DeviceThirdIdModel *model = [[DeviceThirdIdModel alloc] initWithDictionary:responseObject error:nil];
  81. if(model.status == 0
  82. && model.data)
  83. {
  84. weakSelf.DeviceThirdIdMod = model;
  85. NSString*desPwdstr = [RSATool AES128Decrypt:weakSelf.DeviceThirdIdMod.data.password key:AESCODEKEEYY];
  86. didNetEndIsOK(YES);
  87. /*密码保持在本地*/
  88. NSDictionary *deviceDict = [HWDataManager getObjectWithKey:Const_Have_Add_Device];
  89. NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:deviceDict];
  90. [dict setObject:desPwdstr forKey:Const_Have_Add_Device_PWD];
  91. NSString *sdnid = model.data.sdnId;
  92. if(sdnid){
  93. [dict setObject:sdnid forKey:Const_Have_Add_Device_sdnid];
  94. }
  95. [HWDataManager setObjectWithKey:Const_Have_Add_Device_Privacy_Mode value:[NSNumber numberWithBool:model.data.isPrivacyMode]];
  96. [HWDataManager setObjectWithKey:Const_Have_Add_Device value:dict];
  97. //
  98. bool connected = [RaylinkProxy.sharedManager isSdnConnected];
  99. if(!connected || needReconnect){
  100. self->didPingType = NO;
  101. self->didRuiyunLinkType = NO;
  102. self->_isPingOk = NO;
  103. weakSelf.curConnectDeviceState = DeviceConnectGetThridOK;
  104. NSString *ipStr = weakSelf.DeviceThirdIdMod.data.ip;
  105. [weakSelf startPingDeviceIp:ipStr];
  106. [weakSelf initRuiyunSDKFun];
  107. }
  108. }
  109. else{
  110. if(model.status == 201||model.status == 202){
  111. didNetEndIsOK(model.status);
  112. }
  113. else{
  114. didNetEndIsOK(2);
  115. }
  116. }
  117. } failure:^(NSError * _Nonnull error) {
  118. HLog("网络报错");
  119. self->_isGetThridMsgType = NO;
  120. didNetEndIsOK(NO);
  121. }];
  122. }
  123. #pragma mark 刷新扫码的sn获取第三方信息 是否需要重连
  124. -(void)RefreshThridMsg
  125. {
  126. /*先判断本地有无设备 无设备时需要先扫码添加设备*/
  127. NSDictionary *deviceDict = [HWDataManager getObjectWithKey:Const_Have_Add_Device];
  128. if (deviceDict && [[deviceDict allKeys] containsObject:Const_Have_Add_Device_SN]){
  129. //有设备了先去做链接准备 // 80bec9c5
  130. NSString *SNStr = deviceDict[@"Const_Have_Add_Device_SN"];
  131. if(SNStr){
  132. [[connectDeviceManager shareInstance] getThridMsgBySN:SNStr needReconnect:NO didNetEnd:^(NSInteger didSuc) {
  133. }];
  134. }
  135. }
  136. }
  137. #pragma mark 初始化瑞云的SDK等
  138. - (void)initRuiyunSDKFun{
  139. if(didRuiYunInitOkType){
  140. [self onConnectFun];
  141. return;
  142. }
  143. HLog(@"initRuiyunSDKFun");
  144. self.sdnConnected = NO;
  145. self.peerConnected = NO;
  146. //self.sendBtn.enabled = NO;
  147. //self.sdnConnectStateLab.text = @"SDN state: Connectting";
  148. //self.sdnIDLab.text = @"My SDN ID:";
  149. RaylinkProxy.sharedManager.delegate = self;
  150. initProxyQueue = dispatch_queue_create("init_proxy", 0);
  151. NSURL *logUrl = [[NSFileManager.defaultManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].firstObject URLByAppendingPathComponent:@"logs"];
  152. if (![NSFileManager.defaultManager fileExistsAtPath:logUrl.path]) {
  153. [NSFileManager.defaultManager createDirectoryAtURL:logUrl withIntermediateDirectories:YES attributes:NULL error:NULL];
  154. }
  155. KWeakSelf
  156. dispatch_async(initProxyQueue, ^{
  157. NSData *sdnInfo = [NSData dataWithContentsOfURL:[[NSBundle.mainBundle bundleURL] URLByAppendingPathComponent:@"planet.1ali_3ry_peer"]];
  158. /// 1. 初始化代理库
  159. [RaylinkProxy.sharedManager initProxy:logUrl.path rootSdnInfo:sdnInfo];
  160. self->didRuiYunInitOkType = YES;
  161. /// 启动定时器监听 SND 连接状态
  162. self.connectCheckTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 repeats:YES block:^(NSTimer * _Nonnull timer) {
  163. /// 2. 监听SDN 连接状态
  164. bool connected = [RaylinkProxy.sharedManager isSdnConnected];
  165. if (self.sdnConnected == connected) {
  166. return;
  167. }
  168. self.sdnConnected = connected;
  169. if (self.sdnConnected) {
  170. [weakSelf onConnectFun];
  171. [self->_connectCheckTimer invalidate];
  172. //self.sdnConnectStateLab.text = @"SDN state: Connected";
  173. //self.sdnIDLab.text = [@"My SDN ID: " stringByAppendingString:[RaylinkProxy.sharedManager getSdnId]];
  174. } else {
  175. //self.sdnConnectStateLab.text = @"SDN state: Connectting";
  176. }
  177. }];
  178. [[NSRunLoop currentRunLoop] addTimer:self.connectCheckTimer forMode:NSRunLoopCommonModes];
  179. [[NSRunLoop currentRunLoop] run];
  180. });
  181. /// 作为服务端时,启动端口监听
  182. // self.serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
  183. //
  184. // if ([self.serverSocket acceptOnPort:0 error:NULL]) {
  185. // //self.serverPortLab.text = [NSString stringWithFormat: @"server port: %d", self.serverSocket.localPort];
  186. // NSLog(@"accept ok %d",self.serverSocket.localPort);
  187. // }
  188. }
  189. - (void)onConnectFun{
  190. if (self.peerConnected == YES
  191. && _Pre_sdnId
  192. && ![_Pre_sdnId isEqualToString:self.DeviceThirdIdMod.data.sdnId]) {
  193. //[self disconnect];
  194. //return;
  195. }
  196. RuiyunLinkSecond = 0;
  197. _curConnectDeviceState = DeviceConnectDeciceing;
  198. NSString *curSdnId = self.DeviceThirdIdMod.data.sdnId; //@"3dfe7c1f";
  199. if(!curSdnId){
  200. NSDictionary *deviceDict = [HWDataManager getObjectWithKey:Const_Have_Add_Device];
  201. if(deviceDict && [[deviceDict allKeys] containsObject:Const_Have_Add_Device_sdnid])
  202. {
  203. curSdnId = deviceDict[Const_Have_Add_Device_sdnid];
  204. }
  205. }
  206. /// 3. 根据对端的 SDN ID 创建连接
  207. [RaylinkProxy.sharedManager createNewConnection:curSdnId];
  208. //self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
  209. //[self.connectBtn setEnabled:NO];
  210. //[self.connectBtn setTitle:@"连接中..." forState:UIControlStateDisabled];
  211. self.customCheckTimer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer){
  212. if(self->didRuiyunLinkType){
  213. [timer invalidate];
  214. }
  215. else{
  216. self->RuiyunLinkSecond++;
  217. if(self->RuiyunLinkSecond >= 30){
  218. [timer invalidate];
  219. //弹框瑞云链接失败
  220. [[errorAlertTool shareInstance] showNetErrorAlertFun:11 didClickBut:^(NSInteger tag) {
  221. }];
  222. }
  223. }
  224. }];
  225. [[NSRunLoop currentRunLoop] addTimer:self.customCheckTimer forMode:NSRunLoopCommonModes];
  226. [[NSRunLoop currentRunLoop] run];
  227. }
  228. - (void)disconnect {
  229. NSString *curSdnId = self.DeviceThirdIdMod.data.sdnId;
  230. if(_Pre_sdnId){
  231. curSdnId = _Pre_sdnId;
  232. }
  233. if(curSdnId){
  234. [RaylinkProxy.sharedManager closeConnection:curSdnId];
  235. [RaylinkProxy.sharedManager closeHttpService:curSdnId];
  236. //[self.connectBtn setTitle:@"连接" forState:UIControlStateNormal];
  237. self.peerConnected = NO;
  238. }
  239. }
  240. - (IBAction)onClickSend:(id)sender {
  241. // if (self.messageTF.text.length <= 0) {
  242. // return;
  243. // }
  244. //[self.socket writeData:[@"111" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
  245. }
  246. //- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket {
  247. //
  248. // NSLog(@"didAcceptNewSocket");
  249. //
  250. //
  251. // [newSocket setDelegate:self delegateQueue:dispatch_get_main_queue()];
  252. //
  253. // NSThread *revcThread = [[NSThread alloc] initWithBlock:^{
  254. //
  255. // while (true) {
  256. // [newSocket readDataWithTimeout:-1 tag:0];
  257. // [NSThread sleepForTimeInterval:0.1];
  258. // }
  259. // }];
  260. //
  261. // [revcThread start];
  262. //
  263. //}
  264. - (void)onProxyConnected:(NSString *)sdnId status:(int)status {
  265. if (status == 0) {
  266. /// 4. 创建 HttpService
  267. self.tcpPort = [RaylinkProxy.sharedManager createHttpService:sdnId];
  268. self.tcpPortStr = [[NSString alloc] initWithFormat:@"%ld",self.tcpPort];
  269. [[netWorkManager shareInstance] setAFHTTPSessionManagerFunBy:self.tcpPort];
  270. /// 5. 添加端口防火墙
  271. [RaylinkProxy.sharedManager addSdnId:sdnId ip:ruiyunlinkIp allowPort:9300];
  272. [RaylinkProxy.sharedManager addSdnId:sdnId ip:ruiyunlinkIp allowPort:9100];
  273. [RaylinkProxy.sharedManager addSdnId:sdnId ip:ruiyunlinkIp allowPort:9888];
  274. [cachesFileManager writeLogsWithMsg:@"onProxyConnected connectToHost"];
  275. /// 6. 等待连接成功回调,创建 TCP socket 连接 HttpService 的端口
  276. // NSError *error;
  277. //
  278. // NSString*log1 = [[NSString alloc] initWithFormat:@"onProxyConnected connectToHost begin %ld", (long)self.tcpPort];
  279. // [cachesFileManager writeLogsWithMsg:log1];
  280. //
  281. // [self.socket connectToHost:@"127.0.0.1" onPort:self.tcpPort error:&error];
  282. //
  283. // NSString*log2 = [[NSString alloc] initWithFormat:@"onProxyConnected connectToHost end %ld, self.socket = %@ error = %@", (long)self.tcpPort, self.socket, error];
  284. // [cachesFileManager writeLogsWithMsg:log2];
  285. _curConnectDeviceState = DeviceConnectDeciceOk;
  286. _Pre_sdnId = self.DeviceThirdIdMod.data.sdnId;
  287. disconnected_cb_type = NO;
  288. didRuiyunLinkType = YES;
  289. [self beginLinkWebSocketFun];
  290. } else {
  291. HLog(@"瑞云链接断开");
  292. }
  293. }
  294. - (void)OnProxyDisconnected_cb:(NSString *)sdnId {
  295. //[RaylinkProxy.sharedManager closeHttpService:sdnId];
  296. [cachesFileManager writeLogsWithMsg:@"OnProxyDisconnected_cb"];
  297. disconnected_cb_type = YES;
  298. }
  299. //瑞云sock 断开了 需要重连
  300. - (void)tryReconnectFun{
  301. [cachesFileManager writeLogsWithMsg:@"tryReconnect"];
  302. [cachesFileManager writeLogsWithMsg:@"click again try Net Work"];
  303. [self getThridMsgBySN:self.DeviceThirdIdMod.data.changeSn needReconnect:NO didNetEnd:^(NSInteger didSuc) {
  304. NSString *tip = [[NSString alloc] initWithFormat:@"Net Work state:%ld",didSuc];
  305. [cachesFileManager writeLogsWithMsg:tip];
  306. }];
  307. if(!disconnected_cb_type){
  308. [cachesFileManager writeLogsWithMsg:@"tryReconnect return"];
  309. return;
  310. }
  311. NSURL *logUrl = [[NSFileManager.defaultManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].firstObject URLByAppendingPathComponent:@"logs"];
  312. if (![NSFileManager.defaultManager fileExistsAtPath:logUrl.path]) {
  313. [NSFileManager.defaultManager createDirectoryAtURL:logUrl withIntermediateDirectories:YES attributes:NULL error:NULL];
  314. }
  315. // dispatch_queue_t reinitProxyQueue = dispatch_queue_create("reinit_proxy", 0);
  316. //
  317. //
  318. // [cachesFileManager writeLogsWithMsg:@"tryReconnect initProxy 0"];
  319. // dispatch_async(reinitProxyQueue, ^{
  320. // NSData *sdnInfo = [NSData dataWithContentsOfURL:[[NSBundle.mainBundle bundleURL] URLByAppendingPathComponent:@"planet.1ali_3ry_peer"]];
  321. //
  322. // /// 1. 初始化代理库
  323. // [cachesFileManager writeLogsWithMsg:@"tryReconnect initProxy 1"];
  324. // self->disconnected_cb_type = NO;
  325. // self->_isReInitType = YES;
  326. // [RaylinkProxy.sharedManager initProxy:logUrl.path rootSdnInfo:sdnInfo];
  327. // self->_isReInitType = NO;
  328. // [cachesFileManager writeLogsWithMsg:@"tryReconnect initProxy 2"];
  329. // });
  330. // //KWeakSelf
  331. // NSMutableDictionary *paraDict = [NSMutableDictionary new];
  332. // if(self.DeviceThirdIdMod.data.sn){
  333. // [paraDict setValue:self.DeviceThirdIdMod.data.sn forKey:@"sn"];
  334. // }
  335. //
  336. // [cachesFileManager writeLogsWithMsg:@"tryReconnect CommonGetWithCallBackCode"];
  337. // [[netWorkManager shareInstance] CommonGetWithCallBackCode:getThirdIdBySn Parameters:paraDict success:^(id _Nonnull responseObject) {
  338. //
  339. // dispatch_async(self->initProxyQueue, ^{
  340. // NSData *sdnInfo = [NSData dataWithContentsOfURL:[[NSBundle.mainBundle bundleURL] URLByAppendingPathComponent:@"planet.1ali_3ry_peer"]];
  341. //
  342. // /// 1. 初始化代理库
  343. // [RaylinkProxy.sharedManager initProxy:logUrl.path rootSdnInfo:sdnInfo];
  344. // [cachesFileManager writeLogsWithMsg:@"tryReconnect initProxy"];
  345. // });
  346. //
  347. //
  348. // } failure:^(NSError * _Nonnull error) {
  349. // HLog("网络报错");
  350. // }];
  351. }
  352. //音视频 链接返回-5的时候调用
  353. - (void)recreateHttpServiceFun{
  354. [cachesFileManager writeLogsWithMsg:@"recreateHttpServiceFun"];
  355. NSString *sdnId = self.DeviceThirdIdMod.data.sdnId;
  356. self.tcpPort = [RaylinkProxy.sharedManager createHttpService:sdnId];
  357. self.tcpPortStr = [[NSString alloc] initWithFormat:@"%ld",self.tcpPort];
  358. [[netWorkManager shareInstance] setAFHTTPSessionManagerFunBy:self.tcpPort];
  359. [RaylinkProxy.sharedManager addSdnId:sdnId ip:ruiyunlinkIp allowPort:9300];
  360. [RaylinkProxy.sharedManager addSdnId:sdnId ip:ruiyunlinkIp allowPort:9100];
  361. [RaylinkProxy.sharedManager addSdnId:sdnId ip:ruiyunlinkIp allowPort:9888];
  362. }
  363. //- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port {
  364. //
  365. // NSLog(@"didConnectToHost %d", port);
  366. //
  367. // NSThread *thread = [[NSThread alloc] initWithBlock:^{
  368. // while (true) {
  369. //
  370. // [self.socket readDataWithTimeout:-1 tag:0];
  371. // [NSThread sleepForTimeInterval:0.1];
  372. //
  373. // }
  374. // }];
  375. //
  376. // [thread start];
  377. //
  378. // /// 7. Socket 连接成功后,通过 socket 发送, self.peerPortTF 为对端服务端口
  379. // //[sock writeData:[[NSString stringWithFormat:@"CONNECT 127.0.0.1:%@ HTTP/1.0\r\n\r\n", @"9100"] dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
  380. //
  381. // NSLog(@"readDataToData");
  382. //
  383. // [cachesFileManager writeLogsWithMsg:@"didConnectToHost writeData"];
  384. //}
  385. //
  386. //- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
  387. //{
  388. // NSLog(@"socket:%p didWriteDataWithTag:%ld", sock, tag);
  389. //}
  390. //
  391. //- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
  392. //
  393. //
  394. // if (tag == 0) {
  395. //
  396. // NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  397. //
  398. // /// 8. 收到包含 `HTTP/1.0 200`的字符串,则认为连接成功。可以正常给对端发消息了
  399. // if ([str containsString:@"HTTP/1.0 200"]) {
  400. // NSLog(@"Connected");
  401. // self.peerConnected = YES;
  402. //// self.connectBtn.enabled = YES;
  403. //// [self.connectBtn setTitle:@"断开连接" forState:UIControlStateNormal];
  404. // }
  405. //
  406. // }
  407. //
  408. // //self.revcLab.text = [NSString stringWithFormat:@"接收:%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]];
  409. //}
  410. #pragma mark 保持卡密码
  411. -(void)updateCardInfoBySN:(NSString*)snStr withPwdStr:(NSString*)pwd didNetEnd:(netWork_DidEndByOK)didNetEndIsOK
  412. {
  413. NSMutableDictionary *paraDict = [NSMutableDictionary new];
  414. [paraDict setValue:snStr forKey:@"sn"];
  415. NSString* enPwdStr = [RSATool AES128Encrypt:pwd key:AESCODEKEEYY];
  416. if(enPwdStr){
  417. [paraDict setValue:enPwdStr forKey:@"password"];
  418. }
  419. KWeakSelf
  420. [[netWorkManager shareInstance] CommonPostCallBackCode:updateCardInfo Parameters:paraDict success:^(id _Nonnull responseObject) {
  421. SuperModel*model = [[SuperModel alloc] initWithDictionary:responseObject error:nil];
  422. if(model && model.status == 0)
  423. {
  424. didNetEndIsOK(YES);
  425. [connectDeviceManager shareInstance].DeviceThirdIdMod.data.password = enPwdStr;
  426. /*密码保持在本地*/
  427. NSDictionary *deviceDict = [HWDataManager getObjectWithKey:Const_Have_Add_Device];
  428. NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:deviceDict];
  429. [dict setObject:pwd forKey:Const_Have_Add_Device_PWD];
  430. [HWDataManager setObjectWithKey:Const_Have_Add_Device value:dict];
  431. }
  432. else{
  433. didNetEndIsOK(NO);
  434. }
  435. } failure:^(NSError * _Nonnull error) {
  436. HLog("网络报错");
  437. didNetEndIsOK(NO);
  438. }];
  439. }
  440. #pragma mark ---ping-----站点 判断是否是局域网
  441. - (void)startPingDeviceIp:(NSString *)roomInternetIp
  442. {
  443. //roomInternetIp = @"www.baidu.com";
  444. if(!roomInternetIp || roomInternetIp.length < 7){
  445. self.isPingOk = NO;
  446. return;
  447. }
  448. if (self->whPingTester)
  449. {
  450. [self->whPingTester stopPing];
  451. self->whPingTester = nil;
  452. }
  453. self->whPingTester = [[WHPingTester alloc] initWithHostName:roomInternetIp];
  454. self->whPingTester.delegate = self;
  455. //self->whPingTester.countdownTime = 1; //1秒ping一次
  456. [self->whPingTester startPing];
  457. /// 启动定时器监听 10秒后 whPingTester的状态
  458. [NSTimer scheduledTimerWithTimeInterval:5 repeats:NO block:^(NSTimer * _Nonnull timer) {
  459. if(self->whPingTester){
  460. [self didGetPingStateIsOK:NO];
  461. }
  462. }];
  463. }
  464. #pragma mark ---ping---- 代理回调
  465. - (void) didPingSucccessWithTime:(float)time withError:(NSError*) error
  466. {
  467. HLog(@"time:%f \n error: %@",time,error)
  468. //if(error.code == 111 || time > 1000) //超时或者延时超过100ms,就要记录数据
  469. if(error != nil)
  470. {
  471. [self didGetPingStateIsOK:NO];
  472. }
  473. else if(time > 0){
  474. [self didGetPingStateIsOK:YES];
  475. }
  476. }
  477. - (void) didPingfialewithError:(NSError*)error
  478. {
  479. HLog(@" error error: %@",error)
  480. [self didGetPingStateIsOK:NO];
  481. }
  482. -(void)didGetPingStateIsOK:(BOOL)isOk
  483. {
  484. self.isPingOk = isOk;
  485. [self->whPingTester stopPing];
  486. self->whPingTester = nil;
  487. didPingType = YES;
  488. [self beginLinkWebSocketFun];
  489. }
  490. - (void)beginLinkWebSocketFun
  491. {
  492. if(!didPingType){
  493. return;
  494. }
  495. //局域网不通 瑞云还没连接好
  496. if(!self.isPingOk && !didRuiyunLinkType){
  497. return;
  498. }
  499. //切换设备
  500. if([webSocketManager shareInstance].commandChannelManager){
  501. [[webSocketManager shareInstance].commandChannelManager rc_close];
  502. [webSocketManager shareInstance].commandChannelManager = nil;
  503. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  504. [[webSocketManager shareInstance] opencommandChannelManagerrc_openURL];
  505. });
  506. }
  507. else{//第一次启动
  508. if([connectDeviceManager shareInstance].isFirstInputPwdDone){
  509. [[webSocketManager shareInstance] opencommandChannelManagerrc_openURL];
  510. }
  511. }
  512. }
  513. @end