sunmi-device-sdk
Version:
JavaScript SDK for Sunmi card readers and printers
281 lines (201 loc) • 7.46 kB
Markdown
A modern JavaScript/TypeScript SDK for Sunmi card readers and thermal printers. Works with **Expo**, React Native, Cordova, and Capacitor.
- 🃏 **Card Reader Support**: Read/write Mifare cards, IC cards, and magnetic cards
- 🖨️ **Thermal Printer**: Full control over Sunmi thermal printers
- 📘 **TypeScript**: Full type definitions included
- 🔌 **Multi-Platform**: Works with **Expo**, React Native, Cordova, and Capacitor
- 🎯 **Promise-based**: Modern async/await API
- ⚡ **No Cordova Required**: Pure npm package for modern apps
```bash
npm install @sunmi/device-sdk
```
```typescript
import { SunmiCardReader, CardType } from '@sunmi/device-sdk';
// Start reading a card
const result = await SunmiCardReader.startReadCard(['mifare', 'ic']);
console.log('Card detected:', result);
// Authenticate and read Mifare card
await SunmiCardReader.authMifare('FFFFFFFFFFFF', 'A', 4);
const data = await SunmiCardReader.readBlockMifare(4);
console.log('Block data:', data);
```
```typescript
import { SunmiPrinter, PrintAlignment } from '@sunmi/device-sdk';
// Initialize printer
await SunmiPrinter.init();
// Print some text
await SunmiPrinter.setAlignment(PrintAlignment.CENTER);
await SunmiPrinter.setFontSize(24);
await SunmiPrinter.printText('Hello, Sunmi!');
// Print QR code
await SunmiPrinter.printQRCode('https://example.com', 8, 1);
// Feed paper and finish
await SunmiPrinter.feedPaper(3);
```
Start reading a card. Supports multiple card types: `'mifare'`, `'ic'`, `'magnetic'`, `'psam'`.
Authenticate a Mifare card block before reading/writing.
Read data from an authenticated Mifare block. Returns hex string.
Write data to a Mifare block. Data must be a 16-byte hex string.
Cancel an ongoing card reading operation.
Initialize the printer. Call this before any other printer operations.
Print text with current settings.
Print text with specific font settings.
Set text alignment. Options: `LEFT`, `CENTER`, `RIGHT`.
Set font size in points.
Print a QR code.
- `moduleSize`: 1-16 (size of each QR module)
- `errorLevel`: 0-3 (error correction level)
Print a barcode. Supports various symbologies like `'CODE128'`, `'EAN13'`, etc.
Print a bitmap image from base64-encoded data.
Print text in columns (useful for receipts).
#### `feedPaper(lines: number): Promise<void>`
Feed paper by specified number of lines.
#### `getSerialNumber(): Promise<string>`
Get printer serial number.
#### `getVersion(): Promise<string>`
Get printer firmware version.
#### `hasPrinter(): Promise<boolean>`
Check if printer is available on the device.
## Platform Setup
### Expo 🚀 (Easiest!)
**Perfect for Expo users!** Uses Expo's prebuild workflow:
1. **Install:**
```bash
npm install @sunmi/device-sdk
```
2. **Prebuild:**
```bash
npx expo prebuild
```
3. **Copy native files and register packages** (one-time setup)
4. **Use it:**
```typescript
import { SunmiPrinter } from '@sunmi/device-sdk';
await SunmiPrinter.printText('Hello from Expo!');
```
**See `EXPO_SETUP.md` for complete step-by-step instructions** and check out the `expo-example/` folder for a working app!
**No Cordova needed!** Follow these steps:
1. **Install the package:**
```bash
npm install @sunmi/device-sdk
```
2. **Add native modules:**
Copy the bridge files from `react-native/` directory to your Android project:
- `SunmiPrinterModule.java`
- `SunmiPrinterPackage.java`
- `SunmiCardReaderModule.java`
- `SunmiCardReaderPackage.java`
3. **Copy native Android code:**
```bash
cp -r src/android/com your-rn-project/android/app/src/main/java/
cp -r src/android/woyou your-rn-project/android/app/src/main/aidl/
cp libs/rel.aar your-rn-project/android/app/libs/
```
4. **Register in MainApplication.java:**
```java
import com.sunmi.SunmiCardReaderPackage;
import com.sunmi.SunmiPrinterPackage;
@Override
protected List<ReactPackage> getPackages() {
return Arrays.asList(
new MainReactPackage(),
new SunmiCardReaderPackage(),
new SunmiPrinterPackage()
);
}
```
5. **Use in your app:**
```typescript
import { SunmiPrinter } from '@sunmi/device-sdk';
await SunmiPrinter.printText('Hello from React Native!');
```
See `react-native/README.md` for complete setup instructions.
The package maintains Cordova compatibility. The existing plugin.xml works as-is.
Similar setup to React Native. Create Capacitor plugins using the native Android code.
```typescript
import { SunmiPrinter, PrintAlignment } from '@sunmi/device-sdk';
async function printReceipt() {
await SunmiPrinter.init();
// Header
await SunmiPrinter.setAlignment(PrintAlignment.CENTER);
await SunmiPrinter.setFontSize(28);
await SunmiPrinter.printText('My Store Name');
await SunmiPrinter.feedPaper(1);
// Items
await SunmiPrinter.setAlignment(PrintAlignment.LEFT);
await SunmiPrinter.setFontSize(20);
await SunmiPrinter.printColumns(
['Item 1', '10.00'],
[],
[]
);
await SunmiPrinter.printColumns(
['Item 2', '15.00'],
[],
[]
);
// Total
await SunmiPrinter.feedPaper(1);
await SunmiPrinter.printColumns(
['TOTAL', '25.00'],
[],
[]
);
await SunmiPrinter.feedPaper(3);
}
```
```typescript
import { SunmiCardReader } from '@sunmi/device-sdk';
async function readCard() {
// Start reading
const card = await SunmiCardReader.startReadCard(['mifare']);
console.log('Card UID:', card.uid);
// Authenticate with default key
const block = 4;
await SunmiCardReader.authMifare('FFFFFFFFFFFF', 'A', block);
// Read data
const data = await SunmiCardReader.readBlockMifare(block);
console.log('Block data:', data);
}
```
All methods return promises that reject on error:
```typescript
try {
await SunmiPrinter.printText('Hello');
} catch (error) {
console.error('Print failed:', error);
}
```
MIT
Contributions welcome! Please open an issue or PR on GitHub.