code: func (cln *Client) DiscoverCharacteristics(cs []ble.UUID, s *ble.Service) ([]*ble.Characteristic, error) {
  	rsp := cln.conn.sendReq(62, xpc.Dict{
  		"kCBMsgArgDeviceUUID":         cln.id,
  		"kCBMsgArgServiceStartHandle": s.Handle,
  		"kCBMsgArgServiceEndHandle":   s.EndHandle,
  		"kCBMsgArgUUIDs":              uuidSlice(cs),
  	})
  	if rsp.err() != nil {
  		return nil, rsp.err()
  	}
  	for _, xcs := range rsp.characteristics() {
  		xc := msg(xcs.(xpc.Dict))
  		s.Characteristics = append(s.Characteristics, &ble.Characteristic{
  			UUID:        ble.MustParse(xc.uuid()),
  			Property:    ble.Property(xc.characteristicProperties()),
  			Handle:      uint16(xc.characteristicHandle()),
  			ValueHandle: uint16(xc.characteristicValueHandle()),
  		})
  	}
  	return s.Characteristics, nil
  }
docs: // DiscoverCharacteristics finds all the characteristics within a service. [Vol 3, Part G, 4.6.1]
  // If filter is specified, only filtered characteristics are returned.