SDK杂记: Difference between revisions
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); | |||
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"); | |||
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();