You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

12 KiB

ECellBluetooth

ECellBluetooth applies to all bluetooth devices, provides the connection management, quick and convenient and OTA upgrade instructions sent.

Project configuration

  • Reference header file
#import <ECellBluetooth/ECellBluetooth.h>
  • Project demo directory Scan 扫描连接外设demo | Scan the connected peripherals demo Function 所有指令发送demo | All instructions sent the demo Firmware 固件升级指引 | Firmware upgrade guide DialPush 表盘推送demo | Dial push demo
  • Project configuration Targets -> Info->Privacy -> Bluetooth Peripheral Usage Description Targets -> Capabilities -> Background Modes -> Uses Bluetooth LE accessories Targets -> Embedded Binaries -> add IOSDFULibrary.framework and Zip.framework
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
#ifdef DEBUG
    [[ECellBluetoothManager shareInstance] registrationServices:YES IsReconnect:YES];
#else
    [[ECellBluetoothManager shareInstance] registrationServices:NO IsReconnect:YES];
#endif
    return YES;
}

Architecture

#import <ECellBluetooth/ECellBLEEnum.h>
#import <ECellBluetooth/ECellBLENotify.h>
#import <ECellBluetooth/ECellPeripheralModel.h>
#import <ECellBluetooth/ECellDeviceInfoModel.h>
#import <ECellBluetooth/ECellBluetoothManager.h>
#import <ECellBluetooth/ECellCommandProvider.h>

<HPlusBluetooth/HPlusCommandProvider.h>

======= Get Command =======
/// 获取固件版本信息 | Get firmware information
+ (void)getFirmwareInfoCommand:(void(^_Nullable)(ECell_BLE_COMMAND_ERROR_TYPE errorType, NSDictionary *_Nullable json))callback;
{
    adapterNumber = 1001;
    deviceName = "ZW12";
    firmwareVersion = "1.0.5";
    macAddress = "EE:DB:22:17:61:A2";
    platform = 0;
    protocolVersion = "1.0";
}

/// 获取电量 | Get attery
+ (void)getBatteryCommand:(void(^_Nullable)(ECell_BLE_COMMAND_ERROR_TYPE errorType, NSDictionary *_Nullable json))callback;
status: (0: 未充电 1: 充电完成 2: 正在充电 | 0: not charged 1: charging completed 2: charging in progress)
{
    power = 100;
    status = 0;
}

/// 获取配置信息 | Get configuration information
+ (void)getProfileCommand:(void(^_Nullable)(ECell_BLE_COMMAND_ERROR_TYPE errorType, NSDictionary *_Nullable json))callback;
cycle: 重复 0:表示仅一次 1:表示每天重复(bit0 - bit6分别表示周一到周日的重复设置,所有位都为0时,表示只提醒一次) | Repeat 0: only once 1: every day (bit0-bit6 is the repeat setting from Monday to Sunday, and when all bits are 0, it is only reminded once)
label: 0:闹钟 1:会议 | 0: Alarm clock 1: Meeting
hand 0:左手 1:右手 | 0: left hand 1: right hand
raise 0:抬手亮屏关闭  1:抬手亮屏开启 | 0: turn off the bright screen 1: turn on the bright screen
flip 0:翻腕亮屏关闭  1:翻腕亮屏开启 | 0: turn wrist bright screen off 1: turn wrist bright screen on
drinkRemind(interval): 间隔(分钟)| interval(min)
heartRateCheck(interval): 间隔(分钟)10的倍数 | interval(min)
remindType: 提醒方式 1:亮屏 2:震动 3:亮屏+震动 | Reminder 1: bright screen 2: vibration 3: bright screen + vibration
genger: 性别 0:女 1:男 | 0: female 1: male
sittingTime: 久坐时间(分钟)超过这个时间提醒 | Sitting time (min) Over this time reminder
sittingThreshold: 久坐阈值(步数)以小时为单位久坐时间内,步数低于这个阈值才提醒 | Sedentary threshold(Step)
sportMode: 0: 日常计步 1:走路 2: 跑步 3: 骑行 4: 爬山 | 0: daily step counting 1: walking 2: running 3: cycling 4: climbing
{
    alarmClock =     (
                {
            cycle = 0;
            hour = 0;
            isOpen = 0;
            label = 0;
            min = 0;
        },
                {
            cycle = 0;
            hour = 0;
            isOpen = 0;
            label = 0;
            min = 0;
        },
                {
            cycle = 0;
            hour = 0;
            isOpen = 0;
            label = 0;
            min = 0;
        },
                {
            cycle = 0;
            hour = 0;
            isOpen = 0;
            label = 0;
            min = 0;
        },
                {
            cycle = 0;
            hour = 0;
            isOpen = 0;
            label = 0;
            min = 0;
        }
    );
    drinkRemind =     {
        cycle = 0;
        endHour = 21;
        interval = 120;
        isOpen = 0;
        startHour = 7;
    };
    handUp =     {
        flip = 0;
        hand = 0;
        raise = 0;
    };
    heartRateCheck =     {
        endHour = 13;
        interval = 30;
        isOpen = 0;
        startHour = 11;
    };
    notDisturb =     {
        endHour = 0;
        isOpen = 1;
        startHour = 0;
    };
    remindMode =     {
        remindType = 0;
    };
    sedentary =     {
        cycle = 1;
        endHour = 18;
        isOpen = 0;
        sittingThreshold = 200;
        sittingTime = 60;
        startHour = 8;
    };
    setPush =     {
        isOpen = 61;
    };
    target =     {
        sportMode = 0;
        targetSteps = 8917760;
    };
    userInfo =     {
        age = 30;
        gender = 0;
        goalStep = 8917760;
        height = 170;
        sportMode = 0;
        weight = 65;
    };
}

