Skip to content

Entertech/Enter-Native-SDK-iOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 

Repository files navigation

回车科技iOS情感计算本地算法SDK

回车情感计算根据回车产品采集的脑电、心率以及压电压阻进行数据分析,同时能给出包括:放松度、注意力、愉悦值,压力值、激动度(内测)在内的多种情绪情感值。详情请查看官网

在开始开发前,请先查看回车开发文档,了解情感计算算法所能提供的服务具体说明,确定好你的应用中所需要的服务。你还需要联系管理员获取算法授权文件,然后再进行开发。

为了方便你进行 iOS 平台的快速开发,我们提供了情感云快速开发 SDK,通过本 SDK 你可以快速地将情感云的能力集成到你的 app 中。

版本需求

  • iOS 14 及以上(不支持模拟器)
  • Xcode 13 及以上
  • Swift 5.5 及以上

安装

Swift Package Manager

Package添加下面这行到你的 Package.swift:

.package(name: "Enter-Native-SDK-iOS", url: "https://github.com/Entertech/Enter-Native-SDK-iOS.git", from: "1.0.1")

Project添加下面的链接到你的 Package Dependencies 中:

https://github.com/Entertech/Enter-Native-SDK-iOS.git

使用

使用流程

SDK在使用过程中,按照 初始化->进行授权->实时数据计算->获取报表->释放(ARC自动释放) 的流程进行。

头文件引用

XCODE 13版本及以上创建的工程可以直接添加以下头文件:

import AffectiveAlgorithmSDK_iOS

早期版本工程可以在Bridge-Header.h中添加以下头文件:

#import <AffectiveAlgorithmSDK_iOS/AffectiveWrapper.h>

接口头文件查看

所有用到的接口和封装对象都在AffectiveWrapper.h中。

初始化SDK

AffectiveHandler 是整个 SDK 的入口类,你需要先初始化 AffectiveHandler

class Demo {
    var handler: AffectiveHandler?
    
    init {
        handler = AffectiveHandler()
    }
    
    ......
}

设置授权信息

如果你获得了回车科技的授权,会得到一个授权文件ENTERTECH_NATIVE_SDK_LICENSE.txt,你需要将该文件加入工程,然后在初始化 SDK 之前设置授权信息:

    // 获取授权文件路径
    guard let path = Bundle.main.path(forResource: "ENTERTECH_NATIVE_SDK_LICENSE", ofType: "txt") else {
        return false
    }
    // 验证授权
    guard let auth = handler?.auth(fromBundle: path), auth else {
        //验证失败
        return false
    }

授权失败

  • 无法找到path
    • 如果加入了文件还是无法找到path,请检查是否添加了Copy items if neededAdd to targets
  • auth 返回false
    • 确认授权文件是否有改动。

实时数据计算

将蓝牙数据的回调Data类型数据传入,关于蓝牙部分请参考回车蓝牙SDK

数据转化

因为算法用Objective-C封装,需要对蓝牙传过来的Data类型转化才可使用,此处data为蓝牙回调数据。

    // 心率转化, 心率只有首个字节是有效数据
    let mutableArray = NSMutableArray()
    if let hr = data.first {
        mutableArray.add(NSNumber(value: hr))
    }
    
    // 脑波,压电压阻转化
    let mutableArray = NSMutableArray()
    data.forEach { byte in
        mutableArray.add(NSNumber(value: byte))
    }

心率计算

心率累计3组数据数据进行一次计算并返回结果,不计算时返回nil。

    // 先判断是否可用, 未通过授权是不可用状态
    guard let hrEnable = handler?.getHREnable(), hrEnable else {
        return
    }
    if let result = handler?.appendHR(mutableArray) {
        // 此处对 result 进行处理, result 类型`HRAffectiveResOC` 在上方`接口头文件查看`可找到查看入口
    }

双通道脑电计算

双通道脑电累计50组数据进行一次计算并返回结果,不计算时返回nil。

    // 先判断是否可用, 未通过授权是不可用状态
    guard let eegEnable = handler?.getEEGEnable(), eegEnable else {
        return
    }
    if let result = handler?.appendEEG(mutableArray, isEar: false) {
        // 此处对 result 进行处理, result 类型`EEGAffectiveResOC` 在上方`接口头文件查看`可找到查看入口
    }

单通道脑电计算

单通道脑电累计30组数据进行一次计算并返回结果,不计算时返回nil。

    // 先判断是否可用, 未通过授权是不可用状态
    guard let sceegEnable = handler?.getSCEEGEnable(), sceegEnable else {
        return
    }
    if let result = handler?.appendSCEEG(mutableArray, isEar: false) {
        // 此处对 result 进行处理, result 类型`SCEEGAffectiveResOC` 在上方`接口头文件查看`可找到查看入口
    }

压电压阻计算

压电压阻累计15组数据进行一次计算并返回结果,不计算时返回nil。

    // 先判断是否可用, 未通过授权是不可用状态
    guard let peprEnable = handler?.getPEPREnable(), peprEnable else {
        return
    }
    if let result = handler?.appendPEPR(mutableArray) {
        // 此处对 result 进行处理, result 类型`PEPRAffectiveResOC` 在上方`接口头文件查看`可找到查看入口
    }

报表获取

完成数据计算后可以获取报表,不进行计算直接获取报表,会得到空报表。

心率报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let hrEnable = handler?.getHREnable(), hrEnable else {
        return
    }
    if let report = handler?.getHRReport() {
        // 此处对 report 进行处理, report 类型`HRReportResOC` 在上方`接口头文件查看`可找到查看入口
    }

双通道脑电报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let eegEnable = handler?.getEEGEnable(), eegEnable else {
        return
    }
    if let report = handler?.getEEGReport() {
        // 此处对 report 进行处理, report 类型`EEGReprotResOC` 在上方`接口头文件查看`可找到查看入口
    }

单通道脑电报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let sceegEnable = handler?.getSCEEGEnable(), sceegEnable else {
        return
    }
    if let report = handler?.getSCEEGReport() {
        // 此处对 report 进行处理, report 类型`SCEEGReportResOC` 在上方`接口头文件查看`可找到查看入口
    }

压电压阻报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let peprEnable = handler?.getPEPREnable(), peprEnable else {
        return
    }
    if let report = handler?.getPEPRReport() {
        // 此处对 report 进行处理, report 类型`PEPRReportResOC` 在上方`接口头文件查看`可找到查看入口
    }

睡眠报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let sleepEnable = handler?.getSleepEnable(), sleepEnable else {
        return
    }
    if let report = handler?.getSleepReport() {
        // 此处对 report 进行处理, report 类型`SleepReportResOC` 在上方`接口头文件查看`可找到查看入口
    }

放松度报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let relaxEnable = handler?.getRelaxationEnable(), relaxEnable else {
        return
    }
    if let report = handler?.getRelaxationReport() {
        // 此处对 report 进行处理, report 类型`RelaxationReportResOC` 在上方`接口头文件查看`可找到查看入口
    }

注意力报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let attentionEnable = handler?.getAttentionEnable(), attentionEnable else {
        return
    }
    if let report = handler?.getAttentionReport() {
        // 此处对 report 进行处理, report 类型`AttentionReportResOC` 在上方`接口头文件查看`可找到查看入口
    }

压力报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let pressureEnable = handler?.getPressureEnable(), pressureEnable else {
        return
    }
    if let report = handler?.getPressureReport() {
        // 此处对 report 进行处理, report 类型`PressureReportResOC` 在上方`接口头文件查看`可找到查看入口
    }

心流报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let flowEnable = handler?.getFlowEnable(), flowEnable else {
        return
    }
    if let report = handler?.getFlowReport() {
        // 此处对 report 进行处理, report 类型`FlowReportResOC` 在上方`接口头文件查看`可找到查看入口
    }

和谐度报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let coherenceEnable = handler?.getCoherenceEnable(), coherenceEnable else {
        return
    }
    if let report = handler?.getCoherenceReport() {
        // 此处对 report 进行处理, report 类型`CoherenceReportResOC` 在上方`接口头文件查看`可找到查看入口
    }

愉悦度报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let pleasureEnable = handler?.getPleasureEnable(), pleasureEnable else {
        return
    }
    if let report = handler?.getPleasureReport() {
        // 此处对 report 进行处理, report 类型`PleasureReportResOC` 在上方`接口头文件查看`可找到查看入口
    }

激活度报表

    // 先判断是否可用, 未通过授权是不可用状态
    guard let arousalEnable = handler?.getArousalEnable(), arousalEnable else {
        return
    }
    if let report = handler?.getArousalReport() {
        // 此处对 report 进行处理, report 类型`ArousalReportResOC` 在上方`接口头文件查看`可找到查看入口
    }

注意事项

  • 注意循环引用等问题引起内存无法释放,会导致内存溢出。
  • 计算过程中释放可能会导致内存错误,请确保没有数据后(大约停止蓝牙给数据1秒后)再进行释放

About

Native Affective Algorithm For iOS

Resources

Stars

Watchers

Forks

Packages

No packages published