diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 4763964..e42b297 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,5 +1,6 @@ PODS: - boost-for-react-native (1.63.0) + - CocoaAsyncSocket (7.6.5) - DoubleConversion (1.1.6) - FBLazyVector (0.63.2) - FBReactNativeSpec (0.63.2): @@ -245,7 +246,8 @@ PODS: - React-Core (= 0.63.2) - React-cxxreact (= 0.63.2) - React-jsi (= 0.63.2) - - tillpos-rn-receipt-printer-utils (0.1.0): + - tillpos-rn-receipt-printer-utils (0.2.5): + - CocoaAsyncSocket - React - Yoga (1.14.0) @@ -283,6 +285,7 @@ DEPENDENCIES: SPEC REPOS: trunk: - boost-for-react-native + - CocoaAsyncSocket EXTERNAL SOURCES: DoubleConversion: @@ -342,6 +345,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c + CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 DoubleConversion: cde416483dac037923206447da6e1454df403714 FBLazyVector: 3ef4a7f62e7db01092f9d517d2ebc0d0677c4a37 FBReactNativeSpec: dc7fa9088f0f2a998503a352b0554d69a4391c5a @@ -367,9 +371,9 @@ SPEC CHECKSUMS: React-RCTText: 1b6773e776e4b33f90468c20fe3b16ca3e224bb8 React-RCTVibration: 4d2e726957f4087449739b595f107c0d4b6c2d2d ReactCommon: a0a1edbebcac5e91338371b72ffc66aa822792ce - tillpos-rn-receipt-printer-utils: dbc6561b334bc48c8d2b73163ea1bcec35178d68 + tillpos-rn-receipt-printer-utils: 43925ee131d5adace8f07f7b600d494398777011 Yoga: 7740b94929bbacbddda59bf115b5317e9a161598 PODFILE CHECKSUM: f48d21d8c903ca4bae3af77aec96d015293dce33 -COCOAPODS: 1.10.1 +COCOAPODS: 1.11.3 diff --git a/example/ios/ThermalReceiptPrinterExample.xcodeproj/project.pbxproj b/example/ios/ThermalReceiptPrinterExample.xcodeproj/project.pbxproj index 077935d..58cba87 100644 --- a/example/ios/ThermalReceiptPrinterExample.xcodeproj/project.pbxproj +++ b/example/ios/ThermalReceiptPrinterExample.xcodeproj/project.pbxproj @@ -144,6 +144,7 @@ ORGANIZATIONNAME = Facebook; TargetAttributes = { 13B07F861A680F5B00A75B9A = { + DevelopmentTeam = RU463RBG8L; LastSwiftMigration = 1110; }; }; @@ -288,6 +289,8 @@ CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; + DEVELOPMENT_TEAM = RU463RBG8L; + GCC_NO_COMMON_BLOCKS = NO; INFOPLIST_FILE = ThermalReceiptPrinterExample/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_CFLAGS = ( @@ -315,6 +318,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = RU463RBG8L; + GCC_NO_COMMON_BLOCKS = NO; INFOPLIST_FILE = ThermalReceiptPrinterExample/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_CFLAGS = ( @@ -367,7 +372,7 @@ ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; + GCC_NO_COMMON_BLOCKS = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -419,7 +424,7 @@ ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; + GCC_NO_COMMON_BLOCKS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; diff --git a/example/src/App.tsx b/example/src/App.tsx index 30bafdd..5c06314 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -13,8 +13,8 @@ interface Printer { port: number; } const PRINTERS: Array = [ - { device_name: 'P1', host: '10.15.0.78', port: 9100 }, - { device_name: 'P2', host: '10.15.0.174', port: 9100 }, + { device_name: 'P1', host: '10.15.0.82', port: 9100 }, + //{ device_name: 'P2', host: '10.15.0.174', port: 9100 }, ]; let globalCount = 0; @@ -25,7 +25,7 @@ export default function App() { const buffer = Buffer.from( globalCount + ' ::: minions minions minions \n \n ' ); - for (let i = 0; i < 100; i++) { + for (let i = 0; i < 1; i++) { let spont: number = Math.floor(Math.random() * PRINTERS.length); const printer = PRINTERS[spont]; try { @@ -34,7 +34,7 @@ export default function App() { printer.host, printer.port, buffer, - PrinterBrand.EPSON, + PrinterBrand.SUNMI, PrinterSeries.TM_M30 ); } catch (err) { diff --git a/ios/PrinterSDK/GenericPrinterSDK.h b/ios/PrinterSDK/GenericPrinterSDK.h deleted file mode 100644 index af9db7b..0000000 --- a/ios/PrinterSDK/GenericPrinterSDK.h +++ /dev/null @@ -1,74 +0,0 @@ -// -// PrinterSDK.h -// PrinterLibrary -// -// Created by aduo on 5/30/16. -// -// - -#ifndef __PRINTERSDK_H__ -#define __PRINTERSDK_H__ - -#import -#import - -extern NSString* PrinterConnectedNotification; -extern NSString* PrinterDisconnectedNotification; - -@class Printer; - -typedef void (^PrinterScanPrintersCallback) (Printer* printer); - -typedef enum CodeBarType -{ - CodeBarType_UPC_A = 0, - CodeBarType_UPC_E, - CodeBarType_JAN13, - CodeBarType_JAN8, - CodeBarType_CODE39, - CodeBarType_ITF, - CodeBarType_CODABAR, - CodeBarType_CODE93, - CodeBarType_CODE128 -} CodeBarType; - -@interface Printer : NSObject - -@property (nonatomic, readonly) NSString* name; -@property (nonatomic, readonly) NSString* UUIDString; - -@end - -@interface PrinterSDK : NSObject - -+ (PrinterSDK*)defaultPrinterSDK; - -- (void)scanPrintersWithCompletion:(PrinterScanPrintersCallback)callback; -- (void)stopScanPrinters; - -- (BOOL)connectIP:(NSString*)ipAddress; - -- (void)connectBT:(Printer*)printer; -- (void)disconnect; - -- (void)setPrintWidth:(NSInteger)width; - -- (void)printText:(NSString*)text; -- (void)printTextImage:(NSString*)text; -- (void)sendHex:(NSString*)hex; - -- (void)printCodeBar:(NSString*)text type:(CodeBarType)type; -- (void)printQrCode:(NSString*)text; -- (void)printImage:(UIImage*)image; - -- (void)cutPaper; -- (void)beep; -- (void)openCasher; -- (void)setFontSizeMultiple:(NSInteger)multiple; - -- (void)printTestPaper; -- (void)selfTest; - -@end - -#endif diff --git a/ios/PrinterSDK/libGenericPrinterSDK.a b/ios/PrinterSDK/libGenericPrinterSDK.a deleted file mode 100755 index b7dce1d..0000000 Binary files a/ios/PrinterSDK/libGenericPrinterSDK.a and /dev/null differ diff --git a/ios/RNBLEPrinter.m b/ios/RNBLEPrinter.m index 550ba1e..28988d5 100644 --- a/ios/RNBLEPrinter.m +++ b/ios/RNBLEPrinter.m @@ -9,7 +9,6 @@ #import "RNBLEPrinter.h" #import "adapters/epson/BLEPrinterEpsonAdapter.h" -#import "adapters/generic/BLEPrinterGenericAdapter.h" #import "utils/NSDataAdditions.h" #import "utils/EpsonUtils.h" @@ -52,10 +51,6 @@ - (dispatch_queue_t)methodQueue BLEPrinterEpsonAdapter *adapter = [BLEPrinterEpsonAdapter alloc]; [adapter connectAndSend:bdAddress printRawData:text epsonModel:number success:successCallback fail:errorCallback]; } - else { - BLEPrinterGenericAdapter *adapter = [BLEPrinterGenericAdapter alloc]; - [adapter connectAndSend:bdAddress printRawData:text success:successCallback fail:errorCallback]; - } } @catch (NSException *exception) { errorCallback(@[exception.reason]); } diff --git a/ios/RNNetPrinter.m b/ios/RNNetPrinter.m index 20f8223..86c9ea8 100644 --- a/ios/RNNetPrinter.m +++ b/ios/RNNetPrinter.m @@ -7,7 +7,7 @@ #import "RNNetPrinter.h" #import "adapters/epson/NetPrinterEpsonAdapter.h" -#import "adapters/generic/NetPrinterGenericAdapter.h" +#import "adapters/sunmi/NetPrinterSunmiAdapter.h" #import "utils/NSDataAdditions.h" #import "utils/EpsonUtils.h" @@ -52,7 +52,7 @@ - (dispatch_queue_t)methodQueue [adapter connectAndSend:host withPort:port printRawData:text epsonModel:number success:successCallback fail:errorCallback]; } else { - NetPrinterGenericAdapter *adapter = [NetPrinterGenericAdapter alloc]; + NetPrinterSunmiAdapter *adapter = [NetPrinterSunmiAdapter alloc]; [adapter connectAndSend:host withPort:port printRawData:text success:successCallback fail:errorCallback]; } } @catch (NSException *exception) { diff --git a/ios/adapters/generic/BLEPrinterGenericAdapter.h b/ios/adapters/generic/BLEPrinterGenericAdapter.h deleted file mode 100644 index a2cf04c..0000000 --- a/ios/adapters/generic/BLEPrinterGenericAdapter.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// BLEPrinterGenericAdapter.h -// -// Created by Till POS on 14/09/21. - -#pragma once -#ifndef BLEPrinterGenericAdapter_h -#define BLEPrinterGenericAdapter_h - -#if __has_include("RCTBridgeModule.h") -#import "RCTBridgeModule.h" -#else -#import -#endif -#import - -@interface BLEPrinterGenericAdapter : NSObject { - NSMutableArray* _printerArray; - NSObject* m_printer; -} -- (void) connectAndSend:(NSString *)bdAddress printRawData:(NSString *)text success:(RCTResponseSenderBlock)successCallback fail:(RCTResponseSenderBlock)errorCallback; -@end - -#endif /* BLEPrinterGenericAdapter_h */ diff --git a/ios/adapters/generic/BLEPrinterGenericAdapter.m b/ios/adapters/generic/BLEPrinterGenericAdapter.m deleted file mode 100644 index 7902fa8..0000000 --- a/ios/adapters/generic/BLEPrinterGenericAdapter.m +++ /dev/null @@ -1,155 +0,0 @@ -// -// BLEPrinterGenericAdapter.m -// -// Created by Till POS on 14/09/21. -// - -#import - -#import "BLEPrinterGenericAdapter.h" -#import "GenericPrinterSDK.h" -#import "../../utils/NSDataAdditions.h" - -@interface ExtendedPrinter : Printer - -@property (nonatomic, readwrite) NSString* name; -@property (nonatomic, readwrite) NSString* UUIDString; - -@end - -@implementation ExtendedPrinter : Printer { - NSString* _UUIDString; -} - @synthesize name; - @synthesize UUIDString = _UUIDString; - - (void) setUUIDString:(NSString *)value { - _UUIDString = value; - } -@end - -@implementation BLEPrinterGenericAdapter - -- (dispatch_queue_t)methodQueue -{ - return dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); -} - -- (void) init:(RCTResponseSenderBlock)successCallback - fail:(RCTResponseSenderBlock)errorCallback { - @try { - _printerArray = [NSMutableArray new]; - m_printer = [[NSObject alloc] init]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNetPrinterConnectedNotification:) name:@"NetPrinterConnected" object:nil]; - // API MISUSE: can only accept this command while in the powered on state - [[PrinterSDK defaultPrinterSDK] scanPrintersWithCompletion:^(Printer* printer){}]; - successCallback(@[@"Init successful"]); - } @catch (NSException *exception) { - errorCallback(@[@"No bluetooth adapter available"]); - } -} - -- (void) handleNetPrinterConnectedNotification:(NSNotification*)notification -{ - m_printer = nil; -} - -- (void) getDeviceList:(RCTResponseSenderBlock)successCallback - fail:(RCTResponseSenderBlock)errorCallback { - @try { - !_printerArray ? [NSException raise:@"Null pointer exception" format:@"Must call init function first"] : nil; - [[PrinterSDK defaultPrinterSDK] scanPrintersWithCompletion:^(Printer* printer){ - [_printerArray addObject:printer]; - NSMutableArray *mapped = [NSMutableArray arrayWithCapacity:[_printerArray count]]; - [_printerArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - NSDictionary *dict = @{ @"device_name" : printer.name, @"inner_mac_address" : printer.UUIDString}; - [mapped addObject:dict]; - }]; - NSMutableArray *uniquearray = (NSMutableArray *)[[NSSet setWithArray:mapped] allObjects];; - successCallback(@[uniquearray]); - }]; - } @catch (NSException *exception) { - errorCallback(@[exception.reason]); - } -} - -- (void) connectPrinter:(NSString *)inner_mac_address - success:(RCTResponseSenderBlock)successCallback - fail:(RCTResponseSenderBlock)errorCallback { - @try { - __block BOOL found = NO; - __block Printer* selectedPrinter = nil; - [_printerArray enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop){ - selectedPrinter = (Printer *)obj; - if ([inner_mac_address isEqualToString:(selectedPrinter.UUIDString)]) { - found = YES; - *stop = YES; - } - }]; - - if (found) { - [[PrinterSDK defaultPrinterSDK] connectBT:selectedPrinter]; - [[NSNotificationCenter defaultCenter] postNotificationName:@"BLEPrinterConnected" object:nil]; - m_printer = selectedPrinter; - successCallback(@[[NSString stringWithFormat:@"Connected to printer %@", selectedPrinter.name]]); - } else { - [NSException raise:@"Invalid connection" format:@"connectPrinter: Can't connect to printer %@", inner_mac_address]; - } - } @catch (NSException *exception) { - errorCallback(@[exception.reason]); - } -} - -- (void) printRawData:(NSString *)text - fail:(RCTResponseSenderBlock)errorCallback { - @try { - !m_printer ? [NSException raise:@"Invalid connection" format:@"printRawData: Can't connect to printer"] : nil; - - [[PrinterSDK defaultPrinterSDK] sendHex:text]; - } @catch (NSException *exception) { - errorCallback(@[exception.reason]); - } -} - -- (void) connectAndSend:(NSString *)bdAddress - printRawData:(NSString *)text - success:(RCTResponseSenderBlock)successCallback - fail:(RCTResponseSenderBlock)errorCallback { - @try { - [[PrinterSDK defaultPrinterSDK] scanPrintersWithCompletion:^(Printer* printer){ - [self->_printerArray addObject:printer]; - }]; - - __block BOOL found = NO; - __block Printer* selectedPrinter = nil; - - [_printerArray enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop){ - selectedPrinter = (Printer *)obj; - if ([bdAddress isEqualToString:(selectedPrinter.UUIDString)]) { - found = YES; - *stop = YES; - } - }]; - - ExtendedPrinter* extendedPrinter = (ExtendedPrinter*) [ExtendedPrinter alloc]; - [extendedPrinter setUUIDString:bdAddress]; - [[PrinterSDK defaultPrinterSDK] connectBT:extendedPrinter]; - - NSData* payload = [NSData dataWithBase64EncodedString:text]; - [[PrinterSDK defaultPrinterSDK] sendHex:[payload hexadecimalString]]; - successCallback(@[[NSString stringWithFormat:@"Successfuly printed"]]); - } @catch (NSException *exception) { - errorCallback(@[exception.reason]); - } -} - -- (void) closeConn { - @try { - !m_printer ? [NSException raise:@"Invalid connection" format:@"closeConn: Can't connect to printer"] : nil; - [[PrinterSDK defaultPrinterSDK] disconnect]; - m_printer = nil; - } @catch (NSException *exception) { - NSLog(@"%@", exception.reason); - } -} - -@end diff --git a/ios/adapters/generic/NetPrinterGenericAdapter.h b/ios/adapters/generic/NetPrinterGenericAdapter.h deleted file mode 100644 index 2870d64..0000000 --- a/ios/adapters/generic/NetPrinterGenericAdapter.h +++ /dev/null @@ -1,12 +0,0 @@ -// -// NetPrinterGenericAdapter.h -// -// Created by Till POS on 14/09/21. -// - -#import - -@interface NetPrinterGenericAdapter : NSObject { -} -- (void) connectAndSend:(NSString *)host withPort:(nonnull NSNumber *)port printRawData:(NSString *_Nullable)text success:(RCTResponseSenderBlock _Nullable )successCallback fail:(RCTResponseSenderBlock _Nullable )errorCallback; -@end diff --git a/ios/adapters/generic/NetPrinterGenericAdapter.m b/ios/adapters/generic/NetPrinterGenericAdapter.m deleted file mode 100644 index 51603e9..0000000 --- a/ios/adapters/generic/NetPrinterGenericAdapter.m +++ /dev/null @@ -1,35 +0,0 @@ -// -// NetPrinterGenericAdapter.m -// -// Created by Till POS on 14/09/21. -// - -#import "NetPrinterGenericAdapter.h" -#import "GenericPrinterSDK.h" -#import "../../utils/NSDataAdditions.h" - -@implementation NetPrinterGenericAdapter - -- (dispatch_queue_t)methodQueue -{ - return dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); -} - -- (void) connectAndSend:(NSString *)host - withPort:(nonnull NSNumber *)port - printRawData:(NSString *)text - success:(RCTResponseSenderBlock)successCallback - fail:(RCTResponseSenderBlock)errorCallback { - @try { - BOOL isConnectSuccess = [[PrinterSDK defaultPrinterSDK] connectIP:host]; - !isConnectSuccess ? [NSException raise:@"Invalid connection" format:@"Can't connect to printer %@", host] : nil; - NSData* payload = [NSData dataWithBase64EncodedString:text]; - NSString* hexData = [payload hexadecimalString]; - [[PrinterSDK defaultPrinterSDK] sendHex:hexData]; - successCallback(@[[NSString stringWithFormat:@"Sent to printer %@", host]]); - } @catch (NSException *exception) { - errorCallback(@[exception.reason]); - } -} - -@end diff --git a/ios/adapters/generic/USBPrinterGenericAdapter.h b/ios/adapters/generic/USBPrinterGenericAdapter.h deleted file mode 100644 index 2ab9d37..0000000 --- a/ios/adapters/generic/USBPrinterGenericAdapter.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// USBPrinterGenericAdapter.h -// -// Created by Till POS on 14/09/21. -// - -#ifndef USBPrinterGenericAdapter_h -#define USBPrinterGenericAdapter_h - -#if __has_include("RCTBridgeModule.h") -#import "RCTBridgeModule.h" -#else -#import -#endif - -@interface USBPrinterGenericAdapter : NSObject - -@end - -#endif /* USBPrinterGenericAdapter_h */ diff --git a/ios/adapters/generic/USBPrinterGenericAdapter.m b/ios/adapters/generic/USBPrinterGenericAdapter.m deleted file mode 100644 index 6c23142..0000000 --- a/ios/adapters/generic/USBPrinterGenericAdapter.m +++ /dev/null @@ -1,48 +0,0 @@ -// -// USBPrinterGenericAdapter.m -// -// Created by Till POS on 14/09/21. -// - -#import "USBPrinterGenericAdapter.h" -#import "GenericPrinterSDK.h" - -@implementation USBPrinterGenericAdapter - -- (dispatch_queue_t)methodQueue -{ - return dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); -} - -- (void) init:(RCTResponseSenderBlock)successCallback - fail:(RCTResponseSenderBlock)errorCallback { - // TODO - successCallback(@[@"Init successful"]); -} - -- (void) getDeviceList:(RCTResponseSenderBlock)successCallback - fail:(RCTResponseSenderBlock)errorCallback { - // TODO - NSMutableArray *printerArray = [NSMutableArray new]; - successCallback(@[printerArray]); -} - -- (void) connectPrinter:(NSInteger)vendorId - withProductID:(NSInteger)productId - success:(RCTResponseSenderBlock)successCallback - fail:(RCTResponseSenderBlock)errorCallback { - // TODO - errorCallback(@[@"This function is not supported"]); -} - -- (void) printRawData:(NSString *)text - fail:(RCTResponseSenderBlock)errorCallback { - // TODO - errorCallback(@[@"This function is not supported"]); -} - -- (void) closeConn { - // TODO -} - -@end diff --git a/ios/adapters/sunmi/NetPrinterSunmiAdapter.h b/ios/adapters/sunmi/NetPrinterSunmiAdapter.h new file mode 100644 index 0000000..d869f29 --- /dev/null +++ b/ios/adapters/sunmi/NetPrinterSunmiAdapter.h @@ -0,0 +1,32 @@ +#import +#import "../../utils/NSDataAdditions.h" +#import + +typedef void (^IPConnectDeviceBlock)(int resCode); + +enum ErrorStatus : int { + PRINTER_SUCCESS = 0, + PRINTER_PARAM, + PRINTER_CONNECT, + PRINTER_TIMEOUT, + PRINTER_MEMORY, + PRINTER_ILLEGAL, + PRINTER_PROCESSING, + PRINTER_NOT_FOUND, + PRINTER_IN_USE, + PRINTER_TYPE_INVALID, + PRINTER_DISCONNECT, + PRINTER_ALREADY_OPENED, + PRINTER_ALREADY_USED, + PRINTER_BOX_COUNT_OVER, + PRINTER_BOX_CLIENT_OVER, + PRINTER_UNSUPPORTED, + PRINTER_DEVICE_BUSY, + PRINTER_RECOVERY_FAILURE, + PRINTER_FAILURE = 255 +}; + +@interface NetPrinterSunmiAdapter : NSObject + +- (void) connectAndSend:(NSString *_Nullable)host withPort:(nonnull NSNumber *)port printRawData:(NSString *_Nullable)text success:(RCTResponseSenderBlock _Nullable )successCallback fail:(RCTResponseSenderBlock _Nullable )errorCallback; +@end diff --git a/ios/adapters/sunmi/NetPrinterSunmiAdapter.m b/ios/adapters/sunmi/NetPrinterSunmiAdapter.m new file mode 100644 index 0000000..545ba0b --- /dev/null +++ b/ios/adapters/sunmi/NetPrinterSunmiAdapter.m @@ -0,0 +1,133 @@ +#import "NetPrinterSunmiAdapter.h" +#import "sys/utsname.h" +#import "GCDAsyncSocket.h" +#import +#import +#import +#import +#import +#include +#include +#include +#include + +#define BROADCAST_IP @"224.0.0.1" + +@interface NetPrinterSunmiAdapter() +{ + NSString *ipString; + RCTResponseSenderBlock _successCallback; + RCTResponseSenderBlock _errorCallback; +} + +@property (nonatomic, strong) GCDAsyncSocket* tcpSocketConnect; + + +@end + +@implementation NetPrinterSunmiAdapter + +- (dispatch_queue_t)methodQueue +{ + return dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); +} + + +- (void) connectAndSend:(NSString *)host + withPort:(nonnull NSNumber *)port + printRawData:(NSString *)text + success:(RCTResponseSenderBlock)successCallback + fail:(RCTResponseSenderBlock)errorCallback { + + @try { + if (!self.tcpSocketConnect) { + self.tcpSocketConnect = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; + } + BOOL isConnectSuccess = [self connectSocketWithIP:host]; + NSLog(@"TCP connected to host: %d,",isConnectSuccess); + !isConnectSuccess ? [NSException raise:@"Invalid connection" format:@"Can't connect to printer %@", host] : nil; + _successCallback= successCallback; + _errorCallback= errorCallback; + Byte byteArr1[16] = {0x1D, 0x28 ,0x45, 0x03, 0x00, 0x06, 0x03, 0x01}; + Byte byteArr2[4] = {0x0a, 0x0a, 0x0a, 0x0a}; + NSData *data2 = nil; + data2 = [text dataUsingEncoding:NSUTF8StringEncoding]; + NSMutableData *sourceData = [NSMutableData dataWithData:data2]; + [sourceData appendBytes:byteArr2 length:4]; + + // NSMutableData *commandData = [[NSMutableData alloc] init]; +// [commandData appendBytes:cmd length:2]; +// NSStringEncoding gbk=CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); +// NSData* payload = [text dataUsingEncoding:gbk]; +// [commandData appendData:payload]; + NSData *data= [NSData dataWithBytes:byteArr1 length:8]; + [self controlDevicePrintingData:data]; + [self controlDevicePrintingData:data2]; + + } @catch (NSException *exception) { + errorCallback(@[exception.reason]); + } + + @finally{ + [self.tcpSocketConnect disconnectAfterWriting]; + } + +} + + +- (BOOL)connectSocketWithIP:(NSString *)ip { + + return [self.tcpSocketConnect connectToHost:ip onPort:9100 error:nil]; +} + +#pragma mark - GCDAsyncSocketDelegate + +- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port { + + NSLog(@"TCP connected to host: %@ port: %d", host, port); + +} + +- (void)socket:(GCDAsyncSocket *)sender didReadData:(NSData *)data withTag:(long)tag{ +#if HK_SOCKET_DEBUG + NSLog(@"data for tag %llu didRead",(unsigned long long)tag); +#endif + +} + +- (void)socket:(GCDAsyncSocket *)sender didWriteDataWithTag:(long)tag{ + + NSLog(@"data for tag %llu didWrite",(unsigned long long)tag); + [self.tcpSocketConnect disconnect]; + +} + +- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(nullable NSError *)err { + NSLog(@"Disconnected from socket with error: %@", err); + + if (err!= nil) + { + _errorCallback != nil ? _errorCallback(@[[NSString stringWithFormat:@"Delegate with ERROR"]]) : nil; + + } else { + _successCallback != nil ? _successCallback(@[[NSString stringWithFormat:@"Successfuly printed"]]) : nil; + } + + _successCallback = nil; + _errorCallback = nil; + [self.tcpSocketConnect setDelegate: nil]; + self.tcpSocketConnect = nil; + NSLog(@"HERE"); +} + +// MARK: 写数据 +- (void)controlDevicePrintingData:(NSData *)ipData { + [self.tcpSocketConnect writeData:ipData withTimeout:10 tag:100]; +} + +// MARK: 读数据 +-(void)readDataFromSocketWithTag: (NSInteger)tag { + [self.tcpSocketConnect readDataWithTimeout:-1 tag:tag]; +} + +@end diff --git a/src/index.ts b/src/index.ts index 9003b59..c264e97 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,6 +8,7 @@ export enum PrinterBrand { EPSON = 'EPSON', STAR = 'STAR', OTHER = 'OTHER', + SUNMI = 'SUNMI', } export enum PrinterSeries { diff --git a/tillpos-rn-receipt-printer-utils.podspec b/tillpos-rn-receipt-printer-utils.podspec index a9f81c0..1ebfbae 100644 --- a/tillpos-rn-receipt-printer-utils.podspec +++ b/tillpos-rn-receipt-printer-utils.podspec @@ -15,8 +15,9 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/hitz-group/rn-receipt-printer-utils.git", :tag => "v#{s.version}" } s.source_files = "ios/**/*.{h,m}" s.requires_arc = true - s.ios.vendored_libraries = "ios/PrinterSDK/libEpsonPrinterSDKarm64.a", "ios/PrinterSDK/libGenericPrinterSDK.a", "ios/PrinterSDK/libEpsonPrinterSDKx8664.a" + s.ios.vendored_libraries = "ios/PrinterSDK/libEpsonPrinterSDKarm64.a", "ios/PrinterSDK/libEpsonPrinterSDKx8664.a" s.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PROJECT_DIR}/PrinterSDK"/**' } s.dependency 'React' + s.dependency 'CocoaAsyncSocket' end