范例
Sample Application. 在Android Studio中打开示例应用程序,并作为参考。
功能:
- 设置温度,湿度和加速配置
- 读取温度,湿度和加速度数据
- 验证温度,湿度和加速度数据
配置
- 在Android清单中请求权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于提高GPS定位速度 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
- 参考引用
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
implementation(name: 'vechain-verify-sdk', ext: 'aar')
compileOnly files('sdkenc/classes.jar')
implementation 'com.squareup.okhttp3:okhttp:3.13.1'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.1.16'
implementation 'com.google.android.gms:play-services-location:16.0.0'
implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
}
- 定位功能配置
在设置芯片的工作配置并读取芯片中的温度时,需要收集当前位置信息。 它使用百度位置SDK功能,该功能要求开发人员前往百度注册AppKey。 点击注册
将APPKey放入AdroidManifest.xml,点击查询百度参考
<!--baidu location-->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="yourBaiduAppKey"></meta-data>
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"></service>
SDK初始化
继承Android。 应用程式。 应用程序类实现以下方法:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
SdkManager.initSdkManager(this);
String verifyID = "verifyId is Project ID that you get from VeChain Toolchain Portal/Developer Center";
VeChainSensorSDK.init(verifyID);
}
SDK注册
要在您的应用程序中调用SDK函数,您只需在应用程序中注册一次即可获得SDK功能。 在需要注册的“活动”页面上,调用如下方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
VeChainSensorSDK.onCreate(this);
registerSDK();
}
private void registerSDK() {
startLoading();
OnRegisterNotifier notifier = new OnRegisterNotifier() {
@Override
public void onRegisterResult(int resultCode, String token) {
closeLoading();
}
};
VeChainSensorSDK.register(notifier, new MySignAction());
}
MySignAction是SignAction接口的实现。 目的是对输入的ChallengeId和notifier进行签名。 onSignResult(signInfo)通知SDK继续注册过程。 SDK注册成功返回令牌值,失败的令牌为null。
public class MySignAction implements SignAction {
/*
MySignAction is the implementation of the interface SignAction. The purpose is to sign the incoming pair of challengeId and notifier. onSignResult (signInfo) to notify SDK to continue the registration process.
*/
@Override
public void sign(Context context, String challengeId, SignNotifier signNotifier) {
String certString = "Your certificate string";
String certKeyString = "Your certificate key";
String signature = CertUtils.getSignInfo(certString, certKeyString, challengeId);
//More Detail about how to sign the challengeId and get signature, refers to Appendix A: FAQ - How to Sign ChallengeID
signNotifier.onSignResult(signature, "");
}
}
SDK生命周期管理
在需要SDK功能的“活动”页面上:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pagelayout);
//create
VeChainSensorSDK.onCreate(this);
}
@Override
protected void onResume() {
super.onResume();
VeChainSensorSDK.onResume(this]);
}
@Override
protected void onPause() {
super.onPause();
VeChainSensorSDK.onPause();
}
这样,SDK的生命周期与此活动是一致的。
如果要在将芯片靠近手机NFC模块时触发事件,则可以实现以下方法:
@Override
protected void onResume() {
super.onResume();
VeChainSensorSDK.onResume(this,new OnTagListener() {
@Override
public void onTagDiscovered(Tag tag) {
//Detection of NFC module with chip close to mobile phone
//The current method is a non-main thread
}
});
}
读取芯片版本
VeChainSensorSDK.readSensorVersion(new SensorVersionNotifier() {
@Override
public void onReadSensorVersion(SensorVersion version, int errorCode, String errorMessage) {
if (version != null) {
//success
} else {
//fail
}
}
});
public class SensorVersion {
private boolean isSupportTemp;//the chip whether or not supports temperature acquisition
private boolean isSupportHumility;//the chip whether or not supports humility acquisition
private boolean isSupportAccelerate;//the chip whether or not supports accelerate acquisition
private String firmwareVersion;//the chip firmware version
private String hardwareVersion;//the chip hardware version
}
读取UID,VID,saltNO,电池,剩余运行时间
VeChainSensorSDK.readSharedZone(new ShareZoneNotifier() {
@Override
public void onReadShareZone(ShareZone shareZone, String error) {
if (shareZone != null) {
//success
} else {
//fail
}
}
});
读取芯片操作的配置信息
VeChainSensorSDK.readConfig(new ConfigNotifier() {
@Override
public void onReadConfig(Config config, String error) {
if (config != null) {
//success
} else {
//fail
}
}
});
获取写芯片配置信息验证码
在芯片工作之前,应先设置温度,湿度或加速度的配置信息,以确保它是特定芯片,并通过验证码进行验证。 读取验证码,如下所示:
VeChainSensorSDK.requestVerifyCode(new VerifyCodeNotifier() {
@Override
public void onReadVerifyCode(String verifyCode, int errorCode,
String errorMessage){
if (!TextUtils.isEmpty(verifyCode)) {
//success
}else{
//fail
}
}
});
设置芯片工作配置
SettingParam.Builder builder = new SettingParam.Builder();
builder.setVerifyCode(verifyCode).setAccount(account)
.setTempEnable(isTempEnable)
.setInterval(interval)
.setStartDelay(startDelay)
.setRunningTime(runningTime)
.setValidMinimum(validMinimum)
.setValidMaximum(validMaximum)
.setHumidityEnable(isHumidityEnable)
.setHumidityInterval(humidityInterval)
.setHumidityStartDelay(humidityStartDelay)
.setHumidityRunningTime(humidityRunningTime)
.setAccelerateEnable(isAccelerateEnable)
.setAccelerateType(AccelerateType.values()[acTriggerType]);
SettingParam param = builder.build();
VeChainSensorSDK.writeConfig(SettingParam params, new SetConfigNotifier() {
@Override
public void onResult(int status, String errorMessage, long estimateRuntime) {
if (status == ResultCode.OK) {
//success
} else {
//fail
}
}
});
isTempEnable:温度采集功能是否打开。
interval:温度采集间隔(分钟),大于或等于1。
startDelay:延迟时间(分钟),大于或等于0。
runningTime:运行时间(分钟),0表示到无限时间。
validMinimum:最低温度(°c)精确到1位小数,不低于-40。
validMaximum:最高温度(°c)精确到1位小数,不高于85。
isHumidityEnable:湿度获取功能是否打开。
humidityInterval:湿度获取间隔(分钟),大于或等于1。
humidityStartDelay:延迟时间(分钟),大于或等于0。
humidityRunningTime:运行时间(分钟),0到无限时间。
isAccelerateEnable:加速获取功能是否打开。
acTriggerType:此值为0或1;映射类型为AccelerateType.TRIGGERTYPEROCK或AccelerateType.TRIGGERTYPEROLL。
读取收集的温度,湿度和加速度数据
VeChainSensorSDK.readSensorData(new ReadSensorDataNotifier() {
@Override
public void onReadSensorData(SensorData sensorData, String error) {
if (sensorData != null) {
//data Reading Successfully
} else {
//read failure
}
}
});
传感器数据描述
class SensorData {
//Temperature data
private boolean isTempEnable; //Is the temperature measurement on
private List<Float> tempData;//Temperature data
private String tempSignature;//Temperature signature information (hexadecimal string)
private int tempInterval;//Unit minute
private int tempStartDelay;//Unit minute
private int tempRunningTime;//Unit minute
private int tempValidMinimum;//Actual value*10
private int tempValidMaximum;//Actual value*10
private int accuracy;//Temperature data storage accuracy
private int tempGroupSize; //Number of compressions per group
//Humidity data
private boolean isHumidityEnable; //Is the humidity measurement on
private List<Integer> humidityData;
private String humiditySignature;//Hexadecimal string
private int humidityInterval; //Humidity measurement interval,Unit minute
private int humidityStartDelay; //Unit minute
private int humidityRunningTime; //Unit minute
private int humidityGroupSize; //Number of compressions per group
//Accelerate data
private boolean isAccelerateEnable; //Is the accelerate measurement on
private List<Accelerate> accelerateData;
private String accelerateSignature;//Hexadecimal string
private int accGroupSize; //Number of compressions per group
//Base Information
private String uid;//Hexadecimal string
private String vid;//Hexadecimal string
private String saltNo;//Hexadecimal string
private int configTime;//Configuration time
private int configLongitude;//(Actual value*1000000);
private int configLatitude;//(Actual value*1000000);
private int configLocationAccuracy;//Positioning accuracy,Unit meters
//Position information when reading temperature
private int curLongitude;//Actual value*1000000;
private int curLatitude;//Actual value*1000000;
private int curLocationAccuracy;//Positioning accuracy,Unit meters
private int curTime;//Unit seconds
//9bytes Abnormal information
private String restPowerInfo;//Hexadecimal string
}
验证温度数据
Data are obtained from some channels, and SDK is used to verify whether the data is true and reliable, or whether the data has been modified.If the data is not true or modified, the validation return fails
VerifyBean bean = new VerifyBean();
bean.setData(sensorData.getTempData());
bean.setSignature(sensorData.getTempSignature());
bean.setGroupSize(sensorData.getTempGroupSize());
bean.setUid(sensorData.getUid());
bean.setVid(sensorData.getVid());
bean.setSaltNo(sensorData.getSaltNo());
String configString = sensorData.getConfig();
bean.setConfig(configString);
VeChainSensorSDK.verifySensorData(bean, (code, pass, message) -> {
closeLoading();
if (code == ResultCode.OK && pass) {
//check success
} else {
//check fail
}
});
验证湿度数据
VerifyBean bean = new VerifyBean();
bean.setData(sensorData.getHumidityData());
bean.setSignature(sensorData.getHumiditySignature());
bean.setGroupSize(sensorData.getHumidityGroupSize());
bean.setUid(sensorData.getUid());
bean.setVid(sensorData.getVid());
bean.setSaltNo(sensorData.getSaltNo());
String configString = sensorData.getConfig();
bean.setConfig(configString);
VeChainSensorSDK.verifySensorData(bean, (code, pass, message) -> {
closeLoading();
if (code == ResultCode.OK && pass) {
//check success
} else {
//check fail
}
});
验证加速度数据
VerifyBean bean = new VerifyBean();
bean.setData(sensorData.getAccelerates());
bean.setSignature(sensorData.getAccelerateSignature());
bean.setGroupSize(sensorData.getAccGroupSize());
bean.setUid(sensorData.getUid());
bean.setVid(sensorData.getVid());
bean.setSaltNo(sensorData.getSaltNo());
String configString = sensorData.getConfig();
bean.setConfig(configString);
VeChainSensorSDK.verifySensorData(bean, (code, pass, message) -> {
closeLoading();
if (code == ResultCode.OK && pass) {
//check success
} else {
//check fail
}
});
评论
0 条评论
请登录写评论。