Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CrcGenerator *crcGenerator;
- Parser *parser;
- CFSocketRef cfSocket;
- CFRunLoopSourceRef cfSource;
- struct sockaddr_in addr;
- struct sockaddr_in addrOut;
- CFDataRef addrData;
- CFDataRef addrDataOut;
- CFDataRef Data;
- CFDataRef DataOut;
- const char *ip = "0.0.0.0";
- const char *ipOut = "192.168.2.255";
- const int port = 8234;
- const int minimalFrameSize = 3;
- -(void) initNetworkCommunication
- {
- CFSocketContext socketContext = {0, (__bridge void *)(self), NULL, NULL, NULL};
- cfSocket = CFSocketCreate(kCFAllocatorDefault, AF_INET, SOCK_DGRAM, IPPROTO_UDP, kCFSocketAcceptCallBack | kCFSocketDataCallBack, (CFSocketCallBack)socketCallback, &socketContext);
- if ( cfSocket == NULL) {
- NSLog(@"CfSocketCreate failed");
- }else{
- if( cfSocket ) {
- NSLog(@"Socket created ");
- //configure listening address
- memset(&addr, 0, sizeof(addr));
- addr.sin_len = sizeof(addr);
- addr.sin_family = AF_INET;
- addr.sin_port = htons(port); //port
- inet_pton(AF_INET,ip, &addr.sin_addr); //ip adress
- addrData = CFDataCreate(NULL, (const UInt8*)&addr, sizeof(addr));
- //configure output address
- memset(&addrOut, 0, sizeof(addrOut));
- addrOut.sin_len = sizeof(addrOut);
- addrOut.sin_family = AF_INET;
- addrOut.sin_port = htons(port); //port
- inet_pton(AF_INET,ipOut, &addrOut.sin_addr); //ip adress
- addrDataOut = CFDataCreate(NULL, (const UInt8*)&addrOut, sizeof(addrOut));
- //enable broadcast on the socket
- int flag = 1;
- CFSocketNativeHandle socket_handle = (CFSocketNativeHandle)CFSocketGetNative(cfSocket);
- int result = setsockopt(socket_handle, SOL_SOCKET, SO_BROADCAST, &flag, sizeof(flag));
- if ( result < 0 ) {
- NSLog(@"broadcast enable failed");
- }
- //set address of the socket to listen to
- CFSocketSetAddress (cfSocket, addrData);
- //CRC generation object
- crcGenerator = [[CrcGenerator alloc] init];
- //parser object
- parser = [[Parser alloc] init];
- parser.delegate = self;
- }
- }
- cfSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, cfSocket, 0);
- CFRunLoopAddSource(CFRunLoopGetCurrent(), cfSource, kCFRunLoopDefaultMode);
- CFRelease(cfSource);
- CFRelease(cfSocket);
- //CFRunLoopRun();
- }
- static void socketCallback(CFSocketRef cfSocket, CFSocketCallBackType
- type, CFDataRef address, const void *data, void *userInfo)
- {
- //conversion of data from bytes to string
- NSData * inputData = (__bridge NSData*)data;
- NSUInteger capacity = inputData.length * 2;
- NSMutableString *sbuf = [NSMutableString stringWithCapacity:capacity];
- const unsigned char *buf = inputData.bytes;
- NSInteger i;
- for (i=0; i<inputData.length; ++i) {
- [sbuf appendFormat:@"%02X", (NSUInteger)buf[i]];
- }
- //log for checking received frame
- NSLog(sbuf);
- //CRC check
- if(capacity > minimalFrameSize*2){
- uint8_t* inputByteData = (uint8_t*)inputData.bytes;
- uint8_t inputByteArray[inputData.length];
- memcpy(inputByteArray, inputByteData, inputData.length);
- uint16_t compCrc = [crcGenerator generateCRC:inputByteArray withFrameLength:(uint8_t*)(inputData.length - 2) negate:true];
- uint8_t crc[2];
- memcpy(crc, &compCrc, 2);
- if(inputByteArray[inputData.length - 2 ] == crc[0] && inputByteArray[inputData.length - 1] == crc[1])
- {
- NSLog(@"OK n");
- //parse
- [parser setFrameDataToParse:inputData];
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement