Data exchange function
Function overview
When you initiate exercise in the App, the bracelet will calculate the heart rate and calories from the exercise data generated by the App and return it to the App for data exchange; When the bracelet initiates exercise, the movement generated by the bracelet The data is sent to the App regularly and sports data is displayed in real time. Exchanging data uses time as the only reference. The exchange process needs to judge the current activity data based on the movement start time. If the time does not correspond, the data cannot be exchanged.
ExchangeDataInterface
Properties
supportV3ActivityExchange
Get whether v3 motion data exchange is supported
status
Exchange data status
Method
appExec(type:)
app executes data exchange
- Parameters:
- type: app executes data exchange entity IDOAppExecType
appReplyExec
(type:)
ble initiates movement ble executes data exchange app reply
- Parameters:
- type: app reply data entity IDOAppReplyType
getLastActivityData
( )
The last data acquisition of multi-sport data
- Parameters:
- completion: command execution callback
- code: error code 0 is successful, non-0 is unsuccessful
- model: multi-sport data entity IDOAppActivityDataV3ExchangeModel
getActivityHrData(completion:)
Get one minute of heart rate data for multiple exercises
Parameters:
- completion: command execution callback
code: error code 0 is successful, non-0 is unsuccessful
model: Heart rate data entity IDOAppHrDataExchangeModel
IDOExchangeDataDelegate
Method
appListenBleExec (completion:)
ble initiates movement app to monitor ble
- Parameters:
- completion: command execution callback
- type: listen to ble execution data entity IDOBleExecType
appListenAppExec(completion:)
app execution response
- Parameters: I -COMPLETION: Command execution
-Type: Surveillance app executes BLE response entity :
- CompleTion : Command execution callback
- type: Monitor v2 data exchange entity IDOExchangeV2Model
exchangeV3Data(completion:)
Exchange v3 data
- Parameters:
- completion: Command execution callback
- type: Listen v3 data exchange entity IDOExchangeV3Model
Example
Swift:
//pause exercise
let model = IDOAppPauseExchangeModel(baseModel: baseModel)
sdk.dataExchange.appExec(model: model)
//end exercise
let model = IDOAppBleEndReplyExchangeModel(code: 0, duration: duration, calories: calories, distance: distance, baseModel: baseModel)
sdk.dataExchange.appReplyExec(type: .appBleEndReply(model))
let lastData = sdk.dataExchange.getLastActivityData()
if sdk.dataExchange.supportV3ActivityExchange {
sdk.dataExchange.getActivityHrData()
}
sdk.dataExchange.addExchange(IDOExchangeDataDelegateImpl())
class IDOExchangeDataDelegateImpl: IDOExchangeDataOCDelegate {
func appListenBleExec(model: NSObject) {
if (model is IDOBleStartExchangeModel) {
let obj = model as? IDOBleStartExchangeModel
let sendModel = IDOBleStartReplyExchangeModel(baseModel: obj?.baseModel, operate: obj?.operate, retCode: 0)
sdk.dataExchange.appReplyExec(model: sendModel)
}
else if (model is IDOBleIngExchangeModel) {
let obj = model as? IDOBleIngExchangeModel
let sendModel = IDOBleIngReplyExchangeModel(baseModel: obj?.baseModel, distance: obj?.distance)
sdk.dataExchange.appReplyExec(model: sendModel)
}
else if (model is IDOBleEndExchangeModel) {
let obj = model as? IDOBleEndExchangeModel
let sendModel = IDOBleEndReplyExchangeModel(baseModel: obj?.baseModel, retCode: 0)
sdk.dataExchange.appReplyExec(model: sendModel)
}
else if (model is IDOBlePauseExchangeModel) {
let obj = model as? IDOBlePauseExchangeModel
let sendModel = IDOBlePauseReplyExchangeModel(baseModel: obj?.baseModel, retCode: 0)
sdk.dataExchange.appReplyExec(model: sendModel)
}
else if (model is IDOBleRestoreExchangeModel) {
let obj = model as? IDOBleRestoreExchangeModel
let sendModel = IDOBleRestoreReplyExchangeModel(baseModel: obj?.baseModel, retCode: 0)
sdk.dataExchange.appReplyExec(model: sendModel)
}
else if (model is IDOAppBlePauseExchangeModel) {
let obj = model as? IDOAppBlePauseExchangeModel
let sendModel = IDOAppBlePauseReplyExchangeModel(baseModel: obj?.baseModel, errCode: 0)
sdk.dataExchange.appReplyExec(model: sendModel)
}
else if (model is IDOAppBleRestoreExchangeModel) {
let obj = model as? IDOAppBleRestoreExchangeModel
let sendModel = IDOBleRestoreReplyExchangeModel(baseModel: obj?.baseModel, retCode: 0)
sdk.dataExchange.appReplyExec(model: sendModel)
}
else if (model is IDOAppBleEndExchangeModel) {
let obj = model as? IDOAppBleEndExchangeModel
let sendModel = IDOAppBleEndReplyExchangeModel(baseModel: baseModel,
errCode: 0,
duration: obj?.duration,
calories: obj?.calories,
distance: obj?.distance)
sdk.dataExchange.appReplyExec(model: sendModel)
}
}
func appListenAppExec(model: NSObject) {
if (model is IDOAppStartReplyExchangeModel) {
let obj = model as? IDOAppStartReplyExchangeModel
print("sport started now : \(String(describing: obj))")
//* - 0: Success; 1: The device has entered sports mode and failed;
//* - 2: Failed due to low device power; 3: The bracelet is charging
//* - 4: Using Alexa 5: Calling
guard obj?.retCode == 0 else {
textConsole.text = "sport failed to launch, because of \(String(describing: obj?.retCode))"
return
}
textConsole.text = "sport launched successfully"
disposeTimer = DisposeBag()
Observable<Int>.interval(.seconds(Constant.intervalExchangeData), scheduler: MainScheduler.instance)
.subscribe(onNext: { [weak self] value in
self?.exchangeData()
})
.disposed(by: disposeTimer)
Observable<Int>.interval(.seconds(Constant.intervalExchangeCompleteData), scheduler: MainScheduler.instance)
.subscribe(onNext: { [weak self] value in
self?.exchangeCompleteData()
})
.disposed(by: disposeTimer)
Observable<Int>.interval(.seconds(Constant.intervalExchangeHrData), scheduler: MainScheduler.instance)
.subscribe(onNext: { [weak self] value in
self?.exchangeV3HrData()
})
.disposed(by: disposeTimer)
}
else if (model is IDOAppEndReplyExchangeModel) {
let obj = model as? IDOAppEndReplyExchangeModel
print("reply for app's end reply: \(String(describing: obj))")
}
else if (model is IDOAppIngReplyExchangeModel) {
let obj = model as? IDOAppIngReplyExchangeModel
print("data of sport from device: \(String(describing: obj))")
}
else if (model is IDOAppPauseReplyExchangeModel) {
let obj = model as? IDOAppPauseReplyExchangeModel
print("reply for app's pause cmd: \(String(describing: obj))")
}
else if (model is IDOAppRestoreReplyExchangeModel) {
let obj = model as? IDOAppRestoreReplyExchangeModel
print("reply for app's restore cmd: \(String(describing: obj))")
}
else if (model is IDOAppIngV3ReplyExchangeModel) {
let obj = model as? IDOAppIngV3ReplyExchangeModel
print("v3 data of sport from device: \(String(describing: obj))")
}
else if (model is IDOAppOperatePlanReplyExchangeModel) {
let obj = model as? IDOAppOperatePlanReplyExchangeModel
print("reply for app's operate plan cmd: \(String(describing: obj))")
}
else if (model is IDOAppActivityDataV3ExchangeModel) {
let obj = model as? IDOAppActivityDataV3ExchangeModel
print("appActivityDataReply: ${type.model}")
duration = max(duration, obj?.durations ?? 0)
calories = max(calories, obj?.calories ?? 0)
distance = max(distance, obj?.distance ?? 0)
}
else if (model is IDOAppHrDataExchangeModel) {
let obj = model as? IDOAppHrDataExchangeModel
print("appActivityHrReply: \(String(describing: obj))")
}
else if (model is IDOAppGpsDataExchangeModel) {
let obj = model as? IDOAppGpsDataExchangeModel
print("appActivityGpsReply: \(String(describing: obj))")
}
}
func exchangeV2Data(model: IDOExchangeV2Model) {
}
func exchangeV3Data(model: IDOExchangeV3Model) {
}
}
//pause exercise
val model = IDOAppPauseExchangeModel(baseModel)
sdk.dataExchange.appExec(IDOAppExecType.appPause(model))
//end exercise
val model = IDOAppBleEndReplyExchangeModel(0, duration, calories, distance, baseModel)
sdk.dataExchange.appReplyExec(IDOAppReplyType.appBleEndReply(model))
sdk.dataExchange.getLastActivityData()
if (sdk.dataExchange.supportV3ActivityExchange) {
sdk.dataExchange.getActivityHrData()
}
sdk.dataExchange.addExchange(object : IDOExchangeDataDelegate {
override fun appListenBleExec(type: IDOBleExecType) {
when (type) {
is IDOBleExecType.appBleEnd -> {
//The movement initiated by app is initiated and ended by ble
log("appBleEnd: ${type.model}")
mHandler.removeCallbacksAndMessages(null)
val model = IDOAppBleEndReplyExchangeModel(0, duration, calories, distance, baseModel)
sdk.dataExchange.appReplyExec(IDOAppReplyType.appBleEndReply(model))
}
is IDOBleExecType.appBlePause -> {
//App-initiated movement ble initiates pause
log("appBlePause: ${type.model}")
val model = IDOAppBlePauseReplyExchangeModel(0, baseModel)
sdk.dataExchange.appReplyExec(IDOAppReplyType.appBlePauseReply(model))
}
is IDOBleExecType.appBleRestore -> {
//App-initiated movement ble initiates recovery
log("appBleRestore: ${type.model}")
val model = IDOAppBleRestoreReplyExchangeModel(0, baseModel)
sdk.dataExchange.appReplyExec(IDOAppReplyType.appBleRestoreReply(model))
}
//The movement initiated by app is initiated and ended by ble
is IDOBleExecType.bleEnd -> {
log("bleEnd: ${type.model}")
val model = IDOBleEndReplyExchangeModel(0, baseModel)
sdk.dataExchange.appReplyExec(IDOAppReplyType.bleEndReply(model))
}
is IDOBleExecType.bleIng -> {
//motion initiated by ble ble initiated exchange
log("bleIng: ${type.model}")
val model = IDOBleIngReplyExchangeModel(0, baseModel)
sdk.dataExchange.appReplyExec(IDOAppReplyType.bleIngReply(model))
}
is IDOBleExecType.bleOperatePlan -> {
//BLE switching action
log("bleOperatePlan: ${type.model}")
}
is IDOBleExecType.blePause -> {
//motion initiated by ble ble initiates pause
log("blePause: ${type.model}")
val model = IDOBlePauseReplyExchangeModel(0, baseModel)
sdk.dataExchange.appReplyExec(IDOAppReplyType.blePauseReply(model))
}
is IDOBleExecType.bleRestore -> {
//motion initiated by ble ble initiates recovery
log("bleRestore: ${type.model}")
val model = IDOBleRestoreReplyExchangeModel(0, baseModel)
sdk.dataExchange.appReplyExec(IDOAppReplyType.bleRestoreReply(model))
}
is IDOBleExecType.bleStart -> {
//The movement initiated by ble starts when initiated by ble
log("bleStart: ${type.model}")
val model = IDOBleStartReplyExchangeModel(type.model.operate, 0, baseModel)
sdk.dataExchange.appReplyExec(IDOAppReplyType.bleStartReply(model))
}
}
}
override fun appListenAppExec(type: IDOBleReplyType) {
when (type) {
is IDOBleReplyType.appEndReply -> {
//app initiates and ends ble reply
log("reply for app's end reply: ${type.model}")
mHandler.removeCallbacksAndMessages(null)
}
is IDOBleReplyType.appIngReply -> {
//app initiates exchange ble reply
log("data of sport from device: ${type.model}")
}
is IDOBleReplyType.appIngV3Reply -> {
//app initiates exchange v3 reply
log("v3 data of sport from device: ${type.model}")
}
is IDOBleReplyType.appOperatePlanReply -> {
log("reply for app's operate plan cmd: ${type.model}")
}
is IDOBleReplyType.appPauseReply -> {
// app initiates pause ble reply
log("reply for app's pause cmd: ${type.model}")
}
is IDOBleReplyType.appRestoreReply -> {
//APP initiates recovery
log("reply for app's restore cmd: ${type.model}")
}
is IDOBleReplyType.appStartReply -> {
//app initiates start ble reply
log("sport started now : ${type.model}")
if (type.model?.retCode != 0) {
//* - 0: Success; 1: The device has entered sports mode and failed;
//* - 2: Failed due to low device power; 3: The bracelet is charging
//* - 4: Using Alexa 5: Calling
tv_response.text = "sport failed to launch, because of ${type.model?.retCode}"
return
}
tv_response.text = "sport launched successfully"
mHandler.postDelayed(object : Runnable {
override fun run() {
mHandler.postDelayed(this, INTERVAL_EXCHANGE_DATA)
exchangeData()
}
}, INTERVAL_EXCHANGE_DATA)
mHandler.postDelayed(object : Runnable {
override fun run() {
mHandler.postDelayed(this, INTERVAL_EXCHANGE_COMPLETE_DATA)
exchangeCompleteData()
}
}, INTERVAL_EXCHANGE_COMPLETE_DATA)
mHandler.postDelayed(object : Runnable {
override fun run() {
mHandler.postDelayed(this, INTERVAL_EXCHANGE_COMPLETE_DATA)
exchangeV3HrData()
}
}, INTERVAL_EXCHANGE_HR_DATA)
}
is IDOBleReplyType.appActivityDataReply -> {
//result for exchangeCompleteData
val model = type.model
log("appActivityDataReply: ${type.model}")
duration = max(duration, model?.durations ?: 0)
calories = max(calories, model?.calories ?: 0)
distance = max(distance, model?.distance?: 0)
}
is IDOBleReplyType.appActivityGpsReply -> {
log("appActivityGpsReply: ${type.model}")
}
is IDOBleReplyType.appActivityHrReply -> {
log("appActivityHrReply: ${type.model}")
}
}
}
override fun exchangeV2Data(model: IDOExchangeV2Model) {
// log("exchangeV2Data: ${GsonUtil.toJson(model)}")
}
override fun exchangeV3Data(model: IDOExchangeV3Model) {
// log("exchangeV3Data: ${GsonUtil.toJson(model)}")
}
})
override fun appListenAppExec(type: IDOBleReplyType) {
when (type) {
is IDOBleReplyType.appEndReply -> {
//app initiates and ends ble reply
log("reply for app's end reply: ${type.model}")
mHandler.removeCallbacksAndMessages(null)
}
is IDOBleReplyType.appIngReply -> {
//app initiates exchange ble reply
log("data of sport from device: ${type.model}")
}
is IDOBleReplyType.appIngV3Reply -> {
//app initiates exchange v3 reply
log("v3 data of sport from device: ${type.model}")
}
is IDOBleReplyType.appOperatePlanReply -> {
log("reply for app's operate plan cmd: ${type.model}")
}
is IDOBleReplyType.appPauseReply -> {
// app initiates pause ble reply
log("reply for app's pause cmd: ${type.model}")
}
is IDOBleReplyType.appRestoreReply -> {
//APP initiates recovery
log("reply for app's restore cmd: ${type.model}")
}
is IDOBleReplyType.appStartReply -> {
//app initiates start ble reply
log("sport started now : ${type.model}")
if (type.model?.retCode != 0) {
//* - 0: Success; 1: The device has entered sports mode and failed;
//* - 2: Failed due to low device power; 3: The bracelet is charging
//* - 4: Using Alexa 5: Calling
tv_response.text = "sport failed to launch, because of ${type.model?.retCode}"
return
}
tv_response.text = "sport launched successfully"
mHandler.postDelayed(object : Runnable {
override fun run() {
mHandler.postDelayed(this, INTERVAL_EXCHANGE_DATA)
exchangeData()
}
}, INTERVAL_EXCHANGE_DATA)
mHandler.postDelayed(object : Runnable {
override fun run() {
mHandler.postDelayed(this, INTERVAL_EXCHANGE_COMPLETE_DATA)
exchangeCompleteData()
}
}, INTERVAL_EXCHANGE_COMPLETE_DATA)
mHandler.postDelayed(object : Runnable {
override fun run() {
mHandler.postDelayed(this, INTERVAL_EXCHANGE_COMPLETE_DATA)
exchangeV3HrData()
}
}, INTERVAL_EXCHANGE_HR_DATA)
}
is IDOBleReplyType.appActivityDataReply -> {
//result for exchangeCompleteData
val model = type.model
log("appActivityDataReply: ${type.model}")
duration = max(duration, model?.durations ?: 0)
calories = max(calories, model?.calories ?: 0)
distance = max(distance, model?.distance?: 0)
}
is IDOBleReplyType.appActivityGpsReply -> {
log("appActivityGpsReply: ${type.model}")
}
is IDOBleReplyType.appActivityHrReply -> {
log("appActivityHrReply: ${type.model}")
}
}
}
override fun exchangeV2Data(model: IDOExchangeV2Model) {
log("exchangeV2Data: ${GsonUtil.toJson(model)}")
}
override fun exchangeV3Data(model: IDOExchangeV3Model) {
log("exchangeV3Data: ${GsonUtil.toJson(model)}")
}