Advertisement
Guest User

Untitled

a guest
Nov 24th, 2014
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.65 KB | None | 0 0
  1. CrcGenerator *crcGenerator;
  2. Parser *parser;
  3. CFSocketRef cfSocket;
  4. CFRunLoopSourceRef cfSource;
  5. struct sockaddr_in addr;
  6. struct sockaddr_in addrOut;
  7. CFDataRef addrData;
  8. CFDataRef addrDataOut;
  9. CFDataRef Data;
  10. CFDataRef DataOut;
  11.  
  12. const char *ip = "0.0.0.0";
  13. const char *ipOut = "192.168.2.255";
  14. const int port = 8234;
  15. const int minimalFrameSize = 3;
  16.  
  17. -(void) initNetworkCommunication
  18. {
  19. CFSocketContext socketContext = {0, (__bridge void *)(self), NULL, NULL, NULL};
  20.  
  21. cfSocket = CFSocketCreate(kCFAllocatorDefault, AF_INET, SOCK_DGRAM, IPPROTO_UDP, kCFSocketAcceptCallBack | kCFSocketDataCallBack, (CFSocketCallBack)socketCallback, &socketContext);
  22.  
  23. if ( cfSocket == NULL) {
  24. NSLog(@"CfSocketCreate failed");
  25. }else{
  26. if( cfSocket ) {
  27. NSLog(@"Socket created ");
  28.  
  29. //configure listening address
  30. memset(&addr, 0, sizeof(addr));
  31. addr.sin_len = sizeof(addr);
  32. addr.sin_family = AF_INET;
  33. addr.sin_port = htons(port); //port
  34. inet_pton(AF_INET,ip, &addr.sin_addr); //ip adress
  35. addrData = CFDataCreate(NULL, (const UInt8*)&addr, sizeof(addr));
  36.  
  37. //configure output address
  38. memset(&addrOut, 0, sizeof(addrOut));
  39. addrOut.sin_len = sizeof(addrOut);
  40. addrOut.sin_family = AF_INET;
  41. addrOut.sin_port = htons(port); //port
  42. inet_pton(AF_INET,ipOut, &addrOut.sin_addr); //ip adress
  43. addrDataOut = CFDataCreate(NULL, (const UInt8*)&addrOut, sizeof(addrOut));
  44.  
  45. //enable broadcast on the socket
  46. int flag = 1;
  47. CFSocketNativeHandle socket_handle = (CFSocketNativeHandle)CFSocketGetNative(cfSocket);
  48. int result = setsockopt(socket_handle, SOL_SOCKET, SO_BROADCAST, &flag, sizeof(flag));
  49. if ( result < 0 ) {
  50. NSLog(@"broadcast enable failed");
  51. }
  52.  
  53. //set address of the socket to listen to
  54. CFSocketSetAddress (cfSocket, addrData);
  55.  
  56. //CRC generation object
  57. crcGenerator = [[CrcGenerator alloc] init];
  58. //parser object
  59. parser = [[Parser alloc] init];
  60. parser.delegate = self;
  61. }
  62. }
  63.  
  64. cfSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, cfSocket, 0);
  65. CFRunLoopAddSource(CFRunLoopGetCurrent(), cfSource, kCFRunLoopDefaultMode);
  66.  
  67. CFRelease(cfSource);
  68. CFRelease(cfSocket);
  69. //CFRunLoopRun();
  70. }
  71.  
  72. static void socketCallback(CFSocketRef cfSocket, CFSocketCallBackType
  73. type, CFDataRef address, const void *data, void *userInfo)
  74. {
  75. //conversion of data from bytes to string
  76. NSData * inputData = (__bridge NSData*)data;
  77. NSUInteger capacity = inputData.length * 2;
  78.  
  79. NSMutableString *sbuf = [NSMutableString stringWithCapacity:capacity];
  80. const unsigned char *buf = inputData.bytes;
  81. NSInteger i;
  82. for (i=0; i<inputData.length; ++i) {
  83. [sbuf appendFormat:@"%02X", (NSUInteger)buf[i]];
  84. }
  85. //log for checking received frame
  86. NSLog(sbuf);
  87.  
  88. //CRC check
  89. if(capacity > minimalFrameSize*2){
  90. uint8_t* inputByteData = (uint8_t*)inputData.bytes;
  91. uint8_t inputByteArray[inputData.length];
  92. memcpy(inputByteArray, inputByteData, inputData.length);
  93. uint16_t compCrc = [crcGenerator generateCRC:inputByteArray withFrameLength:(uint8_t*)(inputData.length - 2) negate:true];
  94. uint8_t crc[2];
  95. memcpy(crc, &compCrc, 2);
  96.  
  97. if(inputByteArray[inputData.length - 2 ] == crc[0] && inputByteArray[inputData.length - 1] == crc[1])
  98. {
  99. NSLog(@"OK n");
  100. //parse
  101. [parser setFrameDataToParse:inputData];
  102. }
  103. }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement