客户端扫描对端服务的问题



  • fr8106ha作为主机,在已经连接上一个从机并找到了我所需要的服务后,主机与另一个从机设备连接并开始寻找这个从机中我所需要的服务,这种情况下无法找到第二个连接的从机中我所需要的服务。

    验证了gatt_discovery_peer_svc操作中的conidx参数是没有问题的;单独连接这两个从机并寻找所需要的服务都是可以成功。这该怎么解决?

    这两个从机设备并不相同,这两个设备中要用到的服务uuid也不相同。



  • 可以在这个事件里面找到你要的服务,然后拿到对应的handle进行传输
    case GATTC_MSG_SVC_REPORT:
    {
    uint8_t spss_svc_uuid[UUID_SIZE_16]={0xbb, 0x5c, 0x49, 0xd2, 0x04, 0xa3, 0x40, 0x71, 0xa0, 0xb5, 0x35, 0x85, 0x3e, 0xb0, 0x83, 0x07};

    		gatt_uuid_t client_att_tb[2]={0};
    		gatt_svc_report_t *svc_rpt = (gatt_svc_report_t *)(p_msg->param.msg.p_msg_data);
    		
    		 
    		#if 1
    		for(uint8_t j=0; j<svc_rpt->end_hdl-svc_rpt->start_hdl; j++)
            if(memcmp(svc_rpt->info[j].att_value.uuid, spss_svc_uuid,16) == 0)
            {
                for(uint16_t i = 0; i<(svc_rpt->end_hdl - svc_rpt->start_hdl); i++)
                {
                 co_printf("info[%d].att_type:%d\r\n",i,svc_rpt->info[i].att_type);
                    if(svc_rpt->info[i].att_type == ATT_TYPE_CHAR_DECL)
                    {
                        if((svc_rpt->info[i].char_decl.prop & GATT_PROP_NOTI) && handles_scan[0] == 0)
    					{
                            handles_scan[0] = svc_rpt->info[i].char_decl.handle;
    						co_printf("decl, prop:%x,handle:%d\r\n",svc_rpt->info[i].char_decl.prop, handles_scan[0]);
    					
    					}
                        if((svc_rpt->info[i].char_decl.prop & GATT_PROP_WRITE_CMD) && handles_scan[1] == 0)
    					{
                            handles_scan[1] = svc_rpt->info[i].char_decl.handle;
    						client_att_tb[0].size = svc_rpt->info[i].att_value.uuid_len;
                            memcpy(client_att_tb[0].p_uuid, svc_rpt->info[i].att_value.uuid, client_att_tb[0].size);
    						co_printf("decl, prop:%x,handle:%d\r\n",svc_rpt->info[i].char_decl.prop, handles_scan[1]);
    

    // gatt_add_client_uuid((gatt_uuid_t*)client_att_tb[0].p_uuid,3,0,handles_scan);
    }
    }
    if(svc_rpt->info[i].att_type == ATT_TYPE_VAL)
    {
    //co_printf("att_val, uuid_len:%d,uuid:",svc_rpt->info[i].att_value.uuid_len);
    //show_reg(svc_rpt->info[i].att_value.uuid,svc_rpt->info[i].att_value.uuid_len,1);
    if( i == (handles_scan[0] - svc_rpt->start_hdl - 1))
    {
    client_att_tb[0].size = svc_rpt->info[i].att_value.uuid_len;
    memcpy(client_att_tb[0].p_uuid, svc_rpt->info[i].att_value.uuid, client_att_tb[0].size);
    }
    else if( i == (handles_scan[1] - svc_rpt->start_hdl - 1))
    {
    client_att_tb[1].size = svc_rpt->info[i].att_value.uuid_len;
    memcpy(client_att_tb[1].p_uuid,svc_rpt->info[i].att_value.uuid,client_att_tb[1].size);
    }
    }
    if(svc_rpt->info[i].att_type == ATT_TYPE_DESC)
    {
    //co_printf("desc, uuid_len:%d,uuid:",svc_rpt->info[i].att_value.uuid_len);
    //show_reg(svc_rpt->info[i].att_value.uuid,svc_rpt->info[i].att_value.uuid_len,1);
    }
    }
    }
    #endif

    	//	 gatt_add_client_uuid();
    		co_printf("UUID Start:");
    		for (uint8_t i = 0; i < svc_rpt->uuid_len; i++)
    			co_printf("%02x ", svc_rpt->uuid[i]);
    		co_printf("\r\n");
    		
    		co_printf("Handle_Len:%d, Start_Handle:%d - End_Handle:%d\r\n", svc_rpt->uuid_len, svc_rpt->start_hdl, svc_rpt->end_hdl);
    		 
    		 for(uint8_t j=0; j<svc_rpt->end_hdl-svc_rpt->start_hdl; j++)
    		{
    			co_printf("att_value uuid->:");
    			for (uint8_t i = 0; i < svc_rpt->info[j].att_value.uuid_len; i++)
    				co_printf("%02x ", svc_rpt->info[j].att_value.uuid[i]);
    			co_printf(" ;\r\n");
    			co_printf("handle: %02x \r\n", svc_rpt->info[j].char_decl.handle);
    
    		 }
    		co_printf("UUID END\r\n");
    		os_timer_start(&time_send_id, 3000,1);
        }
        break;


  • @mars客户端扫描对端服务的问题 中说:

    GATTC_MSG_SVC_REPORT

    这种无法找到目标服务的情况是没有执行GATTC_MSG_SVC_REPORT的

    日志打印的话执行的顺序为:
    "spsc_clinet,att_idx:1,evt:7
    spsc_clinet,att_idx:0,evt:6"
    att[4]_hdl,att[5]_hdl是对应这个从机服务的句柄,返回的都是0,而且返回的速度异常得快。
    0_1755681054190_14b62b78-ac62-4258-8ee0-fbc9c19cefce-image.png

    因为GATT_OP_PEER_SVC_REGISTERED操作相较于能正常找到服务的速度快太多了,我怀疑第二条从机链接的寻找服务的操作直接在之前连接缓存的服务列表进行比对所以找不到。我不知道这个判断是否准确,希望你再帮我指点一下