SDK杂记: Difference between revisions

From wizarPOS
No edit summary
No edit summary
Line 4: Line 4:


HSMDevice hsm = (HSMDevice) POSTerminal.getInstance(context)
HSMDevice hsm = (HSMDevice) POSTerminal.getInstance(context)
.getDevice(POSTerminal.DEVICE_NAME_HSM);
.getDevice(POSTerminal.DEVICE_NAME_HSM);
hsm.open();
hsm.open();


// 单字段CSR(原接口)
// 单字段CSR(原接口)
X500Principal subject1 = new X500Principal("CN=www.test.com");
X500Principal subject1 = new X500Principal("CN=www.test.com");
byte[] csr1 = hsm.generateCSR("terminal", subject1);
byte[] csr1 = hsm.generateCSR("terminal", subject1);


Line 14: Line 17:
X500Principal subject2 = new X500Principal(
X500Principal subject2 = new X500Principal(
"CN=pay.test.com,O=TestPayCorp,OU=Security Dept,C=CN,ST=Guangdong,L=Shenzhen");
"CN=pay.test.com,O=TestPayCorp,OU=Security Dept,C=CN,ST=Guangdong,L=Shenzhen");
byte[] csr2 = hsm.generateCSR("terminal", subject2);
byte[] csr2 = hsm.generateCSR("terminal", subject2);


Line 22: Line 26:
==主动查询终端是否越界的接口(电子围栏相关)==
==主动查询终端是否越界的接口(电子围栏相关)==
cloudpossdkV1.8.2.10开始支持, TmsAgent-v5.4.50.3以上开始支持。
cloudpossdkV1.8.2.10开始支持, TmsAgent-v5.4.50.3以上开始支持。
com.cloudpos.TerminalSpec
com.cloudpos.TerminalSpec
/** * Requests a geofence status check by sending a broadcast to the Terminal. * * <p> * When this method is invoked, Terminal performs a geofence validation immediately. * The result is delivered asynchronously via broadcast intents. This method does not * return the result directly. * </p> * * <p><b>Broadcast Result Actions:</b></p> * <ul> * <li> * Device is out of the geofence: * com.coudpos.ACTION_LOCATION_OUT_OF_BOUND * </li> * <li> * Device has re-entered the geofence after being out of bounds: * com.coudpos.ACTION_LOCATION_IN_OF_BOUND * </li> * <li> * Geofence feature is not enabled on the device: * com.coudpos.ACTION_LOCATION_GEOFENCE_DISABLED * </li> * </ul> * * <p><b>Implementation Details:</b></p> * <ul> * <li>Uses Android broadcast mechanism with action-based filtering</li> * <li>Caller must register a {@link android.content.BroadcastReceiver} to receive results</li> * <li>Result is typically returned shortly after the request is triggered</li> * </ul> * * <p><b>Notes:</b></p> * <ul> * <li>Ensure Terminal is registered before invoking this method</li> * </ul>
/** * Requests a geofence status check by sending a broadcast to the Terminal. * * <p> * When this method is invoked, Terminal performs a geofence validation immediately. * The result is delivered asynchronously via broadcast intents. This method does not * return the result directly. * </p> * * <p><b>Broadcast Result Actions:</b></p> * <ul> * <li> * Device is out of the geofence: * com.coudpos.ACTION_LOCATION_OUT_OF_BOUND * </li> * <li> * Device has re-entered the geofence after being out of bounds: * com.coudpos.ACTION_LOCATION_IN_OF_BOUND * </li> * <li> * Geofence feature is not enabled on the device: * com.coudpos.ACTION_LOCATION_GEOFENCE_DISABLED * </li> * </ul> * * <p><b>Implementation Details:</b></p> * <ul> * <li>Uses Android broadcast mechanism with action-based filtering</li> * <li>Caller must register a {@link android.content.BroadcastReceiver} to receive results</li> * <li>Result is typically returned shortly after the request is triggered</li> * </ul> * * <p><b>Notes:</b></p> * <ul> * <li>Ensure Terminal is registered before invoking this method</li> * </ul>
*/
*/
Line 28: Line 34:
//Sample code:
//Sample code:
TerminalSpec terminalSpec = POSTerminal.getInstance(context).getTerminalSpec();
TerminalSpec terminalSpec = POSTerminal.getInstance(context).getTerminalSpec();
terminalSpec.requestGeofenceBroadcast();
terminalSpec.requestGeofenceBroadcast();