/// 获取当前实时数据 | Get the current real-time data
/// @param type 1:睡眠 2:心率 3:计步 4:运动模式 | 1: sleep 2: heart rate 3: count steps 4: exercise mode
+ (void)getRealTimeDataCommandType:(NSInteger)type
                         callback:(void(^_Nullable)(ECell_BLE_COMMAND_ERROR_TYPE errorType, NSDictionary *_Nullable json))callback;
type: 3                         
{
    stepCalorie = 0;
    stepDistance = 0;
    stepNumber = 0;
    timestamp = 1591637040;
}
type: 2
{
    heartRate = 80;
    timestamp = 1591637160;
}

/// 获取指定日期健康数据 | Gets health data for the specified date
/// @param type 1:睡眠,2:心率,3:计步,4:运动 5:血压 6:血氧 | 1: sleep, 2: heart rate, 3: step counting, 4: exercise 5: blood pressure 6: blood oxygen
/// @param year 年
/// @param month 月
/// @param day 日
/// 设备最多保存七天数据 | The device holds data for up to seven days
+ (void)getHealthDataCommandType:(NSInteger)type
                            year:(NSInteger)year
                           month:(NSInteger)month
                             day:(NSInteger)day
                        callback:(void(^_Nullable)(ECell_BLE_COMMAND_ERROR_TYPE errorType, NSDictionary *_Nullable json))callback;
class StepModel {
    // mac地址
    var macID: String = ""
    /// 计步日期(2017-01-16)
    var dataDate: String = ""
    /// 步数
    var stepNumber: Int = 0
    /// 计步距离(米)
    var stepDistance: Int = 0
    /// 计步卡路里(千卡)
    var stepCalorie: Float = 0
    /// 计步时长(分钟)
    var stepDuration: Int = 0
    /// 计步详情(step|cal|m|时段,...)
    var stepDetails: String = "0|0.0|0.0|0,0|0.0|0.0|1,0|0.0|0.0|2,0|0.0|0.0|3,0|0.0|0.0|4,0|0.0|0.0|5,0|0.0|0.0|6,0|0.0|0.0|7,0|0.0|0.0|8,0|0.0|0.0|9,0|0.0|0.0|10,0|0.0|0.0|11,0|0.0|0.0|12,0|0.0|0.0|13,0|0.0|0.0|14,0|0.0|0.0|15,0|0.0|0.0|16,0|0.0|0.0|17,0|0.0|0.0|18,0|0.0|0.0|19,0|0.0|0.0|20,0|0.0|0.0|21,0|0.0|0.0|22,0|0.0|0.0|23"
}

class SleepModel {
    // mac地址
    var macID: String = ""
    /// 睡眠日期(2018-06-20)
    var dataDate: String = ""
    /// 深睡时长
    var deepSleepDuration: Int = 0
    /// 浅睡时长
    var lightSleepDuration: Int = 0
    /// 清醒时长
    var awakeDuration: Int = 0
    /// 总睡眠时长
    var totalSleepDuration: Int = 0
    /// 入睡时间(2020-04-16 21:04)
    var fallingSleepTimes: String = ""
    /// 醒来时间
    var awakeTimes: String = ""
    /// 醒来次数
    var awakeNumber: Int = 0
    /// 睡眠详情数据(睡眠类型|开始时间戳|持续时长|结束时间戳,..) 睡眠类型:0: 未进入睡眠 1:轻度睡眠 2:深度睡眠
    var sleepDetails: String = ""
    
    func getToatlSleepTimeStr() -> String {
        return "\(totalSleepDuration / 60)h \(totalSleepDuration % 60)m"
    }
}

class HeartRateModel {
    // mac地址
    var macID: String = ""
    /// 心率日期(2018-06-20)
    var dataDate: String = ""
    /// 最大心率
    var heartMax: Int = 0
    /// 最小心率
    var heartMin: Int = 0
    /// 平均心率
    var heartAvg: Int = 0
    /// 心率详情(心率值|时间戳,...)
    var heartDetails: String = ""
}

class SportModel {
    /// mac地址
    var macID: String = ""
    /// 运动时间(2017-12-17 10:20:20)
    var dataDate: String = ""
    /// 版本号
    var verison: Int = 0
    /// 运动类型 1.健走 2.户外跑 3.室内跑 4.登山 5.越野跑 6.半马 7.全马 8.跳绳 9.羽毛球 10.篮球 11.骑行 12.滑冰 13.健身房 14.瑜伽 15.网球 16.兵乓球 17.足球 18.游泳 19.性爱 20.室内骑行 21.室内健走22.自由训练
    var sportType: Int = 0
    /// 运动时长(秒)
    var duration: Int = 0
    /// 距离(米)
    var distance: Int = 0
    /// 卡路里(千卡)
    var calorie: Float = 0
    /// 运动步数(划水次数,仅游泳模式使用)
    var stepNumber: Int = 0
    /// 最大心率
    var heartMax: Int = 0
    /// 平均心率
    var heartAvg: Int = 0
    /// 最小心率
    var heartMin: Int = 0
    /// 最大步频(泳池长度)
    var stepFrequencyMax: Int = 0
    /// 平均步频(游泳效率SWOLF)
    var stepFrequencyAvg: Int = 0
    /// 最小步频(泳姿)
    var stepFrequencyMin: Int = 0
    /// 最大配速(s)
    var paceMax: Int = 0
    /// 平均配速(s)
    var paceAvg: Int = 0
    /// 最小配速(s)
    var paceMin: Int = 0
    /// 开始绝对海拔
    var startAltitude: Int = 0
    /// 结束绝对海拔
    var endAltitude: Int = 0
    /// GPS个数
    var gpsCount: Int = 0
    /// 公里牌个数
    var kmCount: Int = 0
    /// 步数个数
    var stepCount: Int = 0
    /// 心率个数
    var heartCount: Int = 0
    /// 趟数详情个数
    var trainDetailCount: Int = 0
    /// GPS时间
    var gpsTimestamp: Int = 0
    /// GPS数组(时间差|纬度|经度|海拔,...)
    var gpsDeatail: String = ""
    /// 公里牌数组(时间戳|纬度|经度|步数,...)
    var kmDetail: String = ""
    /// 步数时间
    var stepTimestamp: Int = 0
    /// 步数数组(时间差|步数|距离(m),...)
    var stepDetail: String = ""
    /// HRS时间戳
    var hrsTimestamp: Int = 0
    /// HRS数组(时间差(默认为5S)|心率(未采样到为0))
    var hrsDetail: String = ""
    /// 游泳详细数组(时间戳|仰泳划水次数|蛙泳划水次数|蝶泳划水次数|自由泳划水次数|混合泳划水次数)
    var swimmingDetail: String = ""
    
    // MARK:- 计算属性
    /// 全程步频(步/分钟)
    var stepFrequency: Int {
        if stepNumber <= 0 {
            return 0
        }
        let temp = Float(stepNumber) / (Float(duration) / 60.0)
        return lroundf(temp + 0.5)
    }
    /// 全程步幅(厘米)
    var stride: Int {
        if stepNumber <= 0 {
            return 0
        }
        return (distance * 100) / stepNumber
    }
}
                
======= Listen Command =======
ECell_BLE_REPORT_COMMAND_realStep
{
    stepCalorie = 0;
    stepDistance = 10;
    stepNumber = 18;
    timestamp = 1591637580;
}
ECell_BLE_REPORT_COMMAND_realHeartRate
{
    heartRate = 65;
    timestamp = 1591637580;
}
ECell_BLE_REPORT_COMMAND_realBloodPressure
ECell_BLE_REPORT_COMMAND_realBloodOxyge
ECell_BLE_REPORT_COMMAND_cameraControl
state: 0:退出 1:打开相机 2:拍照(只设备发手机) | 0: exit 1: open camera 2: Take photos (send mobile phone only)
{
    state = 0;
}
ECell_BLE_REPORT_COMMAND_findPhone