# JtoTestTools
**Repository Path**: singmong/jto-test-tools
## Basic Information
- **Project Name**: JtoTestTools
- **Description**: 杰拓Android蓝牙SDK
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-04-30
- **Last Updated**: 2025-01-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 杰拓Android 蓝牙SDK文档
# 一、环境配置
## 1.添加aar包
将jto-fit-sdk-Vxxx.aar包复制到app下的libs目录中
配置build.gradle
```
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}
```
## 2.在AndroidManifest.xml中配置权限
```
```
## 3. 声明组件
```
```
# 二、发送蓝牙数据
## 1. 初始化
```objective-c
//参数一:上下文,参数二:是否打印日志
JToBluetoothHelper.getInstance().initSDK(this, true);
//日志是否保存到文件
JToBluetoothHelper.getInstance().setPrintFile(true);
//日志打印
JToLog.i(TAG,"打印日志");
```
## 2.扫描设备
在权限允许和蓝牙开启的状态下,才能开始正常扫描。在扫描过程中发现设备时,通过OnScanDevListener()回调,扫描结束后,通过onScanDev()方法得到所有设备
### 2.1 初始化扫描监听
```java
JToBluetoothHelper.getInstance().scanningDeviceInit(JToApplication.getInstance(), new OnScanDevListener() {
@Override
public void onScanDev(int callbackType, ScanResult result, List deviceList, JToBleDevice myBleDevice) {
JToLog.i(TAG,"扫描到的设备");
}
@Override
public void onScanError(int errorCode) {
//扫描异常
}
@Override
public void onJLScanDev(JToBleDevice device) {
}
@Override
public void onScanComplete(boolean isReconnect) {
JToLog.i(TAG,"扫描完成");
}
});
```
### 2.2 开始扫描
`JToBluetoothHelper.getInstance().startScan();`
### 2.3 停止扫描
`JToBluetoothHelper.getInstance().stopScan();`
## 3.蓝牙连接与断开
### 3.1 连接蓝牙
`JToBluetoothHelper.getInstance().connectDev(device);`
### 3.2 蓝牙重连
如果返回true,说明正在重连中,如果返回false,说明不可重连
`JToBluetoothHelper.getInstance().reConnectDev();`
### 3.3 蓝牙是否连接
`JToBluetoothHelper.getInstance().isConnectOk();`
### 3.6 配对
蓝牙连接成功后,进行配对操作
`JToBluetoothHelper.getInstance().startSyncPair(0);`
### 3.5 断开蓝牙
解绑设备步骤:
1. 在已连接状态下,先发送解绑指令,等待手表返回解绑成功指令(查看第三大点的第9小点)。
2. 收到解绑成功指令后,招执行断开蓝牙操作。
3. 如果在未连接状态下,直接执行断开蓝牙操作即可。
```
//解绑指令
JToBluetoothHelper.getInstance().getSendBlueData().setSystemControl(3);
//断开蓝牙ble
JToBluetoothHelper.getInstance().disConnect(true);//true断开经典蓝牙bt,false不断开经典蓝牙bt
```
### 3.6 蓝牙是否可用(是否打开)
`JToBluetoothHelper.getInstance().isEnabled();`
## 4.请求历史数据
时间戳为0:表示请求所有历史数据,不为0:表示从该时间戳开始到当前时间的历史数据,接收历史回调数据,请查看第三大点
### 4.1 请求心率历史数据
`JToBluetoothHelper.getInstance().getSendBlueData().getHisHeart("时间戳")`
### 4.2 请求血氧历史数据
`JToBluetoothHelper.getInstance().getSendBlueData().getHisBO2("时间戳")`
### 4.3 请求血压历史数据
`JToBluetoothHelper.getInstance().getSendBlueData().getHisBP("时间戳");`
### 4.4 请求日常活动历史数据
`JToBluetoothHelper.getInstance().getSendBlueData().getHisSteps("时间戳");`
### 4.5 请求睡眠历史数据
JToBluetoothHelper.getInstance().getSendBlueData().getHisSleep("时间戳");
## 5.天气
### 5.1 实时天气
```
JTo_DATA_TYPE_weatherRT jToDataTypeWeatherRT = new JTo_DATA_TYPE_weatherRT();
jToDataTypeWeatherRT.setHour(9);//时
jToDataTypeWeatherRT.setMin(32);//分
jToDataTypeWeatherRT.setTemperature(28);//温度
jToDataTypeWeatherRT.setClimate(1);//天气
jToDataTypeWeatherRT.setWind_scale(1);//风力
jToDataTypeWeatherRT.setHumidity(81);//百分比数值
jToDataTypeWeatherRT.setPressure(1006);//默认单位:百帕
jToDataTypeWeatherRT.setVisibility(30);//默认单位:公里
JToBluetoothHelper.getInstance().getSendBlueData().sendWeatherNow(jToDataTypeWeatherRT);
```
### 5.2 未来24小时天气
```
JTo_DATA_TYPE_WEATHER24 jToDataTypeWeather24 = new JTo_DATA_TYPE_WEATHER24();
jToDataTypeWeather24.setHour(9);//时
jToDataTypeWeather24.setMin(10);//分
List list = new ArrayList<>();
for (Weather24Bean.WeatherData data : weather24Bean.getList()) {
JTo_DATA_TYPE_WEATHER24.WeatherData weatherData = new JTo_DATA_TYPE_WEATHER24.WeatherData();
weatherData.setClimate(data.getClimate());//天气 1
weatherData.setTemperature(data.getTemperature());//温度 29
weatherData.setHumidity(data.getHumidity());//湿度 75
weatherData.setUvIndex(data.getUvIndex());//紫外线
list.add(weatherData);
}
jToDataTypeWeather24.setList(list);
JToBluetoothHelper.getInstance().getSendBlueData().sendWeather24(jToDataTypeWeather24);
```
### 5.3 未来7天天气
```
JTo_DATA_TYPE_WEATHERDAYS jToDataTypeWeatherDays = new JTo_DATA_TYPE_WEATHERDAYS();
jToDataTypeWeatherDays.setDateTime(1714982400);
jToDataTypeWeatherDays.setFutureDays(7);
List list = new ArrayList<>();
for (Weather7DaysBean.WeatherData data : weather7DaysBean.getList()) {
JTo_DATA_TYPE_WEATHERDAYS.WeatherData weatherData = new JTo_DATA_TYPE_WEATHERDAYS.WeatherData();
weatherData.setClimate(data.getClimate());//天气
weatherData.setSunrise(data.getSunrise());//日出时间
weatherData.setSunset(data.getSunset());//日落时间
weatherData.setMaxTemperature(data.getMaxTemperature());//最高温度
weatherData.setMinTemperature(data.getMinTemperature());//最低温度
weatherData.setDaytimeHumidity(data.getDaytimeHumidity());//日间湿度
weatherData.setNightHumidity(data.getNightHumidity());//夜间湿度
weatherData.setDaytimeUltravioletIndex(data.getDaytimeUltravioletIndex());//日间紫外线指数
weatherData.setNightUltravioletIndex(data.getNightUltravioletIndex());//夜间紫外线指数
list.add(weatherData);
}
jToDataTypeWeatherDays.setList(list);
JToBluetoothHelper.getInstance().getSendBlueData().sendWeatherDays(jToDataTypeWeatherDays);
```
### 5.4 日出日落时刻
```
JTo_DATA_TYPE_CITYSUNSET jToDataTypeCitySunset = new JTo_DATA_TYPE_CITYSUNSET();
if (!TextUtils.isEmpty(city)) {
jToDataTypeCitySunset.setCityName("城市名");
jToDataTypeCitySunset.setCityLen(3);//城市名长度
}
if (list != null && list.size() > 0) {
//日出时刻
jToDataTypeCitySunset.setSunriseHour(5);//时
jToDataTypeCitySunset.setSunriseMin(50);//分
//日落时刻
jToDataTypeCitySunset.setSunsetHour(18);//时
jToDataTypeCitySunset.setSunsetMin(50);//分
}
JToBluetoothHelper.getInstance().getSendBlueData().sendCitySunSet(jToDataTypeCitySunset);
```
## 6. APP运动
### 6.1 开始运动
```
JTo_DATA_TYPE_SPORTMULTI jToDataTypeSportMulti = new JTo_DATA_TYPE_SPORTMULTI();
jToDataTypeSportMulti.setSportType(1);//运动类型,查看第三大点第8小点多运动
jToDataTypeSportMulti.setSubCMD(JToAction.SUB_CMD.TWO);
JToBluetoothHelper.getInstance().getSendBlueData().sendSportMulti(jToDataTypeSportMulti);
```
### 6.2 暂停运动
```
JTo_DATA_TYPE_SPORTMULTI jToDataTypeSportMulti = new JTo_DATA_TYPE_SPORTMULTI();
jToDataTypeSportMulti.setSportType(1);//运动类型,查看第三大点第8小点多运动
jToDataTypeSportMulti.setSportStatus(JTo_DATA_TYPE_SPORTMULTI.SPORT_STATUS_PAUSE);//暂停状态
jToDataTypeSportMulti.setSubCMD(JToAction.SUB_CMD.THREE);
JToBluetoothHelper.getInstance().getSendBlueData().sendSportMulti(jToDataTypeSportMulti);
```
### 6.3 停止运动
```
JTo_DATA_TYPE_SPORTMULTI jToDataTypeSportMulti = new JTo_DATA_TYPE_SPORTMULTI();
jToDataTypeSportMulti.setSportType(1);//运动类型,查看第三大点第8小点多运动
jToDataTypeSportMulti.setSportStatus(JTo_DATA_TYPE_SPORTMULTI.SPORT_STATUS_STOP);//停止状态
jToDataTypeSportMulti.setSubCMD(JToAction.SUB_CMD.THREE);
JToBluetoothHelper.getInstance().getSendBlueData().sendSportMulti(jToDataTypeSportMulti);
```
### 6.4 发送实时运动数据
```
JTo_DATA_TYPE_SPORTMULTI jToDataTypeSportMulti = new JTo_DATA_TYPE_SPORTMULTI();
jToDataTypeSportMulti.setSubCMD(JToAction.SUB_CMD.FIVE);
jToDataTypeSportMulti.setSportType(1);//运动类型
jToDataTypeSportMulti.setSteps(100);//步数
jToDataTypeSportMulti.setDistance(100);//距离,单位米
jToDataTypeSportMulti.setCalorie(10);//卡路里
jToDataTypeSportMulti.setDuration(500);//运动时长 ,单位秒
jToDataTypeSportMulti.setPacing();// 配速
jToDataTypeSportMulti.setCadence();// 步频
JToBluetoothHelper.getInstance().getSendBlueData().sendSportMulti(jToDataTypeSportMulti);
```
## 7. app前后台标志
0:APP处于前台,1:APP处于后台
`JToBluetoothHelper.getInstance().getSendBlueData().setAppFB(0);`
## 8. 获取相关数据
```
//蓝牙名
JtoBlueCpProxy.getInstance().getDeviceName();
//蓝牙地址
JtoBlueCpProxy.getInstance().getDevAddress();
//手表屏幕宽
JtoBlueCpProxy.getInstance().getScreenWidth();
//手表屏幕高
JtoBlueCpProxy.getInstance().getScreenHigh();
//手表屏幕形状
JtoBlueCpProxy.getInstance().getScreenShape();
//电量
JtoBlueCpProxy.getInstance().getBatValue();
//项目编号
JtoBlueCpProxy.getInstance().getProjectNumber();
//固件版本
JtoBlueCpProxy.getInstance().getDevVersion();
//字库版本
JtoBlueCpProxy.getInstance().getFontVersion();
//UI库版本
JtoBlueCpProxy.getInstance().getPicVersion()
//蓝牙连接状态
JtoBlueCpProxy.getInstance().getConnectStatus();
```
## 9. 消息推送
### 9.1 消息类型
```
public static final byte TYPE_QQ = 0; //QQ消息
public static final byte TYPE_WX = 1; //微信消息
public static final byte TYPE_MSG = 2; //短信消息
public static final byte TYPE_OTHER = 3; //其他消息
public static final byte TYPE_FACEBOOK = 4; //Facebook
public static final byte TYPE_TWITTER = 5; //Twitter
public static final byte TYPE_WHATSAPP = 6; //WhatsApp
public static final byte TYPE_SKYPE = 7; //Skype
public static final byte TYPE_FACEBOOK_MESSENGER = 8; //Facebook Messenger
public static final byte TYPE_Hangouts = 9;
public static final byte TYPE_LINE = 10;
public static final byte TYPE_LINKED_IN = 11;
public static final byte TYPE_INSTAGRAM = 12;
public static final byte TYPE_Viber = 13;
public static final byte TYPE_KAKAO = 14;
public static final byte TYPE_VKontakte = 15;
public static final byte TYPE_Snapchat = 16;
public static final byte TYPE_Google_plus = 17;
public static final byte TYPE_EMAIL = 18;
public static final byte TYPE_Flickr = 19;
public static final byte TYPE_Tumblr = 20;
public static final byte TYPE_Pinterest = 21;
public static final byte TYPE_YouTube = 22;
public static final byte TYPE_TELEGRAM = 23;
public static final byte TYPE_Truecaller = 24;
public static final byte TYPE_Paytm = 25;//com.one97.paytm
public static final byte TYPE_Zalo = 26;
public static final byte TYPE_imo = 27;
public static final byte TYPE_Microsoft_Teams = 28;
public static final byte TYPE_Outlook = 29;
public static final byte TYPE_Swiggy = 30;//bundl.swiggy
public static final byte TYPE_Zomato = 31;//com.zomato.zomato
public static final byte TYPE_Gpay = 32;//com.google.paisa
public static final byte TYPE_PhonePe = 33;//com.phonepe.PhonePeApp
public static final byte TYPE_Hotstar = 34;//in.startv.hotstar
public static final byte TYPE_PrimeVideo = 35;//com.amazon.aiv.AIVApp
public static final byte TYPE_Flipkart = 36;//com.appflipkart.flipkart
public static final byte TYPE_Amazon = 37;//com.amazon.AmazonIN
public static final byte TYPE_Myntra = 38;//
public static final byte TYPE_NoiseApp = 39;//
public static final byte TYPE_DailyHunt = 40;//
public static final byte TYPE_Inshorts = 41;//com.nis.app
public static final byte TYPE_BookMyShow = 42;//
public static final byte TYPE_Calendar = 43;//com.google.android.calendar
public static final byte TYPE_Jio_Tv = 44;//com.jio.jioplay
public static final byte TYPE_Make_My_Trip = 45;//com.Iphone.MMT
public static final byte TYPE_Netflix = 46;//com.netflix.Netflix
public static final byte TYPE_Ola = 47;//olacabs.OlaCabs
public static final byte TYPE_Reflex = 48;//com.titan.fastrack.reflex
public static final byte TYPE_Uber = 49;//com.ubercab.UberClient
public static final byte TYPE_YT_Music = 50;//com.google.ios.youtubemusic
public static final byte TYPE_WhatsApp_Business = 51;//com.whatsapp.w4b
public static final byte TYPE_Dunzo = 52;//com.dunzo.user
public static final byte TYPE_Gaana = 53;//com.gaana
public static final byte TYPE_Google_Drive = 54;//com.google.android.apps.docs
public static final byte TYPE_googlechat = 55;//com.google.android.apps.docs
public static final byte TYPE_Wynk_music = 56;//com.bsbportal.music
public static final byte TYPE_Yahoo = 57;//com.yahoo.mobile.client.android.mail
public static final byte TYPE_Titan_Smart_World = 58;//com.titan.smartworld
public static final byte TYPE_Slack = 59;//com.Slack
public static final byte TYPE_Spotify = 60;//com.spotify.music
```
### 9.3 发送消息
```
JTo_DATA_TYPE_MESSAGE msg = new JTo_DATA_TYPE_MESSAGE();
msg.setSubCMD(JToAction.SUB_CMD.SIX);
msg.setMsgId(JTo_DATA_TYPE_MESSAGE.TYPE_WX);//消息类型
msg.setMsgTitle("标题");
msg.setMsgContent("消息内容");
JToBluetoothHelper.getInstance().getSendBlueData().sendAppMessage(msg);
```
## 10. 遥控拍照
0 进入,1 退出,2 拍照
`JToBluetoothHelper.getInstance().getSendBlueData().sendTakePhoto(1);`
## 11. 闹钟
### 11.1 新增闹钟
```
JTo_DATA_TYPE_ALARM alarmData = new JTo_DATA_TYPE_ALARM();
//设置一个闹钟
JTo_DATA_TYPE_ALARM.AlarmItem alarmItem = new JTo_DATA_TYPE_ALARM.AlarmItem();
alarmItem.setSwitchStatus(1);//闹钟开关 1打开 0关闭
alarmItem.setWeek_repeat(0);//重复周期,0表示单次,bit0-bit6依次表示周日-周六
alarmItem.setHour(presenter.hour);//时
alarmItem.setMin(presenter.min);//分
alarmData.getAlarmList().add(item);//在原有的闹钟列表中,加入新增的闹钟
alarmData.setAlarmNum(alarmData.getAlarmList().size());
//将所有闹钟发送至手表
JToBluetoothHelper.getInstance().getSendBlueData().setAlarm(alarmData);
```
### 11.2 修改闹钟
修改好其中一个闹钟后,再将闹钟列表重新发送至手表即可
```
//将所有闹钟发送至手表
JToBluetoothHelper.getInstance().getSendBlueData().setAlarm(alarmData);
```
### 11.3 删除闹钟
删除闹钟列表中的指定闹钟,然后将闹钟列表重新发送至手表即可
```
alarmData.getAlarmList().remove(position);
alarmData.setAlarmNum(alarmData.getAlarmList().size());
//将所有闹钟发送至手表
JToBluetoothHelper.getInstance().getSendBlueData().setAlarm(alarmData);
```
## 12. 通讯录
同步联系数据,请查看第三大点的第11小点
### 12.1 添加联系人
```
//添加联系人列表
List contactsList = new ArrayList();
JTo_DATA_TYPE_CONTACTS.MultipleContacts contacts = new JTo_DATA_TYPE_CONTACTS.MultipleContacts();
contacts.setName("姓名");
contacts.setPhone("电话号码");
contactsList.add(contacts)
//将联系人封装到JTo_DATA_TYPE_CONTACTS对象中
JTo_DATA_TYPE_CONTACTS jtoDataTypeContacts = new JTo_DATA_TYPE_CONTACTS();
jtoDataTypeContacts.setSubCMD(JToAction.SUB_CMD.FOUR);
jtoDataTypeContacts.setList(contactsList);
jtoDataTypeContacts.setTotal(contactsList.size());
//发送联系数据
JToBluetoothHelper.getInstance().getTransfer().sendContacts(jToDataTypeContacts);
```
### 12.2 删除联系人
```
jtoDataTypeContacts.setDelIndex(position);//要删除的联系人在列表中的角标
jtoDataTypeContacts.setSubCMD(JToAction.SUB_CMD.SEVEN);
JToBluetoothHelper.getInstance().getTransfer().sendContacts(jToDataTypeContacts);
```
## 13. 单位设置
```
JTo_DATA_TYPE_SETUNIT jToDataTypeSetUnit = new JTo_DATA_TYPE_SETUNIT();
jToDataTypeSetUnit.setUnitLength(0);//距离 0国际(米,千米,公里==),1英制(英里,码==)
jToDataTypeSetUnit.setUnitTemperature(0);//温度 0摄氏度C,1华氏度F
jToDataTypeSetUnit.setUnitTime(0);//时间 0:24小时制,1:12小时制
JToBluetoothHelper.getInstance().getSendBlueData().setUnitSettings(jToDataTypeSetUnit);
```
## 14. 查找手表
1:开始查找,0:停止查找
`JToBluetoothHelper.getInstance().getSendBlueData().sendFindWatch(1);`
## 15. 久坐提醒
```
JTo_DATA_TYPE_SETSEDENTARY jToDataTypeSetSedentary = new JTo_DATA_TYPE_SETSEDENTARY();
jToDataTypeSetSedentary.setSwitchStatus(JtoBleConstants.OPENSTATUS.OPEN);//1开启,0关闭
jToDataTypeSetSedentary.setTriggerDuration(60);//触发时长,15,30,45,60,90 单位分钟
jToDataTypeSetSedentary.getList().get(0).setStartHour(8);
jToDataTypeSetSedentary.getList().get(0).setStartMin(0);
jToDataTypeSetSedentary.getList().get(0).setEndHour(22);
jToDataTypeSetSedentary.getList().get(0).setEndMin(0);
JToBluetoothHelper.getInstance().getSendBlueData().sendSetSedentary(jToDataTypeSetSedentary);
```
## 16. 勿扰设置
```
JTo_DATA_TYPE_SETDND jToDataTypeSetDnd = new JTo_DATA_TYPE_SETDND();
jToDataTypeSetDnd.setSwitchStatus(JtoBleConstants.OPENSTATUS.OPEN);//勿扰开关
jToDataTypeSetDnd.getList().get(0).setStartHour(8);
jToDataTypeSetDnd.getList().get(0).setStartMin(0);
jToDataTypeSetDnd.getList().get(0).setEndHour(22);
jToDataTypeSetDnd.getList().get(0).setEndMin(0);
JToBluetoothHelper.getInstance().getSendBlueData().setDND(jToDataTypeSetDnd);
```
## 17. 亮屏时长
```
JTo_DATA_TYPE_SETSYS jToDataTypeSetSys = new JTo_DATA_TYPE_SETSYS();
jToDataTypeSetSys.setScreenTime(5);//5,10,15 单位秒
JToBluetoothHelper.getInstance().getSendBlueData().setSystemSetting(jToDataTypeSetSys);
```
## 18.抬腕亮屏
```
//1打开,0关闭
JToBluetoothHelper.getInstance().getSendBlueData().setHandRaise(JtoBleConstants.OPENSTATUS.OPEN);
```
## 19. 系统控制
```
//0关机,1重启,2恢复出厂设置
JToBluetoothHelper.getInstance().getSendBlueData().setSystemControl(0);
```
## 20.心率设置
```
JToBluetoothHelper.getInstance().getSendBlueData().sendRealTimeHrSwitch(JtoBleConstants.OPENSTATUS.OPEN);//实时心率开关设置开关
JTo_DATA_TYPE_SETHRWARNING setHrWarning = new JTo_DATA_TYPE_SETHRWARNING();
setHrWarning.setHrWarning.setSwitchStatus(JtoBleConstants.OPENSTATUS.OPEN);//心率预警设置形状
setHrWarning.setHrWarning.setUpperLimit(150);//心率上限
setHrWarning.setHrWarning.setLowerLimit(60);//心率下限
JToBluetoothHelper.getInstance().getSendBlueData().setHrWarning(setHrWarning);
```
## 21. 生理周期
```
JTo_DATA_TYPE_SETFEMALECIRCLE jToDataTypeSetFemaleCircle = new JTo_DATA_TYPE_SETFEMALECIRCLE();
jToDataTypeSetFemaleCircle.setSwitchStatus(JtoBleConstants.OPENSTATUS.OPEN);//生理周期开关
jToDataTypeSetFemaleCircle.setLastMenstrualYear(24);//上次月经开始时间-年
jToDataTypeSetFemaleCircle.setLastMenstrualMonth(5);//上次月经开始时间-月
jToDataTypeSetFemaleCircle.setLastMenstrualDay(6);//上次月经开始时间-日
jToDataTypeSetFemaleCircle.setCycleDay(28);//月经间隔周期 单位天
jToDataTypeSetFemaleCircle.setMenstrualDays(5);//经期天数
jToDataTypeSetFemaleCircle.setRemindHour(8);//提醒时间,表示前一天的哪个时间点提醒
jToDataTypeSetFemaleCircle.setRemindMin(0);//提醒时间,表示前一天的哪个时间点提醒
JToBluetoothHelper.getInstance().getSendBlueData().sendFemaleCircle(jToDataTypeSetFemaleCircle);
```
## 22.表盘
### 22.1 自定义表盘
蓝讯平台
```java
ModifyWatchInfo modifyWatchInfo = new ModifyWatchInfo();
//将本地选择的图片转成适合手表屏幕尺寸的图片,
String customDialPath = JtoBitmapUtils.createCustomDialBg(mContext,表盘形状(0圆,1方), "原图片在本地的完整路径", "转换后保存的完整路径,带图片文件名");
modifyWatchInfo.setFilePath(customDialPath);
//自定义表盘文字颜色
modifyWatchInfo.setColor(0xFFFFFFFF);
//时间上方显示 1: 日期,2:睡眠,3:心率,4:计步
modifyWatchInfo.setTime_up(4);
//时间下方显示 1: 日期,2:睡眠,3:心率,4:计步
modifyWatchInfo.setTime_down(3);
//自定义表盘文字位置:0左上方 1顶部居中 2右上方 3居中 4左下方 5底部居中 6右下方
modifyWatchInfo.setTime_pos(3);
modifyWatchInfo.setTime_x(timeX);//时间文字的x坐标
modifyWatchInfo.setTime_y(timeY);//时间文字的y坐标
//带背景图片
JToBluetoothHelper.getInstance().getSendBlueData().sendLanXunCustomDial(modifyWatchInfo);
//无背景图片
JToBluetoothHelper.getInstance().getSendBlueData().sendCustomDialProperty(modifyWatchInfo);
```
杰理平台
```java
ModifyWatchInfo modifyWatchInfo = new ModifyWatchInfo();
//将本地选择的图片转成适合手表屏幕尺寸的图片
String customDialPath = JtoBitmapUtils.createCustomSqDialBg(mContext, "原图片在本地的完整路径", "转换后保存的完整路径,带图片文件名");
modifyWatchInfo.setFilePath(customDialPath);
//自定义表盘文字颜色
modifyWatchInfo.setColor(0xFFFFFFFF);
//自定义表盘文字位置:0左上方 1顶部居中 2右上方 3居中 4左下方 5底部居中 6右下方
modifyWatchInfo.setTime_pos(3);
modifyWatchInfo.setTime_x(timeX);//时间文字的x坐标
modifyWatchInfo.setTime_y(timeY);//时间文字的y坐标
//截取自定义图片缩略图
String customThumb = JtoFileUtil.captureAndSaveLayout(View, "图片保存完整路径,带文件名");
modifyWatchInfo.setThumbFile(customThumb);
//生成自定义表盘bin文件
JToBluetoothHelper.getInstance().getTransfer().getDialBinFile(modifyWatchInfo, new OnCreateBinFileListener() {
@Override
public void onCreateBinFile(boolean result, String dialPath) {
if (result) {//bin文件生成成功
//发送表盘
JToBluetoothHelper.getInstance().getTransfer().sendTransferDial(dialPath, JtoBleConstants.FILETYPE.TYPE_CUSTOM_DIAL_TWENTYONE,999 );
} else {
//BIN文件生成失败
}
}
});
```
### 22.2 在线表盘
```
String onlineDialBin = "在线表盘bin文件在本地路径";
int onlineDialNumber = 20;//表盘编号
JToBluetoothHelper.getInstance().getTransfer().sendTransferDial(onlineDialBin, JtoBleConstants.FILETYPE.TYPE_DIAL_ZERO, onlineDialNumber);
```
### 22.3 表盘传输进度
查看第三大点13小点,文件传输进度
### 22.4 切换表盘
```
JToBluetoothHelper.getInstance().getSendBlueData().sendCurrentDialNumber("表盘编号");
```
## 23. OTA升级
### 23.1 蓝讯平台
```
//步骤一:启动OTA,手表会重启,进入OTA
JTo_DATA_TYPE_FILE jToDataTypeFile = new JTo_DATA_TYPE_FILE();
jToDataTypeFile.setDocPurpose(JtoBleConstants.FILETYPE.TYPE_OTA);//用途ota
JToBluetoothHelper.getInstance().getTransfer().sendTransferFiles(jToDataTypeFile);
//步骤二:重启完成后会连接上蓝讯服务,开始OTA
jToDevRcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_LANXUN_SERVICE, new JToBleDataResult() {
@Override
public boolean bleDataResult(Integer o) {
//开始OTA
JToBluetoothHelper.getInstance().getLanXunWatchOperate().startOTA(updateBinList, pathList);
return false;
}
});
//蓝讯OTA进度
jToDevRcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_LANXUN_OTA_PROGRESS, new JToBleDataResult() {
@Override
public boolean bleDataResult(OtaProgressBean otaProgressBean) {
//当前阶段
otaProgressBean.getCurStage();
//总阶段
otaProgressBean.getTotalStage();
//当前阶段进度
otaProgressBean.getProgress();
return false;
}
});
```
### 23.2 杰理平台
OTA升级包分3种类型的包:UI库,字库,固件包,如果这3个包同时进行升级时,升级顺序为 UI库 -> 字库 -> 固件
当UI库或字库升级完成后,等待手表下发版本号,等收到版本后,再升级下一个,或者等待文件传输完成回调后,再升级下一个
升级UI与字库
1. 开始升级
```
JTo_DATA_TYPE_FILE jToDataTypeFile = new JTo_DATA_TYPE_FILE();
jToDataTypeFile.setFilePath("升级包本地路径");
//升级包类型:字库JtoBleConstants.FILETYPE.TYPE_FONT_OTA,UI库JtoBleConstants.FILETYPE.TYPE_OTA_RES
jToDataTypeFile.setDocPurpose(JtoBleConstants.FILETYPE.TYPE_FONT_OTA);
JToBluetoothHelper.getInstance().getTransfer().sendTransferFiles(jToDataTypeFile);
```
2. 升级进度,查看第三大点的第13小点
3. 等待手表下发版本号,收到后,继续升级下一个包,接收手表版本号,查看第三大点的第14小点
升级固件
1. 固件升级的前提,必须等待OTA初始化完成,否则固件升级时会出错,初始化完成回调请查看第三大点28.2
```
//初始化OTA
JToBluetoothHelper.getInstance().getJLWatchOperate().initJtoOtaManager();
```
2. 开始升级
`JToBluetoothHelper.getInstance().getJLWatchOperate().startOTA("固件包本地路径");`
3. 固件升级进度
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_JLotaProgress, new JToBleDataResult() {
@Override
public boolean bleDataResult(OtaProgressBean otaProgressBean) {
if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_NOT_READY) {//OTA未准备好
//OTA初始化失败,请重新进入该页面
} else if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_START) {
//升级准备开始
} else if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_LOADER) {//下载固件
//升级固件第一阶段,下载固件
otaProgressBean.getProgress();//下载固件进度
} else if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_UPGRADE) {//升级固件
//升级固件第二阶段,开始升级固件
otaProgressBean.getProgress();//升级固件进度
} else if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_COMPLETE) {//升级完成
} else if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_ERROR) {//升级出错
otaProgressBean.getCode();//报错误码
otaProgressBean.getErrorMsg();//报错信息
}
return false;
}
});
```
4. 蓝牙连接状态要传给sdk
固件升级中,中途会回连蓝牙的过程,所以要将蓝牙连接状态传给sdk
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CONNECT_STATE_CHANGE, new JToBleDataResult() {
@Override
public boolean bleDataResult(Integer connectStatus) {
JToBluetoothHelper.getInstance().getJLWatchOperate().setOtaNotifyBtDeviceConnection(
JToBluetoothHelper.getInstance().getJToDevProxy().getJToBlueTooth().getBluetoothDevice(),
connectStatus);
return false;
}
});
```
5. 需要强制升级固件
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_mandatoryUpgradeFlag, new JToBleDataResult() {
@Override
public boolean bleDataResult(Integer integer) {
//只要收到此消息,说明需要强制升级固件
return false;
}
});
```
## 24. 请求电量
```
JToBluetoothHelper.getInstance().getSendBlueData().sendRequestBat();
```
## 25. 请求蓝牙名
```
JToBluetoothHelper.getInstance().getSendBlueData().sendRequestBleName();
```
## 26. 请求蓝牙地址
```
JToBluetoothHelper.getInstance().getSendBlueData().sendRequestBleAddress();
```
## 27. 读取Rssi
```
JToBluetoothHelper.getInstance().readRemoteRssi();
```
## 28. 设置用户信息
```
JtoUserInfo jtoUserInfo = new JtoUserInfo();
jtoUserInfo.setSex(0);//性别
jtoUserInfo.setAge(22);//年龄
jtoUserInfo.setWeight(55);//体重
jtoUserInfo.setHeight(170);//身高
JToBluetoothHelper.getInstance().getSendBlueData().setPersonInfo(userInfo);
```
## 29. 设置目标
```
JTo_DATA_TYPE_SETTARGET setTarget = new JTo_DATA_TYPE_SETTARGET();
setTarget.setSwitchStatus(1);//1打开,0关闭
setDistance(5000);//距离 米
setCalorie(500);//上路里 千卡
setStep(10000);//步
JToBluetoothHelper.getInstance().getSendBlueData().setTarget(setTarget);
```
## 30. 电子烟
### 30.1 设置功率
```
JToBluetoothHelper.getInstance().getSendBlueData().sendPowerLevel(24);
```
### 30.2 抽烟口次历史数据
时间戳为0:表示请求所有历史数据,不为0:表示从该时间戳开始到当前时间的历史数据,接收历史回调数据,请查看第三大点
```
JToBluetoothHelper.getInstance().getSendBlueData().getHisECig(时间戳);
```
# 三、接收蓝牙数据监听
## 1. 获取蓝牙数据接收监听器
`IJToDevRcvDataManager rcvDataManager = JToBluetoothHelper.getInstance().getJToDevRcvDataManager()`
## 2. 监听蓝牙连接状态
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CONNECT_STATE_CHANGE, new JToBleDataResult() {
@Override
public boolean bleDataResult(Integer status) {
if (status == JtoBleConstants.BLUE_CONNECTED) {//已连接
} else if(status == JtoBleConstants.BLUE_CONNECTING){//正在连接
} else if(status == JtoBleConstants.BLUE_DISCONNECT){//断开连接
}
return false;
}
});
```
## 3. 日常活动数据
实时步数,卡路里,距离
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_realTimeStep, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_REALTIMESTEP data) {
if (data.getSubCMD() == JToAction.SUB_CMD.THREE) {//3 手表按app的申请信息下发的历史分段数据
for (JTo_DATA_TYPE_REALTIMESTEP.ActiveData stepData : data.getList()) {
stepData.getTime();时间戳
stepData.getSteps();//步数
stepData.getCalories();//卡路里
stepData.getDistance();//距离
}
}else if (data.getSubCMD() == JToAction.SUB_CMD.ZERO) {//0 手表推送的实时数据
data.getTime();时间戳
data.getSteps();//步数
data.getCalories();//卡路里
data.getDistance();//距离
}
return false;
}
});
```
## 4. 睡眠数据
### 4.1 睡眠类型
```
JTo_DATA_TYPE_SLEEP.SLEEP_LATENCY //-1 入睡
JTo_DATA_TYPE_SLEEP.AWAKENING //0清醒
JTo_DATA_TYPE_SLEEP.REM //1动眼
JTo_DATA_TYPE_SLEEP.LIGHT_SLEEP //2浅睡
JTo_DATA_TYPE_SLEEP.DEEP_SLEEP //3深睡
JTo_DATA_TYPE_SLEEP.SLEEP_OUT //4出睡
JTo_DATA_TYPE_SLEEP.JUMP_SLEEP //5跳到下一段睡眠
```
### 4.2 睡眠数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_sleep, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_SLEEP jTo_data_type_sleep) {
if (jTo_data_type_sleep.getSubCMD() == JToAction.SUB_CMD.THREE) {//手表下发的睡眠数据
jToDataTypeSleep.getStartTime();//当前睡眠段的开始时间戳
jToDataTypeSleep.getSleepBelongTo();//这段睡眠属于哪一天
jToDataTypeSleep.getEndTime();//当前睡眠段的结束时间戳
jToDataTypeSleep.getDeepDuration();//深睡时长
jToDataTypeSleep.getLightDuration();//浅睡时长
jToDataTypeSleep.getRemDuration();//REM眼动时长
jToDataTypeSleep.getAwakenDuration();//清醒时长
jToDataTypeSleep.getReviveTimes();//苏醒次数
jToDataTypeSleep.getSleepDetail();//睡眠详情,一段json数据
jToDataTypeSleep.getRawData();//睡眠原始数据
}
return false;
}
});
```
## 5. 心率数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_realTimeHr, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTO_DATA_TYPE_REALTIMEHR heartData) {
if (heartData.getSubCMD() == JToAction.SUB_CMD.THREE) {//3 手表按app的申请信息下发历史分段数据
for (int i = 0; i < heartData.getList().size(); i++) {
heartData.getList().get(i).getTime();//心率时间
heartData.getList().get(i).getData();//心率值
}
} else if (heartData.getSubCMD() == JToAction.SUB_CMD.ZERO) {//0 手表推送实时数据
heartData.getTime();//心率时间
heartData.getHeartValue();//心率值
heartData.getAvgHeart();//平均心率值
heartData.getMinHeart();//最小心率值
heartData.getMaxHeart();//最大心率值
} else if(heartData.getSubCMD() == JToAction.SUB_CMD.SEVEN){//7 实时心率开关
heartData.getRealTimeHrSwitch();//1打开,0关闭
}
return false;
}
});
```
## 6. 血氧数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_realTimeSpo2, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTO_DATA_TYPE_REALTIMESPO2 boData) {
if (boData.getSubCMD() == JToAction.SUB_CMD.THREE) {//3 手表按app的申请信息下发历史分段数据
for (int i = 0; i < boData.getList().size(); i++) {
boData.getList().get(i).getTime();//血氧时间
boData.getList().get(i).getData();//血氧值
}
}else if (boData.getSubCMD() == JToAction.SUB_CMD.ZERO) {//实时数据
boData.getTime();//血氧时间
boData.getBloodOxygenValue();//血氧值
boData.getAvgBo();//平均血氧值
boData.getMinBo();//最小血氧值
boData.getMaxBo();//最大血氧值
}
return false;
}
});
```
## 7. 血压数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_realTimeBp, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTO_DATA_TYPE_REALTIMEBP bpData) {
if (bpData.getSubCMD() == JToAction.SUB_CMD.THREE) {//手表按app的申请信息下发历史分段数据
for (int i = 0; i < bpData.getList().size(); i++) {
bpData.getList().get(i).getTime();//时间
bpData.getList().get(i).getSystolicPressure();//收缩压
bpData.getList().get(i).getDiastolicPressure();//舒张压
}
}else if (bpData.getSubCMD() == JToAction.SUB_CMD.ZERO) {//手表推送的实时数据
bpData.getTime();//时间
bpData.getDiastolicPressure();//收缩压
bpData.getSystolicPressure();//舒张压
}
return false;
}
});
```
## 8. 手表运动数据
### 8.1 运动类型
```
JtoBleConstants.SPORT_TYPE.WALK;
public class JtoBleConstants {
/**
* 运动类型
*/
public static final class SPORT_TYPE {
public static final int WALK = 0;//步行
public static final int RUNNING = 1;//跑步
public static final int OUTDOOR_RIDING = 2;//户外骑行
public static final int JUMP_ROPE = 3;//跳绳
public static final int BADMINTON = 4;//羽毛球
public static final int BASKETBALL = 5;//篮球
public static final int FOOTBALL = 6;//足球
public static final int SWIM = 7;//游泳
public static final int MOUNTAIN_CLIMBING = 8;//登山
public static final int TENNIS = 9;//网球
public static final int RUGBY = 10;//橄榄球
public static final int GOLF = 11;//高尔夫
public static final int YOGA = 12;//瑜珈
public static final int FITNESS = 13;//健身
public static final int DANCE = 14;//跳舞
public static final int BASEBALL = 15;//棒球
public static final int ELLIPTICAL_MACHINE = 16;//椭圆机
public static final int INDOOR_CYCLING = 17;//室内骑行
public static final int FREE_TRAINING = 18;//自由训练
public static final int ROWING_MACHINE = 19;//划船机
public static final int SAILBOAT = 20;//帆船
public static final int WATER_POLO = 21;//水球
public static final int OTHER_WATER_SPORTS = 22;//其他水上运动
public static final int PADDLEBOARDING = 23;//桨板运动
public static final int WATER_SKIING = 24;//滑水运动
public static final int KAYAK = 25;//皮划艇
public static final int DRIFTING = 26;//漂流
public static final int ROWING = 27;//赛艇
public static final int MOTORBOAT = 28;//摩托艇
public static final int WEB_SWIMMING = 29;//蹼泳
public static final int DIVING = 30;//跳水
public static final int SYNCHRONISED_SWIMMING = 31;//花样游泳
public static final int SNORKELING = 32;//浮潜
public static final int KITESURFING = 33;//风筝冲浪
public static final int OPEN_WATER_SWIMMING = 34;//开放水域游泳
public static final int ROCK_CLIMBING = 35;//攀岩
public static final int SKATEBOARD = 36;//滑板
public static final int ROLLER_SKATING = 37;//轮滑
public static final int PARKOUR = 38;//跑酷
public static final int MOUNTAIN_CROSS_COUNTRY = 39;//山地越野
public static final int PARAGLIDING = 40;//滑翔伞
public static final int TRIATHLON = 41;//铁人三项
public static final int TRAIL_RUNNING = 42;//越野跑
public static final int ON_FOOT = 43;//徒步
public static final int KABADDI = 44;//卡巴迪
public static final int CLIMB_STAIRS = 45;//爬楼梯
public static final int STEPPER = 46;//踏步机
public static final int CORE_TRAINING = 47;//核心训练
public static final int CALISTHENICS = 48;//柔软操
public static final int PILATES = 49;//普拉提
public static final int GYMNASTICS = 50;//体操
public static final int STRETCH = 51;//拉伸
public static final int STRENGTH_TRAINING = 52;//力量训练
public static final int CROSS_TRAINING = 53;//交叉训练
public static final int AEROBICS = 54;//健身操
public static final int PHYSICAL_TRAINING = 55;//体能训练
public static final int WALL_EXERCISE_BALL = 56;//墙壁健身球
public static final int DUMBBEL = 57;//哑铃
public static final int BARBELL = 58;//杠铃
public static final int DEADLIFT = 59;//硬拉
public static final int UPPER_BODY_TRAINING = 60;//上肢训练
public static final int SIT_UPS = 61;//仰卧起坐
public static final int FUNCTIONAL_TRAINING = 62;//功能性训练
public static final int POPPY = 63;//波比
public static final int BACK_EXERCISE = 64;//背部运动
public static final int LOWER_LIMB_MOVEMENT = 65;//下肢运动
public static final int WAIST_ABDOMINAL_TRAINING = 66;//腰腹训练
public static final int HIT = 67;//HIT
public static final int INDOOR_WALKING = 68;//室内步行
public static final int INDOOR_RUNNING = 69;//室内跑步
public static final int WEIGHTLIFTING = 70;//举重
public static final int SQUARE_DANCE = 71;//广场舞
public static final int BELLY_DANCE = 72;//肚皮舞
public static final int BALLET = 73;//芭蕾舞
public static final int ZUMBA = 74;//尊巴
public static final int LATIN_DANCE = 75;//拉丁舞
public static final int HIP_HOP = 76;//街舞
public static final int FOLK_DANCE = 77;//民族舞
public static final int JAZZ = 78;//爵士舞
public static final int BOXING = 79;//拳击
public static final int WRESTLING = 80;//角力
public static final int MARTIAL_ARTS = 81;//武术
public static final int TAI_CHI = 82;//太极
public static final int MUAY_THAI = 83;//泰拳
public static final int JUDO = 84;//柔道
public static final int TAEKWONDO = 85;//跆拳道
public static final int KARATE = 86;//空手道
public static final int FREE_BOXING = 87;//自由拳击
public static final int FENCING = 88;//击剑
public static final int KENDO = 89;//剑道
public static final int VOLLEYBALL = 90;//排球
public static final int SOFTBALL = 91;//垒球
public static final int HOCKEY = 92;//曲棍球
public static final int PINGPONG = 93;//乒乓球
public static final int CRICKET = 94;//板球
public static final int HANDBALL = 95;//手球
public static final int SQUASH = 96;//壁球
public static final int BILLIARDS = 97;//台球
public static final int SHUTTLECOCK = 98;//毽球
public static final int BEACH_SOCCER = 99;//沙滩足球
public static final int BEACH_VOLLEYBALL = 100;//沙滩排球
public static final int SEPAK_TAKRAW = 101;//藤球
public static final int BOWLING = 102;//保龄球
public static final int SKATE = 103;//滑冰
public static final int CURLING = 104;//冰壶
public static final int OTHER_SNOW_SPORTS = 105;//其他雪上运动
public static final int SNOWMOBILE = 106;//雪地摩托
public static final int PUCK = 107;//冰球
public static final int SNOWMOBILING = 108;//雪车
public static final int SLED = 109;//雪橇
public static final int SKI = 110;//滑雪
public static final int ARCHERY = 111;//射箭
public static final int DARTS = 112;//飞镖
public static final int TUG_WAR = 113;//拔河
public static final int HULA_HOOP = 114;//呼啦圈
public static final int KITE = 115;//风筝
public static final int HORSE_RIDING = 116;//骑马
public static final int FRISBEE = 117;//飞盘
public static final int FISHING = 118;//钓鱼
public static final int EQUESTRIAN_SPORTS = 119;//马术运动
public static final int TRACK_FIELD = 120;//田径
public static final int RACING = 121;//赛车
}
}
```
### 8.2 运动数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_sportMulti, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_SPORTMULTI data) {
data.getSportType();//运动类型
data.getDataSources();//数据来源,0手表
data.getSportDate();//运动日期
data.getStartTime();//开始时间
data.getEndTime();//结束时间
data.getDuration();//运动时长
data.getCalorie();//卡路里
data.getSteps();//步数
data.getDistance();//距离
data.getAvgHeartRate();//平均心率
data.getMaxHeartRate();// 最高心率
data.getMinHeartRate();// 最低心率
data.getAvgPacing();// 平均配速
data.getMaxPacing();// 最高配速
data.getMinPacing();// 最低配速
data.getAvgCadence();// 平均步频
data.getMaxCadence();// 最高步频
data.getMinCadence();// 最低步频
return false;
}
});
```
## 9. 解绑成功指令
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_DATA_SYSCTRL, new JToBleDataResult() {
@Override
public boolean bleDataResult(Integer control) {
if (control >= 3) {
//解绑成功
}
return false;
}
});
```
## 10. 闹钟数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_alarm, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_ALARM alarmData) {
if (alarmData != null && alarmData.getSubCMD() == JToAction.SUB_CMD.ZERO) {//闹钟数据
alarmData.getAlarmList();//闹钟列表
}else if (alarmData != null && alarmData.getSubCMD() == JToAction.SUB_CMD.TWO) {//手表支持的最大闹钟个数
alarmData.getMaxAlarm();
}
return false;
}
});
```
## 11. 联系人数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_contacts, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_CONTACTS data) {
if (data.getSubCMD() == JToAction.SUB_CMD.FIVE) {//手表支持的最大联系人数
data.getSupportMax();
}else if (data.getSubCMD() == (JToAction.SUB_CMD.ZERO | 0x80)) { //手表下发联系人数据
data.getOffset();//联系人条数偏移量
data.getList();//联系人数据
}else if (data.getSubCMD() == JToAction.SUB_CMD.THREE) { //手表告知联系人数据传输结果
data.getResult();//0成功
}else if (jToDataTypeContacts.getSubCMD() == (JToAction.SUB_CMD.FOUR | 0x80)) { //手表告知联系人总数
data.getTotal();
}
return false;
}
});
```
## 12. 查找手机
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_FIND_WATCH, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_FIND jTo_data_type_find) {
if (jToDataTypeFind.getSubCMD() == JToAction.SUB_CMD.ZERO) {
//响铃 或 停止响铃
jToDataTypeFind.getControl();//1查找,0停止查找
}
return false;
}
});
```
## 13. 文件传输
### 13.1 进度
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_DATA_FILE_PROGRESS, new JToBleDataResult() {
@Override
public boolean bleDataResult(Integer progress) {
return false;
}
});
```
### 13.2 文件传输结果
```
jToDevRcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_file, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_FILE jToDataTypeFile) {
if (JTo_DATA_TYPE_FILE.getSubCMD() == JToAction.SUB_CMD.TWO) {
if(jToDataTypeFile.getResult() == 0){
//成功
}
}
return false;
}
});
```
## 14. 手表版本号
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_version, new JToBleDataResult() {
@Override
public boolean bleDataResult(String version) {
//例:version = A9-J103F00001V0198FONTD669-PIC2100
JtoBlueCpProxy.getInstance().getProjectNumber();//项目编号
JtoBlueCpProxy.getInstance().getDevVersion();//固件版本
JtoBlueCpProxy.getInstance().getFontVersion();//字库版本
JtoBlueCpProxy.getInstance().getPicVersion();//UI库版本
return false;
}
});
```
## 15. 单位设置
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_setUnit, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_SETUNIT data) {
data.getUnitTemperature();//0摄氏度C,1华氏度F
data.getUnitLength();//0国际(米,千米,公里==),1英制(英里,码==)
data.getUnitTime();//0 24小时制,1 12小时制
return false;
}
});
```
## 16. 功能标志位
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_flagFunc, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_SETUNIT jToDataTypeFlagFunc) {
jToDataTypeFlagFunc.isFLAG_F_REAL_HEART();//实时心率功能
jToDataTypeFlagFunc.isFLAG_F_HR_WARNING();//心率预警功能
jToDataTypeFlagFunc.isFLAG_F_FEMALE_CYCLE();//女性生理周期功能
jToDataTypeFlagFunc.isFLAG_F_DND();//勿扰功能
jToDataTypeFlagFunc.isFLAG_F_SEDENTARY();//久坐功能
jToDataTypeFlagFunc.isFLAG_F_HAND_RAISE();//抬腕功能
jToDataTypeFlagFunc.isFLAG_F_ALARM();//闹钟功能
jToDataTypeFlagFunc.isFLAG_F_HR();//心率功能
jToDataTypeFlagFunc.isFLAG_F_SPO2();//血氧功能
jToDataTypeFlagFunc.isFLAG_F_BP();//血压功能
return false;
}
});
```
## 17. 抬腕亮屏
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_setHandRaise, new JToBleDataResult() {
@Override
public boolean bleDataResult(Integer isOpen) {
//1打开,0关闭
return false;
}
});
```
## 18. 勿扰数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_setDND, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_SETDND jToDataTypeSetDnd) {
jToDataTypeSetDnd.getSwitchStatus();//1打开,0关闭
jToDataTypeSetDnd.getList().get(0).getStartHour();//起始时分
jToDataTypeSetDnd.getList().get(0).getStartMin();//起始分
jToDataTypeSetDnd.getList().get(0).getEndHour();结束时
jToDataTypeSetDnd.getList().get(0).getEndMin();结束分
return false;
}
});
```
## 19. 久坐数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_setSedentary, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_SETSEDENTARY jToDataTypeSetSedentary) {
jToDataTypeSetSedentary.getSwitchStatus();//1打开,0关闭
jToDataTypeSetSedentary.getTriggerDuration();//触发时长 分钟
jToDataTypeSetSedentary.getList().get(0).getStartHour();//起始时分
jToDataTypeSetSedentary.getList().get(0).getStartMin();//起始分
jToDataTypeSetSedentary.getList().get(0).getEndHour();结束时
jToDataTypeSetSedentary.getList().get(0).getEndMin();结束分
return false;
}
});
```
## 20. 心率预警设置数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_setHrWarning, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_SETHRWARNING setHrWarning) {
setHrWarning.getSwitchStatus();//1打开,0关闭
setHrWarning.getUpperLimit();//心率预警上限
setHrWarning.getLowerLimit();//心率预警下限
return false;
}
});
```
## 21. 生理周期数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_setFemaleCircle, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_SETFEMALECIRCLE jToDataTypeSetFemaleCircle) {
jToDataTypeSetFemaleCircle.getSwitchStatus();//1打开,0关闭
jToDataTypeSetFemaleCircle.getLastMenstrualYear();//上次经期开始时间-年
jToDataTypeSetFemaleCircle.getLastMenstrualMonth();//上次经期开始时间-月
jToDataTypeSetFemaleCircle.getLastMenstrualDay();//上次经期开始时间-日
jToDataTypeSetFemaleCircle.getCycleDay();//周期天数
jToDataTypeSetFemaleCircle.getMenstrualDays();//经期天数
return false;
}
});
```
## 22. 表盘相关数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_dialInfo, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_SETFEMALECIRCLE jToDataTypeSetFemaleCircle) {
if (jToDataTypeDialInfo.getSubCMD() == JToAction.SUB_CMD.ZERO) {//手表推送的表盘信息
jToDataTypeDialInfo.getOnlineDialNumbers().get(0);//在线表盘编号
jToDataTypeDialInfo.getCurrentNumberStr();//当前表盘编号
jToDataTypeDialInfo. getCurrentNumber();
jToDataTypeDialInfo.getDefaultDialNumbers();//手表内置表盘编号列表
jToDataTypeDialInfo.getEditDialNumber();//自定义表盘编号
jToDataTypeDialInfo.getHasCustomBg();//是否有自定义背景图片 0没有,1有
jToDataTypeDialInfo.getGuiType();//GUI类型
jToDataTypeDialInfo.getShape();//形状 0圆形,1方形
jToDataTypeDialInfo.getWidth();//手表屏幕宽
jToDataTypeDialInfo.getHeight();//手表屏幕高
jToDataTypeDialInfo.getPreviewWidth();//表盘预览图宽
jToDataTypeDialInfo.getPreviewHeight();//表盘预览图高
jToDataTypeDialInfo.getOnlineSize();//支持的最大在线表盘文件大小
jToDataTypeDialInfo.getCustomSize();//支持的最大自定表盘文件大小
}else if (jToDataTypeDialInfo.getSubCMD() == JToAction.SUB_CMD.ONE) {
//当前表盘编号
jToDataTypeDialInfo.getCurrentNumberStr();
}
return false;
}
});
```
## 23. 电量数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_bat, new JToBleDataResult() {
@Override
public boolean bleDataResult(Integer data) {
return false;
}
});
```
## 24. 蓝牙名
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_btName, new JToBleDataResult() {
@Override
public boolean bleDataResult(String bleName) {
return false;
}
});
```
## 25. 蓝牙地址
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_mac, new JToBleDataResult() {
@Override
public boolean bleDataResult(String bleMac) {
return false;
}
});
```
## 26. RSSI信号
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_DATA_RSSI, new JToBleDataResult() {
@Override
public boolean bleDataResult(Integer rssi) {
JToLog.i(TAG, "RSSI=" + rssi);
homDataLiveData.postValue(rssi);
return false;
}
});
```
## 27. 目标数据
```
rcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_setTarget, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_SETTARGET target) {
target.getSwitchStatus();//达标提醒开关
target.getStep();//步数
target.getCalorie();//上路里
target.getDistance();//距离
return false;
}
});
```
## 28.OTA
### 28.1 蓝讯平台
```java
//连接上蓝讯服务,开始OTA
jToDevRcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_LANXUN_SERVICE, new JToBleDataResult() {
@Override
public boolean bleDataResult(Integer o) {
//接收到蓝讯服务,可以在这里开始OTA
return false;
}
});
//蓝讯OTA进度
jToDevRcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_LANXUN_OTA_PROGRESS, new JToBleDataResult() {
@Override
public boolean bleDataResult(OtaProgressBean otaProgressBean) {
//当前阶段
otaProgressBean.getCurStage();
//总阶段
otaProgressBean.getTotalStage();
//当前阶段进度
otaProgressBean.getProgress();
return false;
}
});
```
### 28.2 杰理平台ota初始化结果
```
//杰理OTA库准备完成
jToDevRcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_JLOTA_Ready_complete, new JToBleDataResult() {
@Override
public boolean bleDataResult(Integer integer) {
if(integer == 1){
//初始化完成
}
return false;
}
});
```
### 28.3 杰理OTA进度
```
jToDevRcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_JLotaProgress, new JToBleDataResult() {
@Override
public boolean bleDataResult(OtaProgressBean otaProgressBean) {
if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_NOT_READY) {
//OTA未准备好
} else if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_START) {
//升级准备开始
} else if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_LOADER) {
//下载固件
} else if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_UPGRADE) {
//升级固件
} else if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_COMPLETE) {
//升级完成
} else if (otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_ERROR ||
otaProgressBean.getType() == JtoBleConstants.OTA_STATUS.OTA_ERROR_RETRY) {
//出错
}
return false;
}
});
```
## 29.电子烟
```
jToDevRcvDataManager.addBleDataResultListener(JToAction.RECEIVE.RECEIVE_CMD_M_CIGARETTE, new JToBleDataResult() {
@Override
public boolean bleDataResult(JTo_DATA_TYPE_E_CIGARETTE jtoDataECig) {
if(jtoDataECig.getSubCMD() == JToAction.SUB_CMD.ZERO){//油量
jtoDataECig.getPercentage();//百分比
}else if(jtoDataECig.getSubCMD() == JToAction.SUB_CMD.ONE){//功率
List powerList = jTo_data_type_e_cigarette.getPowerList();
}else if(jtoDataECig.getSubCMD() == JToAction.SUB_CMD.THREE){//历史数据
for (JTo_DATA_TYPE_E_CIGARETTE.ItemData itemData : jtoDataECig.getList()) {
long time = itemData.getTime();//时间
int duration = itemData.getDuration();//持续时间,需要除以10,保留1位小数
}
}
return false;
}
});
```