广播接收:
广播接收:
- com.coudpos.ACTION_LOCATION_OUT_OF_BOUND — 终端出围栏
- com.coudpos.ACTION_LOCATION_OUT_OF_BOUND — 终端出围栏
- com.coudpos.ACTION_LOCATION_IN_OF_BOUND — 终端入围栏
- com.coudpos.ACTION_LOCATION_IN_OF_BOUND — 终端入围栏
- com.coudpos.ACTION_LOCATION_GEOFENCE_DISABLED — 围栏未启用
- com.coudpos.ACTION_LOCATION_GEOFENCE_DISABLED — 围栏未启用
<receiver
<receiver
android:name="com.cloudpos.api.receiver.LocationReceiver"
android:name="com.cloudpos.api.receiver.LocationReceiver"
android:enabled="true"
android:enabled="true"
android:exported="true">
android:exported="true">
<intent-filter>
<intent-filter>
<action android:name="com.coudpos.ACTION_LOCATION_OUT_OF_BOUND" />
<action android:name="com.coudpos.ACTION_LOCATION_OUT_OF_BOUND" />
</intent-filter>
</intent-filter>
<intent-filter>
<intent-filter>
<action android:name="com.coudpos.ACTION_LOCATION_IN_OF_BOUND" />
<action android:name="com.coudpos.ACTION_LOCATION_IN_OF_BOUND" />
</intent-filter>
</intent-filter>
<intent-filter>
<intent-filter>
<action android:name="com.coudpos.ACTION_LOCATION_GEOFENCE_DISABLED" />
<action android:name="com.coudpos.ACTION_LOCATION_GEOFENCE_DISABLED" />
</intent-filter>
</intent-filter>
</receiver>
</receiver>
==对于在Q1K/Q2pro上,persist.wp.hw.customerdisplay值可能是size:240x320或者size:272x480,由驱动负责设置。SDK提供获取接口来解析这个属性:
==对于在Q1K/Q2pro上,persist.wp.hw.customerdisplay值可能是size:240x320或者size:272x480,由驱动负责设置。SDK提供获取接口来解析这个属性:
android.util.Size CustomerDisplayDevice.getSize();
android.util.Size CustomerDisplayDevice.getSize();==
cloudpossdkV1.8.2.10_Standard.aar以上开始支持。
cloudpossdkV1.8.2.10_Standard.aar以上开始支持。
Q1K系列,需要bootloader0857+支持 #40099
Q1K系列,需要bootloader0857+支持 #40099


Line 56: Line 70:


com.cloudpos.customerdisplay
com.cloudpos.customerdisplay
CustomerDisplayDevice device = (CustomerDisplayDevice) POSTerminal.getInstance(context).getDevice(POSTerminal.DEVICE_NAME_CUSTOMER_DISPLAY);
CustomerDisplayDevice device = (CustomerDisplayDevice) POSTerminal.getInstance(context).getDevice(POSTerminal.DEVICE_NAME_CUSTOMER_DISPLAY);
device.open();
device.open();


Line 63: Line 79:
==logcat打包接口==
==logcat打包接口==
需要权限
需要权限
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />


接口实现
接口实现
ILogDevice device = LogDeviceImpl.getInstance(context);
ILogDevice device = LogDeviceImpl.getInstance(context);
示例代码:
示例代码:
public void test() {
public void test() {
if(th null || th.getState() Thread.State.TERMINATED){
if(th null || th.getState() Thread.State.TERMINATED){
th = new Thread(new Runnable() {
th = new Thread(new Runnable() {
@Override
@Override
public void run() {
public void run() {
boolean result ;
boolean result ;
ILogDevice logDevice = LogDeviceImpl.getInstance(mContext);
ILogDevice logDevice = LogDeviceImpl.getInstance(mContext);
// result = logDevice.packageLog(1, "/sdcard/test/1_logs.zip");
// result = logDevice.packageLog(1, "/sdcard/test/1_logs.zip");
// Logger.debug("run 1_logs result (%s)", result);
// Logger.debug("run 1_logs result (%s)", result);


result = logDevice.packageLogcats(3, "/sdcard/test/3_logcats.zip");
result = logDevice.packageLogcats(3, "/sdcard/test/3_logcats.zip");
                    Logger.debug("run 3_logcats result (%s)", result);
 
Logger.debug("run 3_logcats result (%s)", result);
 
long endTime = System.currentTimeMillis();
long endTime = System.currentTimeMillis();
                    long startTime = endTime - 12 * 60 * 60 * 1000;
 
                    result = logDevice.packageLogcats(startTime, endTime, "/sdcard/test/11_hours_logcats.zip");
long startTime = endTime - 12 * 60 * 60 * 1000;
                    Logger.debug("run 11_hours_logcats result (%s)", result);
 
                }
result = logDevice.packageLogcats(startTime, endTime, "/sdcard/test/11_hours_logcats.zip");
            });
 
            th.start();
Logger.debug("run 11_hours_logcats result (%s)", result);
        }
}
});
th.start();
}
}
}
==属性ro.wp.antenna.position,0表示内置,1表示外置==
==属性ro.wp.antenna.position,0表示内置,1表示外置==
提供JavaSDK的底层c的接口部分,每次被调用时,同时设置persist.wp.antenna.position确保信息持久化。
提供JavaSDK的底层c的接口部分,每次被调用时,同时设置persist.wp.antenna.position确保信息持久化。
cloudpossdkV1.8.1.1 验证ok
cloudpossdkV1.8.1.1 验证ok
需要固件支持,Q3MINI-V(pcbc)system1072+ #40676
需要固件支持,Q3MINI-V(pcbc)system1072+ #40676


Line 98: Line 133:


AntennaDevice device = (AntennaDevice) POSTerminal.getInstance(context).getDevice(POSTerminal.DEVICE_NAME_ANTENNA);
AntennaDevice device = (AntennaDevice) POSTerminal.getInstance(context).getDevice(POSTerminal.DEVICE_NAME_ANTENNA);
device.open();
device.open();
device.getAntennaMode();
device.getAntennaMode();
device.setAntennaMode(AntennaDevice.AntennaMode.INTERNAL);
device.setAntennaMode(AntennaDevice.AntennaMode.INTERNAL);
device.close();
device.close();

Revision as of 07:10, 3 June 2026

在生成CSR的时候,可以输入证书的常用域,包括:countryName, stateOrProvinceName, localityName, organizationName, organizationUnitName, commonName和emailAddress

cloudpossdkV1.8.1.5开始支持 com.cloudpos.hsm.HSMDevice

HSMDevice hsm = (HSMDevice) POSTerminal.getInstance(context)

.getDevice(POSTerminal.DEVICE_NAME_HSM);

hsm.open();

// 单字段CSR(原接口) X500Principal subject1 = new X500Principal("CN=www.test.com");

byte[] csr1 = hsm.generateCSR("terminal", subject1);

// 多字段CSR(#40841新支持CN/O/OU/C/ST/L) X500Principal subject2 = new X500Principal( "CN=pay.test.com,O=TestPayCorp,OU=Security Dept,C=CN,ST=Guangdong,L=Shenzhen");

byte[] csr2 = hsm.generateCSR("terminal", subject2);

hsm.close();

权限:CLOUDPOS_SAFE_MODULE 前置条件:HSM需存在公私钥对(例如:terminal别名)

主动查询终端是否越界的接口(电子围栏相关)

cloudpossdkV1.8.2.10开始支持, TmsAgent-v5.4.50.3以上开始支持。

com.cloudpos.TerminalSpec

/** * Requests a geofence status check by sending a broadcast to the Terminal. * *

* When this method is invoked, Terminal performs a geofence validation immediately. * The result is delivered asynchronously via broadcast intents. This method does not * return the result directly. *

* *

Broadcast Result Actions:

*

    *
  • * Device is out of the geofence: * com.coudpos.ACTION_LOCATION_OUT_OF_BOUND *
  • *
  • * Device has re-entered the geofence after being out of bounds: * com.coudpos.ACTION_LOCATION_IN_OF_BOUND *
  • *
  • * Geofence feature is not enabled on the device: * com.coudpos.ACTION_LOCATION_GEOFENCE_DISABLED *
  • *

* *

Implementation Details:

*

    *
  • Uses Android broadcast mechanism with action-based filtering
  • *
  • Caller must register a {@link android.content.BroadcastReceiver} to receive results
  • *
  • Result is typically returned shortly after the request is triggered
  • *

* *

Notes:

*

    *
  • Ensure Terminal is registered before invoking this method
  • *
  • /

requestGeofenceBroadcast() //Sample code: TerminalSpec terminalSpec = POSTerminal.getInstance(context).getTerminalSpec();

terminalSpec.requestGeofenceBroadcast();

广播接收: - com.coudpos.ACTION_LOCATION_OUT_OF_BOUND — 终端出围栏

- com.coudpos.ACTION_LOCATION_IN_OF_BOUND — 终端入围栏

- com.coudpos.ACTION_LOCATION_GEOFENCE_DISABLED — 围栏未启用

<receiver android:name="com.cloudpos.api.receiver.LocationReceiver" android:enabled="true" android:exported="true">

<intent-filter> <action android:name="com.coudpos.ACTION_LOCATION_OUT_OF_BOUND" /> </intent-filter> <intent-filter>

<action android:name="com.coudpos.ACTION_LOCATION_IN_OF_BOUND" /> </intent-filter> <intent-filter>

<action android:name="com.coudpos.ACTION_LOCATION_GEOFENCE_DISABLED" /> </intent-filter> </receiver> ==对于在Q1K/Q2pro上,persist.wp.hw.customerdisplay值可能是size:240x320或者size:272x480,由驱动负责设置。SDK提供获取接口来解析这个属性: android.util.Size CustomerDisplayDevice.getSize();== cloudpossdkV1.8.2.10_Standard.aar以上开始支持。

Q1K系列,需要bootloader0857+支持 #40099

<uses-permission android:name="android.permission.CLOUDPOS_CUSTOMER_DISPLAY"/>

com.cloudpos.customerdisplay

CustomerDisplayDevice device = (CustomerDisplayDevice) POSTerminal.getInstance(context).getDevice(POSTerminal.DEVICE_NAME_CUSTOMER_DISPLAY);

device.open();

device.close();

logcat打包接口

需要权限

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />

接口实现 ILogDevice device = LogDeviceImpl.getInstance(context);

示例代码:

public void test() {

if(th null || th.getState() Thread.State.TERMINATED){

th = new Thread(new Runnable() {

@Override

public void run() {

boolean result ;

ILogDevice logDevice = LogDeviceImpl.getInstance(mContext);

// result = logDevice.packageLog(1, "/sdcard/test/1_logs.zip");

// Logger.debug("run 1_logs result (%s)", result);

result = logDevice.packageLogcats(3, "/sdcard/test/3_logcats.zip");

Logger.debug("run 3_logcats result (%s)", result);

long endTime = System.currentTimeMillis();

long startTime = endTime - 12 * 60 * 60 * 1000;

result = logDevice.packageLogcats(startTime, endTime, "/sdcard/test/11_hours_logcats.zip");

Logger.debug("run 11_hours_logcats result (%s)", result); } }); th.start(); } }

属性ro.wp.antenna.position,0表示内置,1表示外置

提供JavaSDK的底层c的接口部分,每次被调用时,同时设置persist.wp.antenna.position确保信息持久化。

cloudpossdkV1.8.1.1 验证ok

需要固件支持,Q3MINI-V(pcbc)system1072+ #40676

<uses-permission android:name="android.permission.CLOUDPOS_MCUCTL" />

AntennaDevice device = (AntennaDevice) POSTerminal.getInstance(context).getDevice(POSTerminal.DEVICE_NAME_ANTENNA);

device.open();

device.getAntennaMode();

device.setAntennaMode(AntennaDevice.AntennaMode.INTERNAL);

device.close();