Advertisement
LA_

XiaoYi_RC remote emulator

LA_
Sep 29th, 2015
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. //  BPAppDelegate.m
  3. //  BLEPeripheral
  4. //
  5. //  https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/PerformingCommonPeripheralRoleTasks/PerformingCommonPeripheralRoleTasks.html
  6.  
  7. #import <objc/runtime.h>
  8. #import <objc/message.h>
  9.  
  10. #import "BPAppDelegate.h"
  11.  
  12. @interface CBXpcConnection : NSObject //{
  13. //    <CBXpcConnectionDelegate> *_delegate;
  14. //    NSRecursiveLock *_delegateLock;
  15. //    NSMutableDictionary *_options;
  16. //    NSObject<OS_dispatch_queue> *_queue;
  17. //    int _type;
  18. //    NSObject<OS_xpc_object> *_xpcConnection;
  19. //    NSObject<OS_dispatch_semaphore> *_xpcSendBarrier;
  20. //}
  21. //
  22. //@property <CBXpcConnectionDelegate> * delegate;
  23.  
  24.  
  25. - (id)allocXpcArrayWithNSArray:(id)arg1;
  26. - (id)allocXpcDictionaryWithNSDictionary:(id)arg1;
  27. - (id)allocXpcMsg:(int)arg1 args:(id)arg2;
  28. - (id)allocXpcObjectWithNSObject:(id)arg1;
  29. - (void)checkIn;
  30. - (void)checkOut;
  31. - (void)dealloc;
  32. - (id)delegate;
  33. - (void)disconnect;
  34. - (void)handleConnectionEvent:(id)arg1;
  35. - (void)handleInvalid;
  36. - (void)handleMsg:(int)arg1 args:(id)arg2;
  37. - (void)handleReset;
  38. - (id)initWithDelegate:(id)arg1 queue:(id)arg2 options:(id)arg3 sessionType:(int)arg4;
  39. - (BOOL)isMainQueue;
  40. - (id)nsArrayWithXpcArray:(id)arg1;
  41. - (id)nsDictionaryFromXpcDictionary:(id)arg1;
  42. - (id)nsObjectWithXpcObject:(id)arg1;
  43. - (void)sendAsyncMsg:(int)arg1 args:(id)arg2;
  44. - (void)sendMsg:(int)arg1 args:(id)arg2;
  45. - (id)sendSyncMsg:(int)arg1 args:(id)arg2;
  46. - (void)setDelegate:(id)arg1;
  47.  
  48. @end
  49.  
  50. int ProtocolValue = 0;
  51. char reportValue = 0x00;
  52.  
  53. @implementation CBXpcConnection (Swizzled)
  54.  
  55. - (void)sendMsg1:(int)arg1 args:(id)arg2
  56. {
  57.     NSLog(@"sendMsg: %d, %@", arg1, arg2);
  58.    
  59.     if ([self respondsToSelector:@selector(sendMsg1:args:)]) {
  60.         [self sendMsg1:arg1 args:arg2];
  61.     }
  62. }
  63.  
  64. - (void)handleMsg1:(int)arg1 args:(id)arg2
  65. {
  66.     NSLog(@"handleMsg: %d, %@", arg1, arg2);
  67.    
  68.     if ([self respondsToSelector:@selector(handleMsg1:args:)]) {
  69.         [self handleMsg1:arg1 args:arg2];
  70.     }
  71. }
  72.  
  73. @end
  74.  
  75. @interface BPAppDelegate ()
  76.  
  77. @property (weak) IBOutlet NSButton *btnReadConnections;
  78. @property (weak) IBOutlet NSButton *btnReportValue;
  79.  
  80. @property (nonatomic, strong) CBPeripheralManager *peripheralManager;
  81. @property (nonatomic, strong) CBMutableService *service;
  82.  
  83. @end
  84.  
  85.  
  86. @implementation BPAppDelegate
  87.  
  88. // BUTTONS
  89. - (IBAction)readConnections:(NSButton *)sender {
  90.     NSLog(@"Read connections");
  91.     NSArray *devices = [IOBluetoothDevice recentDevices:5];
  92.    
  93.     for(IOBluetoothDevice *device in devices) {
  94.         NSLog(@"* device: %@, status %hhd, address: %@",device.nameOrAddress,device.isConnected,device.addressString);
  95.         if(device && [device isConnected]){
  96.             // [device closeConnection];
  97.             NSLog(@"* value: %@",device.nameOrAddress);
  98.         }
  99.     }
  100. }
  101.  
  102. - (IBAction)changeReportValue:(NSButton *)sender {
  103.     if (reportValue == 0x00) {
  104.         reportValue = 0x40;
  105.     } else {
  106.         reportValue = 0x00;
  107.     }
  108. }
  109.  
  110.  
  111. // #define XPC_SPY 1
  112.  
  113. - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
  114. {
  115. #ifdef XPC_SPY
  116.     // Insert code here to initialize your application
  117.     Class xpcConnectionClass = NSClassFromString(@"CBXpcConnection");
  118.    
  119.     Method origSendMethod = class_getInstanceMethod(xpcConnectionClass,  @selector(sendMsg:args:));
  120.     Method newSendMethod = class_getInstanceMethod(xpcConnectionClass, @selector(sendMsg1:args:));
  121.    
  122.     method_exchangeImplementations(origSendMethod, newSendMethod);
  123.    
  124.     Method origHandleMethod = class_getInstanceMethod(xpcConnectionClass,  @selector(handleMsg:args:));
  125.     Method newHandleMethod = class_getInstanceMethod(xpcConnectionClass, @selector(handleMsg1:args:));
  126.    
  127.     method_exchangeImplementations(origHandleMethod, newHandleMethod);
  128. #endif
  129.    
  130.     self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
  131. }
  132.  
  133.  
  134. - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral
  135. {
  136.     NSLog(@"peripheralManagerDidUpdateState: %d", (int)peripheral.state);
  137.    
  138.     if (CBPeripheralManagerStatePoweredOn == peripheral.state) {
  139.    
  140.         char value[23] = {0x57,0x01,0x00,0xD5,0xF6,0xC6,0x19,0x17,0x1A,0x4B,0x50,0xAE,0x0F,0xF0,0x2C,0xD5,0x5C,0x02,0x88,0x10,0x5E,0xAB,0xC0};
  141.         NSData *manufacturerDataKey = [[NSData alloc] initWithBytes:value length:sizeof(value)];
  142.        
  143.         [peripheral startAdvertising:@{
  144.                                        CBAdvertisementDataLocalNameKey: @"XiaoYi_RC",
  145.                                        CBAdvertisementDataManufacturerDataKey: manufacturerDataKey,
  146.                                        CBAdvertisementDataServiceUUIDsKey: @[[CBUUID UUIDWithString:@"00001800-0000-1000-8000-00805f9b34fb"]]
  147.                                        }];
  148.        
  149.  
  150.         // Device Information Service
  151.         // https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.device_information.xml
  152.         //    Firmware Revision String
  153.         NSData *valFirmwareRevision = [@"v20_0.1.8_s915" dataUsingEncoding:NSUTF8StringEncoding];
  154.         CBMutableCharacteristic *characteristicFirmwareRevision = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a26-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead value:valFirmwareRevision permissions:CBAttributePermissionsReadable];
  155.        
  156.         //    Software Revision String
  157.         NSData *valSoftwareRevision = [@"v20_0.1.8_s915" dataUsingEncoding:NSUTF8StringEncoding];
  158.         CBMutableCharacteristic *characteristicSoftwareRevision = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a28-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead value:valSoftwareRevision permissions:CBAttributePermissionsReadable];
  159.  
  160.         //    System ID
  161.         NSData *valSystemID = nil;
  162.         CBMutableCharacteristic *characteristicSystemID = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a23-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead value:valSystemID permissions:CBAttributePermissionsReadable];
  163.  
  164.         //    PNP IP
  165.         NSData *valPNPID = nil;
  166.         CBMutableCharacteristic *characteristicPNPID = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a50-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead value:valPNPID permissions:CBAttributePermissionsReadable];
  167.        
  168.         CBMutableService *serviceDeviceInformation = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:@"0000180a-0000-1000-8000-00805f9b34fb"] primary:YES];
  169.         serviceDeviceInformation.characteristics = @[characteristicFirmwareRevision, characteristicSoftwareRevision, characteristicSystemID, characteristicPNPID];
  170.        
  171.         // Generic Access Service
  172.         // https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.generic_access.xml
  173.         //     Peripheral Privacy Flag
  174.         NSData *valPeripheralPrivacyFlag = nil;
  175.         CBMutableCharacteristic *characteristicPeripheralPrivacyFlag = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a02-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead value:valPeripheralPrivacyFlag permissions:CBAttributePermissionsReadable | CBAttributePermissionsWriteable];
  176.  
  177.         //     Peripheral Connect Paras
  178.         NSData *valPeripheralConnectParas = nil;
  179.         CBMutableCharacteristic *characteristicPeripheralConnectParas = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a04-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead value:valPeripheralConnectParas permissions:CBAttributePermissionsReadable];
  180.        
  181.         CBMutableService *serviceGenericAccess = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:@"00001800-0000-1000-8000-00805f9b34fb"] primary:YES];
  182.         serviceGenericAccess.characteristics = @[characteristicPeripheralPrivacyFlag, characteristicPeripheralConnectParas];
  183.        
  184.         // Human Interface Device
  185.         // https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.human_interface_device.xml
  186.         //    HID Information
  187.         NSData *valHIDInformation = nil;
  188.         CBMutableCharacteristic *characteristicHIDInformation = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a4a-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead value:valHIDInformation permissions:CBAttributePermissionsReadable];
  189.        
  190.         //    HID Control Point
  191.         NSData *valHIDControlPoint = nil;
  192.         CBMutableCharacteristic *characteristicHIDControlPoint = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a4c-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyWriteWithoutResponse value:valHIDControlPoint permissions:CBAttributePermissionsReadable];
  193.        
  194.         //    Report Map
  195.         NSData *valReportMap = nil;
  196.         CBMutableCharacteristic *characteristicReportMap = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a4b-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead value:valReportMap permissions:CBAttributePermissionsReadable];
  197.        
  198.         //    Protocol Mode
  199.         NSData *valProtocolMode = nil;
  200.         CBMutableCharacteristic *characteristicProtocolMode = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a4e-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead+CBCharacteristicPropertyWriteWithoutResponse value:valProtocolMode permissions:CBAttributePermissionsReadable];
  201.        
  202.         //    Boot Keyboard Input Report
  203.         NSData *valBootKeyboardInputReport = nil;
  204.         CBMutableCharacteristic *characteristicBootKeyboardInputReport = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a22-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyNotify+CBCharacteristicPropertyRead+CBCharacteristicPropertyWrite value:valBootKeyboardInputReport permissions:CBAttributePermissionsReadable];
  205.        
  206.         //    Boot Keyboard Output Report
  207.         NSData *valBootKeyboardOutputReport = nil;
  208.         CBMutableCharacteristic *characteristicBootKeyboardOutputReport = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a32-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead+CBCharacteristicPropertyWrite+CBCharacteristicPropertyWriteWithoutResponse value:valBootKeyboardOutputReport permissions:CBAttributePermissionsReadable];
  209.        
  210.         //    Report
  211.         NSData *valReport1 = nil;
  212.         CBMutableCharacteristic *characteristicReport1 = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a4d-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead+CBCharacteristicPropertyWrite+CBCharacteristicPropertyNotify value:valReport1 permissions:CBAttributePermissionsReadable | CBAttributePermissionsWriteable];
  213.  
  214. //        NSData *valReport2 = nil;
  215. //        CBMutableCharacteristic *characteristicReport2 = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a4d-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead+CBCharacteristicPropertyWrite+CBCharacteristicPropertyWriteWithoutResponse value:valReport2 permissions:CBAttributePermissionsReadable | CBAttributePermissionsWriteable];
  216.  
  217. //        NSData *valReport3 = nil;
  218. //        CBMutableCharacteristic *characteristicReport3 = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"00002a4d-0000-1000-8000-00805f9b34fb"] properties:CBCharacteristicPropertyRead+CBCharacteristicPropertyWrite+CBCharacteristicPropertyNotify value:valReport3 permissions:CBAttributePermissionsReadable |CBAttributePermissionsWriteable];
  219.        
  220.        
  221.         CBMutableService *serviceHumanInterfaceDevice = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:@"00001812-0000-1000-8000-00805f9b34fb"] primary:YES];
  222.         serviceHumanInterfaceDevice.characteristics = @[characteristicHIDInformation, characteristicHIDControlPoint, characteristicReportMap, characteristicProtocolMode, characteristicBootKeyboardInputReport, characteristicBootKeyboardOutputReport, characteristicReport1];
  223.        
  224.         self.service = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:@"00001800-0000-1000-8000-00805f9b34fb"] primary:YES];
  225.         self.service.includedServices = @[serviceGenericAccess, serviceDeviceInformation, serviceHumanInterfaceDevice];
  226.        
  227.         [self.peripheralManager addService:serviceGenericAccess];
  228.         [self.peripheralManager addService:serviceDeviceInformation];
  229.         [self.peripheralManager addService:serviceHumanInterfaceDevice];
  230.         [self.peripheralManager addService:self.service];
  231.  
  232.  
  233.     } else {
  234.         [peripheral stopAdvertising];
  235.         [peripheral removeAllServices];
  236.     }
  237. }
  238.  
  239.  
  240.  
  241.  
  242. - (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests
  243. {
  244.    
  245.     NSLog(@"* peripheralManager:didReceiveWriteRequests:");
  246.    
  247.     for(CBATTRequest *request in requests){
  248.         NSLog(@"* UUID: %@",request.characteristic.UUID);
  249.         NSLog(@"* value: %@",request.value);
  250.        
  251.     }
  252.    
  253. }
  254.  
  255. - (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic {
  256.    
  257.     NSLog(@"Central subscribed to characteristic %@", characteristic);
  258.    
  259. }
  260.  
  261.  
  262. - (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request
  263. {
  264.     NSLog(@"- peripheralManager:didReceiveReadRequest:");
  265.     NSLog(@"- UUID: %@",request.characteristic.UUID);
  266.    
  267.     if ([request.characteristic.UUID isEqual:[CBUUID UUIDWithString:@"00002a4e-0000-1000-8000-00805f9b34fb"]]) { // Protocol Mode
  268.         char value[1] = {0x01};
  269.         NSData *valueSample = [[NSData alloc] initWithBytes:value length:1];
  270.         request.value = valueSample;
  271.         [peripheral respondToRequest:request withResult:CBATTErrorSuccess];
  272.     } else if ([request.characteristic.UUID isEqual:[CBUUID UUIDWithString:@"00002a4a-0000-1000-8000-00805f9b34fb"]]) { // HID Information
  273.         char value[4] = {0x00,0x01,0x00,0x00};
  274.         NSData *valueSample = [[NSData alloc] initWithBytes:value length:4];
  275.         request.value = valueSample;
  276.         [peripheral respondToRequest:request withResult:CBATTErrorSuccess];
  277.     } else if ([request.characteristic.UUID isEqual:[CBUUID UUIDWithString:@"00002a4d-0000-1000-8000-00805f9b34fb"]]) { // Report
  278.         char value[3] = {reportValue,0x00,0x00};
  279.         NSData *valueSample = [[NSData alloc] initWithBytes:value length:1];
  280.         request.value = valueSample;
  281.         [peripheral respondToRequest:request withResult:CBATTErrorSuccess];
  282.     }
  283.    
  284. }
  285.  
  286.  
  287. - (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error
  288. {
  289.     NSLog(@"peripheralManagerDidStartAdvertising: %@", error);
  290. }
  291.  
  292. - (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error
  293. {
  294.     NSLog(@"peripheralManagerDidAddService: %@ %@", service, error);
  295. }
  296.  
  297.  
  298. @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement