Version | Date | Owner | Description |
---|---|---|---|
0.1.0 | 2016/04/18 | J.R | .First release version |
0.1.1 | 2016/04/22 | J.R | 运动数据结构体增加正手(反手)和上手(下手) |
0.1.2 | 2016/05/26 | J.R | DEVICE信息中添加固件和软件版本信息修改原来设置软件版本为3个byte(固件1byte+软件2byte) |
1.1数据包协议格式
16进制格式:
CMD | LEN | DATA0 | ~ | DATAn | CRC | 0 |
---|---|---|---|---|---|---|
1Byte | 1Byte | 1Byte | 1Byte | 1Byte | 1Byte |
说明:
CMD:表示命令类型
LEN:表示参数长度(DATA0~DATAn),LEN = n
CRC:包校验和, = SUM(CMD+LEN+DATA0+…+DATAn)
0: CRC后附带包结束标志符
1.1.1APP发送命令给设备
示例说明1:获取设备用户信息命令:CI_GET_DINFO = 0x01(不带参数)
CMD | LEN | CRC | 0 |
---|---|---|---|
1Byte | 1Byte | 1Byte | 1Byte |
CI_GET_DINFO | 0 | 0 | 0 |
完整命令:0x 01 00 01 00、
示例说明2:设置实时时间命令:CI_SET_RTC_TIME = 0x04(带参数)
CMD | LEN | DATA0 | DATA1 | DATA2 | DATA3 | DATA4 | DATA5 | CRC0 |
---|---|---|---|---|---|---|---|---|
04 | 6 | Year | Month | Day | Hour | Minute | Second | Crc |
完整命令:0x 04061004 12 0C 38 1E 92 00
即设置时间:16-04-18 12:56:30
1.1.2 DEVICE发送数据给设备
APP发给设备的命令是否接收到以及命令是否有效,是由设备以notification的方式通过RET UUID回给APP端的。该信息只用于Set Flow和Get Flow返回状态的数据结构如下:
/**************** RET FLOW ************************/
typedef struct{
u8 cmd; //Cmd
u8 len; //Length of data
u8 status; //state of status //00 Success 01 Failure
u8 CrcVal; //CRC Val
u8 EndVal; //End Val = 0
}RET_NOTI_T,*P_RET_NOTI_T;
说明:
Cmd – 为对应的命令,如果等于0xff,这表示不识别的命令。
status – 一般情况下,返回0。如果是不支持的命令返回1。
示例说明1:回复获取设备用户信息命令:CI_GET_DINFO = 0x01
CMD | LEN | DATA0 | … | DATA10 | CRC | 0 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
01 | 0B | mid | typeid | pid | name | … | name[7] | CRC | 0 |
示例说明2:命令收到并执行后回复(不带参数):
CMD | LEN | status | CRC | 00 | |
---|---|---|---|---|---|
Cmd | 01 | 00 | 01+cmd | 00 | 返回成功 |
Cmd | 01 | 01 | 02+cmd | 00 | 返回失败 |
完整命令:
Status = 0x00,成功执行收到的命令
Status = 0x01,成功执行收到的命令
示例说明3:对于不支持命令收到并执行后回复(不带参数):
CMD | LEN | status | CRC | 00 | |
---|---|---|---|---|---|
FE | 01 | 01 | 00 | 00 | 返回失败 |
完整命令:0x FE 01 01 00 00,成功执行收到的命令
1.1.3数据流程图
1.2APP发给设备的命令–APP write to设备命令类型
如下:
enum
{
CMD_GET_DINFO = 1,/*获取设备信息*/
CMD_SET_UINFO = 2,/*设置用户信息*/
CMD_GET_UINFO = 3,/*获取用户信息*/
CMD_RTC_TIME = 4,/*设置实时时钟*/
CMD_RT_SYNC_DATA = 5,/*实时数据同步*/
CMD_HISTORY_STATE = 8,/*获取历史数据状态*/
CMD_HISTORY_SYNC = 9,/*启动运动,睡眠监控数据,心率数据同步*/
CMD_COUNTER_OPEN = 0x21,/*Gsensor数据上传功能打开*/
CMD_COUNTER_CLOSE = 0x22,/* Gsensor数据上传功能关闭*/
CMD_SET_SPORT = 0x26,/*设置健身目标*/
CMD_GET_SPORT = 0x27,/*得到健身目标*/
CMD_RESET_DATA = 0x31,/*重置数据(保留接口,用于腕带和球拍)*/
CMD_GET_BATTERY = 0x32,/*获得设备当前电量*/
CMD_SET_LANGUAGE = 0x35,/*设置语言*/
CMD_GET_LANGUAGE = 0x36,/*获得语言设置*/
CMD_SET_FACTORY_TEST = 0x37,/*设置工厂测试模式*/
CMD_SET_DEVICE_NAME = 0x38,/*设置设备名*/
CMD_GET_DEVICE_NAME = 0x39,/*获得设备名*/
CMD_SET_EXAM = 0x3c,/* 设置竞技模式的参数*/
CMD_GET_EXAM = 0x3d,/* 获取竞技模式的参数*/
CMD_POWERDOWN = 0x40,/*关机命令*/
CMD_SYSTEM_RESET = 0x41,/*系统重启、复位功能*/
CMD_RESTART_NEW_INNING_VAL = 0x42,/*重新开始新的一局*/
CMD_GET_MAC_ADDRESS = 0x43,/* 获取设备的MAC地址*/
CMD_SET_ROPE_LED_TYPE = 0x44,/*设置Rope LED 类型*/
CMD_GET_ROPE_LED_TYPE = 0x45,/*获取Rope LED 类型*/
CMD_SET_FW_UPDATE = 0x46,/*更新设备功能模块*/
CMD_GSENSOR_TEST_MODE = 0x47,/*加速度传感器测试模式*/
};
上面的命令分为两类,一类需要带参数,另一类不需要带参数。
命令结构体struct _ble_cmd,如下:
typedef struct _ble_cmd{
u8 cmd_id; //命令类型
u8 DataLength; //data length
union{
U16 Param;
UINFO_T uinfo; //用户信息参数
RTC_TIME_T rtctime; //时间参数
UALARM_T ualarm; //用户自定义提醒功能参数
...
}u;
u8 crcVal; //CRC value
u8 EndVal; //结束值
}BLE_CMD_T,*P_ BLE_CMD_T;
其中用作参数的数据结构会在下面每一个小节中说明。这些命令使用write的方式来实现。_ble_cmd数据结构中的cmd_id用来识别命令,_ble_cmd.u根据需要用来传递参数(尽管不是每个命令都需要参数,但为了描述方便,都采用上面的数据结构)。
1.2.1 设备信息获取命令
命令:
Cmd_id = CMD_GET_DINFO,
无参数
说明:
APP可以通过发送该命令获取设备设备信息。通过UUID 0xFFF4将用户信息以notify的方式发送给移动客户端(参看1.5.1)。该命令遵循Get Flow流程。
1.2.2 用户信息设置命令
命令:Cmd_id = CMD_SET_UINFO
参数:
typedef struct _uinfo{
u8 sex; //性别
u8 age; //年纪
u8 height; //身高
u8 weight; //体重
u8 step_len; //步长
u16 id; //设备id
}UINFO_T,*P_ UINFO_T;
说明:
sex: 性别,1表示男,2表示女。
age: 年龄。
height: 身高,以厘米为单位。
weight: 体重,以公斤为单位
step_len: 步长,以厘米为单位
APP可以通过该命令配置设备的用户信息。设备接收到该命令后,返回RET notification(参看1.4)。该命令遵循Set Flow流程
1.2.3获取用户信息命令
命令:Cmd_id = CMD_GET_UINFO,
参数:
无
说明:
APP可以通过发送该命令获取设备的用户信息。设备接收到该命令后,通过UUID 0xFFF4将用户信息以notify的方式发送给移动客户端(参看1.5.1.2)。该命令遵循Get Flow流程。
1.2.4 实时时间设置命令
命令:
Cmd = CMD_SET_RTC_TIME,
参数:
typedef struct _time{
u8 year;
u8 month;
u8 day;
u8 hour;
u8 minute;
u8 second;
}RTC_TIME_T,*P_RTC_TIME_T;
说明:
Year:年份,以2000年为基准
Month:月份,1~12
Day:天,1~31
Hour:小时,0~23
Minute:分钟,0~59
Second:秒钟,0~59
APP可以通过该命令配置设备的时间。设备接收到该命令后,返回RET notification(参看1.4)。该命令遵循Set Flow流程。
1.2.5 同步实时数据
命令:CMD = CMD_RT_SYNC_DATA
参数:
enum{//mode
ROPE_NORMAL_MODE = 0x01,
ROPE_CUT_DOWN_MODE = 0x02,
ROPE_TIME_DOWN_MODE = 0x03,
}
enum{//status
ROPE_START_MODE = 0x02,
ROPE_END_MODE = 0x03,
ROPE_ING_MODE = 0x04,
}
Typedef strcut _ropeothermode{
u8 mode; //current mode
u8 status; //current status
u16 TimeVal; //time value by seconds
u16 CounterVal; //counter value
u16 CalorieVal; //calorie value
}
说明:
rope2:跳绳实时数据上传的数据格式见上参数列表。在app端notify使能的情况下,跳绳端会以notification方式上传当前的实时数据。
1.2.6 获得历史数据状态命令
命令:CMD = CI_GET_HISTORY_STATE
参数:无。
说明:
手环设备:
app通过该命令获取设备上历史数据(运动,睡眠,心率,事件)的数量(需要强调的这里指的是未同步过的历史数据)。设备接收到该命令后,先返回RET notification(参见1.4),然后再通过UUID 0xFFF4将上述信息以notify的方式送给移动客户端(参看1.5.1.5)。该命令遵循Get Flow流程。
旧:体育器材(羽毛球,乒乓球、网球、跳绳):
APP通过发送该命令获取体育器材上历史数据(每天运动的数据)的笔数。APP收到该条命令后,先返回RET notification(参见1.4),然后再通过UUID 0xFFF4
将上述信息以notify的方式送给移动客户端的方式送给移动客户端(参看1.5.1.5)。该命令遵循Get Flow流程。
新:体育器材(网球拍,羽毛球拍):
若为最新的带有六轴传感器的体育器材,APP通过发送该命令可以获得体育器材上历史数据(所有数据的)拍数。APP收到该命令后,先返回 ret notification(参见(参见1.4),然后再通过UUID 0xFFF4(将上述的信息以nofity的方式发送给客户端的方式送给移动客户端(参见1.5.1.5)。该命令遵循Get Flow流程。
1.2.7 历史数据同步命令
命令: CMD = CI_HISTORY_SYNC
参数:
typedef struct _hissync{
U8 year;
U8 month;
U8 day;
U8 data_type;
}HISSYNC_T,*P_HISSYNC_T;
rope2://二代跳绳
typedef struct _rope_run_data{
union{
U32 para;
P_ROPERUNSTTIME RopeStartTime;
}time_u;
u16 counts; /*counter value*/
u16 duration; /*time duration*/
u16 KcalorieVal; /*calorie value*/
union{
u32 para;
P_ROPERUNCALPRARA RunPara;
}RopeRunPara_u;
}P_ROPE_RUN_DATA,*P_ROPE_RUN_DATA_T;
typedef struct _RopeRunStTime{
u32 year:6; /*year*/
u32 month:4; /*month*/
u32 day:5; /*day*/
u32 hour:5; /*hour*/
u32 min:6; /*min*/
u32 sec:6; /*second*/
}P_ROPERUNSTTIME,P_ROPERUNSTTIME_T;
Typedef struct _RopeRunCalPara{
u32 average_fre:10; /* average frequency*/
u32 max_fre:10; /*max frequency*/
u32 now_fre:10; /*now frequency*/
}P_ROPERUNCALPARA,P_ROPERUNCALPARA_T;
SpeedBall:
typedef struct _speedball_run_data{
union{
u32 para;
P_SPEEDBALLRUNSTTIME SpeedBallStartTime;
}time_u;
u16 counts; /**/
u16 duration;
//u16 KcalorieVal;//resvered
union{
u32 para;
P_SPEEDBALLFRECALPARA RunFre;
}RopeRunFre_u;
union{
u32 para;
P_SPEEDBALLSTRCALPARA RunStr;
}RopeRunStr_u;
}P_SPEEDBALL_RUN_DATA,*P_SPEEDBALL_RUN_DATA_T;
typedef struct _SpeedBallRunStTime{
u32 year:6; /*year*/
u32 month:4; /*month*/
u32 day:5; /*day*/
u32 hour:5; /*hour*/
u32 min:6; /*min*/
u32 sec:6; /*second*/
}P_SPEEDBALLRUNSTTIME,P_SPEEDBALLRUNSTTIME_T;
typedef struct _SpeedBallFreCalPara{
u32 average_fre:10; //average frequency平均多少次数
u32 max_fre:10; // max frequency//一分钟内平均
u32 critical_hit_fre:10; //now frequency//一分钟内的最大频率
}P_SPEEDBALLFRECALPARA,*P_SPEEDBALLFRECALPARA_T;
typedef struct _SpeedBallStrCalPara{
u32 max_str_value:10;//max strength value //最大力量
u32 average_str_value:10;//average strength value//平均力量
u32 now_str_value:10;//now strength value //当前力量值
}P_SPEEDBALLSTRCALPARA,*P_SPEEDBALLSTRCALPARA_T;
手环设备:
说明:
Year: 要同步的历史数据所在的年份。
Month: 要同步的历史数据所在的月份。
Day: 要同步的历史数据所在的日期。
data_type: 如果sync_state选择DATATYPE,data_type才会有意义。表示要同步的历史数据的类型。0–活动历史数据,1–睡眠监控历史数据,2–心率监控历史数据,3–事件历史数据, 4–整天的数据(包括这天的活动历史数据,睡眠监控历史数据,心率监控历史数据,事件历史数据)
APP可以通过发送该命令获取设备运动,睡眠监控信息,心率信息等。设备接收到该命令后将上述信息通过UUID 0xFFF4以notify的方式分批发送给移动客户端(参看1.5.1.6)。该命令遵循Get Flow流程。
旧:体育器材(羽毛球,乒乓球、网球、跳绳):
说明:
year: 要同步的历史数据所在的年份。
month: 要同步的历史数据所在的月份。
day: 要同步的历史数据所在的日期。
data_type:省略无意思。(只有手环说表才会用到该参数)。体育器材接受该命令后,
APP可以通过发送该命令获取运动器材具体某一天的运动数据的信息。体育器材接受到该命令以后,先返回RET notification(参看1.4),然后再将上述的信息通过UUID 0xFFF4以notify的方式分批发送给移动客户端(参看1.5.1.6)。该命令遵循Get Flow流程。
新:体育器材(网球拍,羽毛球拍):
说明:
若为带有六轴传感器的体育器材。体育器材接受该命令后,APP可以通过发送该命令获取还没有同步的所有的数据。每笔数据传输的格式和实时的数据结构一样
:sport_data_form参见(1.3)。体育器材接受到该命令以后,先返回RET notification(参看1.4),然后再将上述的信息通过UUID 0xFFF4以notify的方式分批发送给移动客户端(参看1.5.1.6)。该命令遵循Get Flow流程。
新:二代跳绳:
说明:
若为二代跳绳设备。跳绳设备接收命令后,app通过发送该命令获取还没有同步的所有的数据。数据格式参见参数列表。跳绳接收此命令后,如果没有需要同步的历史数据,直接返回一个带有结束状态的命令状态标志。如果有未同步的历史数据,那就返回所有未同步的历史数据,所有数据返回完成了,返回一个带有结束标志状态的命令状态标志。
结束状态标志格式:
0x090E000102030405060708090A0B0C0D0E0F CRC00
SpeedBall
若为速度球设备。速度球设备接收命令后,app通过发送该命令获取还没有同步的所有的数据。数据格式参见参数列表。速度球接收此命令后,如果没有需要同步的历史数据,直接返回一个带有结束状态的命令状态标志。如果有未同步的历史数据,那就返回所有未同步的历史数据,所有数据返回完成了,返回一个带有结束标志状态的命令状态标志。
结束状态标志格式:
0x090E000102030405060708090A0B0C0D CRC00
1.2.8 设置当前运动状态命令
命令:CMD = CI_SET_CUR_ACTIVE
参数:
enum{
ACTIVE_STEP = 1,/*走步*/
ACTIVE_SWIM = 2,/*游泳*/
ACTIVE_BIKE = 3,/*骑自行车*/
ACTIVE_BASKETBALL = 4,/*打篮球*/
ACTIVE_FOOTBALL = 5,/*足球*/
ACTIVE_BADMINTON = 6,/*打羽毛球*/
ACTIVE_TABLE_TENNIS = 7,/*打乒乓球*/
ACTIVE_TENNIS = 8,/*打网球*/
ACTIVE_ROPE = 9,/*跳绳*/
ACTIVE_JUMP = 0xa,/*跳远*/
ACTIVE_SLEEP = 0xb,/*睡觉。只能获得,不能设置*/
ACTIVE_DART = 0xc,/*飞镖(特别说明)*/
ACTIVE_SANDBAG = 0xd,/*拳击沙袋(特别说明)*/
ACTIVE_PUSH_UP = 0xe,/*俯卧撑(特别说明)*/
ACTIVE_SIT_UP = 0xf,/*仰卧起坐器(特别说明)*/
ACTIVE_ARM = 0x20,/*臂力器(特别说明)*/
ACTIVE_PULL = 0x21,/*拉力器(特别说明)*/
ACTIVE_GRIP = 0x22,/*握力器 (特别说明)*/
ACTIVE_UNKNOWN = 0xff/*未知状态*/
};
typedef Struct _cur_active{
u8 active_id; /*ACTIVE_STEP,ACTIVE_SWIM...*/
union{
u16 param;//附带参数
}u;
}CUR
_ACTIVE_T,*P_CUR_ACTIVE_T;
说明:
APP通过此命令设置用户当前运动状态。设备接收到该命令后,返回RET notfication(参看1.4)。该命令遵循Set Flow流程。特别说明:此类运动和设FFF4以
notify的方式将当前运动状态发送给APP(详见1.5.1.9),该命令遵循Get Flow流程。
1.2.9 获得当前运动记录命令
命令:CMD = CI_GET_CUR_ACTIVE
参数:
无
说明:
APP通过此命令用户当前运动记录。设备收到该命令后通过UUID 0xFFF4以notify的方式将当前运动状态发送给APP(详见1.5.1.9),该命令遵循Get Flow流程。
1.2.10打开获取G_sensor数据功能
命令:
CMD = CI_GSENSOR_OPEN
参数:无
说明:
APP可以通过该命令打开设备的G_sensor功能备收到该命令后,返回RET notificatio
n(参看1.4)。该命令遵循Set Flow流程。
1.2.11关闭获取G_sensor数据功能
命令:CMD = CI_GSENSOR_CLOSE
参数:无。
说明:
APP可以通过该命令关闭设备的G_sensor功能。设备接收到该命令后,返回RET notification(参看1.4)。该命令遵循Set Flow流程。
1.2.12重置数据
命令:CMD = CI_RESET_DATA
参数:无
说明:
保留接口,如果对象是球拍,可以重置用户挥拍数。如果APP连接的对象是设备或者设备,设备或设备可以无视次命令。设备接收到该命令后,返回RET notification(参看1.4)。该命令遵循Set Flow流程。
1.2.13获得设备电量
命令:CMD = CMD_GET_BATTERY
参数:无
说明:
通过此命令获得设备当前电量。设备接收到该命令后,通过UUID 0xFFF4将用户信息以notify的方式发送给移动客户端(参看1.5.1.2)。该命令遵循Get Flow流程。
1.2.14设置语言
命令:CMD = CI_SET_LANGUAGE
参数:
enum{
LANGUAGE_ICON = 0,/*图标语言*/
LANGUAGE_CHINESE = 1,
LANGUAGE_ENGLISH = 2,
LANGUAGE_JAPANESE = 3,
LANGUAGE_KOREAN = 4,
LANGUAGE_FRANCE = 5,
LANGUAGE_GERMAN = 6,
LANGUAGE_END
};
说明:
通过此命令切换设备的语言显示。设备接收到该命令后,返回RET notification(参看1.4)。该命令遵循Set Flow流程。
1.2.15获得语言设置
命令:CMD = CI_GET_LANGUAGE
参数:无
说明:
通过此命令获得设备的语言。设备接收到该命令后通过UUID 0xFFF4将设备设备名以notify的方式发送给APP(详细见1.5.1.28)。该命令遵循Get Flow流程。
1.2.16设置工厂测试模式
命令:CMD = CI_SET_FACTORY_TEST
参数:
typedef struct _factory{
//U32 reserve;//暂定
u8 testOnOff;
}FACTORY_T,*P_FACTORY_T;
FACTORY_T factory;
//FACTORY_OFF测试模式关闭,FACTORY_ON测试模式打开
typedef enum{
FACTORY_OFF = 0x45,
FACTORY_ON = 0x67,
}FactoryTestEnum;
说明:
通过此命令设置设备工厂测试模式。设备接收到该命令后,返回RET notification(参看1.4)。该命令遵循Set Flow流程。
1.2.17设置设备名
命令:CMD = CI_SET_DEVICE_NAME
参数:
typedef struct _device_name{
u8name[16];//蓝牙设备名
}DEVICE_NAME_T,*P_DEVICE_NAME_T;
DEVICE_NAME_T device_name;
说明:
通过此命令设置设备蓝牙显示的名字,方便用户搜索。设备接收到该命令后,返回RET notification(参看1.4)。该命令遵循Set Flow流程。
1.2.18获得设备名
命令:CMD = CI_GET_DEVICE_NAME
参数:无
说明:
通过此命令获得设备蓝牙显示的名字。设备接收到该命令后通过UUID 0xFFF4将设备设备名以notify的方式发送给APP(详细见1.5.1.29)。该命令遵循Get Flow流程。
1.2.19设置竞技模式
命令:CMD = CI_SET_EXAM
参数:
typedef struct _exam{
u16 val;//units minutes
u16 count;//只能get,不能set
}EXAM_T,*P_EXAM_T;
EXAM_T exam;
说明:
通过此命令设置蓝牙设备的竞技模式。设备接收到该命令后,返回RET notification(参看1.4)。该命令遵循Set Flow流程。
1.2.20得到竞技模式结果
命令:CMD =CI_GET_EXAM
参数:无
说明:
通过此命令获得蓝牙设备竞技模式结果。设备接收到该命令后通过UUID 0xFFF4将设备设备名以notify的方式发送给APP(详细见1.5.1.31)。该命令遵循Get Flow流程。
1.2.21固件更新命令
命令:CMD = CI_FW_UPDATA_MODULE
参数:无
说明:
通过此命令,通知设备端要进行固件升级功能。备接收到该命令后,返回RET notification(参看1.4)。该命令遵循Set Flow流程。
命令格式:0x 46 00 46 00 //开始固件更新命令
1.2.22设置软硬件版本号
命令:CMD= CI_SET_VERSION_NUMBER
参数:
typedef struct _version_val{
u8 firmware_primary_version; //固件主版本号
u8 software_primary_version; //软件主版本号
u8 software_sub_version; //软件次版本号
}VERSION_T,*P_VERSION_T;
VERSION_T framesoftware_version;
说明:
通过此命令可以设置设备的硬件和软件的版本号。设备接收到该命令后,返回
RET nofitication(参看1.4)。该命令遵循SetFlow流程。
1.2.23获取软硬件版本号
命令:CMD= CI_GET_VERSION_NUMBER
参数:无
说明:
通过此命令获得设备的软硬件的版本号。设备接受到该命令后通过UUID 0xFFF4
将设备设备名以notify的方式发给APP(详细见1.5.1.32)。该命令遵循GetFlow
流程。
1.2.24关机命令
命令:CMD = CI_POWERDOWN
参数:无
说明:
通过此命令,可以实现,手环、设备、体育器材的关机功能。设备接收到该命令后,返回RET nofitication(参看1.4)。该命令遵循SetFlow流程。
1.2.25设备重启命令(复位功能)
命令:CMD = CI_SYSTEM_RESET
参数:无
说明:
通过此命令,可以重新,手环、设备、体育器材的系统重启(复位)功能。设备接收到该命令后,返回RET nofitication(参看1.4)。该命令遵循SetFlow流程。
1.2.26重新开始新的一局
命令:CMD = CI_RESTART_NEW_INNING_VAL
参数:无
说明:
新的带有六轴传感器的设备(体育器材),通过该命令, 可以重新开始新的一局。
设备接收到该命令后,返回RET nofitication(参看1.4)。该命令遵循SetFlow流程。
1.2.27获取MAC 地址
命令:CMD = CI_GET_MAC_ADDRESS
参数:无
说明:
通过此命令可以获取设备的MAC地址。设备接受到该命令后通过UUID 0xFFF4
将设备设备名以notify的方式发给APP。该命令遵循GetFlow流程。
1.2.28获取设备的RSSI信号强度
命令:CMD=CI_GET_RSSI_SENSITIVITY
参数:无
说明:
通过此命令可以获取设备的RSSI信号强度。 设备接受到该命令后通过UUID 0xFFF4将设备设备名以notify的方式发给APP。该命令遵循GetFlow。
1.3设备发给APP的信息–设备 notify to APP
typedef struct __run_sync
{
u8 flag;
u16 instSpeed;
u8 instCadence;
u16 instStrideLength;
u32 totalDistance;
}RUN_SYNC_T,*P_RUN_SYNC_T;//用于设备中的计次情况
//old 旧版球拍的数据结构
typedef struct _bat_state
{
u16 counter;
u16 duration;
u16 calories;
u16 strength;
}BAT_STATE_T,*P_BAT_STATE_T;//用于球拍中的实时记次情况
//new 新版球拍的数据结构
typedef struct _sport_data_form
{
u16 action:3; //此拍时什么动作 //七种动作
u16 action_lr:1; //0 = 正手,1 = 反手
u16 speed:10; //每一拍的速度大小 //每一拍的速度大小
u16 sync_flag:1; //是否同步过
u16 action_ud:1; //0 = 上手,1 = 下手
u16 index; //具体的第几拍//拍索引
u32 year:6; //年
u32 month:4; //月
u32 day:5; //日
u32 hour:5; //时
u32 min:6; //分
u32 sec:6; //秒
u16 power; //力量
u32 angle:9; //角度
u32 angle_direction:2; //角度的方向
u32 inning_val:10; //局值
u32 vertical_angle:9; //垂直的角度//正值
u32 vertical_angle_direction:2;//垂直角度的方向//1上2下
} SPORT_DATA_FORM,*P_SPORT_DATA_FORM;
SPORT_DATA_FORM sport_data_form;
说明: 该数据结构用于设备将计次信息发送给APP,。在设备连接上APP的情况下,只要计次信息有变化,设备就会通过notification的方式将其发送给APP。
旧:若为旧版球拍,则同步信息为球拍实时记次信息,采用_bat_state数据结构同步
新:若为新版的球拍,采用的是_sport_data_form数据结构作为同步数据的结构体。
说明:
参数:
Action:动作类型的划分:如下
enum{
SMASH_ACTION = 2, //扣杀球
HANG_ACTION = 3, //劈吊球
FARAWAY_ACTION = 4, //高远球
RAISEUP_ACTION = 5, // 挑球
SMALL_ACTION = 6, //小球
SMOOTH_ACTION = 7, // 平抽
};
Speed:速度范围:0-1000 m/s
Sync_flag:该参数暂时还没有用到
Index:当前一局中拍的值,范围:0-32737
Angle:该参数用于球拍的左偏右偏,度数。
Angle_direction:左偏右偏的值:如下:
enum{
DART_LEFT = 1, //左偏
DART_RIGHT = 2, //右偏
}
inning_val:局值范围:1-1023
vertical_angle:该参数用于飞镖的上偏下偏,度数。
vertical_angle_direction:上偏下偏:如下:
enum{
DART_UP = 1, //上偏
DART_DOWN = 2, //下偏
};
1.4设备RET信息–设备 notify APP
APP发给设备的命令是否接收到以及命令是否有效,是由设备以notification的方式通过RET UUID回给APP端的。该信息只用于Set Flow和Get Flow。返回状态的数据结构如下:
struct{
u8 cmd;
u8 DataLength;
u8 status;
u8 crc;
u8 EndVal;
}RET_NOTI_T,*P_ RET_NOTI _T;
说明:
cmd : 为对应的命令,如果等于0xff,这表示不识别的命令。
status :一般情况下,返回0。如果是不支持的命令返回1。
endVal:—结束标志值为0
1.5设备GET信息通知–设备notifyAPP
设备通过get命令获取的数据结构如下:
typedef struct _xmart_cmd{
u8 cmd_id; /*命令类型*/
union{
u32 param;
UINFO_T uinfo; /*用户信息参数*/
RTC_TIME_T rtctime; /*时间参数*/
UALARM_TIME_T ualarm; /*用户自定义提醒功能参数*/
HISSYNC_T his;/*历史数据同步*/
SLEEP_SET_T sleep_set;/*设置睡眠监控*/
TRIP_SET_T trip_set;/*设置防跌功能*/
CUR_ACTIVE_T cur_active;/*设置当前运动状态*/
TEMP_SET_T temp;/*设置温度报警命令*/
ANTILOSS_T antiloss;/*设置防丢功能命令*/
LONGSIT_T longsit;/*设置久坐提醒命令*/
HEARTCHECK_T heartcheck;/*设置心率检测功能命令*/
WEAR_ALARM_T wear_alarm;/*设置佩戴报警命令*/
PWRONOFF_ALARM_T pwr;/*设置开关机报警命令*/
ALARMCLOCK_T alarmclock;/*设置闹钟提醒*/
ALARMCLOCKGET_T alarmclockget;/*得到闹钟提醒*/
SPORT_T sport;/*设置健身目标*/
REMOTE_CAMERA_T remote;/*设置BLE拍照或视频拍摄事件*/
CALLNAME_T callname;/*来电话提醒手表 */
//CALLREMIND_T callremind;/*设置手表接听和挂断提醒功能事件 */
MESSAGEREMIND_T messageremind;/*设置来短信提醒功能事件*/
SETSTR_T setstr;/*存入字符串*/
GETSTR_T getstr;/*获得字符串的具体信息*/
RUN_SYNC_T run;/*腕带中的计步情况*/
BAT_STATE_T bat_state;/*球拍中的实时记次情况*/
MISS_CALL_MES_T miss_call_mes;/*未接电话和未看短信提醒*/
FACTORY_T factory;/*设置工厂测试模式 */
DEVICE_NAME_T device_name;/*设置蓝牙设备名 */
VB_BEEPER_T vb_bee;/*设置震动和声音提醒的开关 */
EXAM_T exam;/*设置竞技模式*/
ROPE_LED_TYPE_T rope_led_type;/*设置rope类型*/
}u;
}BLE_CMD_T,*P_BLE_CMD_T;
1.5.1设备信息通知
类别:type = CI_GET_DINFO
typedef enum{/*产品系列ID*/
TYPE_BADMINTON = 1,/*羽毛球*/
TYPE_ROPE, /* 跳绳*/
TYPE_TABLE_TENNIS, /*乒乓球*/
TYPE_TENNIS, /*网球*/
TYPE_SPEED_BALL, /*速度球*/
}type;
/*产品子系列ID*/
enum{
GENERATION_FIRST =1,/*第一代*/
GENERATION_SECOND =2,/*第二代*/
GENERATION_THIRD =3,/*第三代*/
};
typedef struct _dinfo{
u8 mid;/*制造商ID*/
u8 type_id;/*产品系列ID*/
u8 pid;/*产品子系列ID*/
u8 name[8]; /*产品名称*/
u8 hardware_version;/*硬件版本编号*/
u8 firmware_main_version;/*软件版本编号*/
u8 firmware_sub_version;/*软件版本编号*/
}DINFO_T,*P_DINFO_T;
说明:
mid:设备制造商
typeid:产品系列ID
pid:产品子系列ID
name:产品名称
将设备的设备信息通知APP。该通知响应CI_GET_DINFO命令(见1.2.1)。
兰威汉字区位码:3228 4594
1.5.2历史数据状态通知
类别:type = CI_HISTORY_STATE
参数:
typdef struct his_stat{
u8 Year;
u8 Month;
u8 Day;
u8 active_cnt;
u8 sleep_cnt;
u8 heart_cnt;
u8 event_cnt;
//u32 thedaydatasize;
}HIS_STATE_T, *P_HIS_STAT_T;
设备手环:
说明:
Year:年份。以2000年为基准,这里是相对于2000年的偏移。
Month:月份。1~12个月。
Day:日。表示一个月中具体的一天。
active_cnt:当天运动状态下,没有同步的历史数据的个数。
Sleep_cnt:当天睡眠状态下,没有同步的历史数据的个数。
Heart_cnt:当天没有同步的心率监测的历史数据的个数。
Event_cnt:当天log的没有同步的事件的个数,事件比如开关机,佩戴与否,心率报警,温度报警等。
将设备的信息通知APP。该通知响应CI_GET_HISTORY_STATE命令(详情见1.2.8)。历史数据的同步在1.5.2节会详细描述。这里需要特别说明的是:在APP发送该命令后,设备会根据其上存储的历史数据的情况,返回几个这样的消息,来告知APP:设备上有哪几天的历史数据。
旧:体育器材(羽毛球,乒乓球、网球、跳绳):
说明:
Year:年份。以2000年为基准,这里是相对于2000年的偏移。
Month:月份。1~12个月。
Day:日。表示一个月中具体的一天。
active_cnt:当天没有同步的历史数据的笔数。
Sleep_cnt:省略,无意思。(只有手环设备才会用到该参数)
Heart_cnt:省略,无意思。
Event_cnt:省略,无意思。
将体育器材的信息通知APP。该通知响应CI_GET_HISTORY_STATE命令(见1.2.8)。历史数据的同步在1.5.2节会详细描述。这里需要特别说明的是:在体育器材发送该命令后,设备会根据其上存储的历史数据的情况,返回几条消息,来告知APP:设备上有哪几天的历史数据。
新:新的体育器材(羽毛球,网球,飞镖):
typedef struct _new_tn_his_stat{
u16 round_count_1;
u16 round_count_2;
u16 round_count_3;
u16 round_count_4;
u16 round_count_5;
u16 round_count_6;
u16 round_count_7;
u16 round_count_8;
}NEW_TN_HIS_STAT,*P_NEW_TN_HIS_STAT;
说明:
round_count_1 代表对应局次的拍数,羽拍共24局,查询历史数据状态时,设备返回三组返回值,每组包含8局的次数,有效局次为拍数非零局统计。
1.5.3历史数据同步通知
新:六轴传感器的体育器材(羽毛球,飞镖,网球)
//new 新版球拍的数据结构
typedef struct round_sport_data_summary{
u8 year; //当前inning 开始的年
u8 month; //当前 inning 开始的月
u8 day;
u8 hour;
u8 min;
u8 sec;
u16 counts;
u16 duration; //
u16 action_smash; //扣杀球
u16 action_hang; //劈吊球
u16 action_farwary; //高远球
u16 action_raiseup; // 挑球
u16 action_small; //小球
u16 action_smooth; // 平抽
u16 action_up; //下手等于总次数减去上手球
u16 action_forcehand; //反手等于总次数减去正手球
u16 speed_max;
u16 speed_ave;
u8 power_max;
u8 power_ave;
}ROUND_SPORT_DATA_SUMMARY,*pROUND_SPORT_DATA_SUMMARY;
//速度球1
typedef struct _speedball_run_data{
union{
u32 para;
P_SPEEDBALLRUNSTTIME SpeedBallStartTime;
}time_u;
u16 counts; /**/
u16 duration;
//u16 KcalorieVal;//resvered
union{
u32 para;
P_SPEEDBALLFRECALPARA RunFre;
}RopeRunFre_u;
union{
u32 para;
P_SPEEDBALLSTRCALPARA RunStr;
}RopeRunStr_u;
}P_SPEEDBALL_RUN_DATA,*P_SPEEDBALL_RUN_DATA_T;
typedef struct _SpeedBallRunStTime{
u32 year:6; /*year*/
u32 month:4; /*month*/
u32 day:5; /*day*/
u32 hour:5; /*hour*/
u32 min:6; /*min*/
u32 sec:6; /*second*/
}P_SPEEDBALLRUNSTTIME,P_SPEEDBALLRUNSTTIME_T;
typedef struct _SpeedBallFreCalPara{
u32 average_fre:10; //average frequency平均多少次数
u32 max_fre:10; // max frequency//一分钟内平均
u32 critical_hit_fre:10; //now frequency//一分钟内的最大频率
}P_SPEEDBALLFRECALPARA,*P_SPEEDBALLFRECALPARA_T;
typedef struct _SpeedBallStrCalPara{
u32 max_str_value:10;//max strength value //最大力量
u32 average_str_value:10;//average strength value//平均力量
u32 now_str_value:10;//now strength value //当前力量值
}P_SPEEDBALLSTRCALPARA,*P_SPEEDBALLSTRCALPARA_T;
1.5.4设备电量通知类别:
类别:type = CMD_GET_BATTERY
参数:
typedef struct _device_battery{
u8 BatteryVal;
}DEVICE_BATTERY_T,P_DEVICE_BATTERY_T;
说明:
BatteryVal;//电量值,以%表示,值范围0~100
BatteryVal= 0x65,充电中
BatteryVal= 0x66,充电满
该通知将获得设备当前电量,该通知相应CI_GET_BATTERY命令(见1.2.50)。当设备电池电量发生较大状态变化时,会主动上报电池状态,条件如下:
1. 电量发生10%变化,即10,20,30,40…
2. USB插拔状态提醒:充电中,未充电
3. 充电满提醒
1.5.5语言设置通知通知
类别:type = CI_LANGUAGE
参数:
val;//语言的一种(详见1.2.53语言定义)
说明:
该通知将获得设备语言的设置,该通知相应CI_GET_LANGUAGE命令(见1.2.54)
1.5.6设备名通知
类别:type = CI_DEVICE_NAME
参数:DEVICE_NAME_Tdevice_name;//详见1.2.56
说明:
该通知将获得设备蓝牙搜索名,该通知相应CI_GET_DEVICE_NAME命令(见1.2.57)。
1.5.7竞技模式通知
类别:type = CI_GET_EXAM
参数:EXAM_T exam;//详见1.2.60
说明:
该通知将获得竞技模式结果,该通知相应CI_GET_EXAM命令(见1.2.61)。
1.5.8软硬件版本号通知
类别:type = CI_GET_VERSION_NUMBER
参数:VERSION_T framesoftware_version;//详见1.2.63
说明:
该通知将获得软硬件版本号,该通知相应CI_GET_VERSION_NUMBER命令;//详见1.2.64。
1.5.9MAC地址通知
类别:type = CI_GET_MAC_ADRESS
参数:
typedef strcut _mac_val{
u32 mac_val;
}MAC_VAL,*P_MAC_VAL_T;
说明:
mac_val:为设备的mac地址值该通知可以获取设备的MAC地址,该通知响应CI_GET_MAC_ADDRESS命令;//详见1.2.68
1.5.10设备RSSI信号通知
类别:type = CI_GET_MAC_SENSITIVITY
参数:
typedef struct _rssi_val{
char rssi_val;
}RSSI_VAL_T,*P_ RSSI_VAL_T;
说明:
rssi_val:为设备的RSSI信号强度.(范围:-100~100)该通知可以获取设备的RSSI信号,该通知相应CI_GET_RSSI_SENSITIVITY命令;//详见获取RSSI信号强度。
1.5.11设备NOTIFY命令执行结果
命令:type = CI_NOTIFY_RESULT
参数:
typedef struct _notify_r{
u8 len;
u8 status;
u8 crc;
u8 val; //val = 0
}NOTIFY_RESULT_T,*NOTIFY_RESULT_T;
说明:
通过此命令可以获取设备的RSSI信号强度
1.5.12历史数据信息同步
该小节主要是用来说明历史数据的同步。
需要同步的历史数据有:
睡眠质量历史数据,反映用户一整天的睡眠情况。
计次统计历史数据,反映用户一整天的活动状态变化。
心率监测历史数据,反应用户一整天的心率变化情况。
整个睡眠和计次历史数据实际反映了如下图所示的一天活动状态和睡眠状态的变化。图中整个过程从一天的7:00am开始24小时内的状态变化。其中7:00am到11:00pm为活动状态,这个有计次历史数据呈现;11:00pm到第二天7:00am为睡眠时段,由睡眠历史数据呈现。
1.5.13固件更新命令通知
命令:CMD= CI_FW_UPDATA_MODULE
参数:
enum{
Status_FW_UPDATA_OK = 0, //升级OK
Status_FW_UPDATA_FAILD = 1, //升级失败
}Status_FW_UPDATA;
说明:
命令格式:0x 46 0100 47 00 //升级OK
命令格式:0x 46 0101 48 00 //升级失败
上图每段状态都包含了一个开始时间以及所处状态的说明,还有该状态下的一些数据描述。心率会根据佩戴的情况,按照配置的心率监测配置,收集数据。APP对历史数据进行同步需要下面数据结构。
1.首先,APP需要发送CI_GET_HISTORY_STATE命令,获得当前设备上历史数据的状况。设备通过NI_HISTORY_STATE消息返回APP所需要的数据。NI_HISTORY_STATE消息的参数见HIS_STATE_T定义(见1.5.1.5),设备有可能连续发几个日期不同的NI_HISTORY_STATE消息到APP。APP根据情况选择其中一天的数据做同步。
2.APP发送CI_HISTORY_SYNC用来同步指定的历史数据。该命令的参数定义如下(见1.2.9):
typedef struct _hissync{
U8 year;
U8 month;
U8 day;
U8 data_type;
}HISSYNC_T,*P_HISSYNC_T;
设备根据命令参数来匹配对应的需要同步的历史数据。同步的历史数据通过NI_HISTORY_DATA通知发送给APP端。NI_HISTORY_DATA通知的参数在1.5.1.6中有定义。
整个的同步流程可以用下图来描述,这里作为一个例子,只是同步了某一天的计次历史数据:
1.6设备send G_sensor数据–设备to APP User
设备根据用户的设置,周期性的向APP发送G_sensor数据。其数据类型如下:
typedef struct _gsen_noti{
u16 x;
u16 y;
u16 z;
}GSEN_NOTI_T,*P_GSEN_NOTI_T;
说明:G_sensor功能可能以后会去掉,初定是1秒钟向APP发送10个数据包。这个数据量有点大。
1.7设备send six axissensor数据–设备 toAPP
typedef struct{//三轴坐标
u16 x;
u16 y;
u16 z;
}COORD_THREE_AXIS_T,*P_COORD_THREE_AXIS_T;
typedef struct{//六轴坐标
COORD_THREE_AXIS_T coord_three;
u16 u;
u16 v;
u16 w;
}COORD_SIX_AXIS_T,*P_COORD_SIX_AXIS_T;
typedef struct _dev{
u16 strength;//力量
u16 speed;
COORD_SIX_AXIS_T coord;//坐标
}DEV_T,*P_DEV_T;
1.8附录1:固件更新YMODE协议
协议简介
Ymodem是一种错误纠正协议。使用较大数据块的调制解调采用这种协议,以获得更高的工作效率。采用Ymodem协议的调制解调器以128/1024字节数的块发送数据。成功接收的会被确认(ACK),有错误的块被否认(NAK),并重发。Ymodem使用循环冗余码校验(CRC)作为错误校验方式。
数据格式
数据包开始信号 | 发送序号 | 发送序号补码 | 数据区 | CRC高字节 | CRC低字节 |
---|---|---|---|---|---|
SOH/STX | 00 | FF | … | … | … |
1Byte | 1Byte | 1Byte | 128/1024Byte | 1Byte | 1Byte |
第1字节SOH/STX:SOH表示本包数据区大小有128字节。STX表示本包数据区大小为1024字节。
第2字节00: 编号,第一包为00,第二包为01,第三包为02依次累加。到FF后继续从0循环递增。
第3字节FF: 编号的反码。 编号为00 对应FF,为01对应FE,以此类推。
第4字节到最后两字节:若第1字节为SOH时有128字节,为STX时有1024字节,这部分为数据区。第一个数据包的数据区是文件名字符串。在文件名之后,如果不满128字节,以0补满。
最后两字节:这里需要注意,只有数据区参与了CRC校验,不包括头和编码部分。
标准CRC-16校验,高字节在前,低字节在后。
基本流程:
1、开启是由接收方开启传输,接收方发送一个字符’C’,然后进入等待(SOH)状态,如果没有回应,就会超时退出。
2、发送方开始时处于等待过程中,等待字符’C’。发送方收到’C’后,发送第一帧数据包,内容如下:
SOH 00 FF Foo.c NUL[123] CRC CRC(Foo.c为文件名,NUL[123]补0)
进入等待(ACK)状态。
3、接收方收到第一帧数据包后,CRC校验满足,则发送ACK。
4、发送方接收到ACK,又进入等待“文件传输开启”信号,即重新进入等待“C”的状态。
5、接收方又发出一个字符’C’,开始准备接收文件。进入等待“SOH”或者“STX”状态。
6、发送方收到字符’C’后,开始发送第二帧,第二帧中的数据存放的是第一包数据。内容如下:
(SOH/STX)(01序号)(FE补码)(128/1024位数据)(CRC校验),等待接收方“ACK”。
7、接收方收到数据后,发送一个ACK,然后等待下一包数据传送完毕,继续ACK应答。直到所有数据传输完毕。…
8、数据传输完毕后,发送方发EOT,第一次接收方以NAK应答,进行二次确认。发送方收到NAK后,重发EOT,接收方第二次收到结束符,就以ACK应答。最后接收方再发送一个字符’C’开启另一次传输,发送方在没有第二个文件要传输的情况下,发送如下数据:SOH 00 FF 00~00(共128个) CRCH CRCL,接收方应答ACK后,正式结束数据传输。