react-native-earl-thermal-printer 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +441 -0
- package/android/build/.transforms/9bdecbc31aaf57a08a337d36d73153ec/results.bin +1 -0
- package/android/build/.transforms/9bdecbc31aaf57a08a337d36d73153ec/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/bc167481fd58833142c92ba32b0fc3e3/results.bin +1 -0
- package/android/build/.transforms/bc167481fd58833142c92ba32b0fc3e3/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/generated/source/buildConfig/debug/com/pinmi/react/printer/BuildConfig.java +10 -0
- package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeBLEPrinterSpec.java +70 -0
- package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeNetPrinterSpec.java +70 -0
- package/android/build/generated/source/codegen/java/com/pinmi/react/printer/NativeUSBPrinterSpec.java +62 -0
- package/android/build/generated/source/codegen/jni/CMakeLists.txt +46 -0
- package/android/build/generated/source/codegen/jni/RNThermalReceiptPrinterSpec-generated.cpp +190 -0
- package/android/build/generated/source/codegen/jni/RNThermalReceiptPrinterSpec.h +49 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ComponentDescriptors.h +22 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/EventEmitters.cpp +18 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/EventEmitters.h +19 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/Props.cpp +21 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/Props.h +20 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/RNThermalReceiptPrinterSpecJSI-generated.cpp +205 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/RNThermalReceiptPrinterSpecJSI.h +355 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ShadowNodes.cpp +19 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/ShadowNodes.h +25 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/States.cpp +18 -0
- package/android/build/generated/source/codegen/jni/react/renderer/components/RNThermalReceiptPrinterSpec/States.h +23 -0
- package/android/build/generated/source/codegen/schema.json +514 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +13 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +18 -0
- package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +5 -0
- package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +1 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
- package/android/build/intermediates/compile_symbol_list/debug/R.txt +1 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml +4 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
- package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
- package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/BuildConfig.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeBLEPrinterSpec.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeNetPrinterSpec.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/NativeUSBPrinterSpec.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNBLEPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNNetPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNPrinterPackage.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/RNUSBPrinterModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterAdapter$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/BLEPrinterDeviceId.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter$2.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/NetPrinterDeviceId.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/PrinterDeviceId.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter$2.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterAdapter.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterDevice.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/pinmi/react/printer/adapter/USBPrinterDeviceId.class +0 -0
- package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +3 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +23 -0
- package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +13 -0
- package/android/build/intermediates/navigation_json/debug/navigation.json +1 -0
- package/android/build/intermediates/packaged_res/debug/values/values.xml +4 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +2 -0
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +37 -0
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build.gradle +30 -0
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +6 -0
- package/android/gradlew +160 -0
- package/android/gradlew.bat +90 -0
- package/android/src/androidTest/java/com/pinmi/react/printer/ExampleInstrumentedTest.java +26 -0
- package/android/src/main/AndroidManifest.xml +10 -0
- package/android/src/main/java/com/pinmi/react/printer/RNBLEPrinterModule.java +91 -0
- package/android/src/main/java/com/pinmi/react/printer/RNNetPrinterModule.java +95 -0
- package/android/src/main/java/com/pinmi/react/printer/RNPrinterModule.java +24 -0
- package/android/src/main/java/com/pinmi/react/printer/RNPrinterPackage.java +57 -0
- package/android/src/main/java/com/pinmi/react/printer/RNUSBPrinterModule.java +79 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterAdapter.java +391 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterDevice.java +33 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/BLEPrinterDeviceId.java +38 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterAdapter.java +433 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterDevice.java +30 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/NetPrinterDeviceId.java +48 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterAdapter.java +29 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterDevice.java +17 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/PrinterDeviceId.java +8 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterAdapter.java +468 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterDevice.java +41 -0
- package/android/src/main/java/com/pinmi/react/printer/adapter/USBPrinterDeviceId.java +49 -0
- package/android/src/main/res/values/strings.xml +3 -0
- package/android/src/test/java/com/pinmi/react/printer/ExampleUnitTest.java +17 -0
- package/dist/NativeBLEPrinter.d.ts +15 -0
- package/dist/NativeBLEPrinter.d.ts.map +1 -0
- package/dist/NativeBLEPrinter.js +3 -0
- package/dist/NativeBLEPrinter.js.map +1 -0
- package/dist/NativeNetPrinter.d.ts +15 -0
- package/dist/NativeNetPrinter.d.ts.map +1 -0
- package/dist/NativeNetPrinter.js +3 -0
- package/dist/NativeNetPrinter.js.map +1 -0
- package/dist/NativeUSBPrinter.d.ts +13 -0
- package/dist/NativeUSBPrinter.d.ts.map +1 -0
- package/dist/NativeUSBPrinter.js +3 -0
- package/dist/NativeUSBPrinter.js.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/EPToolkit.d.ts +9 -0
- package/dist/utils/EPToolkit.d.ts.map +1 -0
- package/dist/utils/EPToolkit.js +161 -0
- package/dist/utils/EPToolkit.js.map +1 -0
- package/dist/utils/buffer-helper.d.ts +12 -0
- package/dist/utils/buffer-helper.d.ts.map +1 -0
- package/dist/utils/buffer-helper.js +32 -0
- package/dist/utils/buffer-helper.js.map +1 -0
- package/ios/PrinterSDK/PrinterSDK.h +74 -0
- package/ios/PrinterSDK/libPrinterSDK.a +0 -0
- package/ios/RNBLEPrinter.h +24 -0
- package/ios/RNBLEPrinter.mm +251 -0
- package/ios/RNNetPrinter.h +25 -0
- package/ios/RNNetPrinter.mm +306 -0
- package/ios/RNThermalReceiptPrinter.xcodeproj/project.pbxproj +294 -0
- package/ios/RNThermalReceiptPrinter.xcworkspace/contents.xcworkspacedata +9 -0
- package/ios/RNUSBPrinter.h +19 -0
- package/ios/RNUSBPrinter.mm +80 -0
- package/package.json +70 -0
- package/react-native-earl-thermal-printer.podspec +22 -0
- package/src/NativeBLEPrinter.ts +16 -0
- package/src/NativeNetPrinter.ts +16 -0
- package/src/NativeUSBPrinter.ts +14 -0
- package/src/index.ts +160 -0
- package/src/utils/EPToolkit.ts +193 -0
- package/src/utils/buffer-helper.ts +42 -0
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
package com.pinmi.react.printer.adapter;
|
|
2
|
+
|
|
3
|
+
import android.content.Context;
|
|
4
|
+
import android.graphics.Bitmap;
|
|
5
|
+
import android.graphics.BitmapFactory;
|
|
6
|
+
import android.graphics.Color;
|
|
7
|
+
import android.net.wifi.WifiManager;
|
|
8
|
+
import android.os.Build;
|
|
9
|
+
import android.util.Base64;
|
|
10
|
+
import android.util.Log;
|
|
11
|
+
|
|
12
|
+
import com.facebook.common.internal.ImmutableMap;
|
|
13
|
+
import com.facebook.react.bridge.Arguments;
|
|
14
|
+
import com.facebook.react.bridge.Promise;
|
|
15
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
16
|
+
import com.facebook.react.bridge.WritableArray;
|
|
17
|
+
import com.facebook.react.bridge.WritableMap;
|
|
18
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
|
19
|
+
import com.google.zxing.EncodeHintType;
|
|
20
|
+
import com.google.zxing.WriterException;
|
|
21
|
+
import com.google.zxing.common.BitMatrix;
|
|
22
|
+
import com.google.zxing.qrcode.QRCodeWriter;
|
|
23
|
+
|
|
24
|
+
import java.io.ByteArrayOutputStream;
|
|
25
|
+
import java.io.IOException;
|
|
26
|
+
import java.io.InputStream;
|
|
27
|
+
import java.io.OutputStream;
|
|
28
|
+
import java.net.HttpURLConnection;
|
|
29
|
+
import java.net.InetSocketAddress;
|
|
30
|
+
import java.net.Socket;
|
|
31
|
+
import java.net.URL;
|
|
32
|
+
import java.util.ArrayList;
|
|
33
|
+
|
|
34
|
+
import androidx.annotation.RequiresApi;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Network (TCP/IP) printer adapter implementation.
|
|
38
|
+
* Migrated to Promise-based API for React Native New Architecture (TurboModules).
|
|
39
|
+
*
|
|
40
|
+
* @author Ordovez, Earl Romeo
|
|
41
|
+
*/
|
|
42
|
+
public class NetPrinterAdapter implements PrinterAdapter {
|
|
43
|
+
private static NetPrinterAdapter mInstance;
|
|
44
|
+
private ReactApplicationContext mContext;
|
|
45
|
+
private String LOG_TAG = "RNNetPrinter";
|
|
46
|
+
private NetPrinterDevice mNetDevice;
|
|
47
|
+
|
|
48
|
+
private int[] PRINTER_ON_PORTS = { 9100 };
|
|
49
|
+
private static final String EVENT_SCANNER_RESOLVED = "scannerResolved";
|
|
50
|
+
private static final String EVENT_SCANNER_RUNNING = "scannerRunning";
|
|
51
|
+
|
|
52
|
+
private final static char ESC_CHAR = 0x1B;
|
|
53
|
+
private static byte[] SELECT_BIT_IMAGE_MODE = { 0x1B, 0x2A, 33 };
|
|
54
|
+
private final static byte[] SET_LINE_SPACE_24 = new byte[] { ESC_CHAR, 0x33, 24 };
|
|
55
|
+
private final static byte[] SET_LINE_SPACE_32 = new byte[] { ESC_CHAR, 0x33, 32 };
|
|
56
|
+
private final static byte[] LINE_FEED = new byte[] { 0x0A };
|
|
57
|
+
private static byte[] CENTER_ALIGN = { 0x1B, 0X61, 0X31 };
|
|
58
|
+
|
|
59
|
+
private Socket mSocket;
|
|
60
|
+
|
|
61
|
+
private boolean isRunning = false;
|
|
62
|
+
|
|
63
|
+
private NetPrinterAdapter() {
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public static NetPrinterAdapter getInstance() {
|
|
67
|
+
if (mInstance == null) {
|
|
68
|
+
mInstance = new NetPrinterAdapter();
|
|
69
|
+
}
|
|
70
|
+
return mInstance;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@Override
|
|
74
|
+
public void init(ReactApplicationContext reactContext, Promise promise) {
|
|
75
|
+
this.mContext = reactContext;
|
|
76
|
+
promise.resolve("RNNetPrinter initialized");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@Override
|
|
80
|
+
public void getDeviceList(Promise promise) {
|
|
81
|
+
// Network printer discovery uses scan(), which emits events asynchronously.
|
|
82
|
+
// Resolve an empty array immediately; discovered printers arrive via events.
|
|
83
|
+
this.scan();
|
|
84
|
+
WritableArray array = Arguments.createArray();
|
|
85
|
+
promise.resolve(array);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private void scan() {
|
|
89
|
+
if (isRunning)
|
|
90
|
+
return;
|
|
91
|
+
new Thread(new Runnable() {
|
|
92
|
+
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
|
|
93
|
+
@Override
|
|
94
|
+
public void run() {
|
|
95
|
+
try {
|
|
96
|
+
isRunning = true;
|
|
97
|
+
emitEvent(EVENT_SCANNER_RUNNING, isRunning);
|
|
98
|
+
|
|
99
|
+
WifiManager wifiManager = (WifiManager) mContext.getApplicationContext()
|
|
100
|
+
.getSystemService(Context.WIFI_SERVICE);
|
|
101
|
+
String ipAddress = ipToString(wifiManager.getConnectionInfo().getIpAddress());
|
|
102
|
+
WritableArray array = Arguments.createArray();
|
|
103
|
+
|
|
104
|
+
String prefix = ipAddress.substring(0, ipAddress.lastIndexOf('.') + 1);
|
|
105
|
+
int suffix = Integer
|
|
106
|
+
.parseInt(ipAddress.substring(ipAddress.lastIndexOf('.') + 1, ipAddress.length()));
|
|
107
|
+
|
|
108
|
+
for (int i = 0; i <= 255; i++) {
|
|
109
|
+
if (i == suffix)
|
|
110
|
+
continue;
|
|
111
|
+
ArrayList<Integer> ports = getAvailablePorts(prefix + i);
|
|
112
|
+
if (!ports.isEmpty()) {
|
|
113
|
+
WritableMap payload = Arguments.createMap();
|
|
114
|
+
payload.putString("host", prefix + i);
|
|
115
|
+
payload.putInt("port", 9100);
|
|
116
|
+
array.pushMap(payload);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
emitEvent(EVENT_SCANNER_RESOLVED, array);
|
|
121
|
+
|
|
122
|
+
} catch (NullPointerException ex) {
|
|
123
|
+
Log.i(LOG_TAG, "No connection");
|
|
124
|
+
} finally {
|
|
125
|
+
isRunning = false;
|
|
126
|
+
emitEvent(EVENT_SCANNER_RUNNING, isRunning);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}).start();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private void emitEvent(String eventName, Object data) {
|
|
133
|
+
if (mContext != null) {
|
|
134
|
+
mContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, data);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
|
|
139
|
+
private ArrayList<Integer> getAvailablePorts(String address) {
|
|
140
|
+
ArrayList<Integer> ports = new ArrayList<>();
|
|
141
|
+
for (int port : PRINTER_ON_PORTS) {
|
|
142
|
+
if (crunchifyAddressReachable(address, port))
|
|
143
|
+
ports.add(port);
|
|
144
|
+
}
|
|
145
|
+
return ports;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
|
|
149
|
+
private static boolean crunchifyAddressReachable(String address, int port) {
|
|
150
|
+
try {
|
|
151
|
+
try (Socket crunchifySocket = new Socket()) {
|
|
152
|
+
crunchifySocket.connect(new InetSocketAddress(address, port), 100);
|
|
153
|
+
}
|
|
154
|
+
return true;
|
|
155
|
+
} catch (IOException exception) {
|
|
156
|
+
exception.printStackTrace();
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private String ipToString(int ip) {
|
|
162
|
+
return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 24) & 0xFF);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
@Override
|
|
166
|
+
public void selectDevice(PrinterDeviceId printerDeviceId, Promise promise) {
|
|
167
|
+
NetPrinterDeviceId netPrinterDeviceId = (NetPrinterDeviceId) printerDeviceId;
|
|
168
|
+
|
|
169
|
+
if (this.mSocket != null && !this.mSocket.isClosed()
|
|
170
|
+
&& mNetDevice.getPrinterDeviceId().equals(netPrinterDeviceId)) {
|
|
171
|
+
Log.i(LOG_TAG, "already selected device, do not need repeat to connect");
|
|
172
|
+
promise.resolve(this.mNetDevice.toRNWritableMap());
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
Socket socket = new Socket(netPrinterDeviceId.getHost(), netPrinterDeviceId.getPort());
|
|
178
|
+
if (socket.isConnected()) {
|
|
179
|
+
closeConnectionIfExists();
|
|
180
|
+
this.mSocket = socket;
|
|
181
|
+
this.mNetDevice = new NetPrinterDevice(netPrinterDeviceId.getHost(), netPrinterDeviceId.getPort());
|
|
182
|
+
promise.resolve(this.mNetDevice.toRNWritableMap());
|
|
183
|
+
} else {
|
|
184
|
+
promise.reject("ERR_CONNECT", "unable to build connection with host: "
|
|
185
|
+
+ netPrinterDeviceId.getHost() + ", port: " + netPrinterDeviceId.getPort());
|
|
186
|
+
}
|
|
187
|
+
} catch (IOException e) {
|
|
188
|
+
e.printStackTrace();
|
|
189
|
+
promise.reject("ERR_CONNECT", "failed to connect printer: " + e.getMessage());
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
@Override
|
|
194
|
+
public void closeConnectionIfExists() {
|
|
195
|
+
if (this.mSocket != null) {
|
|
196
|
+
if (!this.mSocket.isClosed()) {
|
|
197
|
+
try {
|
|
198
|
+
this.mSocket.close();
|
|
199
|
+
} catch (IOException e) {
|
|
200
|
+
e.printStackTrace();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
this.mSocket = null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
@Override
|
|
208
|
+
public void printRawData(String rawBase64Data, Promise promise) {
|
|
209
|
+
if (this.mSocket == null) {
|
|
210
|
+
promise.reject("ERR_NO_CONN", "Connection is not built, may be you forgot to connectPrinter");
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
final String rawData = rawBase64Data;
|
|
214
|
+
final Socket socket = this.mSocket;
|
|
215
|
+
Log.v(LOG_TAG, "start to print raw data " + rawBase64Data);
|
|
216
|
+
new Thread(new Runnable() {
|
|
217
|
+
@Override
|
|
218
|
+
public void run() {
|
|
219
|
+
try {
|
|
220
|
+
byte[] bytes = Base64.decode(rawData, Base64.DEFAULT);
|
|
221
|
+
OutputStream printerOutputStream = socket.getOutputStream();
|
|
222
|
+
printerOutputStream.write(bytes, 0, bytes.length);
|
|
223
|
+
printerOutputStream.flush();
|
|
224
|
+
promise.resolve(null);
|
|
225
|
+
} catch (IOException e) {
|
|
226
|
+
Log.e(LOG_TAG, "failed to print data" + rawData);
|
|
227
|
+
e.printStackTrace();
|
|
228
|
+
promise.reject("ERR_PRINT", e.getMessage());
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}).start();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
public static Bitmap getBitmapFromURL(String src) {
|
|
235
|
+
try {
|
|
236
|
+
URL url = new URL(src);
|
|
237
|
+
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
|
238
|
+
connection.setDoInput(true);
|
|
239
|
+
connection.connect();
|
|
240
|
+
InputStream input = connection.getInputStream();
|
|
241
|
+
Bitmap myBitmap = BitmapFactory.decodeStream(input);
|
|
242
|
+
|
|
243
|
+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
244
|
+
myBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
|
|
245
|
+
|
|
246
|
+
return myBitmap;
|
|
247
|
+
} catch (IOException e) {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
@Override
|
|
253
|
+
public void printImageData(final String imageUrl, Promise promise) {
|
|
254
|
+
final Bitmap bitmapImage = getBitmapFromURL(imageUrl);
|
|
255
|
+
|
|
256
|
+
if (bitmapImage == null) {
|
|
257
|
+
promise.reject("ERR_IMAGE", "image not found");
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (this.mSocket == null) {
|
|
262
|
+
promise.reject("ERR_NO_CONN", "Connection is not built, may be you forgot to connectPrinter");
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
final Socket socket = this.mSocket;
|
|
267
|
+
|
|
268
|
+
try {
|
|
269
|
+
int[][] pixels = getPixelsSlow(bitmapImage);
|
|
270
|
+
OutputStream printerOutputStream = socket.getOutputStream();
|
|
271
|
+
|
|
272
|
+
printerOutputStream.write(SET_LINE_SPACE_24);
|
|
273
|
+
printerOutputStream.write(CENTER_ALIGN);
|
|
274
|
+
|
|
275
|
+
for (int y = 0; y < pixels.length; y += 24) {
|
|
276
|
+
printerOutputStream.write(SELECT_BIT_IMAGE_MODE);
|
|
277
|
+
printerOutputStream.write(
|
|
278
|
+
new byte[] { (byte) (0x00ff & pixels[y].length), (byte) ((0xff00 & pixels[y].length) >> 8) });
|
|
279
|
+
for (int x = 0; x < pixels[y].length; x++) {
|
|
280
|
+
printerOutputStream.write(recollectSlice(y, x, pixels));
|
|
281
|
+
}
|
|
282
|
+
printerOutputStream.write(LINE_FEED);
|
|
283
|
+
}
|
|
284
|
+
printerOutputStream.write(SET_LINE_SPACE_32);
|
|
285
|
+
printerOutputStream.write(LINE_FEED);
|
|
286
|
+
printerOutputStream.flush();
|
|
287
|
+
promise.resolve(null);
|
|
288
|
+
} catch (IOException e) {
|
|
289
|
+
Log.e(LOG_TAG, "failed to print data");
|
|
290
|
+
e.printStackTrace();
|
|
291
|
+
promise.reject("ERR_PRINT_IMAGE", e.getMessage());
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
@Override
|
|
296
|
+
public void printQrCode(String qrCode, Promise promise) {
|
|
297
|
+
final Bitmap bitmapImage = TextToQrImageEncode(qrCode);
|
|
298
|
+
|
|
299
|
+
if (bitmapImage == null) {
|
|
300
|
+
promise.reject("ERR_QR", "QR code generation failed");
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
if (this.mSocket == null) {
|
|
305
|
+
promise.reject("ERR_NO_CONN", "Connection is not built, may be you forgot to connectPrinter");
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
final Socket socket = this.mSocket;
|
|
310
|
+
|
|
311
|
+
try {
|
|
312
|
+
int[][] pixels = getPixelsSlow(bitmapImage);
|
|
313
|
+
OutputStream printerOutputStream = socket.getOutputStream();
|
|
314
|
+
|
|
315
|
+
printerOutputStream.write(SET_LINE_SPACE_24);
|
|
316
|
+
printerOutputStream.write(CENTER_ALIGN);
|
|
317
|
+
|
|
318
|
+
for (int y = 0; y < pixels.length; y += 24) {
|
|
319
|
+
printerOutputStream.write(SELECT_BIT_IMAGE_MODE);
|
|
320
|
+
printerOutputStream.write(
|
|
321
|
+
new byte[] { (byte) (0x00ff & pixels[y].length), (byte) ((0xff00 & pixels[y].length) >> 8) });
|
|
322
|
+
for (int x = 0; x < pixels[y].length; x++) {
|
|
323
|
+
printerOutputStream.write(recollectSlice(y, x, pixels));
|
|
324
|
+
}
|
|
325
|
+
printerOutputStream.write(LINE_FEED);
|
|
326
|
+
}
|
|
327
|
+
printerOutputStream.write(SET_LINE_SPACE_32);
|
|
328
|
+
printerOutputStream.write(LINE_FEED);
|
|
329
|
+
printerOutputStream.flush();
|
|
330
|
+
promise.resolve(null);
|
|
331
|
+
} catch (IOException e) {
|
|
332
|
+
Log.e(LOG_TAG, "failed to print data");
|
|
333
|
+
e.printStackTrace();
|
|
334
|
+
promise.reject("ERR_PRINT_QR", e.getMessage());
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
private Bitmap TextToQrImageEncode(String Value) {
|
|
339
|
+
com.google.zxing.Writer writer = new QRCodeWriter();
|
|
340
|
+
BitMatrix bitMatrix = null;
|
|
341
|
+
try {
|
|
342
|
+
bitMatrix = writer.encode(Value, com.google.zxing.BarcodeFormat.QR_CODE, 250, 250,
|
|
343
|
+
ImmutableMap.of(EncodeHintType.MARGIN, 1));
|
|
344
|
+
int width = 250;
|
|
345
|
+
int height = 250;
|
|
346
|
+
Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
|
347
|
+
|
|
348
|
+
for (int i = 0; i < width; i++) {
|
|
349
|
+
for (int j = 0; j < height; j++) {
|
|
350
|
+
bmp.setPixel(i, j, bitMatrix.get(i, j) ? Color.BLACK : Color.WHITE);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return bmp;
|
|
354
|
+
} catch (WriterException e) {
|
|
355
|
+
return null;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
public static int[][] getPixelsSlow(Bitmap image2) {
|
|
360
|
+
Bitmap image = resizeTheImageForPrinting(image2);
|
|
361
|
+
int width = image.getWidth();
|
|
362
|
+
int height = image.getHeight();
|
|
363
|
+
int[][] result = new int[height][width];
|
|
364
|
+
for (int row = 0; row < height; row++) {
|
|
365
|
+
for (int col = 0; col < width; col++) {
|
|
366
|
+
result[row][col] = getRGB(image, col, row);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return result;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
private byte[] recollectSlice(int y, int x, int[][] img) {
|
|
373
|
+
byte[] slices = new byte[] { 0, 0, 0 };
|
|
374
|
+
for (int yy = y, i = 0; yy < y + 24 && i < 3; yy += 8, i++) {
|
|
375
|
+
byte slice = 0;
|
|
376
|
+
for (int b = 0; b < 8; b++) {
|
|
377
|
+
int yyy = yy + b;
|
|
378
|
+
if (yyy >= img.length) {
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
int col = img[yyy][x];
|
|
382
|
+
boolean v = shouldPrintColor(col);
|
|
383
|
+
slice |= (byte) ((v ? 1 : 0) << (7 - b));
|
|
384
|
+
}
|
|
385
|
+
slices[i] = slice;
|
|
386
|
+
}
|
|
387
|
+
return slices;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
private boolean shouldPrintColor(int col) {
|
|
391
|
+
final int threshold = 127;
|
|
392
|
+
int a, r, g, b, luminance;
|
|
393
|
+
a = (col >> 24) & 0xff;
|
|
394
|
+
if (a != 0xff) {
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
r = (col >> 16) & 0xff;
|
|
398
|
+
g = (col >> 8) & 0xff;
|
|
399
|
+
b = col & 0xff;
|
|
400
|
+
|
|
401
|
+
luminance = (int) (0.299 * r + 0.587 * g + 0.114 * b);
|
|
402
|
+
return luminance < threshold;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
public static Bitmap resizeTheImageForPrinting(Bitmap image) {
|
|
406
|
+
int width = image.getWidth();
|
|
407
|
+
int height = image.getHeight();
|
|
408
|
+
if (width > 200 || height > 200) {
|
|
409
|
+
if (width > height) {
|
|
410
|
+
float decreaseSizeBy = (200.0f / width);
|
|
411
|
+
return getBitmapResized(image, decreaseSizeBy);
|
|
412
|
+
} else {
|
|
413
|
+
float decreaseSizeBy = (200.0f / height);
|
|
414
|
+
return getBitmapResized(image, decreaseSizeBy);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return image;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
public static int getRGB(Bitmap bmpOriginal, int col, int row) {
|
|
421
|
+
int pixel = bmpOriginal.getPixel(col, row);
|
|
422
|
+
int R = Color.red(pixel);
|
|
423
|
+
int G = Color.green(pixel);
|
|
424
|
+
int B = Color.blue(pixel);
|
|
425
|
+
return Color.rgb(R, G, B);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
public static Bitmap getBitmapResized(Bitmap image, float decreaseSizeBy) {
|
|
429
|
+
Bitmap resized = Bitmap.createScaledBitmap(image, (int) (image.getWidth() * decreaseSizeBy),
|
|
430
|
+
(int) (image.getHeight() * decreaseSizeBy), true);
|
|
431
|
+
return resized;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
package com.pinmi.react.printer.adapter;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Arguments;
|
|
4
|
+
import com.facebook.react.bridge.WritableMap;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Created by xiesubin on 2017/9/21.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
public class NetPrinterDevice implements PrinterDevice {
|
|
11
|
+
private NetPrinterDeviceId mNetPrinterDeviceId;
|
|
12
|
+
|
|
13
|
+
public NetPrinterDevice(String host, Integer port) {
|
|
14
|
+
this.mNetPrinterDeviceId = NetPrinterDeviceId.valueOf(host, port);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@Override
|
|
18
|
+
public PrinterDeviceId getPrinterDeviceId() {
|
|
19
|
+
return this.mNetPrinterDeviceId;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@Override
|
|
23
|
+
public WritableMap toRNWritableMap() {
|
|
24
|
+
WritableMap deviceMap = Arguments.createMap();
|
|
25
|
+
deviceMap.putString("device_name", this.mNetPrinterDeviceId.getHost() + ":" + this.mNetPrinterDeviceId.getPort());
|
|
26
|
+
deviceMap.putString("host", this.mNetPrinterDeviceId.getHost());
|
|
27
|
+
deviceMap.putInt("port", this.mNetPrinterDeviceId.getPort());
|
|
28
|
+
return deviceMap;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
package com.pinmi.react.printer.adapter;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Created by xiesubin on 2017/9/21.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
public class NetPrinterDeviceId extends PrinterDeviceId {
|
|
8
|
+
private String host;
|
|
9
|
+
private Integer port;
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
public static NetPrinterDeviceId valueOf(String host, Integer port) {
|
|
13
|
+
return new NetPrinterDeviceId(host, port);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
private NetPrinterDeviceId(String host, Integer port) {
|
|
17
|
+
this.host = host;
|
|
18
|
+
this.port = port;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public String getHost() {
|
|
22
|
+
return host;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public Integer getPort() {
|
|
26
|
+
return port;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@Override
|
|
30
|
+
public boolean equals(Object o) {
|
|
31
|
+
if (this == o) return true;
|
|
32
|
+
if (o == null || getClass() != o.getClass()) return false;
|
|
33
|
+
if (!super.equals(o)) return false;
|
|
34
|
+
|
|
35
|
+
NetPrinterDeviceId that = (NetPrinterDeviceId) o;
|
|
36
|
+
|
|
37
|
+
if (!host.equals(that.host)) return false;
|
|
38
|
+
return port.equals(that.port);
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@Override
|
|
43
|
+
public int hashCode() {
|
|
44
|
+
int result = host.hashCode();
|
|
45
|
+
result = 31 * result + port.hashCode();
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
package com.pinmi.react.printer.adapter;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Promise;
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
5
|
+
|
|
6
|
+
import java.util.List;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Adapter interface for thermal receipt printers.
|
|
10
|
+
* Migrated to Promise-based API for React Native New Architecture (TurboModules).
|
|
11
|
+
*
|
|
12
|
+
* @author Ordovez, Earl Romeo
|
|
13
|
+
*/
|
|
14
|
+
public interface PrinterAdapter {
|
|
15
|
+
|
|
16
|
+
void init(ReactApplicationContext reactContext, Promise promise);
|
|
17
|
+
|
|
18
|
+
void getDeviceList(Promise promise);
|
|
19
|
+
|
|
20
|
+
void selectDevice(PrinterDeviceId printerDeviceId, Promise promise);
|
|
21
|
+
|
|
22
|
+
void closeConnectionIfExists();
|
|
23
|
+
|
|
24
|
+
void printRawData(String rawBase64Data, Promise promise);
|
|
25
|
+
|
|
26
|
+
void printImageData(String imageUrl, Promise promise);
|
|
27
|
+
|
|
28
|
+
void printQrCode(String qrCode, Promise promise);
|
|
29
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package com.pinmi.react.printer.adapter;
|
|
2
|
+
|
|
3
|
+
import android.hardware.usb.UsbDevice;
|
|
4
|
+
|
|
5
|
+
import com.facebook.react.bridge.Arguments;
|
|
6
|
+
import com.facebook.react.bridge.WritableMap;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Created by xiesubin on 2017/9/21.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
public interface PrinterDevice {
|
|
13
|
+
|
|
14
|
+
public PrinterDeviceId getPrinterDeviceId();
|
|
15
|
+
public WritableMap toRNWritableMap();
|
|
16
|
+
|
|
17
|
+
}
|