myPOS MDB SDK Integration Guide

This guide outlines how to install and use the myPOS-MDB-SDK to enable cashless vending machine integration via Android.

1. Installation

Gradle Setup Add the Maven Central repository in your project-level build.gradle:

allprojects {
   repositories {
   	mavenCentral()
   }
}

Add the SDK dependency in your app-level build.gradle:

dependencies {
   implementation 'com.mypos:mdbsdk:1.0.0'
}

2. Initialization

Android Manifest
Add required package queries:

<queries>
    <package android:name="com.mypos" />
    <package android:name="com.mypos.ipp" />
</queries>

Application Class Setup

public class SampleApplication extends Application implements MDBManager.OnBindListener {
    @Override
    public void onCreate() {
        super.onCreate();
        MDBManager.getInstance().bind(this, this);
    }

    @Override
    public void onBindComplete() {
        MDBManager.getInstance().init(paymentAppInfo, iCompletionCallback, iPaymentCallback);
    }
}

3. Cashless Device Configuration

Setup PaymentAppInfo

PaymentAppInfo paymentAppInfo = new PaymentAppInfo();
paymentAppInfo.setClientId("12345678");
paymentAppInfo.setManufactureCode("XGD");
paymentAppInfo.setModel(Build.MODEL);
paymentAppInfo.setCountryCode("826");
paymentAppInfo.setDecimalPlaces((byte) 0x02);
paymentAppInfo.setScaleFactor(1);
paymentAppInfo.setResponseTime((byte) 0x3C);
paymentAppInfo.setLogLevel(LogLevel.INFO.ordinal());
paymentAppInfo.setReaderFeatureLevel((byte) 0x00);
paymentAppInfo.setRevalueApproved(false);
paymentAppInfo.setRequestRefunds(true);
paymentAppInfo.setDeviceMode(DeviceMode.CASHLESS);
paymentAppInfo.setNotifyStatus(false);
paymentAppInfo.setRespondAckFirst(false);
paymentAppInfo.setDeviceType(0);
paymentAppInfo.setSupportCashSale(false);
paymentAppInfo.setDelayTm(0);
paymentAppInfo.setWaitEndSessionTm(30);
paymentAppInfo.setSupportMultiVend(false);
paymentAppInfo.setSupportRemoteVend(false);
paymentAppInfo.setEnableAlwaysIdle(true);
paymentAppInfo.setMonetaryFormat(0);

4. Payment Callback

private final IPaymentCallback iPaymentCallback = new IPaymentCallback.Stub() {
    @Override
    public int onPay(int tradeType, String itemPrice, String itemNumber) {
        if (tradeType == VendType.SALE.ordinal()) {
            // Handle sale
        }
        return 0;
    }

    @Override
    public void notifyMdbStatus(int mdbDeviceStatus) {
        switch (DeviceStatus.values()[mdbDeviceStatus]) {
            case INACTIVE:
            case DISABLE:
            case ENABLE:
            case SESSION_IDLE:
            case VEND:
                break;
        }
    }

    @Override
    public void notifyVendResult(int result) {
        switch (VendResult.values()[result]) {
            case VEND_SUCCESS:
            case VEND_FAILURE:
            case VEND_END_SESSION:
            case VEND_CANCEL:
                break;
        }
    }

    @Override
    public void notifyVendParam(int type, byte[] data) {
        switch (VendParam.values()[type]) {
            case MIN_PRICE:
                double minPrice = Long.parseLong(ByteArray.bytesToHex(data), 16) / 100.0;
                break;
            case MAX_PRICE:
                double maxPrice = Long.parseLong(ByteArray.bytesToHex(data), 16) / 100.0;
                break;
            case IDLE_MODE:
                long idleMode = Long.parseLong(ByteArray.bytesToHex(data), 16);
                break;
        }
    }

    @Override public void onPayResult(String result) {}
    @Override public void onCallDiagnostics(byte[] bytes) {}
    @Override public void onReaderCancel() {}
};

5. Setup Completion Callback

private final ICompletionCallback iCompletionCallback = new ICompletionCallback.Stub() {
    @Override public void onSuccess() {}
    @Override public void onFailure(int retCode) {}
    @Override public void onAppUpdate() {}
    @Override public void onNotifyVMCInfo(String brand, String model) {}
    @Override public void onReportError(int type, boolean success, String errorMessage) {}
};

6. Session Management

Start Session

JSONObject report = new JSONObject();
report.put(ReportKey.TYPE, ReportType.BEGIN_SESSION.ordinal());
report.put(ReportKey.FUNDS, hexAmount); // in hexadecimal format
MDBManager.getInstance().reportToVMC(report.toString());

Cancel Session

JSONObject report = new JSONObject();
report.put(ReportKey.TYPE, ReportType.CANCEL_SESSION_REQUEST.ordinal());
MDBManager.getInstance().reportToVMC(report.toString());

Report Vend Result

JSONObject report = new JSONObject();
report.put(ReportKey.TYPE, ReportType.TRADE_RESULT.ordinal());
report.put(ReportKey.TRADE_RESULT, TransResult.TRADE_SUCCESS.ordinal());
report.put(ReportKey.TRANS_RESULT_AMOUNT, hexAmount);
MDBManager.getInstance().reportToVMC(report.toString());

7. Age Verification

MDBManager.getInstance().setAgeVerificationCallback(ageVerificationCallback);

Implement Callback

private final IAgeVerificationCallback ageVerificationCallback = new IAgeVerificationCallback.Stub() {
    @Override
    public void onCheckAgeVerification(int age) {
        // Perform your age check logic
    }
};

Set Verification Result

AgeVerificationManager.getInstance().setDRAVSStatus(AgeVerificationResult.VALID_CARD);