NetworkServiceHandler.m 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. //
  2. // NetworkServiceHandler.m
  3. // OneCable
  4. //
  5. // Created by Jason Lee on 2/15/16.
  6. // Copyright © 2016 ntels. All rights reserved.
  7. //
  8. #import "JDObject.h"
  9. #import "NetworkServiceHandler.h"
  10. #import "Reachability.h"
  11. #import "NSString-Addtions.h"
  12. #import "NSNetService+Util.h"
  13. @interface NetworkServiceHandler () <NSNetServiceBrowserDelegate, NSNetServiceDelegate>
  14. {
  15. NSNetServiceBrowser *_netServiceBrowser;
  16. BOOL _isNotFirstLoading;
  17. Reachability *_reachability;
  18. NSMutableArray* _services;
  19. }
  20. @property (strong, nonatomic) NSNetService *netService;
  21. @end
  22. @implementation NetworkServiceHandler
  23. - (BOOL)startSearchBonjourServices {
  24. NSLog(@"currentReachabilityStatus= %zd", _reachability.currentReachabilityStatus);
  25. // _isNotFirstLoading = NO;
  26. if (_reachability.currentReachabilityStatus != ReachableViaWiFi) {
  27. return NO;
  28. }
  29. //1.check if wifi
  30. // if (_netServiceBrowser) {
  31. // [_netServiceBrowser stop];
  32. // _netServiceBrowser = nil;
  33. // }
  34. NSString *browseType;
  35. if (!_netService) {
  36. _netServiceBrowser = [[NSNetServiceBrowser alloc] init];
  37. _netServiceBrowser.delegate = self;
  38. _services = [[NSMutableArray alloc] init];
  39. // browseType = @"_services._dns-sd._udp.";
  40. browseType = @"_ntelshub._tcp.";
  41. // browseType = @"_ntelshub._tcp.local.";
  42. NSLog(@"Serch BrowseType : %@", browseType);
  43. [_netServiceBrowser searchForServicesOfType:browseType inDomain:@""];
  44. } else {
  45. [self publishNetService];
  46. }
  47. return YES;
  48. }
  49. - (void)stopSearchBonjourServices{
  50. if (_netServiceBrowser) {
  51. [_netServiceBrowser stop];
  52. _netServiceBrowser = nil;
  53. }
  54. if(_netService) {
  55. [_netService stop];
  56. _netService = nil;
  57. }
  58. }
  59. - (void)publishNetService {
  60. NSLog(@"%@", [JDFacade facade].deviceHostName);
  61. if (!_netService) {
  62. _netService = [[NSNetService alloc] initWithDomain:@"" type:@"_ntelshub._tcp" name:[JDFacade facade].deviceHostName port:7979];
  63. _netService.delegate = self;
  64. }
  65. if (_netService) {
  66. [_netService publish];
  67. } else {
  68. NSLog(@"An error occurred initializing the NSNetService object.");
  69. }
  70. }
  71. #pragma mark - NSNetServiceDelegate methods
  72. - (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing {
  73. /*
  74. 현재 안드로이드에서 MDNS통해서 수집하는 정보는 manufacturer, modelNumber, serialNumber, profileVersion, hostAddress 입니다.
  75. */
  76. [service setDelegate:self];
  77. [service resolveWithTimeout:0.0];
  78. [_services addObject:service];
  79. // NSMutableDictionary *info = [NSMutableDictionary dictionary];
  80. // NSDictionary* dict = [NSNetService dictionaryFromTXTRecordData:[service TXTRecordData]];
  81. // info[@"name"] = service.name;
  82. // info[@"domain"] = service.domain;
  83. // info[@"type"] = service.type;
  84. // info[@"hostName"] = service.hostName;
  85. // info[@"Data"] = service.type;
  86. // info[@"Address"] = service.addresses;
  87. //// info[@"port"] = service.port;
  88. // NSLog(@"Finish : %@", info );
  89. // NSLog(@"Info : %@", dict );
  90. //
  91. // if (!moreComing)
  92. // {
  93. // [self chkServiceData];
  94. // }
  95. //
  96. if (!_isNotFirstLoading) {
  97. [self publishNetService];
  98. _isNotFirstLoading = YES;
  99. }
  100. }
  101. -(void)chkServiceData
  102. {
  103. for (NSNetService *service in _services)
  104. {
  105. NSMutableDictionary *info = [NSMutableDictionary dictionary];
  106. info[@"name"] = service.name;
  107. info[@"domain"] = service.domain;
  108. info[@"type"] = service.type;
  109. info[@"hostName"] = service.hostName;
  110. info[@"Data"] = service.type;
  111. info[@"Address"] = service.addresses;
  112. NSLog(@"Service : %@", info );
  113. NSDictionary* dict = [NSNetService dictionaryFromTXTRecordData:[service TXTRecordData]];
  114. NSLog(@"Service TXT : %@", dict );
  115. }
  116. }
  117. - (void)netServiceDidPublish:(NSNetService *)sender {
  118. NSLog(@"%s\n %@", __PRETTY_FUNCTION__, sender);
  119. // if (self.delegate && [self.delegate respondsToSelector:@selector(didSucceedPublishService)]) {
  120. // [self.delegate didSucceedPublishService];
  121. // }
  122. if (self.delegate && [self.delegate respondsToSelector:@selector(didSucceedPublishService:)]) {
  123. [self.delegate didSucceedPublishService:_services];
  124. }
  125. }
  126. - (void)netServiceWillPublish:(NSNetService *)sender {
  127. NSLog(@"%s\n %@", __PRETTY_FUNCTION__, sender);
  128. }
  129. - (void)netServiceDidStop:(NSNetService *)sender {
  130. NSLog(@"%s\n %@", __PRETTY_FUNCTION__, sender);
  131. }
  132. - (void)netService:(NSNetService *)sender didAcceptConnectionWithInputStream:(NSInputStream *)inputStream outputStream:(NSOutputStream *)outputStream {
  133. NSLog(@"%s\n %@", __PRETTY_FUNCTION__, sender);
  134. }
  135. - (void)netService:(NSNetService *)sender didNotPublish:(NSDictionary<NSString *,NSNumber *> *)errorDict {
  136. NSLog(@"%s\n %@", __PRETTY_FUNCTION__, errorDict);
  137. if (self.delegate && [self.delegate respondsToSelector:@selector(didFailPublishService:)]) {
  138. [self.delegate didFailPublishService:errorDict];
  139. }
  140. }
  141. - (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict {
  142. NSLog(@"%s\n %@", __PRETTY_FUNCTION__, sender);
  143. NSNumber *errorCode = [errorDict valueForKey:NSNetServicesErrorCode];
  144. switch ([errorCode intValue]) {
  145. case NSNetServicesActivityInProgress:
  146. NSLog(@"%s\n %@", __PRETTY_FUNCTION__, @"Service Resolution Currently in Progress. Please Wait.");
  147. break;
  148. case NSNetServicesTimeoutError:
  149. NSLog(@"%s\n %@", __PRETTY_FUNCTION__, @"Service Resolution Currently in Progress. Please Wait.");
  150. //service stop
  151. [sender stop];
  152. if (self.delegate && [self.delegate respondsToSelector:@selector(didFailPublishService:)]) {
  153. [self.delegate didFailPublishService:errorDict];
  154. }
  155. break;
  156. }
  157. }
  158. - (void)netServiceDidResolveAddress:(NSNetService *)service
  159. {
  160. NSDictionary* dict = [NSNetService dictionaryFromTXTRecordData:[service TXTRecordData]];
  161. /*
  162. manufacturer = <4e54656c 73>;
  163. "model_number" = <53544248 55427633>;
  164. "profile_version" = <7633>;
  165. "serial_number" = <30383632 36363064 30633935>;
  166. */
  167. NSMutableDictionary *info = [NSMutableDictionary dictionary];
  168. info[@"name"] = service.name;
  169. info[@"domain"] = service.domain;
  170. info[@"type"] = service.type;
  171. info[@"hostName"] = service.hostName;
  172. info[@"Data"] = service.type;
  173. // info[@"Address"] = service.addressesAndPorts;
  174. for (AddressAndPort *addrInfo in service.addressesAndPorts) {
  175. NSLog(@"ADDR : %@", addrInfo.address);
  176. }
  177. for (NSString *key in dict.allKeys) NSLog(@"[%@] : %@", key,[NSString stringWithUTF8Data:[dict objectForKey:key]]);
  178. }
  179. #pragma mark - Reachability Notification
  180. - (void)netReachabilityChanged:(id)notification {
  181. if (_reachability.currentReachabilityStatus == ReachableViaWiFi) {
  182. NSLog(@"%s\n currentReachabilityStatus = %zd", __PRETTY_FUNCTION__, _reachability.currentReachabilityStatus);
  183. [self performSelectorInBackground:@selector(startSearchBonjourServices) withObject:nil];
  184. }
  185. }
  186. - (void)dealloc {
  187. NSLog(@"%s", __PRETTY_FUNCTION__);
  188. [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:kReachabilityChangedNotification];
  189. [_reachability stopNotifier];
  190. [_netServiceBrowser stop];
  191. }
  192. #pragma mark - Singleton
  193. + (NetworkServiceHandler *)handler {
  194. static NetworkServiceHandler *sharedNetworkServiceHandler = nil;
  195. static dispatch_once_t onceToken;
  196. dispatch_once(&onceToken, ^{
  197. sharedNetworkServiceHandler = [[self alloc] init];
  198. });
  199. return sharedNetworkServiceHandler;
  200. }
  201. - (id)init {
  202. if (self = [super init]) {
  203. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netReachabilityChanged:) name:kReachabilityChangedNotification object:nil];
  204. _reachability = [Reachability reachabilityForLocalWiFi];
  205. [_reachability startNotifier];
  206. }
  207. return self;
  208. }
  209. @end