#include "osal_timer.h"\r
#include "bleEvent.h"\r
#include "app_common_api.h"\r
+#include "hidService.h"\r
#include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h"\r
#include "errcode.h"\r
-\r
+#define PHONE_WATCH_CONFIG_PATH "/user/userdata/phone_watch.json"\r
+#define ALARM_DATA_CONFIG_PATH "/user/userdata/alarm_test.json"\r
+uint8_t *bigDataBuf = NULL;//大数据buf\r
+uint8_t bigDataBufLen=0;\r
+bool sendbigDataBufState = false;//发送大数据表示不要被其他指令打断\r
+bool recvBigDataBufState = false;//接收大数据标志\r
+static bool muiltFlag = 0;//多包数据flag\r
+static uint16_t data_len = 0;\r
ble_recv_data_info_t ble_recv_data;\r
ble_recv_msg_callback_t g_recv_msg_toUI = NULL;\r
-\r
+#if 1\r
\r
// typedef void (*hx3695_msg_callback_t)(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen);\r
uint32_t ble_recv_register_msg_callback(ble_recv_msg_callback_t func)\r
{\r
return g_recv_msg_toUI;\r
}\r
-\r
+static msg_get_heart_set_param_info_t hr_param;\r
+static msg_get_spo2_set_param_info_t spo2_param;\r
+static msg_drink_set_param_info_t drink_info;\r
+static msg_drink_param_info_t drink_on_t;//喝水提醒开关\r
+static msg_watch_lcd_param_info_t watch_lcd_param;//手表屏幕参数\r
+static msg_get_voice_vibration_info_t voice_vibration;\r
+static msg_caramer_info_t caramer_info;//拍照手势状态 0退出拍照 1进入拍照\r
+static msg_user_info_t user_info;//用户信息 体重 身高 年龄 性别\r
+//手表TODO 这是一个sample\r
int ble_recv_msg_callback(uint8_t writ_read,uint16_t msg_typeID, uint8_t *msg_data, uint16_t msg_datalen)\r
{\r
+ if(writ_read == READ_FLASH_DATA){//读手表数据 WRITE_FLASH_DATA 写手表数据\r
+ switch (msg_typeID)\r
+ {\r
+ case SET_DRINK_PARAM_CMD:\r
+ memset(&drink_info,0,sizeof(msg_drink_set_param_info_t));\r
+ drink_info.drink_on = 1;\r
+ drink_info.alarm_mode = 1;\r
+ drink_info.start_hour = 8;\r
+ drink_info.startt_min = 9;\r
+ drink_info.end_hour = 23;\r
+ drink_info.end_min = 59;\r
+ drink_info.frequenc = 1;\r
+ memcpy(msg_data,&drink_info,sizeof(msg_drink_set_param_info_t));\r
+ \r
+ break;\r
+ case GET_WATCH_HR_SET_PARAM_CMD:\r
+ memset(&hr_param,0,sizeof(msg_get_heart_set_param_info_t));\r
+ hr_param.frequence = 1;\r
+ hr_param.remind_on = 1;\r
+ hr_param.max_min = 1;\r
+ hr_param.heart = 180;\r
+ memcpy(msg_data,&hr_param,sizeof(msg_get_heart_set_param_info_t));\r
+ \r
+ break;\r
+ case GET_DRINK_SWITCH_CMD:\r
+ \r
+ memset(&drink_on_t,0,sizeof(msg_drink_param_info_t));\r
+ drink_on_t.drink_on = 1;\r
+ memcpy(msg_data,&drink_on_t,sizeof(msg_drink_param_info_t));\r
+ break;\r
+ case GET_WATCH_LCD_PARAM_CMD:\r
+ memset(&watch_lcd_param,0,sizeof(msg_watch_lcd_param_info_t));\r
+ watch_lcd_param.brigntess = 10;\r
+ watch_lcd_param.screen_time = 3;\r
+ watch_lcd_param.wrist_on = 0;\r
+ memcpy(msg_data,&watch_lcd_param,sizeof(msg_get_heart_set_param_info_t));\r
+ \r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ \r
+ \r
+ }else{\r
+ switch (msg_typeID)\r
+ {\r
+ case SET_DRINK_PARAM_CMD:\r
+ \r
+ memset(&drink_info,0,sizeof(msg_drink_set_param_info_t));\r
+ drink_info.drink_on = msg_data[0];\r
+ drink_info.alarm_mode = msg_data[1];\r
+ drink_info.target_drink = msg_data[2]+msg_data[3]*256;\r
+ drink_info.start_hour = msg_data[4];\r
+ drink_info.startt_min = msg_data[5];\r
+ drink_info.end_hour = msg_data[6];\r
+ drink_info.end_min = msg_data[7];\r
+ drink_info.frequenc = msg_data[8];\r
+ printf("drink_info %d %d %d %d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,\r
+ drink_info.target_drink,drink_info.start_hour,drink_info.startt_min,drink_info.end_hour,\r
+ drink_info.end_min,drink_info.frequenc);\r
+ // memcpy(msg_data,&drink_info,sizeof(msg_drink_set_param_info_t));\r
+ break;\r
+ case GET_DRINK_SWITCH_CMD:\r
+ \r
+ memset(&drink_on_t,0,sizeof(msg_drink_param_info_t));\r
+ drink_on_t.drink_on = 1;\r
+ memcpy(msg_data,&drink_on_t,sizeof(msg_drink_param_info_t));\r
+ break;\r
+ \r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ for(uint16_t i = 0;i<msg_datalen;i++)\r
+ {\r
+ printf("%02x ",msg_data[i]);\r
+ }\r
int ret = 1;\r
return ret;\r
}\r
+\r
+void cameram_data(void)//拍照发送数据 调用这个接口即可\r
+{\r
+ uint8_t data[2]={0x01,0x00};\r
+ errcode_t ret = ble_hid_server_send_input_report(&data,2);\r
+ osal_msleep(100); /* wait 100 ms */\r
+ memset(data,0,2);\r
+ (void)ble_hid_server_send_input_report(&data, 2); /* 上报按下按键 把停止发送指令也要发送 防止一直拍照*/\r
+ printf("cameram_send_data:0x%x",ret);\r
+}\r
+\r
bool bigDataBufState=false;//大数据传输状态\r
-static bool Check_CRC(uint8_t *crcnum,uint16_t len)//计算20byte的的校验位\r
+static bool Check_CRC(uint8_t *crcnum,uint16_t len,uint8_t crcvalue)//计算20byte的的校验位\r
{\r
uint8_t crcbuf = 0;\r
uint8_t lrcValue = 0x00;\r
- for(uint16_t i = 0; i < len-1; i++)\r
+ for(uint16_t i = 0; i < len; i++)\r
{\r
lrcValue =lrcValue+ crcnum[i];\r
- printf("%x ",crcnum[i]);\r
+ // printf("%02x ",crcnum[i]);\r
}\r
crcbuf = lrcValue%256;\r
crcbuf = 256-crcbuf;\r
crcbuf = crcbuf%256;\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC ret:0x%x\r\n",crcbuf);\r
- if(crcbuf == crcnum[len-1])\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC ret:0x%x len:%d\r\n",crcbuf,len);\r
+ if(crcbuf == crcvalue)\r
{\r
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC true:\r\n");\r
return true;\r
{\r
lrcValue =lrcValue+ crcnum[i];\r
}\r
+ // printf("Calculate_CRC:%x,len:%d",lrcValue,len);\r
crcbuf = lrcValue%256;\r
crcbuf = 256-crcbuf;\r
crcbuf = crcbuf%256;\r
- // uint8_t crcbuf = 0x00;\r
- // // uint8_t lrcValue = 0x00;\r
- // for(uint16_t i = 0; i < len; i++)\r
- // {\r
- // crcbuf ^= crcnum[i];\r
- // }\r
return crcbuf;\r
}\r
static uint8_t cal_sum(uint8_t *crcnum,uint16_t len)//计算20byte\r
for(uint16_t i = 0; i < len; i++)\r
{\r
lrcValue =lrcValue+ crcnum[i];\r
- printf("%02x ",crcnum[i]);\r
}\r
- printf("cal_sum\r\n");\r
return lrcValue;\r
}\r
static uint8_t Calculate_CRC_Big(uint8_t *crcnum,uint16_t len)//计算20byte\r
errcode_t sendBleData(uint8_t *buf,uint16_t len)\r
{\r
errcode_t ret = ERRCODE_FAIL;\r
- if(bigDataBufState == true)return ERRCODE_FAIL;\r
- for(uint16_t i = 0;i<len;i++)\r
- { \r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "%02x ",buf[i]);\r
- }\r
+ if(bigDataBufState == true || sendbigDataBufState == true)return ERRCODE_FAIL; //在手表发送分包数据时 手表不允许发指令给app\r
+ // for(uint16_t i = 0;i<len;i++)\r
+ // { \r
+ // printf("%02x ",buf[i]);\r
+ // }\r
if(Bleconnect == true )\r
{\r
ret = svr_ble_bt_gatts_noyify(buf,len);\r
}\r
void sendDataNow(uint8_t *buf,uint16_t len)\r
{\r
- for(uint16_t i = 0;i<len;i++)\r
- { \r
- printf("%02x ",buf[i]);\r
- }\r
if(Bleconnect == true )\r
{\r
svr_ble_bt_gatts_noyify(buf,len);\r
}\r
}\r
//发送ble数据\r
-void sendBleDataNow(uint8_t *buf,uint16_t len)\r
-{\r
- if(bigDataBufState == true)return;\r
- for(uint16_t i = 0;i<len;i++)\r
- { \r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "%02x ",buf[i]);\r
- }\r
- if(Bleconnect == true )\r
- {\r
- svr_ble_bt_gatts_noyify(buf,len);\r
- }\r
-}\r
-uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空 只要mac地址不为空就认为和该手机绑定过不要走连接流程只要走回连即可\r
+uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空 \r
uint8_t parie_mac[6];//配对完成之后的的mac地址\r
uint8_t phoneDataFlag = 0;\r
//发送配对指令\r
memcpy(value+15,&tmp_data,2);\r
value[17] = 0x01;\r
value[18] = Calculate_CRC(value,1+18);\r
- if(Check_CRC(value,2+17))\r
- {\r
- sendBleData(value,19);\r
- }\r
- \r
+ sendBleData(value,19);\r
}\r
\r
static void jsonCheck_phoneinfor(uint8_t *buf,uint8_t *mac_data)//解析手机信息json\r
{\r
uint8_t mac_tmp[6];\r
memset(mac_tmp,0,6);\r
+ char *devname;//手机设备名称\r
+ uint8_t type = 0;\r
uint8_t count1 = 0;\r
uint8_t count2 = 0;\r
uint8_t *json;\r
\r
cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
if (cJSON_IsString(pn)) {\r
- printf("产品名称: %s\n", pn->valuestring);\r
+ printf("设备名称: %s\n", pn->valuestring);\r
+ \r
}\r
\r
cJSON* tp = cJSON_GetObjectItem(root, "tp");\r
if (cJSON_IsNumber(tp)) {\r
printf("类型: %d\n", tp->valueint);\r
+ type = tp->valueint;\r
}\r
\r
cJSON* mac = cJSON_GetObjectItem(root, "mac");\r
cJSON_ArrayForEach(macElement, mac) {\r
if (cJSON_IsNumber(macElement)) {\r
printf("%d", macElement->valueint);\r
- if (macElement->next != NULL) {\r
+ if (macElement->prev != NULL) {\r
phone_mac[count1++] = macElement->valueint;\r
mac_tmp[count2++] = macElement->valueint;\r
printf(", ");\r
}\r
printf("\n");\r
}\r
- if(sizeof(mac_tmp) != 0)\r
+ if(mac_tmp[0] != 0 && mac_tmp[1] != 0 && mac_tmp[2] != 0 && mac_tmp[3] != 0 && mac_tmp[4] != 0 && mac_tmp[5] != 0)\r
{\r
printf("MAC地址: len %d",sizeof(mac_tmp));\r
memcpy(mac_data,mac_tmp,6);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp,2);\r
value[17] = 1;\r
- value[18] = Calculate_CRC(value+17,1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendok = sendBleData(value,19);\r
bool ret = bt_is_acl_connected(&phone_addr);\r
- bool remove = 0;\r
- if(ret == true)\r
- {\r
- errcode_t ret = gap_ble_remove_all_pairs(); \r
- remove = gap_remove_all_pairs();\r
- printf("remove11111!!!!!!:%d",remove);\r
- }else{\r
- errcode_t ret = gap_ble_remove_all_pairs(); \r
- remove = gap_remove_all_pairs();\r
- printf("remove2222!!!!!!:%d",remove);\r
- }\r
+ gap_ble_remove_all_pairs(); \r
+ gap_remove_all_pairs();\r
closeBle();\r
return sendok;\r
}\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp,2);\r
value[17] = flag;\r
- value[18] = Calculate_CRC(value+17,1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}\r
-void clearPaireCmd(uint8_t *crcnum,uint16_t len)//发送清除配对指令\r
+void clearPaireCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)//发送清除配对指令\r
{\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
//弹出清除配对界面不弹出是则发送0x02操作失败 1操作成功 0校验失败\r
clearPaireFlag(1);\r
void comfirmPaire(uint8_t flag)\r
{\r
uint8_t value[19];\r
- uint8_t crcvalue = 0;\r
memset(value,0,19);\r
uint32_t tmp = 1;\r
value[0] =0x72;\r
\r
}\r
\r
-uint8_t bond_phone = 0;//是否和手机app绑定过已经绑定就不需要配对指令给app,直接发起配对\r
-void getPhoneInfo(uint8_t *buf,uint16_t len)//获取手机信息\r
+uint8_t firts_bond = 0;//是否和手机app绑定过已经绑定就不需要配对指令给app,直接发起配对\r
+void getPhoneInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取手机信息\r
{\r
- \r
+ //static void * next_tmp;\r
uint8_t value[20];\r
- uint8_t crcvalue = 0;\r
+ // uint8_t crcvalue = 0;\r
memset(value,0,20);\r
uint32_t tmp = 1;\r
uint16_t tmp_fen= 1;\r
memcpy(value+15,&tmp_fen,2);\r
phoneDataFlag = 1;\r
\r
- if(Check_CRC(buf,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
- ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
- if(func != NULL)\r
- {\r
- func(0x01,0x011a,value,19);\r
- // func(HX3695_MSG_TYPE_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
- }\r
uint8_t *tmp_data;\r
- tmp_data = buf;\r
+ tmp_data = crcnum;\r
uint8_t copare_mac[6];\r
memset(copare_mac,0,6);\r
jsonCheck_phoneinfor(tmp_data,&copare_mac);\r
gap_ble_pair_state_t status;\r
gap_ble_get_pair_state(&phone_addr,&status);//获取配对状态\r
uint8_t bond = 1;//未与任何手机绑定过\r
- if(strlen((char *)copare_mac) != 0 && strlen((char *)parie_mac)) //两个都不为空才进行比较\r
- {\r
- int result = memcmp(copare_mac,parie_mac,6);//两个不一致说明和其他手机绑定了\r
- if(result == 0)//相等则手机与改手机绑定过\r
- {\r
- bond = 2;//和该手机绑定过\r
- }\r
- else{\r
- bond = 3;//和其他手机绑定过\r
+ errcode_t ret = 0;\r
+ firts_bond = 0;\r
+\r
+ uint8_t save_mac[6];\r
+ uint8_t save_mac_t[6];\r
+ uint8_t count = 0;\r
+ uint8_t count_t = 0;\r
+ FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");\r
+ if (jsfile != NULL) {\r
+ printf("succes opening file\n");\r
+ fseek(jsfile, 0, SEEK_END);\r
+ long fileSize = ftell(jsfile);\r
+ fseek(jsfile, 0, SEEK_SET);\r
+\r
+ char *jsonData = (char *)malloc(fileSize + 1);\r
+ fread(jsonData, 1, fileSize, jsfile);\r
+ jsonData[fileSize] = '\0';\r
+ fclose(jsfile);\r
+\r
+ // 解析JSON数据\r
+ cJSON *root = cJSON_Parse(jsonData);\r
+ free(jsonData);\r
+\r
+ if (root != NULL) {\r
+ cJSON *modifiedJson = cJSON_GetObjectItem(root,"mac");\r
+ if (cJSON_IsArray(modifiedJson)) {\r
+ printf("MAC地址: ");\r
+ cJSON* macElement = NULL;\r
+ cJSON_ArrayForEach(macElement, modifiedJson) {\r
+ if (cJSON_IsNumber(macElement)) {\r
+ if ((macElement->prev != NULL)) {\r
+ save_mac[count] = macElement->valueint;\r
+ count++;\r
+ }\r
+ \r
+ }\r
+ }\r
+ printf("\n");\r
+ }\r
+ // printf("success parsing JSON :save_mac :%d %d %d %d %d %d\n",save_mac[0],save_mac[1],save_mac[2],save_mac[3],save_mac[4],save_mac[5]);\r
}\r
- printf("gap_ble_pair_remote_device result %d\r\n",result);\r
+ // 释放资源\r
+ cJSON_Delete(root);\r
}\r
- errcode_t ret = 0;\r
- // errcode_t ret = gap_ble_remove_all_pairs(); \r
- // bool remove = gap_remove_all_pairs();\r
- printf("gap_ble_pair_remote_device status %d ret:%d\r\n",status,ret);\r
- bond_phone = 0;\r
- if(strlen((char *)copare_mac) == 0)\r
+ if(save_mac[0] == 0 && save_mac[1] == 0 && save_mac[2] == 0)//只要手表本地存储没有mac地址就走连接流程重新绑定\r
{\r
bond = 0x01;//手表未和任何手机绑定过\r
- \r
- }else\r
- {\r
- bond_phone = 1;\r
- bond = 0x02;//手表与该手机绑定过\r
- }\r
- value[17] = bond;//\r
- value[18] = Calculate_CRC(value,18);\r
- sendBleData(value,19);\r
- if(1)\r
- {\r
- uint16_t number;\r
- errcode_t ret = gap_ble_get_paired_devices_num(&number);\r
- int gap_ret = gap_get_pair_state(&phone_addr);\r
- gap_ble_pair_state_t status;\r
- gap_ble_get_pair_state(&phone_addr,&status);//获取配对状态\r
if(strlen((char *)copare_mac) == 0)//只要app没有下发mac就开启弹窗\r
{\r
comfirmPaire(1);\r
}else{\r
ret = gap_ble_pair_remote_device(&phone_addr);\r
}\r
- printf("gap_ble_pair_remote_device ret:%d number %d phone_mac_data 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x phone_addr->TYPE:%d\n",ret,number,phone_addr.addr[0],phone_addr.addr[1],phone_addr.addr[2],phone_addr.addr[3],phone_addr.addr[4],\r
+ printf("gap_ble_pair_remote_device ret: %d phone_mac_data 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x phone_addr->TYPE:%d\n",ret,phone_addr.addr[0],phone_addr.addr[1],phone_addr.addr[2],phone_addr.addr[3],phone_addr.addr[4],\r
phone_addr.addr[5],phone_addr.type);\r
+\r
+ }else\r
+ {\r
+ if(copare_mac[0] != 0 && copare_mac[1] != 0 && copare_mac[2] != 0 ) \r
+ {\r
+ printf("success parsing JSON :save_mac :%d %d %d %d %d %d copare_mac %d %d %d %d %d %d;\n",save_mac[0],save_mac[1],save_mac[2],save_mac[3],save_mac[4],save_mac[5],\r
+ copare_mac[0],copare_mac[1],copare_mac[2],copare_mac[3],copare_mac[4],copare_mac[5]);\r
+ int result = memcmp(copare_mac,save_mac,6);\r
+ if(result == 0)\r
+ {\r
+ firts_bond = 1;\r
+ bond = 0x02;//手表与该手机绑定过\r
+ }else{\r
+ bond = 0x03;//手表与其他手机绑定过\r
+ }\r
+ }else{//如果手机有保存mac app下发是空就提示和其他手机绑定过界面不在发起配对\r
+ bond = 0x03;//手表和其他手机绑定过\r
+\r
+ }\r
+ }\r
+ printf("bond flag:%d firts_bond:%d\r\n",bond,firts_bond);\r
+ value[17] = bond;//\r
+ value[18] = Calculate_CRC(value,18);\r
+ sendBleData(value,19);\r
+ if(bond == 0x03)\r
+ {\r
+ //加解绑提示界面是否和旧的手机解绑app 弹窗提示\r
+ return;\r
}\r
}else{\r
value[17] = 0x00;\r
value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}\r
- \r
- \r
}\r
\r
\r
void sendParieSuccess(uint8_t flag,uint8_t *mac)//发送配对成功指令to app\r
{\r
- if(bond_phone != 1 && phoneDataFlag == 1){//和该手机绑定过并且是连接app之后下发的数据 正常系统配对是不需要保存的\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);\r
+ if(firts_bond != 1 && phoneDataFlag == 1){//和该手机绑定过并且是连接app之后下发的数据 正常系统配对是不需要保存的\r
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);\r
uint8_t value[25];\r
uint8_t length = 0;\r
memset(value,0,25);\r
value[0] = 0x72;\r
value[1] = 0x05;\r
value[2] = 0x10;\r
- uint32_t tmp = 1;\r
- uint16_t tmp_data = 1;\r
- memcpy(value+3,&tmp,4);\r
- memcpy(value+7,&tmp,4);\r
- memcpy(value+11,&tmp,4);\r
- memcpy(value+15,&tmp_data,2);\r
+ uint32_t totalpack= 1;//总的包数\r
+ uint32_t data_len = 7;//数据长度\r
+ uint32_t pack_index= 1;//分包序号Index\r
+ uint16_t pack_dataLen = 7;\r
+ memcpy(value+3,&totalpack,4);\r
+ memcpy(value+7,&data_len,4);\r
+ memcpy(value+11,&pack_index,4);\r
+ memcpy(value+15,&pack_dataLen,2);\r
value[17] = flag;//1 配对成功 0 配对失败 \r
if(flag == 1)//配对成功\r
{\r
+ cJSON *dataJSON = cJSON_CreateObject();\r
+\r
+ cJSON* arrayJSON = cJSON_CreateArray();\r
+ for(uint8_t id = 0;id<6;id++)\r
+ {\r
+ cJSON_AddNumberToObject(arrayJSON,"id",mac[id]);\r
+ }\r
+ \r
+ // cJSON_AddNumberToObject(dataJSON,"id",i);\r
+ cJSON_AddItemToObject(dataJSON,"mac",arrayJSON);\r
+ char *jsonString = cJSON_PrintUnformatted(dataJSON);\r
+ printf("phone %s",jsonString);\r
+ FILE *file = fopen(PHONE_WATCH_CONFIG_PATH, "wb");\r
+ if (file)\r
+ {\r
+ if (fputs(jsonString, file) != EOF) // 将 JSON 字符串写入文件\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WriteJsonData success\n");\r
+ }\r
+ fclose(file);\r
+ }\r
+ free(jsonString);\r
+\r
+\r
+ \r
+ // 读取JSON文件\r
+\r
memcpy(value+18,mac,6);\r
memcpy(parie_mac,mac,6);\r
length = 18+6;\r
sendBleData(sendBuf,19);\r
\r
}\r
-static void jsonCheck_time(uint8_t *buf,char *set_time)//json 格式解析\r
+static void jsonCheck_time(uint8_t *buf)//json 格式解析\r
{\r
- uint8_t time_data[24];\r
+ char time_data[24];\r
memset(time_data,0,24);\r
+ \r
uint8_t *json;\r
json = buf;\r
cJSON* root = cJSON_Parse((const char *)json);\r
printf("时间 JSON解析错误\n");\r
return;\r
}\r
-\r
- cJSON* pn = cJSON_GetObjectItem(root, "time");\r
- if (cJSON_IsNumber(pn)) {\r
- printf("time: %d\n", pn->valueint);\r
+ char *locations;\r
+ int year = 1970;\r
+ uint8_t month = 1;\r
+ uint8_t day = 1;\r
+ uint8_t week = 4;\r
+ uint8_t hour = 0;\r
+ uint8_t minute = 0;\r
+ uint8_t second = 0;\r
+ cJSON* time = cJSON_GetObjectItem(root, "time");\r
+ if (cJSON_IsNumber(time)) {\r
+ printf("time: %d\n", time->valueint);\r
\r
}\r
- cJSON* week = cJSON_GetObjectItem(root, "week");\r
- if (cJSON_IsNumber(week)) {\r
- printf("week: %d\n", week->valueint);\r
- }\r
- cJSON* year = cJSON_GetObjectItem(root, "year");\r
- if (cJSON_IsNumber(week)) {\r
- printf("year: %d\n", year->valueint);\r
- }\r
- cJSON* month = cJSON_GetObjectItem(root, "month");\r
- if (cJSON_IsNumber(month)) {\r
- printf("month: %d\n", month->valueint);\r
- }\r
- cJSON* day = cJSON_GetObjectItem(root, "day");\r
- if (cJSON_IsNumber(day)) {\r
- printf("day: %d\n", day->valueint);\r
- }\r
- cJSON* hour = cJSON_GetObjectItem(root, "hour");\r
- if (cJSON_IsNumber(hour)) {\r
- printf("hour: %d\n", hour->valueint);\r
- }\r
- cJSON* minute = cJSON_GetObjectItem(root, "minute");\r
- if (cJSON_IsNumber(minute)) {\r
- printf("minute: %d\n", minute->valueint);\r
- }\r
- cJSON* second = cJSON_GetObjectItem(root, "second");\r
- if (cJSON_IsNumber(second)) {\r
- printf("second: %d\n", second->valueint);\r
+ cJSON* jsweek = cJSON_GetObjectItem(root, "week");\r
+ if (cJSON_IsNumber(jsweek)) {\r
+ printf("week: %d\n", jsweek->valueint);\r
+ week = jsweek->valueint;\r
+ }\r
+ cJSON* jsyear = cJSON_GetObjectItem(root, "year");\r
+ if (cJSON_IsNumber(jsyear)) {\r
+ printf("year: %d\n", jsyear->valueint);\r
+ year = jsyear->valueint;\r
+ }\r
+ cJSON* jsmonth = cJSON_GetObjectItem(root, "month");\r
+ if (cJSON_IsNumber(jsmonth)) {\r
+ printf("month: %d\n", jsmonth->valueint);\r
+ month = jsmonth->valueint;\r
+ }\r
+ cJSON* jsday = cJSON_GetObjectItem(root, "day");\r
+ if (cJSON_IsNumber(jsday)) {\r
+ printf("day: %d\n", jsday->valueint);\r
+ day = jsday->valueint;\r
+ }\r
+ cJSON* jshour = cJSON_GetObjectItem(root, "hour");\r
+ if (cJSON_IsNumber(jshour)) {\r
+ printf("hour: %d\n", jshour->valueint);\r
+ hour = jshour->valueint;\r
+ }\r
+ cJSON* jsminute = cJSON_GetObjectItem(root, "minute");\r
+ if (cJSON_IsNumber(jsminute)) {\r
+ printf("minute: %d\n", jsminute->valueint);\r
+ minute = jsminute->valueint;\r
+ }\r
+ cJSON* jssecond = cJSON_GetObjectItem(root, "second");\r
+ if (cJSON_IsNumber(jssecond)) {\r
+ printf("second: %d\n", jssecond->valueint);\r
+ second = jssecond->valueint;\r
}\r
cJSON* location = cJSON_GetObjectItem(root, "location");\r
if (cJSON_IsString(location)) {\r
printf("location: %s\n", location->valuestring);\r
+ locations = location->valuestring;\r
}\r
- sprintf((char *)time_data,"%d-%d-%d %d:%d:%d",year->valueint+2000,month->valueint,day->valueint,hour->valueint,minute->valueint,second->valueint);\r
- memcpy(set_time,time_data,strlen((char *)time_data));\r
+ sprintf((char *)time_data,"%d-%d-%d %d:%d:%d",year+2000,month,day,hour,minute,second);\r
+ set_system_time(time_data);\r
cJSON_Delete(root);\r
}\r
\r
\r
\r
\r
-void GetUTCtime(uint8_t *crcnum,uint16_t len)//获取时间\r
+void GetUTCtime(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取时间\r
{\r
uint32_t tmp = 1;\r
uint16_t tmp_data = 1;\r
memcpy(sendBuf+11,&tmp,4);\r
memcpy(sendBuf+15,&tmp_data,2);\r
\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
sendBuf[17] = 1;\r
sendBuf[18] = Calculate_CRC(sendBuf,18);\r
sendBleData(sendBuf,19);\r
- char set_time[24];\r
- memset((uint8_t *)set_time,0,24);\r
uint8_t *data;\r
data = crcnum;\r
- jsonCheck_time(data,&set_time);\r
- if(strlen(set_time) != 0)\r
+ jsonCheck_time(data);\r
+ }\r
+ else\r
+ {\r
+ sendBuf[17] = 0;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
+ }\r
+ \r
+}\r
+static void jsonCheck_alarm(uint8_t *buf)//json 解析闹钟数据\r
+{\r
+ uint8_t *json;\r
+ json = buf;\r
+ cJSON* root = cJSON_Parse((const char *)json);\r
+ if (root == NULL) {\r
+ printf("闹钟 JSON解析错误\n");\r
+ return;\r
+ }\r
+ cJSON* alarms = cJSON_GetObjectItem(root, "alarms");\r
+ int alarmCount = cJSON_GetArraySize(alarms);\r
+ printf("alarmCount %d\n",alarmCount);\r
+}\r
+void GetAlarmDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数\r
+{\r
+ uint32_t tmp = 1;\r
+ uint16_t tmp_data = 1;\r
+ uint8_t sendBuf[19];\r
+ memset(sendBuf,0,19);\r
+ sendBuf[0] = 0x72;\r
+ sendBuf[1] = 0x02;\r
+ sendBuf[2] = 0x21;\r
+ memcpy(sendBuf+3,&tmp,4);\r
+ memcpy(sendBuf+7,&tmp,4);\r
+ memcpy(sendBuf+11,&tmp,4);\r
+ memcpy(sendBuf+15,&tmp_data,2);\r
+\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
+ {\r
+ jsonCheck_alarm(crcnum);\r
+ \r
+ sendBuf[17] = 1;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
+ }\r
+ else\r
+ {\r
+ sendBuf[17] = 0;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
+ }\r
+ \r
+}\r
+\r
+\r
+\r
+void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数\r
+{\r
+ uint32_t tmp = 1;\r
+ uint16_t tmp_data = 1;\r
+ uint8_t sendBuf[19];\r
+ memset(sendBuf,0,19);\r
+ sendBuf[0] = 0x72;\r
+ sendBuf[1] = 0x02;\r
+ sendBuf[2] = 0x0e;\r
+ memcpy(sendBuf+3,&tmp,4);\r
+ memcpy(sendBuf+7,&tmp,4);\r
+ memcpy(sendBuf+11,&tmp,4);\r
+ memcpy(sendBuf+15,&tmp_data,2);\r
+\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
+ {\r
+ ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+ memset(&watch_lcd_param,0,sizeof(msg_watch_lcd_param_info_t));\r
+ \r
+ // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+ watch_lcd_param.brigntess = crcnum[0];\r
+ watch_lcd_param.screen_time = crcnum[1];\r
+ watch_lcd_param.wrist_on = crcnum[2];\r
+ if(func != NULL)\r
+ {\r
+ func(WRITE_FLASH_DATA,cmd,&watch_lcd_param,sizeof(msg_watch_lcd_param_info_t));\r
+ }\r
+ \r
+ sendBuf[17] = 1;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
+ }\r
+ else\r
+ {\r
+ sendBuf[17] = 0;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
+ }\r
+ \r
+}\r
+\r
+\r
+\r
+void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数\r
+{\r
+ uint32_t tmp = 1;\r
+ uint16_t tmp_data = 1;\r
+ uint8_t sendBuf[19];\r
+ memset(sendBuf,0,19);\r
+ sendBuf[0] = 0x72;\r
+ sendBuf[1] = 0x02;\r
+ sendBuf[2] = 0x0f;\r
+ memcpy(sendBuf+3,&tmp,4);\r
+ memcpy(sendBuf+7,&tmp,4);\r
+ memcpy(sendBuf+11,&tmp,4);\r
+ memcpy(sendBuf+15,&tmp_data,2);\r
+\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
+ {\r
+ ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+ memset(&voice_vibration,0,sizeof(msg_get_voice_vibration_info_t));\r
+ if(func != NULL)\r
+ {\r
+ func(READ_FLASH_DATA,cmd,&voice_vibration,sizeof(msg_get_voice_vibration_info_t));\r
+ }\r
+ // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+ uint8_t type = crcnum[0];\r
+ if(type == 0)//只改变系统音量参数 其他还是保持不变 按照原来的参数\r
+ {\r
+ voice_vibration.sys_volume = crcnum[1];\r
+ }else if(type == 1)//只改变铃声音量参数 其他还是保持不变 按照原来的参数\r
+ {\r
+ voice_vibration.ring_volume = crcnum[1];\r
+ }else if(type == 2)//只改变铃声和振动开关\r
+ {\r
+ voice_vibration.bell_on = crcnum[1];\r
+ voice_vibration.vibrate_on = crcnum[2];\r
+ }\r
+ if(func != NULL)\r
+ {\r
+ func(WRITE_FLASH_DATA,cmd,&voice_vibration,sizeof(msg_get_voice_vibration_info_t));\r
+ }\r
+ \r
+ sendBuf[17] = 1;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
+ }\r
+ else\r
+ {\r
+ sendBuf[17] = 0;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
+ }\r
+ \r
+}\r
+\r
+void GetHrSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数\r
+{\r
+ uint32_t tmp = 1;\r
+ uint16_t tmp_data = 1;\r
+ uint8_t sendBuf[19];\r
+ memset(sendBuf,0,19);\r
+ sendBuf[0] = 0x72;\r
+ sendBuf[1] = 0x02;\r
+ sendBuf[2] = 0x12;\r
+ memcpy(sendBuf+3,&tmp,4);\r
+ memcpy(sendBuf+7,&tmp,4);\r
+ memcpy(sendBuf+11,&tmp,4);\r
+ memcpy(sendBuf+15,&tmp_data,2);\r
+\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
+ {\r
+ ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+ memset(&hr_param,0,sizeof(msg_get_heart_set_param_info_t));\r
+ if(func != NULL)\r
+ {\r
+ func(READ_FLASH_DATA,cmd,&hr_param,sizeof(msg_get_heart_set_param_info_t));\r
+ }\r
+ // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+ hr_param.frequence = crcnum[0];\r
+ hr_param.remind_on = crcnum[1];\r
+ hr_param.max_min = crcnum[2];\r
+ hr_param.heart = crcnum[3];\r
+ if(func != NULL)\r
+ {\r
+ func(WRITE_FLASH_DATA,cmd,&hr_param,sizeof(msg_get_heart_set_param_info_t));\r
+ }\r
+ \r
+ sendBuf[17] = 1;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
+ }\r
+ else\r
+ {\r
+ sendBuf[17] = 0;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
+ }\r
+ \r
+}\r
+\r
+\r
+void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数\r
+{\r
+ uint32_t tmp = 1;\r
+ uint16_t tmp_data = 1;\r
+ uint8_t sendBuf[19];\r
+ memset(sendBuf,0,19);\r
+ sendBuf[0] = 0x72;\r
+ sendBuf[1] = 0x02;\r
+ sendBuf[2] = 0x13;\r
+ memcpy(sendBuf+3,&tmp,4);\r
+ memcpy(sendBuf+7,&tmp,4);\r
+ memcpy(sendBuf+11,&tmp,4);\r
+ memcpy(sendBuf+15,&tmp_data,2);\r
+\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
+ {\r
+ ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+ memset(&spo2_param,0,sizeof(msg_get_spo2_set_param_info_t));\r
+ if(func != NULL)\r
+ {\r
+ func(READ_FLASH_DATA,cmd,&spo2_param,sizeof(msg_get_spo2_set_param_info_t));\r
+ }\r
+ // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+ spo2_param.frequence = crcnum[0];\r
+ spo2_param.remind_on = crcnum[1];\r
+ if(spo2_param.remind_on)\r
+ {\r
+ spo2_param.spo2 = crcnum[2];\r
+ }\r
+ \r
+ if(func != NULL)\r
{\r
- set_system_time(set_time);\r
+ func(WRITE_FLASH_DATA,cmd,&spo2_param,sizeof(msg_get_spo2_set_param_info_t));\r
}\r
+ \r
+ sendBuf[17] = 1;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
}\r
else\r
{\r
}\r
\r
}\r
+\r
+void GetDrinkSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取喝水提醒s设置\r
+{\r
+ uint32_t tmp = 1;\r
+ uint16_t tmp_data = 1;\r
+ uint8_t sendBuf[19];\r
+ memset(sendBuf,0,19);\r
+ sendBuf[0] = 0x72;\r
+ sendBuf[1] = 0x02;\r
+ sendBuf[2] = 0x14;\r
+ memcpy(sendBuf+3,&tmp,4);\r
+ memcpy(sendBuf+7,&tmp,4);\r
+ memcpy(sendBuf+11,&tmp,4);\r
+ memcpy(sendBuf+15,&tmp_data,2);\r
+\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
+ {\r
+ ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+ msg_drink_set_param_info_t drink_info;\r
+ if(func != NULL)\r
+ {\r
+ func(READ_FLASH_DATA,SET_DRINK_PARAM_CMD,&drink_info,sizeof(msg_drink_set_param_info_t));\r
+ }//读设备内存\r
+ printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+ drink_info.drink_on = crcnum[0];\r
+ if(drink_info.drink_on == 0){\r
+ drink_info.drink_on = 0;\r
+ }else{\r
+ drink_info.drink_on = crcnum[0];\r
+ drink_info.alarm_mode = crcnum[1];\r
+ drink_info.target_drink = crcnum[2]+crcnum[3]*256;\r
+ drink_info.start_hour = crcnum[4];\r
+ drink_info.startt_min = crcnum[5];\r
+ drink_info.end_hour = crcnum[6];\r
+ drink_info.end_min = crcnum[7];\r
+ drink_info.frequenc = crcnum[8];\r
+ }\r
+ if(func != NULL)\r
+ {\r
+ func(WRITE_FLASH_DATA,SET_DRINK_PARAM_CMD,&drink_info,sizeof(msg_drink_set_param_info_t));\r
+ }\r
+ \r
+ sendBuf[17] = 1;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
+ }\r
+ else\r
+ {\r
+ sendBuf[17] = 0;\r
+ sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+ sendBleData(sendBuf,19);\r
+ }\r
+ \r
+}\r
+\r
static void jsonCheck_weather(uint8_t *buf)//json 格式解析 天气数据\r
{\r
uint8_t *json;\r
}\r
\r
\r
-void GetWeatherCmd(uint8_t *crcnum,uint16_t len)//获取天气数据\r
+void GetWeatherCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取天气数据\r
{\r
uint32_t tmp = 1;\r
uint16_t tmp_data = 1;\r
memcpy(sendBuf+11,&tmp,4);\r
memcpy(sendBuf+15,&tmp_data,2);\r
\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
sendBuf[17] = 1;\r
sendBuf[18] = Calculate_CRC(sendBuf,18);\r
sendBleData(sendBuf,19);\r
+ \r
jsonCheck_weather(crcnum);\r
}\r
else\r
\r
}\r
//获取用户数据 app下发的\r
-void getUserInfo(uint8_t *crcnum,uint16_t len)//\r
+void getUserInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
{\r
uint8_t value[19];\r
- uint8_t crcvalue = 0;\r
memset(value,0,19);\r
uint32_t tmp = 1;\r
value[0] =0x72;\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp,2);\r
\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
- uint8_t age = crcnum[0];\r
- uint8_t gender = crcnum[1];\r
- uint8_t height = crcnum[2];\r
- uint8_t weight = crcnum[3];\r
-\r
- uint32_t targetStep = 0;\r
- memcpy(&targetStep,&crcnum[4],4);\r
- uint16_t targetFatTime = 0;\r
- memcpy(&targetFatTime,&crcnum[8],2);\r
\r
- uint8_t targetStand = crcnum[10];\r
- uint8_t Time = crcnum[11];\r
+ ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+ memset(&user_info,0,sizeof(msg_user_info_t));\r
+ if(func != NULL)\r
+ {\r
+ func(READ_FLASH_DATA,cmd,&user_info,sizeof(msg_user_info_t));\r
+ }\r
+ user_info.age = crcnum[0];\r
+ user_info.gender = crcnum[1];\r
+ user_info.height = crcnum[2];\r
+ memcpy(crcnum+3,&user_info.weight,2);\r
+ memcpy(crcnum+5,&user_info.target_step,4);\r
+ memcpy(crcnum+9,&user_info.fat_time,2);\r
+ user_info.target_stand = crcnum[11];\r
+ user_info.timeformat = crcnum[12];\r
+ if(func != NULL)\r
+ {\r
+ func(WRITE_FLASH_DATA,cmd,&user_info,sizeof(msg_user_info_t));\r
+ }\r
\r
value[17] = 0x01;\r
value[18] = Calculate_CRC(value,18);\r
}\r
\r
//02 类型\r
-void typeHexTwoData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)\r
+void type2AE4Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue)\r
{\r
uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];\r
+ printf("type2AE4Data typeID:0x%x",typeID);\r
switch (typeID) //ID\r
{\r
- case USER_INFOR_CMD://获取用户信息\r
- getUserInfo(data,datalen);\r
+ case USER_INFOR_CMD://app下发的获取用户信息\r
+ getUserInfo(typeID,data,datalen,totalData,crcvalue);\r
break;\r
- case GET_PHONE_INFOR_CMD://手机下发的手机信息\r
- getPhoneInfo(data,datalen);\r
+ case SET_PHONE_INFOR_CMD://app下发的下发的手机信息\r
+ getPhoneInfo(typeID,data,datalen,totalData,crcvalue);\r
break;\r
case CURR_TIME_CMD:\r
- GetUTCtime(data,datalen);//获取时间app下发的时间进行解析\r
+ GetUTCtime(typeID,data,datalen,totalData,crcvalue);//获取时间app下发的时间进行解析\r
break;\r
case SET_BLE_NAME_CMD:\r
getPhoneInfo_test();\r
break;\r
case SET_TRAIN_TARGET_CMD:\r
break;\r
- case GET_ALARM_DATA_CMD:\r
+ case SET_ALARM_DATA_CMD:\r
+ GetAlarmDataCmd(typeID,data,datalen,totalData,crcvalue);\r
+ printf("alarm infor !!!!!!!!!!\r\n");\r
break;\r
case DELETE_FILE_CMD:\r
break;\r
break;\r
case SYN_TODAY_BASIC_TRAIN_TXT_CMD:\r
break;\r
- case GET_WEATHER_DATA_CMD://天气数据\r
- GetWeatherCmd(data,datalen);\r
+ case SYN_WATCH_LCD_PARAM_CMD://app下发的同步屏幕参数到手表\r
+ GetWatchLcdParamCmd(typeID,data,datalen,totalData,crcvalue);\r
+ break;\r
+ case SYN_VOICE_VIBRATION_PARAM_CMD://app下发声音与振动参数\r
+ GetVoiceVibrateParamCmd(typeID,data,datalen,totalData,crcvalue);\r
+ break;\r
+ case SET_WATCH_HR_SET_PARAM_CMD://app下发设置心率参数\r
+ GetHrSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
+ break;\r
+ case SET_WATCH_SPO2_SET_PARAM_CMD:\r
+ GetSpo2SetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
+ break;\r
+ case SET_DRINK_PARAM_CMD://app下发的喝水提醒设置\r
+ GetDrinkSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
+ break;\r
+ case SET_WEATHER_DATA_CMD://app下发的天气数据\r
+ GetWeatherCmd(typeID,data,datalen,totalData,crcvalue);\r
break;\r
default:\r
break;\r
}\r
\r
//切换表盘\r
-static void switchDialCmd(uint8_t *crcnum,uint16_t len)\r
+static void switchDialCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint16_t daila_type = 0;\r
memcpy(&daila_type,&crcnum[17],2);\r
value[17] = 1;//校验成功\r
- value[18] = Calculate_CRC(value+17,18-1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}else\r
{\r
value[17] = 0;//校验失败\r
- value[18] = Calculate_CRC(value+17,18-1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}\r
}\r
\r
+//获取闹钟数据\r
+static void SetAlarmDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+{\r
+ \r
+ uint32_t tmp = 1;\r
+ uint32_t data_len = 1;\r
+ uint16_t tmp_data = 1;\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
+ {\r
+ \r
+ cJSON *dataJSON = cJSON_CreateObject();\r
+ cJSON* data_arryJSON = cJSON_CreateArray();\r
+ cJSON_AddNumberToObject(dataJSON,"code",1);\r
+ \r
+ for(uint8_t i =0;i<2;i++)\r
+ {\r
+ cJSON* itemJSON = cJSON_CreateObject();\r
+ cJSON* arrayJSON = cJSON_CreateArray();\r
+ for(uint8_t id = 0;id<7;id++)\r
+ {\r
+ cJSON_AddNumberToObject(arrayJSON,"id",id);\r
+ }\r
+ \r
+ cJSON_AddNumberToObject(itemJSON,"id",i);\r
+ cJSON_AddItemToObject(itemJSON,"repeat",arrayJSON);\r
+ cJSON_AddNumberToObject(itemJSON,"hour",2+20*i);\r
+ cJSON_AddNumberToObject(itemJSON,"minute",30+i*0);\r
+ cJSON_AddNumberToObject(itemJSON,"enable",1);\r
+ cJSON_AddItemReferenceToArray(data_arryJSON,itemJSON);\r
+ }\r
+ cJSON_AddItemToObject(dataJSON,"alarms",data_arryJSON);\r
+\r
+ char *json_format = cJSON_PrintUnformatted(dataJSON);\r
+ printf("%d\n",strlen(json_format));\r
+ cJSON_Delete(dataJSON);\r
+ printf("phone %s",json_format);\r
+ char *new_json;\r
+\r
+ uint32_t len = strlen(json_format);\r
+ uint8_t value[len+17+1];\r
+ memset(value,0,len+17+1);\r
+ value[0] = 0x72;\r
+ value[1] = 0x01;\r
+ value[2] = 0x01;\r
+ data_len = len;\r
+ tmp_data = len;\r
+ memcpy(value+3,&tmp,4);\r
+ memcpy(value+7,&data_len,4);\r
+ memcpy(value+11,&tmp,4);\r
+ memcpy(value+15,&tmp_data,2);\r
+ if((data_len+18) > ble_nus_max_data_len && data_len > 0)\r
+ {\r
+\r
+ }else{\r
+ if(data_len != 0){\r
+ memcpy(value+17,json_format,data_len);\r
+ }\r
+ \r
+ }\r
+ value[data_len+17] = Calculate_CRC(value,data_len+17);\r
+ sendBleData(value,data_len+17+1);\r
+ }else\r
+ {\r
+ uint8_t value[19];\r
+ memset(value,0,19);\r
+ value[0] = 0x72;\r
+ value[1] = 0x01;\r
+ value[2] = 0x01;\r
+ uint32_t tmp = 1;\r
+ uint16_t tmp_data = 1;\r
+ memcpy(value+3,&tmp,4);\r
+ memcpy(value+7,&tmp,4);\r
+ memcpy(value+11,&tmp,4);\r
+ memcpy(value+15,&tmp_data,2);\r
+ value[17] = 0;//校验失败\r
+ value[18] = Calculate_CRC(value,18);\r
+ sendBleData(value,19);\r
+ }\r
+}\r
+\r
+\r
+\r
//关于本机内容\r
-static void aboutDeviceCmd(uint8_t *crcnum,uint16_t len)\r
+static void aboutDeviceCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
cJSON *dataJSON = cJSON_CreateObject();\r
cJSON_AddNumberToObject(dataJSON,"code",1);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
memcpy(value+17,(uint8_t *)json_format,data_len);\r
- unsigned char lrc = Calculate_CRC(value+17,data_len);\r
+ unsigned char lrc = Calculate_CRC(value,data_len+17);\r
printf("lrc:%d",lrc);\r
value[data_len+18] = lrc;\r
sendBleData(value,data_len+18);\r
}else\r
{\r
value[17] = 0;\r
- unsigned char lrc = Calculate_CRC(value+17,18-1);\r
+ unsigned char lrc = Calculate_CRC(value,18);\r
value[18] = lrc;\r
sendBleData(value,19);\r
}\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
value[17] = flag;//校验标志\r
- value[18] = Calculate_CRC(value+17,18-1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}\r
-static void findWatchCmd(uint8_t *crcnum,uint16_t len)\r
+static void findWatchCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
\r
- uint8_t findFlag = crcnum[17];\r
- if(Check_CRC(crcnum+17,len-17))\r
+ uint8_t findFlag = crcnum[0];\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
//弹窗界面\r
if(findFlag)//查找手表弹窗界面\r
} \r
}\r
//获取sd卡剩余空间\r
-static void GetSDSpaceCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSDSpaceCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[27];\r
memset(value,0,27);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum+17,len-17))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint8_t sdFlag = 0;\r
if(sdFlag == 1)// 1获取失败 2 获取成功 \r
{\r
value[17] = 1;//校验标志\r
- value[18] = Calculate_CRC(value+17,18-1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,27);\r
}else{\r
value[17] = 2;//校验标志\r
- value[18] = Calculate_CRC(value+17,18-1); \r
+ value[18] = Calculate_CRC(value,18); \r
sendBleData(value,19);\r
}\r
}else\r
{\r
value[17] = 0;//校验标志\r
- value[18] = Calculate_CRC(value+17,18-1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
} \r
}\r
//获取当前数据\r
-static void GetCurDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetCurDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
cJSON *dataJSON = cJSON_CreateObject();\r
const char *string_value[8]={"hr","spo2","stress","steps","duration","standup","calories","distance"};\r
\r
// uint8_t buf[22] = {0x7b,0x22,0x74,0x70,0x22,0x3a,0x31,0x2c,0x22,0x70,0x6e,0x22,0x3a,0x22,0x69,0x50,0x68,0x6f,0x6e,0x65,0x22,0x7d};\r
\r
- if(Check_CRC(crcnum+17,len-17))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
memcpy(value+17,(uint8_t *)json_format,data_len);\r
- uint8_t lrc = Calculate_CRC(value+17,dataLen);\r
+ uint8_t lrc = Calculate_CRC(value,data_len+17);\r
printf("lrc:%d",lrc);\r
value[data_len+18] = lrc;\r
sendBleData(value,data_len+18);\r
}else\r
{\r
value[17] = 0;\r
- uint8_t lrc = Calculate_CRC(value+17,18-1);\r
+ uint8_t lrc = Calculate_CRC(value,18);\r
value[18] = lrc;\r
sendBleData(value,19);\r
}\r
}\r
//获取当手表电池电量\r
-static void GetBatteryLevelCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetBatteryLevelCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum+17,len-17))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
float voltage = 0.0F;\r
uint8_t power = 0;\r
power = battery_get_voltage(&voltage);\r
value[17] = power;\r
- value[18] = Calculate_CRC(value+17,18-1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}else\r
{\r
value[17] = 0;\r
- value[18] = Calculate_CRC(value+17,18-1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}\r
}\r
//获取开关消息推送功能\r
-static void GetSwitchMessCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSwitchMessCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum+17,len-17))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
- uint8_t switch_on = crcnum[17];//0 关闭 1 开启\r
+ uint8_t switch_on = crcnum[0];//0 关闭 1 开启\r
\r
value[17] = 1;\r
- value[18] = Calculate_CRC(value+17,18-1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}else\r
{\r
value[17] = 0;\r
- value[18] = Calculate_CRC(value+17,18-1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}\r
}\r
//撤销当前文件传输 1 OTA 2MP3 3表盘 3天气 5闹钟\r
-static void RemoveFileCmd(uint8_t *crcnum,uint16_t len)\r
+static void RemoveFileCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum+17,len-17))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
- uint8_t switch_on = crcnum[17];//0 关闭 1 开启\r
+ uint8_t switch_on = crcnum[0];//0 关闭 1 开启\r
\r
value[17] = 1; //1 操作成功 2 操作失败\r
- value[18] = Calculate_CRC(value+17,18-1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}else\r
{\r
value[17] = 0;\r
- value[18] = Calculate_CRC(value+17,18-1);\r
+ value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}\r
}\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,1))\r
{\r
uint8_t fileType = crcnum[17];//2 mp3 3 表盘\r
\r
}\r
}\r
//删除指定类型所有的文件\r
-static void DeleteFileTypeCmd(uint8_t *crcnum,uint16_t len)\r
+static void DeleteFileTypeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
value[17] = 1; //1 操作成功 2 操作失败\r
value[18] = Calculate_CRC(value,18);\r
}\r
}\r
//开启指定运动模式\r
-static void OpenSportModeCmd(uint8_t *crcnum,uint16_t len)\r
+static void OpenSportModeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
- uint8_t sportMode = crcnum[17];//运动类型 0 健走 1跑步 2骑行 3\r
+ uint8_t sportMode = crcnum[0];//运动类型 0 健走 1跑步 2骑行 3\r
\r
value[17] = 1; //1 操作成功 2 操作失败\r
value[18] = Calculate_CRC(value,18);\r
}\r
}\r
//结束运动模式\r
-static void StopSportModeCmd(uint8_t *crcnum,uint16_t len)\r
+static void StopSportModeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
value[17] = 1; //1 操作成功 2 操作失败\r
value[18] = Calculate_CRC(value,18);\r
}\r
}\r
//设置语言\r
-static void SetLanguageCmd(uint8_t *crcnum,uint16_t len)\r
+static void SetLanguageCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
- uint8_t language = crcnum[17];\r
+ uint8_t language = crcnum[0];\r
\r
value[17] = 1; //1 操作成功 2 操作失败\r
value[18] = Calculate_CRC(value,18);\r
}\r
}\r
//开启/关闭获取实时训练数据\r
-static void SetRealTimeDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void SetRealTimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
- uint8_t autoSportData = crcnum[17];//开关 1开启 0关闭\r
+ uint8_t autoSportData = crcnum[0];//开关 1开启 0关闭\r
\r
value[17] = 1; //1 操作成功 2 操作失败\r
value[18] = Calculate_CRC(value,18);\r
}\r
}\r
//设置训练试试数据采集频率\r
-static void SetRTDataFreCmd(uint8_t *crcnum,uint16_t len)\r
+static void SetRTDataFreCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
- uint8_t Frequence = crcnum[17];//频率单位是s\r
+ uint8_t Frequence = crcnum[0];//频率单位是s\r
\r
value[17] = 1; //1 操作成功 2 操作失败\r
value[18] = Calculate_CRC(value,18);\r
\r
}\r
//获取实时训练数据\r
-static void GetRealTimeDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetRealTimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
sendRealTimeDataToAPP(1);\r
}else\r
}\r
}\r
//设置最高心率提醒\r
-static void SetMaxHrRemindCmd(uint8_t *crcnum,uint16_t len)\r
+static void SetMaxHrRemindCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))//\r
+ if(Check_CRC(crcnum,len,crcvalue))//\r
{\r
- uint8_t maxHr = crcnum[17];\r
+ uint8_t maxHr = crcnum[0];\r
if(maxHr > 250)maxHr = 250;\r
else if(maxHr <= 0) maxHr = 0;\r
\r
\r
}\r
//训练暂停/恢复\r
-static void GetSportPasueResetCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSportPasueResetCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))//\r
+ if(Check_CRC(crcnum,len,crcvalue))//\r
{\r
- uint8_t PauseStop = crcnum[17];//0 暂停 1恢复\r
+ uint8_t PauseStop = crcnum[0];//0 暂停 1恢复\r
value[17] = 1;\r
value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
\r
}\r
//发送当前表盘到app\r
-static void SendDialToAppCmd(uint8_t *crcnum,uint16_t len)\r
+static void SendDialToAppCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[20];\r
memset(value,0,20);\r
memcpy(value+7,&datalen,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))//\r
+ if(Check_CRC(crcnum,len,crcvalue))//\r
{\r
uint16_t dialNum = 450;//0 暂停 1恢复\r
memcpy(&value[17],&dialNum,2);\r
\r
}\r
//获取手表当前状态\r
-static void GetWatchStatusCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetWatchStatusCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[20];\r
memset(value,0,20);\r
sendBleData(value,19);\r
}\r
//获取手表屏幕参数\r
-static void GetScreenParamCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetScreenParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[21];\r
memset(value,0,21);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
\r
- //0空闲状态 9 usb状态 10 运动训练状态\r
- uint8_t Brightness = 5;//亮度调节 \r
- uint8_t screenTime = 1;//亮屏时长 0 5S 1 10s 2 15s 3 30s 4 1分钟 5 5分钟\r
- uint8_t wristOn = 0;//抬婉亮屏\r
-\r
- value[17] = Brightness;\r
- value[18] = screenTime;\r
- value[19] = wristOn;\r
+ ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+ memset(&watch_lcd_param,0,sizeof(msg_watch_lcd_param_info_t));\r
+ \r
+ if(func != NULL)\r
+ {\r
+ func(READ_FLASH_DATA,cmd,&watch_lcd_param,sizeof(msg_watch_lcd_param_info_t));\r
+ }//读设备内存\r
+ value[17] = watch_lcd_param.brigntess;\r
+ value[18] = watch_lcd_param.screen_time;\r
+ value[19] = watch_lcd_param.wrist_on;\r
value[20] = Calculate_CRC(value,20);\r
sendBleData(value,21);\r
}\r
\r
//App删除表盘 (仅W4手表)\r
-static void DeleteDialUidCmd(uint8_t *crcnum,uint16_t len)\r
+static void DeleteDialUidCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[20];\r
memset(value,0,20);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint16_t deleteDial = 0;//删除的表盘UID \r
- deleteDial=crcnum[17]+crcnum[18]*256;\r
+ deleteDial=crcnum[0]+crcnum[1]*256;\r
value[17] = 1;// 1删除成功 2 没有改资源 0指令校验失败\r
value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}\r
\r
//获取手表声音与振动参数 Sound and Vibration\r
-static void GetSoundVibrationCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSoundVibrationCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[23];\r
memset(value,0,23);\r
uint16_t tmp_data = 5;\r
value[0] = 0x72;\r
value[1] = 0x01;\r
- value[2] = 0x1b;\r
+ value[2] = 0x1c;\r
memcpy(value+3,&tmp,4);\r
memcpy(value+7,&datalen,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
- {\r
- uint8_t sysSoundLevel = 0;//系统音量调节\r
- uint8_t sysRing = 0;//铃声音量调节\r
- uint8_t sysMedia = 0;//媒体音量调节\r
- uint8_t RingSwitch = 0;//铃声开关\r
- uint8_t VibiationSwitch = 0;//振动开关\r
- value[17] = sysSoundLevel;// \r
- value[18] = sysRing;// \r
- value[19] = sysMedia;// \r
- value[20] = RingSwitch;//\r
- value[21] = VibiationSwitch;// \r
+ if(Check_CRC(crcnum,len,crcvalue))\r
+ {\r
+ memset(&voice_vibration,0,sizeof(msg_get_voice_vibration_info_t));\r
+ // uint8_t sysSoundLevel = 0;//系统音量调节\r
+ // uint8_t sysRing = 0;//铃声音量调节\r
+ // uint8_t sysMedia = 0;//媒体音量调节\r
+ // uint8_t RingSwitch = 0;//铃声开关\r
+ // uint8_t VibiationSwitch = 0;//振动开关\r
+ ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+ memset(&voice_vibration,0,sizeof(msg_get_voice_vibration_info_t));\r
+ \r
+ // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+ \r
+ if(func != NULL)\r
+ {\r
+ func(READ_FLASH_DATA,cmd,&voice_vibration,sizeof(msg_get_voice_vibration_info_t));\r
+ }\r
+ value[17] = voice_vibration.sys_volume;// \r
+ value[18] = voice_vibration.ring_volume;// \r
+ value[19] = voice_vibration.media_volume;// \r
+ value[20] = voice_vibration.bell_on;//\r
+ value[21] = voice_vibration.vibrate_on;// \r
value[22] = Calculate_CRC(value,22);\r
sendBleData(value,23);\r
}else\r
}\r
\r
//APP获取手表辅助功能参数Auxiliary functions\r
-static void GetWatchAuxFuncCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetWatchAuxFuncCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[23];\r
memset(value,0,23);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint8_t paramCmt = 0;//辅助功能 0\r
\r
\r
}\r
//APP获取手表心率设置\r
-static void GetHrSetParamCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetHrGetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[22];\r
memset(value,0,22);\r
memcpy(value+7,&datalen,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint8_t hrfreq = 0;//监测频率\r
uint8_t hrSwitch = 0;//心率提醒开关\r
uint8_t hrMaxMin = 0;//高于或低于\r
uint8_t hrValue = 0;//阈值\r
- value[17] = hrfreq;//\r
- value[18] = hrSwitch;//\r
- value[19] = hrMaxMin;//\r
- value[20] = hrValue;// \r
+ msg_get_heart_set_param_info_t heart_param;\r
+ memset(&heart_param,0,sizeof(msg_get_heart_set_param_info_t));\r
+ ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+ if(func != NULL)\r
+ {\r
+ func(READ_FLASH_DATA,cmd,&heart_param,sizeof(msg_get_heart_set_param_info_t));\r
+ }\r
+\r
+ value[17] = heart_param.frequence;//\r
+ value[18] = heart_param.remind_on;//\r
+ value[19] = heart_param.max_min;//\r
+ value[20] = heart_param.heart;// \r
value[21] = Calculate_CRC(value,21);\r
sendBleData(value,22);\r
}else\r
\r
}\r
//APP获取手表血氧设置\r
-static void GetSpo2SetParamCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[21];\r
memset(value,0,21);\r
memcpy(value+7,&datalen,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint8_t spo2freq = 0;//监测频率\r
uint8_t spo2Switch = 0;//心率提醒开关\r
}\r
\r
//手势拍照协议\r
-static void carmeraCmd(uint8_t *crcnum,uint16_t len)\r
+static void carmeraCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
- uint8_t carmera = crcnum[17];\r
+ uint8_t carmera_on = crcnum[0]; //0退出拍照界面 1进入拍照界面\r
+ //需要加界面弹窗提示\r
+ if(carmera_on == 1)//进入拍照弹窗界面\r
+ {\r
+\r
+ }else{//退出拍照弹窗界面\r
+\r
+ }\r
value[17] = 1;// \r
value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}\r
\r
//APP获取手表喝水提醒设置\r
-static void GetDrinkParamCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetDrinkParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
- uint8_t drinkOn = 0;\r
- value[17] = drinkOn;// \r
+ msg_drink_param_info_t drink_on_t;\r
+ memset(&drink_on_t,0,sizeof(msg_drink_param_info_t));\r
+ ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+ if(func != NULL){\r
+ func(READ_FLASH_DATA,cmd,&drink_on_t,sizeof(msg_drink_param_info_t));\r
+ }\r
+ value[17] = drink_on_t.drink_on;// \r
value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}else\r
}\r
\r
//APP发送恢复出厂设置\r
-static void GetFactoryCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetFactoryCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
\r
value[17] = 1;// \r
}\r
}\r
//APP发送重新启动\r
-static void GetResetCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetResetCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
\r
value[17] = 1;// \r
}\r
}\r
//APP发送关机\r
-static void GetPowerOffCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetPowerOffCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
\r
value[17] = 1;// \r
\r
\r
//app发送公英制单位\r
-static void GetMetricCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetMetricCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
- uint8_t kmileter = crcnum[17];//公英制单位 0 是公英制 1英制单位\r
+ uint8_t kmileter = crcnum[0];//公英制单位 0 是公英制 1英制单位\r
value[17] = 1;// \r
value[18] = Calculate_CRC(value,18);\r
sendBleData(value,19);\r
}\r
\r
//app获取睡眠设置\r
-static void GetSleepParamCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSleepParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[24];\r
memset(value,0,24);\r
memcpy(value+7,&datalen,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint8_t sleepTime = 0;//作息时间设定 0关闭 1开启\r
uint8_t bedTimeHour = 0;//就寝时间\r
}\r
\r
//app获取所有表盘UID\r
-static void GetAllDialUidCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetAllDialUidCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[24];\r
memset(value,0,24);\r
memcpy(value+7,&tmp,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint8_t sleepTime = 0;//作息时间设定 0关闭 1开启\r
uint8_t bedTimeHour = 0;//就寝时间\r
}\r
}\r
//app获取目标步数设置\r
-static void GetTargetStepCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetTargetStepCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[25];\r
memset(value,0,25);\r
memcpy(value+7,&datalen,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint32_t targetStep = 10000;//目标步数 4字节\r
uint8_t ringOn = 0;//铃声提醒\r
}\r
\r
//app其他目标设置\r
-static void GetTargetOtherCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetTargetOtherCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[26];\r
memset(value,0,26);\r
memcpy(value+7,&datalen,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint16_t targetKcal = 4556;//目标卡路里\r
uint8_t targetKm = 0;//目标里程\r
}\r
\r
//app发送解除配对消息\r
-static void UnpairMessCmd(uint8_t *crcnum,uint16_t len)\r
+static void UnpairMessCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&datalen,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
\r
value[17] = 1;//\r
}\r
}\r
//app发送同步数据结束消息\r
-static void GetSynDataEndCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSynDataEndCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[19];\r
memset(value,0,19);\r
memcpy(value+7,&datalen,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
value[17] = 1;//\r
value[18] = Calculate_CRC(value,18);\r
}\r
}\r
//同步历史步数\r
-static void stepDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void stepDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[58];\r
memset(value,0,58);\r
memcpy(value+7,&tmpToall,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint8_t data_buf[40]; //\r
uint8_t data_len = 0;\r
}\r
}\r
//同步卡路里历史数据\r
-static void kcalDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void kcalDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[58];\r
memset(value,0,58);\r
memcpy(value+7,&tmpToall,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint8_t data_buf[40]; //\r
uint8_t data_len = 4;\r
}\r
}\r
//同步距离历史数据\r
-static void disDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void disDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[58];\r
memset(value,0,58);\r
memcpy(value+7,&tmpToall,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint8_t data_buf[40]; //\r
uint8_t data_len = 4;\r
}\r
}\r
//同步基础训练历史数据 training history data\r
-static void trainiHistoryDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void trainiHistoryDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
\r
cJSON *dataJSON = cJSON_CreateObject();\r
memcpy(value+7,&tmpToall,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
\r
memcpy(value+17,json_format,data_len);\r
}\r
}\r
//同步睡眠数据\r
-static void sleepDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void sleepDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[18+1];\r
memset(value,0,18+1);\r
memcpy(value+7,&tmpToall,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
value[17] = 0;\r
value[18] = 0xff;\r
}\r
}\r
//同步数据结束完成\r
-static void synEndDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void synEndDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[18+1];\r
memset(value,0,18+1);\r
memcpy(value+7,&tmpToall,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
value[17] = 1;\r
value[18] = Calculate_CRC(value,18);\r
}\r
}\r
//同步站立历史数据\r
-static void standDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void standDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[58];\r
memset(value,0,58);\r
memcpy(value+7,&tmpToall,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint8_t data_buf[40]; //\r
uint8_t data_len = 4;\r
}\r
\r
//同步燃脂时间数据\r
-static void burntimeDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void burntimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[48];\r
memset(value,0,48);\r
memcpy(value+7,&tmpToall,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint8_t data_buf[30]; //\r
uint32_t data_len = 0;\r
}\r
\r
//同步心率历史数据\r
-static void heartDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void heartDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[43];\r
memset(value,0,43);\r
memcpy(value+7,&tmpToall,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint32_t data_len = 0;\r
for(uint16_t i = 0;i<5;i++)\r
}\r
}\r
//同步血氧历史数据\r
-static void spo2DataCmd(uint8_t *crcnum,uint16_t len)\r
+static void spo2DataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
{\r
uint8_t value[43];\r
memset(value,0,43);\r
memcpy(value+7,&tmpToall,4);\r
memcpy(value+11,&tmp,4);\r
memcpy(value+15,&tmp_data,2);\r
- if(Check_CRC(crcnum,len))\r
+ if(Check_CRC(crcnum,len,crcvalue))\r
{\r
uint32_t data_len = 0;\r
for(uint16_t i = 0;i<5;i++)\r
}\r
\r
\r
+//01类型 \r
+/*\r
+cmd: 指令uint16_t 协议01 02 拼接成0x0102 去协议文档对应是切换表盘\r
+*data:数据,不包含前面17个字节的包头和最后一位的校验和\r
+len 就是data的长度\r
+*totaldata:总的数据内容 包含包头和校验预览做接口是用 如果要计算totaldata的长度直接是len+17+1 就是加上包头和校验和\r
+crcvalue;数据的校验和 不包含包头和校验和的计算结果\r
+*/\r
+void type2AE3Data(uint16_t cmd ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)\r
+{\r
+ // uint16_t typeID = cmd_buf[1]*256+cmd_buf[2];\r
+ printf("typeHexOneData:0x%x\r\n",cmd);\r
+ // uint8_t typeID = cmd_buf[2];\r
+ switch (cmd)\r
+ {\r
+ case SEND_UPPAIR_CMD://清除配对指令\r
+ clearPaireCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case ALARM_CMD:\r
+ SetAlarmDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SWITCH_DIAL_CMD://表盘切换\r
+ switchDialCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case ABOUT_DEV_CMD://关于本机内容\r
+ aboutDeviceCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case FIND_WATCH_CMD://查找手表\r
+ findWatchCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_SD_SPACE_CMD://获取sdk的剩余空间\r
+ GetSDSpaceCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_CURR_DATA_CMD://获取当前数据 卡路里 \r
+ GetCurDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_BATTERY_LEVEL_CMD://获取手表电池电量 \r
+ GetBatteryLevelCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SWITCH_MESS_CMD://开关消息推送功能 \r
+ GetSwitchMessCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输\r
+ RemoveFileCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 \r
+ RemoveFileCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case DELETE_SPECIF_TYPE_FILE_CMD://删除指定类型的所有文件\r
+ DeleteFileTypeCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SWITCH_SPORT_MODE_CMD://开启指定运动模式\r
+ OpenSportModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case STOP_SPORT_MODE_CMD://结束运动模式\r
+ StopSportModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SET_LANGUGAE_CMD://设置语言\r
+ SetLanguageCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_REAL_HEART_CMD://获取实时训练数据\r
+ GetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SWITCH_GET_REAL_HEART_CMD://开启/关闭自动获取实时训练数据\r
+ SetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SET_REAL_DATA_FREQ_CMD://设置训练实时数据采集频率\r
+ SetRTDataFreCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+\r
+ case SET_MAX_HR_REMID_CMD://设置最高心疼提醒 255关闭\r
+ SetMaxHrRemindCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SPORT_PAUSE_RESET_CMD://训练暂停/恢复\r
+ GetSportPasueResetCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SEND_CURR_DIAL_TOAPP_CMD://发送当前表盘\r
+ SendDialToAppCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SEND_CURR_STATUS_CMD: //获取手表当前状态\r
+ GetWatchStatusCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_WATCH_LCD_PARAM_CMD: //获取手表屏幕参数\r
+ GetScreenParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case DELETE_DIAL_CMD://删除表盘UID\r
+ DeleteDialUidCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_WATCH_VOICE_VIBRATE_CMD://获取手表声音与振动参数\r
+ GetSoundVibrationCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_WATCH_AUXIL_FUN_PARAM_CMD://获取手表辅助功能参数 \r
+ GetWatchAuxFuncCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_WATCH_HR_SET_PARAM_CMD://获取手表心率设置\r
+ GetHrGetParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_WATCH_SPO2_SET_PARAM_CMD://获取手表血氧设置\r
+ GetSpo2GetParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_GESTURE_CARMERA_CMD://获取手势拍照\r
+ carmeraCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_DRINK_SWITCH_CMD://获取喝水提醒设置\r
+ GetDrinkParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case FACTORY_SET_CMD://app发送恢复出厂设置\r
+ GetFactoryCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case RESET_WATCH_CMD://app发送重启指令\r
+ GetResetCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case POWER_OFF_CMD://app发送关机\r
+ GetPowerOffCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case KM_MILE_CMD://app设置手表公英制单位\r
+ GetMetricCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SLEEP_SET_CMD://app获取睡眠设置\r
+ GetSleepParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case DELETE_ALL_DILA_CMD://app所有表盘UID\r
+ GetAllDialUidCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_TARGET_STEP_CMD://app获取目标步数设置\r
+ GetTargetStepCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_OTHER_TARGET_CMD://app获取其他目标\r
+ GetTargetOtherCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case GET_UNPAIR_CMD://发送解除配对消息\r
+ UnpairMessCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SYN_DATA_END_CMD: //app发送同步数据结束消息\r
+ GetSynDataEndCmd(cmd,data,datalen,totaldata,crcvalue);\r
+ break;\r
+ case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据\r
+ case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据\r
+ case SYN_STEP_HISTORY_DATA_CMD: //同步步数历史数据\r
+ case SYN_FAT_BURN_HISTORY_DATA_CMD://同步燃脂时间数据\r
+ case SYN_STAND_HISTORY_DATA_CMD://同步站立历史数据\r
+ case SYN_KCAL_HISTORY_DATA_CMD://同步卡路里历史数据\r
+ case SYN_DIS_HISTORY_DATA_CMD://同步距离历史数据\r
+ case SYN_BASIC_TRANIN_HISTORY_DATA_CMD://同步基础训练历史数据\r
+ case SYN_SLEEP_HISTORY_DATA_CMD://睡眠历史数据\r
+ // readDevDataBle(totaldata,datalen+18,crcvalue);\r
+ break;\r
+ \r
+ default:\r
+ break;\r
+ }\r
+\r
+\r
+}\r
+\r
+\r
//05 类型\r
void typeHexFiveData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)\r
{\r
uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];\r
switch (typeID) //ID\r
{\r
- case FIND_PHONE_CMD://获取用户信息\r
+ case FIND_PHONE_CMD://查找手机\r
// (data,datalen);\r
break;\r
- case GET_CURR_TIME_CMD://手机下发的手机信息\r
+ case GET_CURR_TIME_CMD://手表获取系统时间\r
// getPhoneInfo(data,datalen);\r
break;\r
case SEND_PARI_SUCESS_CMD:\r
\r
void sendReadData(void)\r
{\r
- static uint8_t packCount = 0;\r
+ sendbigDataBufState = true;//分包同步数据不允许打断\r
+ static uint32_t packCount = 0;\r
uint8_t buf[517];\r
memset(buf,0,517);\r
uint32_t dataLen = 0;\r
uint32_t totalLen = 0;\r
dataLen = 640; \r
uint32_t dataPack = 1;\r
- uint16_t dataPackLen = 640;\r
+ uint16_t dataPackLen = 640;//减掉前面17+2个字节的包头总共就是19个数据(多包) 一包就减去17个字节\r
uint32_t time = 0;\r
uint32_t step = 0;\r
- packCount = 0;\r
+ packCount = 1;\r
\r
uint16_t startDataLen = 17;\r
uint8_t crc = 0x00;\r
}\r
while (1)\r
{\r
- time = 1710833119+3600*packCount;\r
+ time = 1711348052+3600*packCount;\r
memcpy(buf+startDataLen,&time,4);//21 \r
startDataLen=startDataLen+4;\r
step = 1000+packCount*1000;\r
// printf("startDataLen22222222222:%d totalEnd:%d crcvalue:%x\r\n",startDataLen,totalEnd,crcvalue);\r
if((totalEnd-17) >= dataLen && totalEnd > 17)\r
{\r
- if(packCount == 0)\r
- {\r
- memcpy(buf+15,&startDataLen,2);\r
- crcvalue = Calculate_CRC(buf,startDataLen);//17+数据+校验和\r
- printf("end crcvalue1:%x\r\n",crcvalue);\r
- buf[startDataLen] = crcvalue;\r
- sendDataNow(buf,startDataLen+1);\r
- packCount = 0;\r
- }else{//17+MTU-17-校验和+数据+校验和\r
- memcpy(buf+15,&startDataLen,2);\r
- crcvalue = Calculate_CRC_Big(buf+18,startDataLen+18);\r
- uint16_t pack_data = max_mtu_szie_data_len-17-crcvalue;\r
- memcpy(&buf[17],&pack_data,2);\r
- printf("end crcvalue2:%x\r\n",crcvalue);\r
- buf[startDataLen] = crcvalue;\r
- sendDataNow(buf,startDataLen+1);\r
- packCount = 0;\r
- }\r
+ memcpy(buf+11,&packCount,4);\r
+ dataPackLen = startDataLen-17;\r
+ memcpy(buf+15,&dataPackLen,2);\r
+ crcvalue = Calculate_CRC_Big(buf+17,dataPackLen);\r
+ printf("end crcvalue1:%x\r\n",crcvalue);\r
+ buf[startDataLen] = crcvalue;\r
+ sendDataNow(buf,startDataLen+1);\r
+\r
+ packCount = 1;\r
+ sendbigDataBufState = false;\r
break;\r
}else{\r
- memcpy(buf+15,&startDataLen,2);\r
- crcvalue = Calculate_CRC_Big(buf+18,startDataLen+18);\r
- uint16_t pack_data = max_mtu_szie_data_len-17-crcvalue;\r
- memcpy(&buf[17],&pack_data,2);\r
- printf("end crcvalue3:%x\r\n",crcvalue);\r
+ memcpy(buf+11,&packCount,4);\r
+ dataPackLen = startDataLen-19;//减掉前面17+2个字节的包头总共就是19个数据\r
+ memcpy(buf+15,&dataPackLen,2);\r
+ crcvalue = Calculate_CRC_Big(buf+19,dataPackLen);\r
+ uint16_t pack_size = ble_nus_max_data_len-17-crcvalue;\r
+ memcpy(buf+17,&pack_size,2);\r
+ printf("end crcvalue3:%x %d %d %d\r\n",crcvalue,ble_nus_max_data_len,pack_size,crcvalue);\r
buf[startDataLen] = crcvalue;//\r
sendDataNow(buf,startDataLen+1);\r
packCount+=1;\r
// printf("pack1 startDataLen22222222222:%d totalEnd:%d crcvalue:%x\r\n",startDataLen,totalEnd,crcvalue);\r
if((totalEnd-17) >= dataLen && totalEnd > 17)\r
{\r
- memcpy(buf+15,&startDataLen,2);\r
- crcvalue = Calculate_CRC(buf,startDataLen+1);\r
+ memcpy(buf+11,&packCount,4);\r
+ dataPackLen = startDataLen-17;\r
+ memcpy(buf+15,&dataPackLen,2);\r
+ crcvalue = Calculate_CRC_Big(buf+17,dataPackLen);\r
buf[startDataLen] = crcvalue;\r
sendDataNow(buf,startDataLen+1);\r
- startDataLen = 0;\r
- packCount = 0;\r
+ sendbigDataBufState = false;\r
break;\r
}\r
}else{\r
- if(dataPackLen < max_mtu_szie_data_len) //只有总的包数小于最大的mtu的大小\r
+ if(dataPackLen < ble_nus_max_data_len) //只有总的包数小于最大的mtu的大小\r
{\r
totalEnd = startDataLen-17;//不包含前17个字节的数据,前17个不是数据类型\r
// printf("pack0 startDataLen22222222222:%d totalEnd:%d crcvalue:%x\r\n",startDataLen,totalEnd,crcvalue);\r
if(totalEnd >= dataLen && totalEnd > 0)\r
{\r
- memcpy(buf+15,&startDataLen,2);\r
- crcvalue = Calculate_CRC(buf,startDataLen);\r
+ memcpy(buf+11,&packCount,4);\r
+ dataPackLen = startDataLen-17;\r
+ memcpy(buf+15,&dataPackLen,2);\r
+ crcvalue = Calculate_CRC_Big(buf+17,dataPackLen);\r
printf("total end crcvalue2:%x\r\n",crcvalue);\r
buf[startDataLen] = crcvalue;//校验和的值 最后一个校验和也要发给app\r
sendDataNow(buf,startDataLen+1);\r
- startDataLen = 17;\r
- packCount = 0;\r
+ sendbigDataBufState = false;\r
break;\r
}\r
}\r
}\r
}\r
//手机app下发读设备数据指令\r
-void readDevDataBle(uint8_t *crcnum,uint16_t len)\r
+void readDevDataBle(uint8_t *crcnum,uint16_t len,uint8_t crcvalue)\r
{\r
- if(Check_CRC(crcnum+17,len-17))\r
+ if(Check_CRC(crcnum+17,len-18,crcvalue))\r
{\r
bleSendTypeID=crcnum[2];\r
\r
}\r
\r
\r
-//01类型\r
-void typeHexOneData(uint8_t *buf,uint16_t len,uint8_t *cmd_buf,uint8_t *totaldata)\r
-{\r
- uint16_t typeID = cmd_buf[1]*256+cmd_buf[2];\r
- printf("typeHexOneData:0x%x\r\n",typeID);\r
- // uint8_t typeID = cmd_buf[2];\r
- switch (typeID)\r
- {\r
- case SEND_UPPAIR_CMD://清除配对指令\r
- clearPaireCmd(buf,len);\r
- break;\r
- case SWITCH_DIAL_CMD://表盘切换\r
- switchDialCmd(buf,len);\r
- break;\r
- case ABOUT_DEV_CMD://关于本机内容\r
- aboutDeviceCmd(buf,len);\r
- break;\r
- case FIND_WATCH_CMD://查找手表\r
- findWatchCmd(buf,len);\r
- break;\r
- case GET_SD_SPACE_CMD://获取sdk的剩余空间\r
- GetSDSpaceCmd(buf,len);\r
- break;\r
- case GET_CURR_DATA_CMD://获取当前数据 卡路里 \r
- GetCurDataCmd(buf,len);\r
- break;\r
- case GET_BATTERY_LEVEL_CMD://获取手表电池电量 \r
- GetBatteryLevelCmd(buf,len);\r
- break;\r
- case SWITCH_MESS_CMD://开关消息推送功能 \r
- GetSwitchMessCmd(buf,len);\r
- break;\r
- case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输\r
- RemoveFileCmd(buf,len);\r
- break;\r
- case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 \r
- RemoveFileCmd(buf,len);\r
- break;\r
- case DELETE_SPECIF_TYPE_FILE_CMD://删除指定类型的所有文件\r
- DeleteFileTypeCmd(buf,len);\r
- break;\r
- case SWITCH_SPORT_MODE_CMD://开启指定运动模式\r
- OpenSportModeCmd(buf,len);\r
- break;\r
- case STOP_SPORT_MODE_CMD://结束运动模式\r
- StopSportModeCmd(buf,len);\r
- break;\r
- case SET_LANGUGAE_CMD://设置语言\r
- SetLanguageCmd(buf,len);\r
- break;\r
- case GET_REAL_HEART_CMD://获取实时训练数据\r
- GetRealTimeDataCmd(buf,len);\r
- break;\r
- case SWITCH_GET_REAL_HEART_CMD://开启/关闭自动获取实时训练数据\r
- SetRealTimeDataCmd(buf,len);\r
- break;\r
- case SET_REAL_DATA_FREQ_CMD://设置训练实时数据采集频率\r
- SetRTDataFreCmd(buf,len);\r
- break;\r
\r
- case SET_MAX_HR_REMID_CMD://设置最高心疼提醒 255关闭\r
- SetMaxHrRemindCmd(buf,len);\r
- break;\r
- case SPORT_PAUSE_RESET_CMD://训练暂停/恢复\r
- GetSportPasueResetCmd(buf,len);\r
- break;\r
- case SEND_CURR_DIAL_TOAPP_CMD://发送当前表盘\r
- SendDialToAppCmd(buf,len);\r
- break;\r
- case SEND_CURR_STATUS_CMD: //获取手表当前状态\r
- GetWatchStatusCmd(buf,len);\r
- break;\r
- case GET_WATCH_LCD_PARAM_CMD: //获取手表屏幕参数\r
- GetScreenParamCmd(buf,len);\r
- break;\r
- case DELETE_DIAL_CMD://删除表盘UID\r
- DeleteDialUidCmd(buf,len);\r
- break;\r
- case GET_WATCH_VOICE_VIBRATE_CMD://获取手表声音与振动参数\r
- GetSoundVibrationCmd(buf,len);\r
- break;\r
- case GET_WATCH_AUXIL_FUN_PARAM_CMD://获取手表辅助功能参数 \r
- GetWatchAuxFuncCmd(buf,len);\r
- break;\r
- case GET_WATCH_HR_SET_PARAM_CMD://获取手表心率设置\r
- GetHrSetParamCmd(buf,len);\r
- break;\r
- case GET_WATCH_SPO2_SET_PARAM_CMD://获取手表血氧设置\r
- GetSpo2SetParamCmd(buf,len);\r
- break;\r
- case GET_GESTURE_CARMERA_CMD://获取手势拍照\r
- carmeraCmd(buf,len);\r
- break;\r
- case GET_DRINK_SWITCH_CMD://获取喝水提醒设置\r
- GetDrinkParamCmd(buf,len);\r
- break;\r
- case FACTORY_SET_CMD://app发送恢复出厂设置\r
- GetFactoryCmd(buf,len);\r
- break;\r
- case RESET_WATCH_CMD://app发送重启指令\r
- GetResetCmd(buf,len);\r
- break;\r
- case POWER_OFF_CMD://app发送关机\r
- GetPowerOffCmd(buf,len);\r
- break;\r
- case KM_MILE_CMD://app设置手表公英制单位\r
- GetMetricCmd(buf,len);\r
- break;\r
- case SLEEP_SET_CMD://app获取睡眠设置\r
- GetSleepParamCmd(buf,len);\r
- break;\r
- case DELETE_ALL_DILA_CMD://app所有表盘UID\r
- GetAllDialUidCmd(buf,len);\r
- break;\r
- case GET_TARGET_STEP_CMD://app获取目标步数设置\r
- GetTargetStepCmd(buf,len);\r
- break;\r
- case GET_OTHER_TARGET_CMD://app获取其他目标\r
- GetTargetOtherCmd(buf,len);\r
- break;\r
- case GET_UNPAIR_CMD://发送解除配对消息\r
- UnpairMessCmd(buf,len);\r
- break;\r
- case SYN_DATA_END_CMD: //app发送同步数据结束消息\r
- GetSynDataEndCmd(buf,len);\r
- break;\r
- case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据\r
- case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据\r
- case SYN_STEP_HISTORY_DATA_CMD: //同步步数历史数据\r
- case SYN_FAT_BURN_HISTORY_DATA_CMD://同步燃脂时间数据\r
- case SYN_STAND_HISTORY_DATA_CMD://同步站立历史数据\r
- case SYN_KCAL_HISTORY_DATA_CMD://同步卡路里历史数据\r
- case SYN_DIS_HISTORY_DATA_CMD://同步距离历史数据\r
- case SYN_BASIC_TRANIN_HISTORY_DATA_CMD://同步基础训练历史数据\r
- case SYN_SLEEP_HISTORY_DATA_CMD://睡眠历史数据\r
- readDevDataBle(totaldata,len+17);\r
- break;\r
- \r
- default:\r
- break;\r
- }\r
-}\r
+\r
void getPhoneInfo_test(void)\r
{\r
/*\r
}\r
\r
//长数据解析\r
-void bleLongRecvData(uint8_t *data, uint32_t data_size,uint8_t *buf_cmd)//buf_cmd 指令前17个字节数据\r
+void bleLongRecvData(uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据\r
{\r
uint8_t type=buf_cmd[1];\r
- printf("type:%d %d data_size:%d data:%d",buf_cmd[0],type,data_size,data[0]);\r
+ printf("type:%d %d data_size:%d data:%d crcvalue:%x",buf_cmd[0],type,data_size,data[0],crcvalue);\r
switch(buf_cmd[0])\r
{\r
case 0x73://传输方向 0x73是app下发的 \r
switch (type)\r
{\r
case 0x02://获取手机信息\r
- typeHexTwoData(buf_cmd,data,data_size);\r
+ type2AE4Data(buf_cmd,data,data_size,totalData,crcvalue);\r
break;\r
default:\r
break;\r
break;\r
}\r
}\r
+\r
+uint8_t *recvData;\r
+uint32_t packdataLen = 0;\r
+uint32_t totalDataLen = 0;\r
+uint8_t totalpack = 0;\r
uint8_t cmd_data[17];\r
-uint8_t *bigDataBuf = NULL;//大数据buf\r
-uint8_t bigDataBufLen=0;\r
-bool sendbigDataBufState = false;//发送大数据表示不要被其他指令打断\r
-bool recvBigDataBufState = false;//接收大数据标志\r
-static bool muiltFlag = 0;//多包数据flag\r
-static uint16_t data_len = 0;\r
-void longDataRecv(uint8_t *buf, uint16_t event_size,uint16_t handle)\r
+void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)\r
{\r
- if(sendbigDataBufState == true)\r
+ if(sendbigDataBufState == true)//正在发送大数据不接收任何app指令下发的数据\r
{\r
return;\r
}\r
\r
- uint8_t data[514];\r
- static uint8_t totalpack = 0;\r
- static uint32_t totalDataLen = 0;\r
- if(shortCmdChara == handle)//短指令\r
+ \r
+ uint8_t crcvalue= 0x00;\r
+\r
+ if(data2ae3Cmd == handle)//短指令\r
{\r
if(recvBigDataBufState == true)//在接收大数据时未接收完成时,不能被其他指令打断\r
{\r
}\r
if(event_size > 17)\r
{\r
- memset(cmd_data,0,17);\r
- memcpy(cmd_data,buf,17);\r
- uint8_t type=cmd_data[1];\r
+ uint16_t cmd = totalData[1]*256+totalData[2];\r
+ crcvalue = totalData[event_size-1];\r
\r
-\r
- printf("short:%d type_id:%x %d %d %d\r\n",shortCmdChara,cmd_data[1],cmd_data[2]);\r
- switch(buf[0])\r
+ memcpy(&packdataLen,&totalData[3],4);\r
+ recvData = malloc(packdataLen);\r
+ memcpy(recvData,totalData+17,packdataLen);\r
+ printf("recv crcvalue:%x packdataLen-1:%d\r\n",crcvalue,packdataLen);\r
+ type2AE3Data(cmd,recvData,packdataLen,totalData,crcvalue);\r
+ if(recvData != NULL)\r
{\r
- case 0x73://传输方向 0x73是app下发的 \r
- switch (type)\r
- {\r
- case 0x01:\r
- typeHexOneData(buf+17,event_size-17,cmd_data,buf);\r
- break;\r
- default:\r
- break;\r
- }\r
- break;\r
+ free(recvData);\r
}\r
}\r
- }else if(longCmdChara == handle)\r
+ }else if(data2ae4Cmd == handle)\r
{\r
while (1)\r
{\r
- printf("longData!!!! muiltFlag%d event_size:%d\r\n",muiltFlag,event_size);\r
if(muiltFlag == 0)\r
{\r
//每包的数据长度 如果当前报数的数据小于总的数据包数时认为就发送完成,没有就还有继续接收\r
- // data_len = data_len+event_size-18;// 减掉18个数据 0+517 730总的数据长度 517还是小于730 说明还有数据没有接收完成 继续接收\r
- if(event_size >= 20)\r
+ // packdataLen = packdataLen+event_size-18;// 减掉18个数据 0+517 730总的数据长度 517还是小于730 说明还有数据没有接收完成 继续接收\r
+ if(event_size >= 17)\r
{\r
- data_len = event_size-17;//第一包的数据大小 第二包不走这里\r
- memcpy(&totalDataLen,buf+7,4);//总的数据大小\r
- printf("totalDataLen;%d data_len:%d",totalDataLen,data_len);\r
- if(totalDataLen > data_len)//如果总的数据长度大于每次增加后的\r
+ packdataLen = event_size;//第一包的数据大小 第二包不走这里 514-17 = 497\r
+ memcpy(&totalDataLen,totalData+7,4);//总的数据大小\r
+ printf("totalDataLen;%d totaldataLen:%d",totalDataLen,packdataLen);\r
+ if(totalDataLen > event_size-18)//如果514-18 = 496 497 > 496 \r
{\r
- printf("muilt totalDataLen;%d data_len:%d",totalDataLen,data_len);\r
- bigDataBuf = malloc(totalDataLen);\r
- if(bigDataBuf == NULL)return;\r
+ printf("muilt totalDataLen;%d packdataLen:%d",totalDataLen,packdataLen);\r
+\r
+ recvData = malloc(totalDataLen+18);\r
+ if(recvData == NULL)return;\r
muiltFlag = 1;//表示有两包以上的数据\r
- memcpy(bigDataBuf,buf+17,data_len);//从第十七个字节开始接收数据data\r
+ memcpy(recvData,totalData,event_size);//从第十七个字节开始接收数据data\r
memset(cmd_data,0,17);\r
- memcpy(cmd_data,buf,17);\r
+ memcpy(cmd_data,totalData,17);\r
totalpack=1;\r
break;\r
}else{//直接发送数据解析\r
- printf("muilt totalDataLen11;%d data_len:%d",totalDataLen,data_len);\r
+ printf("muilt totalDataLen11;%d packdataLen:%d",totalDataLen,packdataLen);\r
muiltFlag = 0; \r
- data_len = event_size-17;\r
+ packdataLen = event_size-17;\r
memset(cmd_data,0,17);\r
- memcpy(cmd_data,buf,17);\r
- memset(data,0,514);\r
- memcpy(data,buf+17,data_len);\r
- bleLongRecvData(&data,data_len,&cmd_data);\r
+ memcpy(cmd_data,totalData,17);\r
+ \r
+ recvData = malloc(packdataLen-1);\r
+ if(recvData == NULL)return;\r
+ memcpy(recvData,totalData+17,packdataLen-1);\r
+ if(totalDataLen == 0){\r
+ crcvalue = 0x00;\r
+ }else{\r
+ crcvalue = totalData[event_size-1];\r
+ }\r
+ bleLongRecvData(recvData,packdataLen-1,&cmd_data,totalData,crcvalue);\r
+ if(recvData != NULL){\r
+ free(recvData);\r
+ }\r
+ packdataLen = 0;\r
break;\r
}\r
}\r
}else//这是接收两包以上的数据\r
{\r
totalpack+=1;//包数\r
- printf("muilt 122222;%d data_len:%d",totalDataLen,data_len);\r
- memcpy(bigDataBuf+data_len,buf,event_size); //先copy再加\r
- data_len = data_len+event_size;\r
- printf("muilt 133333;%d data_len:%d",totalDataLen,data_len);\r
- if((totalDataLen+1) >= data_len)//总的数据包大于等于增加之后说明已经接收完成\r
+ printf("muilt 122222;%d packdataLen:%d",totalDataLen,packdataLen);\r
+ memcpy(recvData+packdataLen,totalData,event_size); //先copy再加\r
+ packdataLen = packdataLen+event_size;\r
+ printf("muilt 133333;%d packdataLen:%d",totalDataLen,packdataLen);\r
+ if(totalDataLen >= (packdataLen-18))//总的数据包 packdataLen-18把前面17个字节的包头和一个字节的校验和去掉得到数据部分和校验和部分\r
{\r
- bleLongRecvData(bigDataBuf,data_len,&cmd_data);\r
+ bigDataBuf = malloc(totalDataLen);\r
+ crcvalue = totalData[event_size-1];\r
+ memcpy(bigDataBuf,recvData+17,totalDataLen);\r
+ bleLongRecvData(bigDataBuf,totalDataLen,&cmd_data,recvData,crcvalue);\r
totalDataLen = 0;\r
- data_len = 0;\r
+ packdataLen = 0;\r
muiltFlag = 0;\r
totalpack = 0; \r
if(bigDataBuf != NULL){\r
free(bigDataBuf);\r
}\r
+ if(recvData != NULL){\r
+ free(recvData);\r
+ }\r
+ break;\r
+ }else{\r
+\r
break;\r
}\r
}\r
{\r
totalpack = 0;\r
muiltFlag = 0; \r
- data_len = 0;\r
+ packdataLen = 0;\r
totalDataLen = 0;\r
if(bigDataBuf != NULL){\r
free(bigDataBuf);\r
}\r
+ if(recvData != NULL){\r
+ free(recvData);\r
+ }\r
break;\r
}\r
}\r
}\r
}\r
+//接收app下发的原始数据 \r
void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的数据大小\r
{\r
- printf("handle :%d shortCmdChara:%d longCmdChara:%d buf:%d event_size %d\r\n",handle,shortCmdChara,longCmdChara,buf,event_size);\r
- longDataRecv(buf,event_size,handle);\r
+ printf("handle :%d data2ae3Cmd:%d data2ae4Cmd:%d buf:%d event_size %d\r\n",handle,data2ae3Cmd,data2ae4Cmd,buf,event_size);\r
+ bleDataRecv(buf,event_size,handle);\r
}\r
+#endif
\ No newline at end of file
static a2dp_src_callbacks_t g_a2dpSrcCallbacks;\r
\r
static bool g_ble_adv_start_state = false;\r
-static uint16_t g_ble_server_id = 1;\r
-static uint16_t g_ble_server_handle = 0;\r
+uint16_t g_ble_server_id = 1;\r
+\r
static uint16_t g_ble_read_handle = 0;\r
-static uint16_t g_ble_conn_id = 0;\r
+uint16_t g_ble_conn_id = 0;\r
+static uint16_t g_ble_server_handle = 0;\r
static uint8_t g_ble_character_buf[BLE_CHARACTERISTIC_MAX_LENGTH] = {0};\r
static bool g_ble_init_flag = false;\r
static const uint8_t ble_adv_type[BLE_ADV_TYPE_LENTH] = {2, 1, 2};\r
static const uint8_t ble_adv_uuid[BLE_ADV_UUID_LENTH] = {0x3, 0x3, 0xe0, 0x18};\r
-static const uint8_t ble_adv_tx[3] = {0x02,0x0a,0x00};\r
+static const uint8_t ble_adv_tx[4] = {0x03,0x03,0xe0,0x18};\r
static bool AdverFlag = true;\r
\r
static uint8_t scan_data[BLE_SCAN_MAC_LENTH] = {0};\r
#define A2DP_STREAM_ACCEPT_TIMER_PERIOD 500\r
static osal_timer g_a2dp_stream_accept_timer = {NULL, NULL, 0, 0};\r
\r
-uint8_t shortCmdChara = 0;//2ae3短指令特征值\r
-uint8_t longCmdChara = 0;\r
+uint8_t data2ae3Cmd = 0;//2ae3短指令特征值\r
+uint8_t data2ae4Cmd = 0;\r
\r
\r
static void set_phone_info(bd_addr_t *addr)//保存手机信息 包含手机mac地址\r
{\r
+ phone_addr.addr[0] = addr->addr[5];\r
+ phone_addr.addr[1] = addr->addr[4];\r
+ phone_addr.addr[2] = addr->addr[3];\r
+ phone_addr.addr[3] = addr->addr[2];\r
+ phone_addr.addr[4] = addr->addr[1];\r
+ phone_addr.addr[5] = addr->addr[0];\r
memcpy(&phone_addr,addr,sizeof(bd_addr_t));\r
}\r
\r
BLE_CHARACTERISTIC_READ_BATTERY_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_READ,\r
};\r
\r
-static void svr_ble_ble_adv_stop(void)\r
+void svr_ble_adv_stop(void)\r
{\r
gap_ble_stop_adv(BLE_ADV_ID);\r
}\r
-void svr_ble_ble_adv_start(void)\r
+void svr_ble_adv_start(void)\r
{\r
gap_ble_start_adv(BLE_ADV_ID);\r
}\r
{\r
return AdverFlag;\r
}\r
-#if 0\r
-/* adapt ios adv data. *///设置广播和扫描数据\r
-static void svr_ble_adv_data_set(int adv_id)\r
-{\r
- uint8_t ble_name[BLE_NAME_LENGTH] = {0};\r
- uint8_t ble_name_len = BLE_NAME_LENGTH;\r
- uint8_t adv_data[BLE_ADV_DATA_MAX_LENGTH] = {0};\r
- uint8_t adv_data_len = 0;\r
- uint8_t scan_data_len = 0;\r
- uint8_t ble_data_name[BLE_ADV_BLE_NAME_MAX_LENGTH + 1 ] = {0}; // +TYPE LENGTH\r
- uint8_t ble_data_mac_switch[BD_ADDR_LEN] = {0};\r
- uint8_t adv_mac_head[BLE_ADV_MAC_LENTH] = {0x9, 0x16, 0x12, 0x18};\r
- gap_ble_config_adv_data_t adv_data_info;\r
- memset_s(&adv_data_info, sizeof(gap_ble_config_adv_data_t), 0, sizeof(gap_ble_config_adv_data_t));\r
-\r
- unsigned char set_mac[6] = {0x61,0x22,0x33,0x44,0x09,0x11};\r
- bluetooth_set_local_addr(set_mac,6);\r
- bd_addr_t addr_info;\r
- int32_t ret= 0;\r
- unsigned int len = BLE_MAC_MAX_LEN;\r
-\r
- unsigned char addr[BLE_MAC_MAX_LEN] = {0};\r
- bluetooth_get_local_addr(&addr[0],len);\r
- char watchName[32];\r
- memset_s(watchName, sizeof(watchName), 0, sizeof(watchName));\r
- (void)sprintf_s(watchName, sizeof(watchName), "%s %x%x",BLE_DEFAULT_NAME,addr[1],addr[0]);\r
-\r
- // ret = bluetooth_set_local_name((unsigned char*)watchName, strlen((char*)watchName) + 1);\r
- if (ret == false) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bt SetLocalName ret = 0x%x", ret);\r
- }\r
- ret = bluetooth_get_local_name(ble_name, &ble_name_len);\r
- if (ret != 0) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_ble_get_local_name fail, name:%s,len:%u,ret:%u.", ble_name, ble_name_len, ret);\r
- memset_s(ble_name, BLE_NAME_LENGTH, 0, BLE_NAME_LENGTH);\r
- memcpy_s(ble_name, BLE_NAME_LENGTH,BLE_DEFAULT_NAME, BLE_DEFAULT_NAME_LEN);\r
- ble_name_len = BLE_DEFAULT_NAME_LEN + 1; \r
- }\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_ble_get_local_name name:%s,len:%u,ret:%u.", ble_name, ble_name_len, ret);\r
-\r
- ret = gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 60); // start scan\r
- if (ret == false) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ConnectPhonePresenter bt gap_br_set_bt_scan_mode ret = 0x%x", ret);\r
- }\r
-\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_ble_get_local_addr, ret:%u.", ret);\r
- memcpy_s(adv_data, sizeof(ble_adv_type), ble_adv_type, sizeof(ble_adv_type));\r
- adv_data_len = sizeof(ble_adv_type);\r
-\r
- if (ble_name_len > BLE_ADV_BLE_NAME_MAX_LENGTH) {\r
- ble_name_len = BLE_ADV_BLE_NAME_MAX_LENGTH;\r
- }\r
- ble_data_name[0] = ble_name_len;\r
- ble_data_name[1] = 0x9;\r
- memcpy_s(&ble_data_name[2], ble_name_len - 1, ble_name, ble_name_len - 1);\r
-\r
- memcpy_s(adv_data + adv_data_len, ble_name_len + 1, ble_data_name, ble_name_len + 1);\r
-\r
- adv_data_len = adv_data_len + ble_name_len + 1;\r
- memcpy_s(adv_data + adv_data_len, sizeof(ble_adv_tx), ble_adv_tx, sizeof(ble_adv_tx));//这是tx power\r
- adv_data_len = adv_data_len + sizeof(ble_adv_tx);\r
-\r
- int k = BD_ADDR_LEN;\r
- for (int i = 0; i < BD_ADDR_LEN; i++) {\r
- ble_data_mac_switch[--k] = addr[i];\r
- }\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_info:%02x:%02x:%02x:%02x:%02x:%02x", ble_data_mac_switch[0], ble_data_mac_switch[1],\r
- ble_data_mac_switch[2], ble_data_mac_switch[3], ble_data_mac_switch[4], ble_data_mac_switch[5]);\r
- // memcpy_s(adv_mac_head + BLE_ADV_MAC_HEAD_LENTH, BD_ADDR_LEN, ble_data_mac_switch, BD_ADDR_LEN);\r
-\r
- // memcpy_s(adv_data + adv_data_len, sizeof(adv_mac_head), adv_mac_head, sizeof(adv_mac_head));\r
- // adv_data_len = adv_data_len + sizeof(adv_mac_head);\r
-\r
- scan_data[0] = 0x0f;//长度\r
- scan_data[1] = 0xff;//数据类型 manufactory data\r
- scan_data[2] = 'J';\r
- scan_data[3] = 'H';\r
- scan_data[4] = bond_flag;//是否绑定\r
- scan_data[5] = ble_data_mac_switch[0];\r
- scan_data[6] = ble_data_mac_switch[1];\r
- scan_data[7] = ble_data_mac_switch[2];\r
- scan_data[8] = ble_data_mac_switch[3];\r
- scan_data[9] = ble_data_mac_switch[4];\r
- scan_data[10] = ble_data_mac_switch[5];\r
- // memcpy_s(scan_data+5,BD_ADDR_LEN, ble_data_mac_switch, BD_ADDR_LEN);//拷贝蓝牙设备地址到厂商数据里面做广播扫描使用,app会扫描这里做连接使用\r
- // scan_data_len = strlen((char *)scan_data);//转换成char型\r
- scan_data_len = 11;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "adv_data_info.adv_length.scan_data_len:%d\r\n",scan_data_len);\r
- scan_data[scan_data_len++] = 0x05;//未知 app\r
- scan_data[scan_data_len++] = 0x05;\r
- scan_data[scan_data_len++] = 0x00;\r
- scan_data[scan_data_len++] = 0x00;\r
- scan_data[scan_data_len++] = 0x01;\r
- \r
- if (scan_data_len > BLE_SCAN_MAC_LENTH){\r
- scan_data_len = BLE_SCAN_MAC_LENTH;\r
- }\r
- adv_data_info.scan_rsp_data = scan_data;//扫描数据\r
- adv_data_info.scan_rsp_length = scan_data_len;//扫描长度\r
- adv_data_info.adv_data = adv_data;//广播数据 \r
- adv_data_info.adv_length = adv_data_len;//广播长度\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "adv_data_info.adv_length:%u. scan_data_len:%d\r\n", adv_data_len,scan_data_len);\r
- gap_conn_param_update_t params;//更改连接参数\r
- params.interval_min = 0x30;\r
- params.interval_max = 0x60;\r
- params.conn_handle = 1;\r
- params.slave_latency = 0;\r
- params.timeout_multiplier = 4000;\r
- ret = gap_ble_connect_param_update(¶ms);\r
- gap_ble_set_adv_data(adv_id, &adv_data_info);\r
-\r
- return;\r
-}\r
-#endif\r
-\r
#if 1\r
/* adapt ios adv data. *///设置广播和扫描数据\r
static void svr_ble_adv_data_set(int adv_id)\r
gap_ble_config_adv_data_t adv_data_info;\r
memset_s(&adv_data_info, sizeof(gap_ble_config_adv_data_t), 0, sizeof(gap_ble_config_adv_data_t));\r
\r
- unsigned char set_mac[6] = {0x61,0x22,0x33,0x44,0x09,0x12};\r
+ unsigned char set_mac[6] = {0x61,0x22,0x33,0x44,0x09,0x14};\r
bluetooth_set_local_addr(set_mac,6);\r
bd_addr_t addr_info;\r
int32_t ret= 0;\r
char watchName[32];\r
memset_s(watchName, sizeof(watchName), 0, sizeof(watchName));\r
(void)sprintf_s(watchName, sizeof(watchName), "%s %x%x",BLE_DEFAULT_NAME,addr[1],addr[0]);\r
+ // (void)sprintf_s(watchName, sizeof(watchName), "%s",BLE_DEFAULT_NAME);\r
\r
ret = bluetooth_set_local_name((unsigned char*)watchName, strlen((char*)watchName) + 1);\r
if (ret == false) {\r
memcpy_s(adv_data + adv_data_len, ble_name_len + 1, ble_data_name, ble_name_len + 1);\r
\r
adv_data_len = adv_data_len + ble_name_len + 1;\r
- memcpy_s(adv_data + adv_data_len, sizeof(ble_adv_tx), ble_adv_tx, sizeof(ble_adv_tx));//这是tx power\r
- adv_data_len = adv_data_len + sizeof(ble_adv_tx);\r
+ memcpy_s(adv_data + adv_data_len, sizeof(ble_adv_uuid), ble_adv_uuid, sizeof(ble_adv_uuid));//这是tx power\r
+ adv_data_len = adv_data_len + sizeof(ble_adv_uuid);\r
\r
int k = BD_ADDR_LEN;\r
for (int i = 0; i < BD_ADDR_LEN; i++) {\r
}\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_info:%02x:%02x:%02x:%02x:%02x:%02x", ble_data_mac_switch[0], ble_data_mac_switch[1],\r
ble_data_mac_switch[2], ble_data_mac_switch[3], ble_data_mac_switch[4], ble_data_mac_switch[5]);\r
- // memcpy_s(adv_mac_head + BLE_ADV_MAC_HEAD_LENTH, BD_ADDR_LEN, ble_data_mac_switch, BD_ADDR_LEN);\r
+ memcpy_s(adv_mac_head + BLE_ADV_MAC_HEAD_LENTH, BD_ADDR_LEN, ble_data_mac_switch, BD_ADDR_LEN);\r
\r
- // memcpy_s(adv_data + adv_data_len, sizeof(adv_mac_head), adv_mac_head, sizeof(adv_mac_head));\r
- // adv_data_len = adv_data_len + sizeof(adv_mac_head);\r
+ memcpy_s(adv_data + adv_data_len, sizeof(adv_mac_head), adv_mac_head, sizeof(adv_mac_head));\r
+ adv_data_len = adv_data_len + sizeof(adv_mac_head);\r
\r
scan_data[0] = 0x0f;//长度\r
scan_data[1] = 0xff;//数据类型 manufactory data\r
\r
\r
\r
-void svr_ble_adv_start(void)\r
+void svr_ble_adv_start_param(void)\r
{\r
int adv_id = BLE_ADV_ID;\r
if (AdverFlag == false) { //已经开始广播了,不需要重复开启广播\r
{\r
uint16_t number;\r
errcode_t ret = gap_ble_get_paired_devices_num(&number);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "number :%d addr!!! 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\r\n",number,addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],\r
- addr->addr[4],addr->addr[5]);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "number :%d addr!!! 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x addr->type:%d\r\n",number,addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],\r
+ addr->addr[4],addr->addr[5],addr->type);\r
g_ble_conn_id = conn_id;\r
if (GAP_BLE_STATE_DISCONNECTED == conn_state) { // restart ble adv when disconnected\r
- \r
Bleconnect = GAP_BLE_STATE_DISCONNECTED;//蓝牙已断开\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GAP_BLE_STATE_DISCONNECTED!!! 0x%x ret:%d\r\n",pair_state,AdverFlag);\r
if(AdverFlag == true){\r
- svr_ble_ble_adv_start();\r
+ svr_ble_adv_start();\r
} \r
} else {\r
+ \r
set_phone_info(addr);\r
Bleconnect = GAP_BLE_STATE_CONNECTED;//蓝牙已连接\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GAP_BLE_STATE_CONNECTED!!! 0x%x\r\n",pair_state);\r
\r
static void svr_pair_result_cbt_cb(uint16_t conn_id, const bd_addr_t *addr, errcode_t status)\r
{\r
- bond_flag = 1;\r
- uint16_t number;\r
- errcode_t ret = gap_ble_get_paired_devices_num(&number);\r
- gap_ble_pair_state_t paire_status;\r
- gap_ble_get_pair_state(addr,&paire_status);//获取配对状态\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_pair_result_cbt_cb status %d number:%d\r\n",paire_status,number);\r
- \r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_pair_result_cbt_cb!!! addr 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x status:0x%x\r\n",addr->addr[0],addr->addr[1],\r
addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5],status);\r
}\r
// ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
}\r
}\r
-extern void alipay_add_chart_decr_cb(uint8_t server_id,uint16_t srv_handle);\r
+static uint16_t ble_server_handle = 0;\r
+static uint8_t g_alipay_character_buf[256] = {0};\r
+void alipay_add_chart_decr_cb(uint8_t server_id,uint16_t srv_handle)\r
+{\r
+ errcode_t ret = 0;\r
+ // uint16_t id = ALIPAYY_CHARACTERISTIC_ID;\r
+ gatts_add_chara_info_t character;\r
+ uint16_t value = 0;\r
+ bt_uuid_t alipay_service_uuid = {0};\r
+ bts_data_to_uuid_len2(0x4a02, &alipay_service_uuid);\r
+ memset_s(&character, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));\r
+ // character.chara_uuid.uuid_len = sizeof(id);\r
+ // memcpy_s(character.chara_uuid.uuid, sizeof(character.chara_uuid.uuid), (char *)&id, sizeof(id));\r
+ character.chara_uuid = alipay_service_uuid;\r
+ character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ character.properties =\r
+ GATT_CHARACTER_PROPERTY_BIT_READ | GATT_CHARACTER_PROPERTY_BIT_WRITE | GATT_CHARACTER_PROPERTY_BIT_NOTIFY;\r
+ character.value_len = 256;\r
+ character.value = g_alipay_character_buf;\r
+\r
+ ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
+ if (ret != ERRCODE_SUCC) {\r
+ ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
+ }\r
+\r
+ uint8_t bas_ccc_val[] = {\r
+ 0x01,\r
+ 0x00\r
+ };\r
+ bt_uuid_t ccc_uuid = { 0 };\r
+ bts_data_to_uuid_len2(0x2902, &ccc_uuid);\r
+ // bts_data_to_uuid_len2(0x2902, &ccc_uuid);\r
+ gatts_add_desc_info_t descriptor;\r
+ descriptor.desc_uuid = ccc_uuid;\r
+ descriptor.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ descriptor.value_len = (uint16_t)sizeof(bas_ccc_val);\r
+ descriptor.value = bas_ccc_val;\r
+ \r
+ ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+ if (ret != ERRCODE_SUCC) {\r
+ ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+ }\r
+ bd_addr_t addr_info;\r
+ gatts_add_desc_info_t descriptor_ap;\r
+ gap_ble_get_local_addr(&addr_info);\r
+ bts_data_to_uuid_len2(0x4b02, &ccc_uuid);\r
+ descriptor_ap.desc_uuid = ccc_uuid;\r
+ descriptor_ap.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ descriptor_ap.value_len = BD_ADDR_LEN;\r
+ uint8_t ble_data_mac_switch[BD_ADDR_LEN] = {0};\r
+ int k = BD_ADDR_LEN;\r
+ for (int i = 0; i < BD_ADDR_LEN; i++) {\r
+ ble_data_mac_switch[--k] = addr_info.addr[i];\r
+ }\r
+ descriptor_ap.value = ble_data_mac_switch;\r
+ ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_ap);\r
+ if (ret != ERRCODE_SUCC) {\r
+ ALIPAY_PRINT_ERR(0, "gatts_add_descriptor second fail, ret:%u.\r\n", ret);\r
+ }\r
+\r
+\r
+}\r
//这个回调函数添加新的服务UUID\r
static void svr_ble_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uuid, uint16_t srv_handle,\r
errcode_t status)\r
{\r
+ ble_server_handle = srv_handle;\r
// ALIPAY_PRINT_DEBUG(0, "BtGattsServiceAddCallback 0x%x 0x%x 0x%x 0x%x", status, server_id, srv_handle,\r
// *((uint16_t *)uuid->uuid));\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb 0x%x\r\n",srv_handle);\r
bt_uuid_t hid_service_uuid = {0};\r
bts_data_to_uuid_len2(BLE_UUID_HUMAN_INTERFACE_DEVICE, &hid_service_uuid);\r
\r
- bt_uuid_t alpay_service_uuid = {0};\r
- bts_data_to_uuid_len2(ALIPAYY_SERVICE_ID, &alpay_service_uuid);\r
+ \r
\r
errcode_t ret = 0;\r
if (ble_gatts_cmp_uuid(uuid, &ble_service_uuid) == true) {//通过传入的uuid进行比较\r
srv_ble_add_chart_decr_short_cmd(server_id,srv_handle);\r
srv_ble_add_chart_decr_long_cmd(server_id,srv_handle);\r
srv_ble_add_chart_decr_recv_cmd(server_id,srv_handle);\r
+ alipay_add_chart_decr_cb(server_id,srv_handle);\r
gatts_start_service(server_id, srv_handle);\r
}\r
if (ble_gatts_cmp_uuid(uuid, &hid_service_uuid) == true){\r
ret = gatts_start_service(server_id, srv_handle);\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);\r
}\r
- if (ble_gatts_cmp_uuid(uuid, &alpay_service_uuid) == true){\r
- alipay_add_chart_decr_cb(server_id,srv_handle);\r
- \r
- ret = gatts_start_service(server_id, srv_handle);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "alipay_add_chart_decr_cb ret:%d\r\n",ret);\r
- }\r
}\r
-\r
+uint16_t g_alipay_server_handle = 0;\r
+uint16_t g_hid_server_handle = 0;\r
static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t *uuid, uint16_t srv_handle,\r
gatts_add_character_result_t *result, errcode_t status)\r
{\r
bt_uuid_t hid_report_uuid = {0};\r
bts_data_to_uuid_len2(BLE_UUID_REPORT, &hid_report_uuid);\r
\r
- bt_uuid_t alipay_uuid = {0};\r
- bts_data_to_uuid_len2(ALIPAYY_CHARACTERISTIC_ID, &alipay_uuid);\r
\r
if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data1))\r
{\r
if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data2))\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->value_handle2 %d\r\n",result->value_handle);\r
- shortCmdChara = result->value_handle;\r
+ data2ae3Cmd = result->value_handle;\r
}\r
\r
if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data4))\r
if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data3))\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->value_handle3 %d\r\n",result->value_handle);\r
- longCmdChara = result->value_handle;\r
+ data2ae4Cmd = result->value_handle;\r
}\r
if (ble_gatts_cmp_uuid(uuid, &hid_report_uuid) == true) {\r
- ble_hid_add_characters_input_report_cbk(srv_handle);\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->hid_report_uuid %d\r\n",result->value_handle);\r
- }\r
- if (ble_gatts_cmp_uuid(uuid, &alipay_uuid) == true) {\r
- // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_alipay_add_characters_input_report_cbk \r\n");\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->alipay_uuid %d\r\n",result->value_handle);\r
- ble_alipay_add_characters_input_report_cbk(srv_handle);\r
+ if(g_hid_server_handle == 0){\r
+ g_hid_server_handle = result->value_handle;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_hid_server_handle %d\r\n",g_hid_server_handle);\r
+ ble_hid_add_characters_input_report_cbk(g_hid_server_handle);\r
+ }\r
}\r
return;\r
}\r
\r
}\r
revBleOldData(write_cb_para->value,write_cb_para->length,write_cb_para->handle);\r
+ if(write_cb_para->handle == g_alipay_server_handle)\r
+ {\r
+ printf("g_alipay_server_handle:%d",g_alipay_server_handle);\r
+ uint8_t *msg_data = write_cb_para->value;\r
+ svr_alipay_msg_write(ALIPAY_MSG_BT, msg_data, write_cb_para->length, false);\r
+ }\r
\r
}\r
static void svr_ble_mtu_exchange(uint8_t server_id, uint16_t conn_id, uint16_t mtu_size, errcode_t status)\r
}\r
if(state == GAP_ACL_STATE_DISCONNECTED || state == GAP_ACL_STATE_LE_DISCONNECTED)\r
{\r
- gap_remove_all_pairs();\r
+ // gap_remove_all_pairs();\r
}\r
\r
}\r
BtA2dpSnkPlayingStateChangedCb,\r
BtA2dpSnkConfigChangedCb\r
};\r
-\r
void svr_ble_btcallback_reg(void)//ble基础通讯服务注册回调函数\r
{\r
- gap_ble_sec_params_t sec_params = { 0 };\r
+ \r
+ gap_ble_sec_params_t sec_params = {0};\r
sec_params.bondable = 0x01;\r
sec_params.io_capability = GAP_BLE_IO_CAPABILITY_NOINPUTNOOUTPUT;//最好选择没有输入输出IO能力\r
- sec_params.sc_enable = 0x01;\r
+ sec_params.sc_enable = 0x00;\r
sec_params.sc_mode = GAP_BLE_GAP_SECURITY_MODE1_LEVEL2;\r
errcode_t ret = gap_ble_set_sec_param(&sec_params);//设置配对参数 发起配对弹窗\r
\r
uint8_t serverId = 0;\r
bt_uuid_t uuid;\r
errcode_t ret = 0;\r
- uuid.uuid_len = (uint8_t)sizeof(ser_id);\r
- memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&ser_id, sizeof(ser_id));\r
+ uuid.uuid_len = (uint8_t)sizeof(id);\r
+ memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&id, sizeof(id));\r
ret = gatts_register_server(&uuid, &serverId); /* 注册gatt server */\r
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_register_server ret: 0x%x serverId = 0x%x uuid.uuid_len:%d", ret, serverId,uuid.uuid_len);\r
g_ble_server_id = serverId;\r
\r
bt_uuid_t ble_service_uuid = {0};\r
bts_data_to_uuid_len2(id, &ble_service_uuid);\r
- ret = gatts_add_service(1, &ble_service_uuid, true);\r
+ ret = gatts_add_service(serverId, &ble_service_uuid, true);\r
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_service ret: 0x%x", ret);\r
\r
\r
bt_os_free(tgt);\r
return result;\r
}\r
-\r
-\r
+extern void alipay_unregist_server(void);\r
+void ble_unregist_server(void)\r
+{\r
+ gatts_delete_all_services(g_ble_server_id);\r
+ gatts_unregister_server(g_ble_server_id);\r
+ svr_ble_adv_stop();\r
+ \r
+}\r
+void svr_ble_reset_init(void)//重新启ble服务\r
+{\r
+ alipay_unregist_server();\r
+ osDelay(100);\r
+ svr_ble_btcallback_reg();\r
+ svr_ble_bt_init_gatts();\r
+ ble_hid_server_init();\r
+ svr_ble_adv_start_param();\r
+}\r
\r
void svr_bluetooth_init(void)\r
{\r
bool ret = enable_bt_stack();\r
if (ret != ERRCODE_SUCC) {\r
- // WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "svr_bluetooth_init enable_bt_stack ret:%u.\r\n", ret);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "svr_bluetooth_init enable_bt_stack ret:%u.\r\n", ret);\r
}\r
- if (g_ble_init_flag == true) {\r
- return;\r
- }\r
- \r
+ // osDelay(100);\r
svr_ble_btcallback_reg();\r
svr_ble_bt_init_gatts();\r
-#ifdef SUPPORT_ALIPAY_SEC\r
- // uapi_alipay_svr_init();\r
- svr_alipay_bluetooth_init();\r
-#endif\r
ble_hid_server_init();\r
- svr_ble_adv_start();\r
- ble_nus_max_data_len = 100;\r
- g_ble_init_flag = true;\r
+ svr_ble_adv_start_param();\r
WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "svr_bluetooth_init22222222222\r\n");\r
ble_recv_register_msg_callback(ble_recv_msg_callback);//注册驱动回调\r
return;\r
if(Bleconnect == GAP_BLE_STATE_CONNECTED){//设备连接需要断开\r
ret = gap_ble_disconnect_remote_device((const bd_addr_t *)&bd_addr);//与固定的mac设置地址进行断开连接\r
}\r
- ret = gap_ble_remove_all_pairs();//删除和所有配对的手机app\r
- gap_remove_all_pairs();\r
- svr_ble_ble_adv_stop();//停止广播 不发送广播数据 就是app搜索不到该设备了\r
+ // ret = gap_ble_remove_all_pairs();//删除和所有配对的手机app\r
+ // gap_remove_all_pairs();\r
+ svr_ble_adv_stop();//停止广播 不发送广播数据 就是app搜索不到该设备了\r
ret = disable_bt_stack();//关闭ble 直接断开和当前连接的手机app\r
- // WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "closeBle ret%d 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",ret,bd_addr.addr[0],bd_addr.addr[1],bd_addr.addr[2],bd_addr.addr[3],bd_addr.addr[4],bd_addr.addr[5]);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "closeBle ret%d 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",ret,bd_addr.addr[0],bd_addr.addr[1],bd_addr.addr[2],bd_addr.addr[3],bd_addr.addr[4],bd_addr.addr[5]);\r
}\r
}\r
//开启蓝牙\r