connectDeviceManager.m 22 KB

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