增加ANCS的消息过滤机制,仅过滤ios,安卓由APP管理 522/1 522/head
authorhcj <1224667075@qq.com>
Mon, 15 Jul 2024 10:43:05 +0000 (18:43 +0800)
committerhcj <1224667075@qq.com>
Mon, 15 Jul 2024 10:43:05 +0000 (18:43 +0800)
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp
code/sdk/application/wearable/service/ble_service/bleservice/bleANCS.c
code/sdk/application/wearable/service/ble_service/bleservice/bleANCS.h
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h
code/sdk/application/wearable/service/ble_service/bleservice/bleService.c

index f417b0b..1dda147 100644 (file)
@@ -28,6 +28,7 @@
 #include "thread_adapter.h"
 #include "broadcast_feature.h"
 #include "broadcast_service.h"
+#include "bleANCS.h"
 
 #define MESSAGE_JSON_FILE "user/userdata/ancs.json"
 #define MESSAGE_JSON_DIR "user/userdata/message/"
@@ -164,6 +165,8 @@ namespace OHOS
     // 加载Message文件
     bool MessageModel::LoadMessagesFromStorage()
     {
+        //加载消息过滤文件
+        filtration_file_read();
         std::ifstream file(MESSAGE_JSON_FILE);
         if (!file.is_open())
         {
@@ -231,6 +234,8 @@ namespace OHOS
     // 保存Message文件
     bool MessageModel::SaveMessagesToStorage()
     {
+        //消息过滤文件保存
+        filtration_file_save();
         if (MessageVector.empty())
         {
             // 清空文件
index 0457b0c..8f0e986 100644 (file)
@@ -48,6 +48,8 @@
 #define ANCS_DEC_CHAR_COUNT 2
 #define BYTE_BIT_COUNT 8
 
+#define ANCS_APP_FILTRATION_PATH "user/userdata/filtration.bin"
+
 /* ANCS客户端接口命令id */
 typedef enum {
     BLE_SAMPLE_ANCS_CLIENT_REGISTER_CBK = 1, /* 1 注册ANCS客户端回调函数 */
@@ -62,6 +64,132 @@ typedef enum {
 
 static uint8_t g_client_id=0;
 /* 命令处理函数接口 */
+#define filtration_data_count 20
+filtration_data filtration_data_T[filtration_data_count]={0};
+//*com.tencent.qqmail
+// com.apple.mobilephone
+// com.apple.MobileSMS
+// com.netease.mailmaster
+// com.tencent.xin
+// com.tencent.mqq
+// com.facebook.Messenger
+// com.atebits.Tweetie2
+// net.whatsapp.WhatsAppSMB
+// com.linkedin.LinkedIn
+// com.burbn.instagram
+// com.facebook.Messenger
+// com.toyopagroup.picaboo
+// jp.naver.line
+// com.iwilab.KakaoTalk
+// com.viber
+// com.skype.skype
+// ph.telegra.Telegraph
+// com.others
+//消息过滤文件保存,在此列的消息未打开,不发消息给手表,不在此列默认开
+void filtration_on_get(char *buf,uint8_t len)
+{
+    for (size_t i = 0; i < len; i++)
+    {
+      if(strlen( filtration_data_T[i].name)!=0 && filtration_data_T[i].on==0)
+      {
+        buf[i]=0;
+      }
+      else
+      {
+        buf[i]=1;
+      }
+    }
+}
+void filtration_file_save(void)
+{
+    FILE *fp=fopen(ANCS_APP_FILTRATION_PATH,"wb+");
+    if(fp==NULL)return;
+    for (size_t i = 0; i < filtration_data_count; i++)
+    {
+       fwrite(&filtration_data_T[i],sizeof(filtration_data),1,fp);
+    }
+    fclose(fp);
+}
+
+void filtration_file_read(void)
+{
+    FILE *fp=fopen(ANCS_APP_FILTRATION_PATH,"rb+");
+    if(fp==NULL)return;
+    for (size_t i = 0; i < filtration_data_count; i++)
+    {
+       int readsize= fread(&filtration_data_T[i],sizeof(filtration_data),1,fp);
+       if(readsize!=1)
+       break;
+    }
+    fclose(fp);
+}
+
+
+void filtration_file_updata(filtration_data *data)
+{
+    for (size_t i = 0; i < filtration_data_count; i++)
+    {
+        if(strlen( filtration_data_T[i].name)==0)
+        {
+            filtration_data_T[i].on=data->on;
+            filtration_data_T[i].len=data->len;
+            memset(filtration_data_T[i].name,0,filtration_data_max_len);
+            memcpy_s(filtration_data_T[i].name,filtration_data_max_len, data->name,strlen( data->name));
+            break;
+           // printf("name:%s on:%d\r\n",data->name,data->on);
+        }
+        else if (strcmp(data->name,filtration_data_T[i].name)==0)
+        {
+            filtration_data_T[i].on=data->on;
+            break;
+            //printf("name:%s on:%d\r\n",data->name,data->on);
+        }
+    }
+}
+
+static uint8_t get_other_filtration()
+{
+    for (size_t i = 0; i < filtration_data_count; i++)
+    {
+        if (strcmp("com.others",filtration_data_T[i].name)==0)
+        {
+            if(filtration_data_T[i].on)
+            {
+                return 1;
+            }
+            else
+            {
+                return 0;
+            }
+        }
+    }
+    return 1;
+
+}
+
+uint8_t is_filtration_data(char *data)
+{
+    for (size_t i = 0; i < filtration_data_count; i++)
+    {
+        if (strcmp(data,filtration_data_T[i].name)==0)
+        {
+            if(filtration_data_T[i].on)
+            {
+                return 1;
+            }
+            else
+            {
+                return 0;
+            }
+        }
+    }
+    if(get_other_filtration())
+    return 1;
+    else
+    return 0;
+}
+
+
 
 
 /* 获取通知属性 */
@@ -187,7 +315,7 @@ static void ble_ancs_client_notification_attr_rsp_cbk(uint8_t client_id, uint16_
         uint16_t att_num = 1;
         char title_buf[256]={0};
         char msg_buf[256]={0};
-         char new_msg_buf[64]={0};
+        char app_buf[32]={0};
         while (node != NULL) {
             if (node != NULL) {
                 printf("[ANCSClientNotifyATTRSPCBK]att id:%d length:%lu att_value:%s\r\n",
@@ -200,9 +328,9 @@ static void ble_ancs_client_notification_attr_rsp_cbk(uint8_t client_id, uint16_
                 {
                     sprintf_s(msg_buf,256,"%s",node->att);
                 }
-                if(node->att_id==5)
+                if(node->att_id==0)
                 {
-                   sprintf_s(new_msg_buf,64,"%s",node->att);
+                   sprintf_s(app_buf,64,"%s",node->att);
                 }
             }
             node = lnext(node);
@@ -220,6 +348,7 @@ static void ble_ancs_client_notification_attr_rsp_cbk(uint8_t client_id, uint16_
             // memset(old_time_buf,0,64);
             // memcpy_s(old_time_buf,64,new_msg_buf,64);
            // printf("ble_ancs_client_notification_attr_rsp_cbk test 2\r\n");
+            if(is_filtration_data(app_buf))
             message_data(notify_attr_rsp->notification_uid,0,title_buf,msg_buf,0);
            
 
index b587f1d..0a2664a 100644 (file)
 #ifdef __cplusplus
 extern "C" {
 #endif
-
+#define  filtration_data_max_len 32
 //void ble_ancs_client_at_cmd(uint8_t cmd_id, char **params, uint8_t params_cnt);
+typedef struct filtration_data_t
+{
+    uint32_t on;
+    uint32_t len;
+    char name[filtration_data_max_len];
+}filtration_data;
+
 
 void gattc_reg_id(void);
 uint8_t ble_ancs_client_cmd_setup_and_subscribe(uint16_t conn_id);
 uint8_t ble_ancs_client_subscribe_notify(uint16_t conn_id,uint8_t sub_flag);
 uint8_t ble_ancs_client_subscribe_data(uint16_t conn_id,uint8_t sub_flag);
+void filtration_file_updata(filtration_data *data);
+void filtration_on_get(char *buf,uint8_t len);
+void filtration_file_save(void);
+void filtration_file_read(void);
 /**
  * @}
  */
index 92af0fb..0b220ff 100644 (file)
@@ -42,6 +42,7 @@ extern "C" {
 #include "bletest.h"\r
 #include "custom_utils.h"\r
 #include "custom_runtime.h"\r
+#include "bleANCS.h"\r
 \r
 #define DEBUG_TEST (0)\r
 #define CRC_CHECK_ERR 0 //crc校验失败\r
@@ -1874,6 +1875,50 @@ void SetsedentarinessSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t
     }\r
 }\r
 \r
+void SetmsgfiltrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置久坐设置\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] = 0x1E;\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(data,len,crcvalue))\r
+       {\r
+        printf("总长%d\r\n",len);\r
+        uint32_t offset=0;\r
+        while (offset<len)\r
+        {\r
+            filtration_data data_t={0};\r
+            data_t.on=data[offset];\r
+            offset++;\r
+            data_t.len=data[offset];\r
+            offset++;\r
+            memcpy_s(data_t.name,filtration_data_max_len,&data[offset],data_t.len);\r
+            offset+=data_t.len;\r
+            printf("%s\r\n",data_t.name);\r
+            filtration_file_updata(&data_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
 \r
@@ -2374,6 +2419,9 @@ void type2AE4Data(ble_read_data *buffer_handle,uint8_t *buf_cmd,uint8_t *data,ui
         case SET_SEDENTARINESS_PARAM_CMD:\r
             SetsedentarinessSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
             break;\r
+        case SET_ANCS_MSG_FILTRATION_CMD:\r
+             SetmsgfiltrationCmd(typeID,data,datalen,totalData,crcvalue);\r
+             break;\r
         case QUERY_DIAL_INSTALLED_PARAM_CMD:\r
             query_dial_installed(buffer_handle,typeID,data,datalen,totalData,crcvalue);\r
             break;\r
@@ -2828,8 +2876,8 @@ static void GetBatteryLevelCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *
         sendBleData(value,19);\r
     }\r
 }\r
-//è\8e·å\8f\96å¼\80å\85³æ¶\88æ\81¯æ\8e¨é\80\81å\8a\9fè\83½\r
-static void GetSwitchMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+//设置å¼\80å\85³//ï¼\88å¼\83ï¼\89\r
+static void SetSwitchMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2845,6 +2893,14 @@ static void GetSwitchMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to
     if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint8_t switch_on = data[0];//0 关闭 1 开启\r
+        if(switch_on)\r
+        {\r
+            ble_ancs_client_cmd_setup_and_subscribe(g_ble_conn_id);\r
+        }\r
+        else\r
+        {\r
+            ble_ancs_client_subscribe_notify(g_ble_conn_id,0);\r
+        }\r
 \r
         value[17] = 1;\r
         value[18] = Calculate_CRC(value,18);\r
@@ -3909,11 +3965,11 @@ static void GetTargetOtherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *t
 \r
 static void GetPasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
-    uint8_t value[26];\r
-    memset(value,0,26);\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
     uint32_t tmp = 1;\r
-    uint32_t datalen = 6;\r
-    uint16_t tmp_data = 6;\r
+    uint32_t datalen = 1;\r
+    uint16_t tmp_data = 1;\r
     value[0] = 0x72;\r
     value[1] = 0x01;\r
     value[2] = 0x2f;\r
@@ -3936,6 +3992,39 @@ static void GetPasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *tota
     }\r
 }\r
 \r
+static void GetmsgconfigCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+{\r
+    uint8_t value[36];\r
+    memset(value,0,36);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 18;\r
+    uint16_t tmp_data = 18;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x33;\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(1)\r
+    {\r
+        uint8_t data_buf[18]={1};\r
+       \r
+        // memset(data,1,18);\r
+        filtration_on_get((char*)data_buf,18);\r
+        memcpy(&value[17],data_buf,18);//\r
+     \r
+        value[35] = Calculate_CRC(value,35);\r
+        sendBleData(value,36);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+\r
 \r
 \r
 bool get_AI_PATH_and_size(char *path,uint32_t *size)\r
@@ -4546,7 +4635,7 @@ void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,u
             GetBatteryLevelCmd(cmd,data,datalen,totaldata,crcvalue);\r
             break;\r
         case SWITCH_MESS_CMD://开关消息推送功能 \r
-            GetSwitchMessCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            SetSwitchMessCmd(cmd,data,datalen,totaldata,crcvalue);\r
             break;\r
         case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输\r
             RemoveFileCmd(buffer_handle,cmd,data,datalen,totaldata,crcvalue);\r
@@ -4645,6 +4734,10 @@ void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,u
         case GET_PASSWORD_CMD: //获取手表密码\r
             GetPasswordCmd(cmd,data,datalen,totaldata,crcvalue);\r
             break;\r
+        case SYN_GET_MSG_CONFIG_CMD: //获取手表消息设置\r
+            GetmsgconfigCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+            \r
         case APP_GET_AI_PCM_DATA_CMD:\r
             GetAiRecordCmd(cmd,data,datalen,totaldata,crcvalue);\r
             break;\r
index bd065d1..8b9097e 100644 (file)
@@ -94,6 +94,7 @@ void cameram_send_data(void);
 #define SYN_DIS_HISTORY_DATA_CMD 0x0147 //同步距离历史数据
 #define SYN_BASIC_TRANIN_HISTORY_DATA_CMD 0x0149 //同步基础训练历史数据basic training
 #define SYN_SLEEP_HISTORY_DATA_CMD 0x014B //同步睡眠历史数据
+#define SYN_GET_MSG_CONFIG_CMD 0x0133 //获取消息开关
 #define APP_GET_AI_PCM_DATA_CMD 0x0134 //APP获取录音文件
 #define AI_IS_READ_DATA_CMD 0x0505 //AI准备就绪
 
@@ -608,6 +609,7 @@ TYPE:02
 #define SET_OTHER_TARGET_CMD 0x0217 //app发送其他目标
 #define SET_PASSWORD_CMD 0x021C //APP设置手表密码password
 #define SET_SEDENTARINESS_PARAM_CMD 0x021D //APP设置久坐提醒
+#define SET_ANCS_MSG_FILTRATION_CMD 0x021e //APP设置消息过滤处理
 #define SET_APP_AI_TXT_CMD 0x021F //设置AI返回的文本
 #define SET_WEATHER_DATA_CMD 0x0220 //发送天气数据
 #define SET_ALARM_DATA_CMD 0x0221 //发送闹钟数据
index 2bb2872..4d8814b 100644 (file)
@@ -327,7 +327,7 @@ void svr_pair_result_cbt_cb(uint16_t conn_id, const bd_addr_t *addr, errcode_t s
     devpair_state = 1;//代表配对成功了\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
-    if(get_notify_switch())\r
+    //if(get_notify_switch())\r
     ble_ancs_client_cmd_setup_and_subscribe(g_ble_conn_id);\r
     \r
 }\r